Check which drops sold (batch)
API reference

Check which drops sold (batch)

Sale info for a batch of product ids — the polling half of sale tracking.

View as MarkdownUpdated Aug 19, 2026
POST/api/external/drops/check-status

Sale info for a batch of product ids — the polling half of sale tracking.

Poll it periodically (every few minutes is plenty) with the productIds you are tracking. Amounts are gross buyer-paid totals in cents.

Truncation, omission, refunds

At most 200 ids are processed per call — extras are dropped without an error, so chunk larger lists. Unsold and unknown ids are omitted from the response (only paid: true entries appear). And unlike earnings, this endpoint does NOT exclude refunded or charged-back orders — a refunded sale still reports paid. Reconcile against GET /api/external/earnings for net truth.

Authentication

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

Request body

Content type: application/json

NameTypeRequiredDescription
productIdsstring[]RequiredProduct ids to check (≤200 — extras silently dropped). Non-strings filtered out; an empty array returns {"sales":{}}.
Max items: 200
Check two drops
{
  "productIds": [
    "clxdr0p000001prod",
    "clxdr0p000002prod"
  ]
}

Responses

200Sales map — only sold products appear. Multiple paid orders on one product report the most recent.
NameTypeDescription
salesSalesMapproductId → most recent sale.
Show child attributes
{productId}objectKeyed by the product ids you sent. Unsold and unknown ids are OMITTED — only entries with paid:true come back. Multiple paid orders on one product report the most recent. Refunded/charged-back orders are NOT excluded here (unlike earnings) — cross-check GET /api/external/earnings for net truth.
Show child attributes
paidbooleanAlways true — unsold products simply do not appear.
saleAmountCentsintegerGross buyer-paid total in **cents** (order.totalCharged × 100).
buyerEmailstring | nullThe buyer’s email when known, else null.
Format: email
Example response
{
  "sales": {
    "clxdr0p000001prod": {
      "paid": true,
      "saleAmountCents": 2500,
      "buyerEmail": "[email protected]"
    }
  }
}

Errors

StatusBodyWhen
400{"error":"Invalid JSON body"}The body is not valid JSON.
401{"error":"Unauthorized","code":"unauthorized"}Missing or invalid API key.
500{"error":"Failed to check drop status"}Query failed — retry later.

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 -X POST "https://www.dropfans.io/api/external/drops/check-status" \
  -H "Authorization: Bearer $DROPFANS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "productIds": [
    "clxdr0p000001prod",
    "clxdr0p000002prod"
  ]
}'

Questions? [email protected]