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.
/api/external/earnings/transactionsNewEvery 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/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.
An agency's own key can call this for a creator it manages by adding X-Dropfans-Account: <account id> (needs canViewStats). See Agencies.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
since | string | Optional | Only transactions paid at or after this time. Format: date-time |
until | string | Optional | Only transactions paid at or before this time. Format: date-time |
type | string | Optional | Comma-separated subset of drop,tip,subscription. Default: all three. |
includeReversed | boolean | Optional | Also return refunded and charged-back transactions. Default: false |
limit | integer | Optional | Page size. Default: 100Min: 1 Max: 200 |
cursor | string | Optional | nextCursor from the previous page. |
Responses
| Name | Type | Description | ||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
transactions | LedgerTransaction[] | Newest first.Show child attributes
| ||||||||||||||||||||||||||||||||||||||||||||||||
nextCursor | string | null | Pass as cursor for the next page; null on the last page. |
{
"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": "[email protected]",
"buyerName": null,
"paidAt": "2026-10-18T21:03:00.000Z",
"status": "paid"
}
],
"nextCursor": "MjAyNi0xMC0xOFQyMTowMzowMC4wMDBafGNseDByZDNyMDAwMDAxc2FsZQ"
}Errors
| Status | Body | When |
|---|---|---|
| 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. |
| 403 | {"error":"This key cannot act for that account.","code":"account_not_managed"} | `X-Dropfans-Account` names an account this key cannot act for: not an agency’s own key, no ACCEPTED management, or the agency or account 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"} | With `X-Dropfans-Account`: the agency lacks `canViewStats` on that account. |
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/earnings/transactions?since=2026-10-01T00%3A00%3A00Z&until=2026-10-31T23%3A59%3A59.999Z&type=drop%2Ctip" \
-H "Authorization: Bearer $DROPFANS_API_KEY"const res = await fetch(`https://www.dropfans.io/api/external/earnings/transactions?since=2026-10-01T00%3A00%3A00Z&until=2026-10-31T23%3A59%3A59.999Z&type=drop%2Ctip`, {
headers: {
Authorization: `Bearer ${process.env.DROPFANS_API_KEY}`,
},
});
console.log(await res.json());import os
import requests
res = requests.get(
"https://www.dropfans.io/api/external/earnings/transactions",
headers={"Authorization": f"Bearer {os.environ['DROPFANS_API_KEY']}"},
params={"since": "2026-10-01T00:00:00Z", "until": "2026-10-31T23:59:59.999Z", "type": "drop,tip"},
)
print(res.json())Questions? [email protected]
