Home / Google
Google Photos Library API (append-only upload)
developers.google.com/photos/library/guides/upload-mediaMediastorage/google-photos-library-apiJSONcomparereport an errorprovider JSON
- Free allowance
- No quota of its own — but every item uploaded counts against the user's Google Account storage at original quality.
- Verdict
- fails: quotathe free allowance is too small to matter
- Cost
- free tier
- Identity
- institutionno card, no phone
- Binding limit
- noneno named constraint binds
- Evidence
- reported2 sources; a third party said so
- Freshness
- stale on 2026-11-05checked 2026-10-21 (inherited); stale on 2026-11-05
| Free tier | No quota of its own — but every item uploaded counts against the user's Google Account storage at original quality. 200 MB max per photo, 20 GB max per video. unit GB; metered on stored-bytes |
|---|
| Price | none stated |
|---|
| Identity | institution not published |
|---|
| Egress | Media bytes served via baseUrl, 75,000 requests/project/day; no documented per-GB charge but the underlying storage is metered. |
|---|
| Per-object cap | not stated |
|---|
| Retention | not stated |
|---|
| Interface | rest, rclone rest |
|---|
| Tooling | Photos Library API (photoslibrary.appendonly scope), uploads endpoint + batchCreate; no rclone backend. Unofficial wrappers are thin. |
|---|
| Composes with | 20 GB per video x N videos is the only interesting shape, but it does NOT escape the 15 GB account quota — this is billing-avoidance-free. Not a multiplier, a quota consumption path. |
|---|
| Reliability | API uploads skip the 'Storage saver' free-compression path, so they consume quota fastest of any Google surface. Strictly worse than Drive for bulk data. |
|---|
Evidence 2
More fields 1
{
"dead_end": {
"failure_class": "quota",
"why": "No quota of its own — but every item uploaded counts against the user's Google Account storage at original quality. 200 MB max per photo, 20 GB max per video.",
"retry_when": null,
"first_recorded": "2026-10-21"
}
}Unknown values 6
$.binding_note boilerplate$.identity_cost.detail boilerplate$.per_object_cap.notes the field may be stated in a source that was not read$.per_object_cap.stated the field may be stated in a source that was not read$.retention.notes the field may be stated in a source that was not read$.retention.stated the field may be stated in a source that was not read