Read back a drop
One drop you created: price, moderation status (overall and per media item), checkout URL, whether previews are attached, and a sales summary.
/api/external/drops/{id}NewOne drop you created: price, moderation status (overall and per media item), checkout URL, whether previews are attached, and a sales summary.
salesCount counts paid orders excluding refunds and chargebacks — stricter than check-status, which does not exclude them. Use this endpoint to verify a drop went APPROVED before attaching it to a post, and to see which media items still lack a baked preview.
Authentication
Send the creator's API key as a bearer token: Authorization: Bearer dpfn_…. See Authentication & API keys.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Required | The product (drop) id from create-drop. |
Responses
| Name | Type | Description | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | string | The product (drop) id. | |||||||||||||||
name | string | null | Drop title. Null when created without a name. | |||||||||||||||
price | number | USD **dollars**. 0 means free. | |||||||||||||||
currency | string | Always "USD". One of: USD | |||||||||||||||
status | string | The drop’s overall moderation status. A drop built from already-APPROVED vault items is APPROVED at creation. One of: PENDING, APPROVED, REJECTED, FLAGGED | |||||||||||||||
moderationReason | string | null | Why the drop was rejected or flagged. Null otherwise. | |||||||||||||||
buyUrl | string | The web checkout page for this drop. Format: uri | |||||||||||||||
allowDownload | boolean | Whether buyers may download the files after purchase. | |||||||||||||||
mediaCount | integer | Number of media items attached. | |||||||||||||||
media | object[] | Attached media in display order.Show child attributes
| |||||||||||||||
salesCount | integer | Paid orders, excluding refunds and chargebacks (stricter than check-status, which does NOT exclude refunds). | |||||||||||||||
lastSaleAt | string | null | When the newest counted sale was paid. Null when never sold. Format: date-time | |||||||||||||||
createdAt | string | Creation time. Format: date-time |
{
"id": "clxdr0p000001prod",
"name": "Beach set — 6 photos",
"price": 25,
"currency": "USD",
"status": "APPROVED",
"moderationReason": null,
"buyUrl": "https://www.dropfans.io/buy/clxdr0p000001prod",
"allowDownload": true,
"mediaCount": 3,
"media": [
{
"vaultItemId": "clxv1a2b30001item",
"order": 0,
"fileType": "image",
"moderationStatus": "APPROVED",
"hasPreview": true
},
{
"vaultItemId": "clxv1a2b30002item",
"order": 1,
"fileType": "image",
"moderationStatus": "APPROVED",
"hasPreview": true
},
{
"vaultItemId": "clxv1a2b30003item",
"order": 2,
"fileType": "video",
"moderationStatus": "APPROVED",
"hasPreview": false
}
],
"salesCount": 2,
"lastSaleAt": "2026-08-18T21:03:00.000Z",
"createdAt": "2026-08-15T09:00:00.000Z"
}Errors
| Status | Body | When |
|---|---|---|
| 401 | {"error":"Unauthorized","code":"unauthorized"} | Missing or invalid API key. |
| 404 | {"error":"Drop not found"} | No such drop on this account (another creator’s drop also 404s — never 403). |
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/drops/$PRODUCT_ID" \
-H "Authorization: Bearer $DROPFANS_API_KEY"const productId = '…'; // from an earlier response
const res = await fetch(`https://www.dropfans.io/api/external/drops/${productId}`, {
headers: {
Authorization: `Bearer ${process.env.DROPFANS_API_KEY}`,
},
});
console.log(await res.json());import os
import requests
product_id = "…" # from an earlier response
res = requests.get(
f"https://www.dropfans.io/api/external/drops/{product_id}",
headers={"Authorization": f"Bearer {os.environ['DROPFANS_API_KEY']}"},
)
print(res.json())Questions? [email protected]
