Full transaction ledger (paginated, net per transaction)
API reference

Full transaction ledger (paginated, net per transaction)

Every drop sale, tip and subscription payment of the key's account, newest first, with net, gross, platform fee and VAT per transaction. No cap — follow `nextCursor` until it is null.

View as MarkdownUpdated Oct 28, 2026
GET/api/external/v1/earnings/transactionsalso served at /api/external/earnings/transactionsNew

Every drop sale, tip and subscription payment of the key's account, newest first, with net, gross, platform fee and VAT per transaction. No cap — follow nextCursor until it is null.

Same sources and filters as GET /api/external/v1/earnings: refunds and chargebacks are left out, so the netAmountCents of a window's pages add up to its stats.totalEarningsCents (pass the same window as since / until instants). Pass includeReversed=true to also get refunded and charged-back transactions, with their status.

Keep since, until, type and includeReversed the same while you follow a cursor.

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}/earnings/transactions — an agency's own key for a creator or AI persona it manages (needs canViewStats), 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.

Query parameters

NameTypeRequiredDescription
sincestringOptionalOnly transactions paid at or after this time.
Format: date-time
untilstringOptionalOnly transactions paid at or before this time.
Format: date-time
typestringOptionalComma-separated subset of drop,tip,subscription. Default: all three.
includeReversedbooleanOptionalAlso return refunded and charged-back transactions.
Default: false
limitintegerOptionalPage size.
Default: 100
Min: 1
Max: 200
cursorstringOptionalnextCursor from the previous page.

Responses

200A page of transactions. All money in cents.
NameTypeDescription
transactionsLedgerTransaction[]Newest first.
Show child attributes
idstringThe order / tip / renewal id. Unique per transaction — dedupe on it.
typestringRevenue source.
One of: drop, tip, subscription
productIdstring | nullThe sold drop — drops only, null on tips and subscriptions.
productNamestringDrop name, or the literal "Tip" / "Subscription".
externalRefstring | nullYour per-fan reference from the checkout or tip link, when there was one.
linkIdstring | nullThe link id (POST /api/external/v1/links) the sale came through; null for template links and subscriptions.
amountCentsintegerNET seller earnings in cents — the same number /earnings calls amountCents.
netAmountCentsintegerSame as amountCents: what the creator keeps (after the platform fee and VAT; before any agency split).
grossAmountCentsintegerSeller gross in cents (buyer-paid minus VAT, before the fee).
platformFeeCentsintegerPlatform fee in cents.
taxCentsintegerVAT in cents.
totalChargedCentsintegerWhat the buyer paid in cents (VAT included).
currencystringAlways USD.
One of: USD
buyerEmailstring | nullBuyer email when known.
Format: email
buyerNamestring | nullBuyer display name — tips and subscriptions only.
paidAtstringWhen it was paid (UTC).
Format: date-time
statusstringAlways "paid" unless includeReversed=true.
One of: paid, refunded, charged_back
nextCursorstring | nullPass as cursor for the next page; null on the last page.
Example response
{
  "transactions": [
    {
      "id": "clx0rd3r000001sale",
      "type": "drop",
      "productId": "clxdr0p000001prod",
      "productName": "Beach set — 6 photos",
      "externalRef": "tg_48213377",
      "amountCents": 2000,
      "netAmountCents": 2000,
      "grossAmountCents": 2500,
      "platformFeeCents": 500,
      "taxCents": 250,
      "totalChargedCents": 2750,
      "currency": "USD",
      "buyerEmail": "buyer@example.com",
      "buyerName": null,
      "paidAt": "2026-10-18T21:03:00.000Z",
      "status": "paid"
    }
  ],
  "nextCursor": "MjAyNi0xMC0xOFQyMTowMzowMC4wMDBafGNseDByZDNyMDAwMDAxc2FsZQ"
}

Errors

StatusBodyWhen
400{"error":"since must be an ISO date"}Unparseable `since` (or `until`).
400{"error":"type must be a comma-separated subset of drop,tip,subscription"}Unknown type.
400{"error":"Invalid cursor"}The cursor was not one we returned.
401{"error":"Unauthorized","code":"unauthorized"}Missing or invalid API key.
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":"canViewStats"}For a managed creator: the agency lacks `canViewStats` on that account.
403{"error":"This app does not have the earnings API category enabled. Contact support to enable it.","code":"api_category_disabled","category":"earnings"}Your app has the Earnings & balance [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/earnings/transactions?since=2026-10-01T00%3A00%3A00Z&until=2026-10-31T23%3A59%3A59.999Z&type=drop%2Ctip" \
  -H "Authorization: Bearer $DROPFANS_API_KEY"

Questions? support@dropfans.io