Get a media upload
API reference

Get a media upload

The session's status: which parts arrived, the vault item once completed, and its moderation status.

View as MarkdownUpdated Oct 31, 2026
GET/api/external/v1/media/uploads/{id}also served at /api/external/media/uploads/{id}New

The session's status: which parts arrived, the vault item once completed, and its moderation status.

Poll this after complete until moderationStatus leaves PENDING — every 15–30 seconds is plenty. Sessions are kept for 30 days.

Authentication

Send the creator's API key as a bearer token: Authorization: Bearer dpfn_…. See Authentication & API keys.

For a creator you manage or onboarded

GET /api/external/v1/creators/{creatorId}/media/uploads/{id} — an agency's own key for a creator or AI persona it manages (needs canManageVault), or your app owner's own key for an account your app onboarded. The X-Dropfans-Account header still works but is deprecated. See Acting for a creator.

Path parameters

NameTypeRequiredDescription
idstringRequiredThe upload id from POST /api/external/v1/media/uploads.

Responses

200The session.
NameTypeDescription
idstringUpload id.
kindstringWhat you are uploading.
One of: image, video, audio
statusstringuploading until you complete it; processing while a complete runs; completed once the vault item exists.
One of: uploading, processing, completed, failed, expired
fileNamestringThe file name, stored on the vault item.
contentTypestringThe stored content type.
sizeBytesintegerThe declared size.
folderIdstring | nullThe vault folder the item goes in.
partSizeinteger | nullImage / audio: bytes per part (the last part is the remainder). Null for video.
totalPartsinteger | nullImage / audio: number of parts. Null for video.
receivedPartsinteger[] | nullPart numbers received so far.
missingPartsinteger[] | nullPart numbers still to upload.
vaultItemIdstring | nullThe vault item, once completed.
moderationStatusstring | nullThe vault item’s moderation status, once completed.
One of: PENDING, APPROVED, FLAGGED, REJECTED
bunnyStreamIdstring | nullVideo: the Stream video id — poll [video-status](/developers/reference/video-status) with it.
errorobject | null{ code, message } when the upload failed or expired.
Show child attributes
codestringMachine-readable reason.
messagestring | nullHuman-readable reason.
expiresAtstringUpload the parts (or the tus bytes) and complete before this.
Format: date-time
createdAtstringWhen the session was opened.
Format: date-time
completedAtstring | nullWhen it completed.
Format: date-time
Example response
{
  "id": "mu_3f9c1a7be0d24c55a1e8b6f2",
  "kind": "image",
  "status": "completed",
  "fileName": "beach.jpg",
  "contentType": "image/jpeg",
  "sizeBytes": 7904267,
  "folderId": null,
  "partSize": 3145728,
  "totalParts": 3,
  "receivedParts": [
    1,
    2,
    3
  ],
  "missingParts": [],
  "vaultItemId": "clxv9z8y70003item",
  "moderationStatus": "PENDING",
  "bunnyStreamId": null,
  "error": null,
  "expiresAt": "2026-10-31T18:00:00.000Z",
  "createdAt": "2026-10-31T10:00:00.000Z",
  "completedAt": "2026-10-31T10:00:41.000Z"
}

Errors

StatusBodyWhen
401{"error":"Unauthorized","code":"unauthorized"}Missing or invalid API key.
404{"error":"Upload not found","code":"upload_not_found"}Unknown id, or an upload of another account.
400{"error":"X-Dropfans-Account must be an account id (from GET /api/external/agency/creators), not a username.","code":"invalid_account_header"}`X-Dropfans-Account` is not an account id.
400{"error":"X-Dropfans-Account names a different account than the path — send one or the other.","code":"account_mismatch"}Called under /v1/creators/{creatorId}/ with an `X-Dropfans-Account` naming another account.
403{"error":"This key cannot act for that account.","code":"account_not_managed"}The creator in the path (or `X-Dropfans-Account`) is one this key cannot act for: no ACCEPTED management by your agency and not an account your app onboarded (or it no longer holds a key bound to your app), a key minted for one creator, or someone is suspended, banned or deleted. An unknown id gets the same answer.
403{"error":"The agency does not have permission for this on that account.","code":"permission_denied","permission":"canManageVault"}For a managed creator: the agency lacks `canManageVault` on that account.
403{"error":"This app does not have the vault API category enabled. Contact support to enable it.","code":"api_category_disabled","category":"vault"}Your app has the Vault [API category](/developers/concepts/api-categories) switched off.

Rate limiting

Every response carries the X-RateLimit-Tier header and, on limited tiers, the per-minute and per-day trios — read X-RateLimit-Remaining and X-RateLimit-Reset instead of hardcoding limits. Details in Rate limits.

Code samples

curl "https://www.dropfans.io/api/external/v1/media/uploads/$VAULT_ITEM_ID" \
  -H "Authorization: Bearer $DROPFANS_API_KEY"

Questions? [email protected]