Sell a drop end-to-end
Guides

Sell a drop end-to-end

From approved vault items to a paid sale: create the drop, share the link, poll for the sale, read the earnings.

View as MarkdownUpdated Aug 19, 2026

A drop is a paid media bundle with a checkout page. This guide walks the whole loop: pick content → create the drop → share the link → learn about the sale.

1. Pick approved vault items#

Only APPROVED items can go into a drop. The default vault listing returns approved items only, so anything it gives you is usable:

curl "https://www.dropfans.io/api/external/vault?limit=10" \
  -H "Authorization: Bearer $DROPFANS_API_KEY"

Need to upload first? See Upload media.

2. Create the drop#

Price is USD dollars: 0 for free, otherwise $5–$750. At most 10 vault items per drop.

curl -X POST "https://www.dropfans.io/api/external/drops" \
  -H "Authorization: Bearer $DROPFANS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Beach set", "price": 15, "vaultItemIds": ["VAULT_ITEM_A", "VAULT_ITEM_B"] }'
description is accepted, validated — and not stored

POST /drops validates a description field for prohibited words but deliberately does not persist it. Do not build UI that expects it back.

A drop built from approved items is born APPROVED. Read it back any time with GET /drops/{id} — it returns the status, per-item moderation, salesCount and lastSaleAt:

curl "https://www.dropfans.io/api/external/drops/PRODUCT_ID" \
  -H "Authorization: Bearer $DROPFANS_API_KEY"

3. Optional: attach blurred previews#

If your product bakes its own teaser blur, attach a JPEG preview per media item (≤ 8 MB each) so the checkout page shows your blur instead of the default:

curl -X POST "https://www.dropfans.io/api/external/drops/PRODUCT_ID/previews" \
  -H "Authorization: Bearer $DROPFANS_API_KEY" \
  -F "previewBlob_VAULT_ITEM_A=@teaser_a.jpg;type=image/jpeg" \
  -F "blurMeta_VAULT_ITEM_A=partial"

The response is { "success": true, "updated": n } — compare updated with the number you sent; non-JPEG or oversized parts are skipped silently.

  • Web: the buyUrl from the create response — https://www.dropfans.io/buy/<productId>.
  • Telegram: take telegram.buyTemplate from GET /links and substitute the product id — it opens the Dropfans Mini App straight on the checkout. When telegram is null the bot is not configured; fall back to the web URL. See Links & deep links.

5. Poll for the sale#

POST /drops/check-status takes up to 200 product ids and returns a map of the ones that sold:

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": ["PRODUCT_ID"] }'

Cadence: check on demand (when the buyer says "paid") plus a periodic sweep every 1–5 minutes over your open drops, chunked at 200 ids. Unsold ids are omitted from the map — absence means "not sold yet", not an error.

check-status does not know about refunds

A refunded sale still reports paid: true here. For money truth, reconcile against GET /earnings, which excludes refunds and chargebacks.

6. Read the money#

saleAmountCents is the gross charge in cents. Net (what the creator keeps), per-type totals and the transaction log live on GET /earnings — see Earnings & balance.

Next: Links & deep links or Earnings & balance.

Questions? [email protected]