Skip to content

asset_blocked

HTTP 400. A URL the render needed to fetch failed the egress policy, or failed to fetch at all.

400 Bad Request
{
"error": {
"type": "asset_blocked",
"message": "Refused to fetch http://169.254.169.254/latest/meta-data/: address 169.254.169.254 is in a blocked range (169.254.0.0/16 link-local / cloud instance metadata).",
"docs_url": "https://galleyrender.com/docs/errors/asset_blocked",
"details": {
"url": "http://169.254.169.254/latest/meta-data/",
"reason": "address 169.254.169.254 is in a blocked range (169.254.0.0/16 link-local / cloud instance metadata)"
}
}
}

Everything that leaves the service on your behalf goes through one guarded fetcher, and every refusal it makes carries this type. details.reason names the exact rule:

ReasonMeaning
not a valid absolute URLRelative or malformed.
protocol … is not allowedhttp/https only. No file:, no ftp:.
port … is not allowed80 and 443 only.
denylisted hostname / suffixlocalhost, metadata hosts, *.internal, *.local, …
… is in a blocked rangePrivate, loopback, link-local, CGNAT, multicast or reserved, IPv4 or IPv6.
DNS lookup failed / returned no addressesThe name does not resolve from our network.
too many redirectsMore than 3 hops.
response is N bytes, over the … capOver 10 MB.
timed out after … msOver the 5-second budget.
upstream returned HTTP …The host answered with a non-2xx.

Both engines behave the same way. A refused subresource fails the render, on chromium and on satori alike, and details.url names it. Set options.on_blocked_asset: "skip" to drop the asset and render without it instead. Refused webhook deliveries are recorded against the render rather than returned — see Webhooks.

When more than one asset was refused, details.blocked_assets lists up to ten of them and details.blocked_count is the total.

Serve the asset from a public https URL, or inline it as a data: URI, which never touches the network. A URL that resolves only inside your VPC will never work here. If the asset is decorative and you would rather have the document than the guarantee, set options.on_blocked_asset: "skip". See Images, fonts and other assets.

Only for a timeout or a transient upstream failure. A policy refusal is deterministic.