transloadit/uppy · error · Error

Failed to get session

Error message

Failed to get session

What it means

Thrown inside pollPickingSession when the periodic GET to photospicker.googleapis.com/v1/sessions/{id} returns non-OK. This poll is what detects when the user finishes picking photos in the Google-side UI; a failure here breaks the polling loop.

Source

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

        setTimeout(() => {
          signal.removeEventListener('abort', reject)
          resolve()
        }, interval * 1000)
        signal.addEventListener('abort', reject, { once: true })
      })

      const accessToken = getAccessToken()
      pickingSession = getPickingSession()

      if (pickingSession != null && accessToken != null) {
        const headers = getAuthHeader(accessToken)

        // https://developers.google.com/photos/picker/reference/rest/v1/sessions
        const response = await fetch(
          `https://photospicker.googleapis.com/v1/sessions/${encodeURIComponent(pickingSession.id)}`,
          { headers, signal },
        )
        if (!response.ok) throw new Error('Failed to get session')
        const json: PickingSession = await response.json()
        if (json.mediaItemsSet) {
          // console.log('User picked!', json)
          const resolvedPhotos = await resolvePickedPhotos({
            accessToken,
            pickingSession,
            signal,
          })
          onPickingSessionClear()
          onFilesPicked(resolvedPhotos, accessToken)
        }
        if (pickingSession.pollingConfig.timeoutIn === '0s') {
          onPickingSessionClear()
        }
      }
    } catch (err) {
      if (err instanceof Error && err.name === 'AbortError') {
        return

View on GitHub (pinned to 5d4dedd02a)

Solutions

  1. Restart the picker flow (a fresh session is created) when this error surfaces
  2. Provide onAccessTokenRequired to keep the token fresh during long picking sessions
  3. Catch the error around showPicker and show a user-facing 'please try again' message
  4. Check the network tab for the exact status (404=session expired, 401=token, 429=quota)

Example fix

// before
await picker.showPicker() // session poll 404 after idle -> Failed to get session

// after
try { await picker.showPicker() }
catch (err) {
  if (err.message === 'Failed to get session') {
    uppy.info('Photo picking timed out. Please try again.', 'error', 5000)
  }
}
Defensive patterns

Strategy: try-catch

Validate before calling

null

Type guard

function isGetSessionError(e: unknown): boolean {
  return e instanceof Error && e.message === 'Failed to get session'
}

Try / catch

try { await picker.showPicker() }
catch (err) {
  if (isGetSessionError(err)) {
    uppy.info('Photo picking timed out. Please try again.', 'error', 5000)
  }
}

Prevention

When it happens

Trigger: Starting the photos picker (init -> pollPickingSession) and any subsequent poll of the session endpoint failing — invalid session id (expired/already consumed), token revoked, 429/5xx from Google.

Common situations: User takes too long and the picking session expires server-side; token revoked by the user mid-flow; network interruption during polling; polling rate hitting quota.

Related errors


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