External URL file inputs still fail on Gemini 3.5+ (now 403 PERMISSION_DENIED, was 429) after the Sep 4 "fixed" post

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/genai 2.18.0) and models/{model}:generateContent with file_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 :white_check_mark: works :white_check_mark: works :white_check_mark: works :white_check_mark: works
gemini-3.5-flash :cross_mark: 403 permission_denied :cross_mark: 403 permission_denied :white_check_mark: works –
gemini-3.6-flash :cross_mark: 403 permission_denied :cross_mark: 403 permission_denied :white_check_mark: works –
gemini-3.7-flash :cross_mark: 403 permission_denied :cross_mark: 403 permission_denied :white_check_mark: works –
gemini-3.8-flash :cross_mark: 403 permission_denied :cross_mark: 403 permission_denied :white_check_mark: works :white_check_mark: works

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.

Hello @Henrique_Inonhe ,

External URL fetching in file_data.file_uri and the Interactions API is now supported and available across Gemini 3.5+ models for files up to 15 MB.

For files larger than 15 MB, please upload them via the Gemini Files API.

Please retry your request and let us know if the issue persists.

Thanks, this was preventing us from upgrading.

I did some thorough testing on my side and it worked in every case.

Hi @Sai_Deepika_K, thanks for the fix.

I’d like to clarify the size limit, because it differs from the official documentation.

Your reply says external URL fetching works “for files up to 15 MB”, while the File input methods page (last updated 2026-09-23) lists 100 MB per
request/payload
for External URLs and does not mention 15 MB.

Could you clarify the following?

  1. Which limit is correct for external URLs on Gemini 3.5+ — 15 MB or 100 MB?
  2. Or do both apply — i.e. 100 MB for the total of all files in one request, and 15 MB for each individual file?
  3. Has the 15 MB per-file limit always existed, or was it introduced with the recent fix for the 403 PERMISSION_DENIED issue?
  4. Does the limit differ by MIME type (e.g. application/pdf vs image/*) or by model (e.g. gemini-3-flash-preview vs Gemini 3.5+)?
  5. What error (HTTP status / error status) is returned when a file exceeds the limit? We would like to handle it explicitly and fall back to the Files API.

In any case, it would be very helpful if the documentation could be updated to match the actual behavior, since we size our upload limits based on it.

Thanks!

Hello @take ,

Thanks for flagging! We’ve updated the File input methods page to show the correct limit which is 15MB for external URLs. For files larger than 15MB, please upload with the Files API.