Daily earnings per creator
One row per managed creator per day with revenue, across every account you may see stats for (`canViewStats`), in integer cents. Paged with a cursor.
/api/external/v1/agency/earningsalso served at /api/external/agency/earningsNewOne row per managed creator per day with revenue, across every account you may see stats for (canViewStats), in integer cents. Paged with a cursor.
Rows come ordered by date, then creatorId; days without revenue have no row. The figures match GET /api/external/v1/earnings/summary for that creator: refunds and chargebacks are left out, and days are whole local days in timezone. The agency’s own sales are not included — read those with the summary, without X-Dropfans-Account.
Keep startDate, endDate and timezone the same while you follow nextCursor.
Authentication
Send the creator's API key as a bearer token: Authorization: Bearer dpfn_…. See Authentication & API keys.
Needs the agency's own key, sent without X-Dropfans-Account.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
startDate | string | Optional | First local day (YYYY-MM-DD). Defaults to 29 days before endDate. At most 366 days per window.Format: date |
endDate | string | Optional | Last local day (YYYY-MM-DD), inclusive. Defaults to today in timezone.Format: date |
timezone | string | Optional | IANA timezone for the days. tz is accepted too; an unknown zone is a 400.Default: "UTC"Format: iana-timezone |
limit | integer | Optional | Rows per page. Default: 100Min: 1 Max: 500 |
cursor | string | Optional | nextCursor from the previous page. |
Responses
| Name | Type | Description | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
startDate | string | The window’s first day. Format: date | |||||||||||||||
endDate | string | The window’s last day (inclusive). Format: date | |||||||||||||||
timezone | string | The timezone used. | |||||||||||||||
currency | string | Always USD. | |||||||||||||||
data | object[] | Rows, by date then creatorId.Show child attributes
| |||||||||||||||
nextCursor | string | null | Pass as cursor for the next page; null on the last page. |
{
"startDate": "2026-10-01",
"endDate": "2026-10-31",
"timezone": "Europe/Stockholm",
"currency": "USD",
"data": [
{
"creatorId": "cmh4v2q8k0003xy9z7w6v5u4t",
"date": "2026-10-01",
"grossCents": 8200,
"netCents": 6560,
"count": 3
},
{
"creatorId": "cmh3k9p2a0002cd5e6f7g8h9j",
"date": "2026-10-01",
"grossCents": 4050,
"netCents": 3240,
"count": 2
}
],
"nextCursor": "MjAyNi0xMC0wMXxjbWg0djJxOGswMDAzeHk5ejd3NnY1dTR0"
}Errors
| Status | Body | When |
|---|---|---|
| 400 | {"error":"Agency endpoints act as the agency itself — send them without X-Dropfans-Account.","code":"account_header_not_allowed"} | The request carried `X-Dropfans-Account`. Agency endpoints always act as the agency. |
| 401 | {"error":"Unauthorized","code":"unauthorized"} | Missing or invalid API key. |
| 403 | {"error":"This endpoint needs a verified agency's own API key.","code":"agency_key_required"} | The key is not a verified agency’s own key — a creator’s key, or a key an agency minted for one of its creators. |
| 400 | {"error":"timezone must be an IANA timezone name, e.g. Europe/Stockholm","code":"invalid_timezone"} | Unknown `timezone`. |
| 400 | {"error":"startDate and endDate must be YYYY-MM-DD dates","code":"invalid_date"} | Malformed or impossible date. |
| 400 | {"error":"endDate must be on or after startDate","code":"invalid_date_range"} | `startDate` is after `endDate`. |
| 400 | {"error":"Date range too large — at most 366 days.","code":"range_too_large"} | The window is longer than 366 days. |
| 400 | {"error":"limit must be an integer from 1 to 500","code":"invalid_limit"} | Bad `limit`. |
| 400 | {"error":"Invalid cursor","code":"invalid_cursor"} | The cursor was not one we returned. |
| 400 | {"error":"This endpoint acts as the key’s own account or app — call it without /creators/{creatorId}.","code":"creator_scope_not_allowed"} | Called under /api/external/v1/creators/{creatorId}/ — this endpoint always acts as the key’s own account, agency or app. |
| 403 | {"error":"This app does not have the agency API category enabled. Contact support to enable it.","code":"api_category_disabled","category":"agency"} | Your app has the Agency roster [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/agency/earnings?startDate=2026-10-01&endDate=2026-10-31&timezone=Europe%2FStockholm" \
-H "Authorization: Bearer $DROPFANS_API_KEY"const res = await fetch(`https://www.dropfans.io/api/external/v1/agency/earnings?startDate=2026-10-01&endDate=2026-10-31&timezone=Europe%2FStockholm`, {
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/v1/agency/earnings",
headers={"Authorization": f"Bearer {os.environ['DROPFANS_API_KEY']}"},
params={"startDate": "2026-10-01", "endDate": "2026-10-31", "timezone": "Europe/Stockholm"},
)
print(res.json())Questions? [email protected]
