Get GDPR export status
Me
Get GDPR export status
Poll an export job by id. Returns a freshly minted 24h signed download URL once the worker reaches READY.
GET
Get GDPR export status
Overview
Polls a singlegdpr_export_jobs row by id. Used by clients that want to show a “your data is being prepared” UI between export request and the email arriving.
When the job reaches READY and the row has not yet expired (expiresAt > now), the endpoint mints a fresh 24h signed download URL on every call — so a user who lost the original email link can still download via this endpoint as long as the underlying row is alive.
The signed URL TTL is 24 hours. The email link uses the same TTL — but since the URL is re-minted on every poll, the practical download window for the user is as long as the
gdpr_export_jobs row exists (up to 30 days, then it’s cleaned up by gdpr-erasure along with the underlying S3 object).Authentication
Bearer <accessToken> (user scope) required. The route also gates on requireOnboarded. The job is scoped to the authenticated user — calling with another user’s jobId returns 404 NOT_FOUND (enumeration-safe — we never reveal that the job belongs to someone else).
Path parameters
| Field | Type | Required | Notes | Example |
|---|---|---|---|---|
jobId | string | yes | Returned by GET /me/export. | 665b1c8d9c2b0a0001a4f701 |
Query parameters
None.Request body
None — this is aGET.
Response — 200 OK
| Field | Type | Notes |
|---|---|---|
jobId | string | Echo of path param. |
status | string | One of PENDING, PROCESSING, READY, FAILED, EXPIRED. |
requestedAt | string (ISO 8601) | When the user pressed the button. |
completedAt | string | null | When the worker finished. Present for READY, FAILED, and EXPIRED. |
downloadUrl | string | null | A freshly-minted 24h signed S3 URL. Only present when status === 'READY' and the row has not expired. Null otherwise. |
expiresAt | string | null | When the underlying gdpr_export_jobs row will be considered EXPIRED (and its S3 object eligible for cleanup). Present for READY. |
Example — PENDING
Example — READY
Example — FAILED
Error responses
| Status | Code | Meaning |
|---|---|---|
| 400 | VALIDATION_FAILED | jobId missing or malformed path segment. |
| 401 | UNAUTHENTICATED | Missing / malformed / expired token. |
| 403 | ONBOARDING_INCOMPLETE | The caller has not finished onboarding. |
| 404 | NOT_FOUND | No job exists with that id for this user. Other users’ jobs are returned as 404 — enumeration-safe. |
Example error — 404 NOT_FOUND
Polling guidance
The export worker typically completes in seconds for a fresh account, up to a minute for a heavily-active user. Suggested client polling:- Initial wait: 2 seconds.
- Then poll every 5 seconds until
status === 'READY'orstatus === 'FAILED'. - Stop polling after 5 minutes — show the user “we’ll email you when it’s ready” and rely on the email.
READY with a one-shot 24h link, so a user who closes the page still receives their data.
See also
- Request export — kick off the job.
- GDPR data lifecycle — what’s in the ZIP, retention of the underlying object.
- Delete account — right-to-erasure counterpart.
curl
Postman
Seedocs/postman/swappr.postman_collection.json → Me → Export Status.