v1Resources/Media/getList stored Google photos

List stored Google photos

Returns stored Google photos across every location the key can access. Filter by locationId, clientId or kind and page with nextCursor. Stored only: it never calls Google or starts a sync. The top-level location is null only when locationId is not sent; with locationId it carries that location's coverage even when items is empty. Each item carries its own location and freshness. Synup's own media library by category is a separate read: GET /api/v1/media?locationId.

get/api/v1/media/google
media:read
Query parameters
locationIdstringoptional
Only photos at this location. Accepts the public loc_ id, the native id or a legacy id. It must belong to clientId when both are sent.
clientIdstringoptional
Only photos at locations owned by this client. The key must be allowed to access that client.
kindstring (owner | ugc)optional
owner for business-uploaded photos, ugc for customer-contributed photos. Omit for both.
limitintegeroptional
Page size, a whole number from 1 to 100. Default 50. Any other value is rejected, not clamped.
cursorstringoptional
The nextCursor from the previous page. It works only with the same filters; a cursor from a different request is rejected.
Response
dataobjectoptional
itemsarray of objectoptional
One item per photo and location association, newest first. A photo shared by several locations appears once for each location you can access.
idstringoptional
The stored photo record id. Shared by every location the photo is linked to, so key a row by associationKey.
associationKeystringoptional
Unique per photo and location: the id and the location id joined by a colon.
externalIdstringoptional
The full Google resource name. This is the photo's identity: the same URL with a different externalId is a different photo.
urlstringoptional
The Google-hosted URL. A reference to the photo on Google, not a copy stored by Synup. A photo pushed from Synup can keep its source URL until the next scheduled pull.
categorystringoptional
Google's own category for the photo, or null when Google gave none. Not the same as kind.
formatstringoptional
The media format as stored, for example PHOTO, or null.
kindstring (owner | ugc)optional
owner for a business-uploaded photo, ugc for a customer-contributed one.
lastSeenAtstringoptional
When a Google response last included this photo at this location, or null if unknown. A photo pushed after a scan started also counts as seen.
presencestring (seen_in_last_complete_scan | not_seen_in_last_complete_scan | unknown)optional
Whether the last complete scan saw this photo: seen_in_last_complete_scan, not_seen_in_last_complete_scan, or unknown when there is no complete scan yet. It records what was observed and never means Google deleted the photo.
moderationobjectoptional
Review state of the photo.
statusstring (ok | needs_review | spam | skipped)optional
ok, needs_review, spam or skipped; null when not classified. Photos marked spam or needs_review are still returned, never filtered out.
locationobjectoptional
The location this photo is linked to.
idstringoptional
The location's public id.
namestringoptional
The location's name, or null.
clientIdstringoptional
The client that owns the location, or null for a location with no client.
freshnessobjectoptional
How recent and how complete the stored data is for this photo's kind at this location. Null fields mean unknown or never attempted, never complete.
coveragestring (complete | partial | unavailable)optional
complete, partial or unavailable; null when no refresh has been attempted.
outcomestring (complete | incomplete | unavailable | failed | not_connected)optional
Result of the latest refresh attempt: complete, incomplete, unavailable, failed or not_connected.
lastAttemptAtstringoptional
When the latest refresh was attempted.
lastSuccessAtstringoptional
When the last refresh that finished complete ran.
completedScanAtstringoptional
When the last complete scan started. presence compares lastSeenAt with this instant.
locationobjectoptional
Present on a single-location read, even when items is empty: the location with its owner and UGC freshness. null on the collection route without locationId.
idstringoptional
The location's public id.
namestringoptional
The location's name, or null.
clientIdstringoptional
The client that owns the location, or null for a location with no client.
ownerobjectoptional
How recent and how complete the stored data is for this photo's kind at this location. Null fields mean unknown or never attempted, never complete.
coveragestring (complete | partial | unavailable)optional
complete, partial or unavailable; null when no refresh has been attempted.
outcomestring (complete | incomplete | unavailable | failed | not_connected)optional
Result of the latest refresh attempt: complete, incomplete, unavailable, failed or not_connected.
lastAttemptAtstringoptional
When the latest refresh was attempted.
lastSuccessAtstringoptional
When the last refresh that finished complete ran.
completedScanAtstringoptional
When the last complete scan started. presence compares lastSeenAt with this instant.
ugcobjectoptional
How recent and how complete the stored data is for this photo's kind at this location. Null fields mean unknown or never attempted, never complete.
coveragestring (complete | partial | unavailable)optional
complete, partial or unavailable; null when no refresh has been attempted.
outcomestring (complete | incomplete | unavailable | failed | not_connected)optional
Result of the latest refresh attempt: complete, incomplete, unavailable, failed or not_connected.
lastAttemptAtstringoptional
When the latest refresh was attempted.
lastSuccessAtstringoptional
When the last refresh that finished complete ran.
completedScanAtstringoptional
When the last complete scan started. presence compares lastSeenAt with this instant.
limitintegeroptional
The page size applied.
nextCursorstringoptional
Pass it as cursor to get the next page. null when there are no more.
Errors
400limit, kind, a filter or the cursor is invalid, a parameter was repeated, or the location does not belong to the clientId sent. The code field names the cause.
401Missing, invalid, expired, or revoked API key.
403The key is not authorized for that client or location. A location with no client is visible to agency-wide keys only.
404The location was not found in this agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/media/google
Your API key
locationId
clientId
kind
limit
cursor
{
  "data": {
    "items": [
      {
        "id": "4c7a1e90-2b6d-4d8f-9e35-71f0a8c2d413",
        "associationKey": "4c7a1e90-2b6d-4d8f-9e35-71f0a8c2d413:loc_789",
        "externalId": "accounts/102938475610293847561/locations/7788990011223344556/media/AF1QipOwnerSign03",
        "url": "https://lh3.googleusercontent.com/p/AF1QipOwnerSign03",
        "category": "EXTERIOR",
        "format": "PHOTO",
        "kind": "owner",
        "lastSeenAt": "2026-10-12T04:01:58.000Z",
        "presence": "seen_in_last_complete_scan",
        "moderation": {
          "status": null
        },
        "location": {
          "id": "loc_789",
          "name": "Acme Dental — Uptown",
          "clientId": "cli_123"
        },
        "freshness": {
          "coverage": "complete",
          "outcome": "complete",
          "lastAttemptAt": "2026-10-12T04:02:11.000Z",
          "lastSuccessAt": "2026-10-12T04:02:11.000Z",
          "completedScanAt": "2026-10-12T04:01:58.000Z"
        }
      }
    ],
    "location": null,
    "limit": 50,
    "nextCursor": null
  }
}

Guides that use this endpoint