transloadit/uppy · error · Error

Failed to get a media items

Error message

Failed to get a media items

What it means

Thrown while resolving the photos a user picked: a paginated GET of photospicker.googleapis.com/v1/mediaItems returned a non-OK response. It aborts resolution of the picked media items after the user has already made their selection in the Google Photos picker.

Source

Thrown at packages/@uppy/core/src/companion-client/googlePicker.ts:424

  accessToken,
  pickingSession,
  signal,
}: {
  accessToken: string
  pickingSession: PickingSession
  signal: AbortSignal
}) {
  const headers = getAuthHeader(accessToken)

  let pageToken: string | undefined
  let mediaItems: MediaItem[] = []
  do {
    const pageSize = 100
    const response = await fetch(
      `https://photospicker.googleapis.com/v1/mediaItems?${new URLSearchParams({ sessionId: pickingSession.id, pageSize: String(pageSize), ...(pageToken && { pageToken }) }).toString()}`,
      { headers, signal },
    )
    if (!response.ok) throw new Error('Failed to get a media items')
    const {
      mediaItems: batchMediaItems,
      nextPageToken,
    }: { mediaItems: MediaItem[]; nextPageToken?: string } =
      await response.json()
    pageToken = nextPageToken
    mediaItems.push(...batchMediaItems)
  } while (pageToken)

  // Filter out items that aren't fully processed or ready
  mediaItems = mediaItems.flatMap((i) =>
    i.type === 'PHOTO' ||
    (i.type === 'VIDEO' &&
      i.mediaFile.mediaFileMetadata.videoMetadata.processingStatus === 'READY')
      ? [i]
      : [],
  )

View on GitHub (pinned to 5d4dedd02a)

Solutions

  1. Retry the pick flow with a smaller selection
  2. Provide an onAccessTokenRequired handler that silently refreshes the token so pagination never uses a stale token
  3. Retry once after a short delay for transient failures
  4. Check quota in Google Cloud Console if 429s recur

Example fix

// before
const picker = uppy.getPlugin('GooglePicker')
await picker.showPicker() // large selection -> Failed to get a media items

// after
renderButton(uppy, {
  clientId: 'xxx',
  onAccessTokenRequired: async (pickerInstance) => {
    const token = await getFreshToken() // silent re-auth
    pickerInstance.setOAuthToken(token)
  },
})
Defensive patterns

Strategy: retry

Validate before calling

null

Type guard

function isMediaItemsError(e: unknown): boolean {
  return e instanceof Error && e.message === 'Failed to get a media items'
}

Try / catch

try { await picker.showPicker() }
catch (err) {
  if (isMediaItemsError(err)) {
    uppy.info('Could not load all picked photos. Please pick fewer items and retry.', 'error', 5000)
  }
}

Prevention

When it happens

Trigger: During pollPickingSession -> resolvePickedPhotos, any mediaItems page fetch failing (expired token mid-pagination, 429 quota, 5xx) throws this error.

Common situations: Large selections requiring many pages hit rate limits; long picker sessions let the access token expire before all pages are fetched; transient Google Photos Picker errors.

Related errors


AI-assisted analysis of transloadit/uppy@5d4dedd02a (2026-08-28). Data as JSON: /api/errors/d774135f5e7e9c83. Report an issue: GitHub.