API reference
Get your app
Your app as we know it: name, logo, status, commission terms and which API categories are switched on. Always the app the key is bound to.
View as MarkdownUpdated Oct 30, 2026
GET
/api/external/v1/crm/appalso served at /api/external/crm/appNewYour app as we know it: name, logo, status, commission terms and which API categories are switched on. Always the app the key is bound to.
Authentication
Send the creator's API key as a bearer token: Authorization: Bearer dpfn_…. See Authentication & API keys.
Responses
200Your app.
| Name | Type | Description | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | string | Your app’s id. | ||||||||||||
name | string | App name, as creators see it. | ||||||||||||
logoUrl | string | null | App logo, or null. Format: uri | ||||||||||||
status | string | Always approved here: a suspended app’s keys get 403 app_suspended on every endpoint.One of: approved | ||||||||||||
commission | object | Your commission terms.Show child attributes
| ||||||||||||
apiCategories | ApiCategoryState[] | Your app’s API category switches: which parts of the API your keys may call (see /developers/concepts/api-categories). Added 2026-11-01.Show child attributes
|
Example response
{
"id": "clxap0001app",
"name": "Acme CRM",
"logoUrl": "https://cdn.example.com/acme/logo.png",
"status": "approved",
"commission": {
"rate": 0.05,
"types": [
"drop",
"tip",
"subscription"
]
},
"apiCategories": [
{
"id": "account",
"label": "Account",
"enabled": true,
"locked": true
},
{
"id": "payouts",
"label": "Payouts",
"enabled": false,
"locked": false
}
]
}Errors
| Status | Body | When |
|---|---|---|
| 401 | {"error":"Unauthorized","code":"unauthorized"} | Missing or invalid API key. |
| 403 | {"error":"This endpoint needs a key bound to an approved app.","code":"app_key_required"} | A Personal key was used. |
| 403 | {"error":"Use the app owner's key for this endpoint.","code":"owner_key_required"} | The key was minted by a creator for themselves. App-level calls need a key held by your app owner: their own, or one their agency minted for its personas or managed creators. |
| 400 | {"error":"This endpoint only acts as the key’s own account — send it without X-Dropfans-Account.","code":"account_header_not_allowed"} | `X-Dropfans-Account` was sent. These endpoints always answer for the key’s app. |
| 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 crm API category enabled. Contact support to enable it.","code":"api_category_disabled","category":"crm"} | Your app has the CRM dashboard [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/crm/app" \
-H "Authorization: Bearer $DROPFANS_API_KEY"const res = await fetch(`https://www.dropfans.io/api/external/v1/crm/app`, {
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/crm/app",
headers={"Authorization": f"Bearer {os.environ['DROPFANS_API_KEY']}"},
)
print(res.json())Questions? support@dropfans.io
