asset_blocked
HTTP 400. A URL the render needed to fetch failed the egress policy, or failed to fetch at all.
{ "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)" } }}Why this happens
Section titled “Why this happens”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:
| Reason | Meaning |
|---|---|
| not a valid absolute URL | Relative or malformed. |
| protocol … is not allowed | http/https only. No file:, no ftp:. |
| port … is not allowed | 80 and 443 only. |
| denylisted hostname / suffix | localhost, metadata hosts, *.internal, *.local, … |
| … is in a blocked range | Private, loopback, link-local, CGNAT, multicast or reserved, IPv4 or IPv6. |
| DNS lookup failed / returned no addresses | The name does not resolve from our network. |
| too many redirects | More than 3 hops. |
| response is N bytes, over the … cap | Over 10 MB. |
| timed out after … ms | Over 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.
How to fix it
Section titled “How to fix it”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.
Does retrying help?
Section titled “Does retrying help?”Only for a timeout or a transient upstream failure. A policy refusal is deterministic.