Following up on Gemini API Image URLs returns 429 RESOURCE_EXHAUSTED and External URLs cause 429, both marked fixed by Google staff on Sep 4, 2026.
As of Sep 7, 2026, external URL file inputs still fail for me on every Gemini 3.5+ model. The error has changed: in August it was quota_exceeded / “Resource has been exhausted”, now it is permission_denied / “The caller does not have permission” (HTTP 403 on generateContent). It fails instantly (~0.3–0.7 s), 100% of the time.
Setup
- Endpoint:
generativelanguage.googleapis.com, paid project, tier: 2 - Tested via both the Interactions API (
POST /v1beta/interactions, streaming,@google/genai2.18.0) andmodels/{model}:generateContentwithfile_data.file_uri. Same result on both. - Image: a 210-byte PNG. URLs tested: an AWS S3 presigned URL (sa-east-1) and a plain public Google-hosted image (
https://www.gstatic.com/webp/gallery3/1.png).
Results
| Model | Presigned S3 URL | Public URL (gstatic) | Inline base64 | Files API URI |
|---|---|---|---|---|
| gemini-3-flash-preview | ||||
| gemini-3.5-flash | – | |||
| gemini-3.6-flash | – | |||
| gemini-3.7-flash | – | |||
| gemini-3.8-flash |
Exact error from the Interactions stream:
{"event_type":"error","error":{"message":"The caller does not have permission","code":"permission_denied"}}
From generateContent:
{"code":403,"message":"The caller does not have permission","status":"PERMISSION_DENIED"}
Notes
- Same API key, same request body, only the model name changes between the passing and failing rows, so this is not a key restriction or a URL reachability issue.
- Text-only requests, inline base64, and Files API references all work on the failing models, so the regression is isolated to the external URL fetch path on 3.5+.
- This looks like the same symptom as 403 PERMISSION_DENIED on generateContent with file_data.file_uri since 2026-08-14, which was attributed to a server-side file-permission check regression, but now hitting external HTTPS URLs rather than Files API URIs.