Request a payout
API reference

Request a payout

Request a payout of the account's **full** available balance — exactly what "Pay out funds" does in the dashboard.

View as MarkdownUpdated Oct 30, 2026
POST/api/external/payouts/requestsNew

Request a payout of the account's full available balance — exactly what "Pay out funds" does in the dashboard.

One request is created per side (creator, agency, affiliate, share) that has money and no open request; each is reviewed and paid on its own. There is no amount: partial payouts are not possible.

Idempotency-Key header required (1–255 printable characters, e.g. a UUID per payout you intend). Sending the same key with the same body again returns the original requests (201, with Idempotent-Replayed: true) instead of a second payout; the same key with a different body is refused with 409 idempotency_conflict. Keys are scoped to the account and your app (or, for a personal key, that key), so another app can never replay or block yours. A second call with the same key while the first is still running gets 409 payout_busy; retry it and it replays the first one's answer. Retry network errors with the same key.

Checked in this order, each with its own code: ID check (kyc_required) → payouts enabled (payouts_disabled) → not a buyer account (consumer_account) → a default payout method (no_method) → the payout wallet activated if the method is a MassPay wallet (masspay_not_activated) → the minimum (below_minimum) → no open request (request_open) → no payout being sent (in_flight). GET /payouts/summary reports the same gates up front.

The key's own account only: X-Dropfans-Account is refused, and so is a key an agency minted for an account it manages (403 agency_key_not_allowed) — an agency can never request a payout for a creator it manages.

Dropfans-operated integrations only, for now

At launch this endpoint answers 403 first_party_only to every other app. The read endpoints of this group are open to every key.

Authentication

Send the creator's API key as a bearer token: Authorization: Bearer dpfn_…. See Authentication & API keys.

Request body

Content type: application/json — Optional — an empty body is fine.

NameTypeRequiredDescription
notestring | nullOptionalA note for the Dropfans team, shown with the request.
Max length: 500
With a note
{
  "note": "October"
}

Responses

201The requests created (or, on a replay, the original ones).
NameTypeDescription
requestsPayout[]One payout request per side that had money and no open request (kind request).
Show child attributes
idstringId of the row. Unique across the three kinds — use it with GET /api/external/payouts/{id}.
kindstringpayout: sent by Dropfans (Paxum, MassPay wallet load, or settled by an admin). manual: paid outside the platform and recorded by an admin. request: a payout request the account made that has not been fulfilled into a payout yet.
One of: payout, manual, request
statusstringRequests: requested → approved → (processing for Paxum, from the moment they are made) → paid, or rejected / cancelled. Payouts: pending (in a batch, not sent yet) → processing (sent) → paid or failed; cancelled when an attempt was dropped. Manual payouts are always paid.
One of: requested, approved, pending, processing, paid, failed, cancelled, rejected
amountCentsintegerInteger **cents**. What is paid out (negative only on a reversal row).
currencystringAlways "USD".
One of: USD
sidestringWhich balance it draws from: creator (own sales), agency (income from managed creators / AI personas), affiliate (referral commission), share (partner shares of other accounts’ sales), or combined (several sides in one transfer — see sides).
sidesobjectThe amount split by side, integer cents. Adds up to amountCents.
Show child attributes
creatorCentsintegerCreator side, cents.
agencyCentsintegerAgency side, cents.
affiliateCentsintegerReferral commission, cents.
shareCentsintegerPartner shares, cents.
methodobject | nullThe destination frozen when the payout or request was made, masked. Null for manual payouts.
Show child attributes
typestringProvider method type.
One of: PAXUM_P2P, MASSPAY, BANK_SWIFT
labelstringDisplay label — the creator’s nickname, or e.g. "Paxum · j***@example.com", "Payout wallet · SWE", "Bank transfer · ••••1234". Never a full e-mail, IBAN or token.
notestring | nullRequests: the note sent with the request. Manual payouts: the note the admin recorded for the payee. Otherwise null.
failureMessagestring | nullWhy a failed payout failed, as reported by the provider. Null unless status is failed.
invoiceNumberinteger | nullPayout invoice number once the invoice exists. The invoice itself is in the dashboard.
requestIdstring | nullkind payout / manual: the request this payout fulfilled, if any.
payoutIdstring | nullkind request: the payout or manual payout that fulfilled it, if any.
createdAtstringWhen the payout was created or the request made. The list is ordered by this.
Format: date-time
initiatedAtstring | nullWhen the payout was sent to the provider.
Format: date-time
paidAtstring | nullWhen it was paid. Null unless status is paid (requests carry it on the fulfilling payout instead).
Format: date-time
failedAtstring | nullWhen it failed. Null unless status is failed.
Format: date-time
reversedAtstring | nullSet on a paid wallet load that was sent back (spendback): the money is available again. Its negative twin has reversalOfId. Both are hidden from GET /payouts unless includeReversed=true.
Format: date-time
reversalOfIdstring | nullSet on the negative row that reverses the payout with this id.
Example response
{
  "requests": [
    {
      "id": "clxpr0001request",
      "kind": "request",
      "status": "requested",
      "amountCents": 34210,
      "currency": "USD",
      "side": "creator",
      "sides": {
        "creatorCents": 34210,
        "agencyCents": 0,
        "affiliateCents": 0,
        "shareCents": 0
      },
      "method": {
        "type": "MASSPAY",
        "label": "Payout wallet · SWE"
      },
      "note": "October",
      "failureMessage": null,
      "invoiceNumber": null,
      "requestId": null,
      "payoutId": null,
      "createdAt": "2026-10-30T09:12:00.000Z",
      "initiatedAt": null,
      "paidAt": null,
      "failedAt": null,
      "reversedAt": null,
      "reversalOfId": null
    }
  ]
}

Errors

StatusBodyWhen
400{"error":"Send an Idempotency-Key header (a unique value per payout request, e.g. a UUID).","code":"idempotency_key_required"}No `Idempotency-Key` header (`invalid_idempotency_key` when it is malformed).
400{"error":"note must be at most 500 characters","code":"invalid_note"}`note` is not a string or too long.
400{"error":"Invalid JSON body"}The body is not valid JSON.
400{"error":"Add a payout method before requesting a payout.","code":"no_method"}No default payout method.
400{"error":"Activate your payout wallet before requesting a payout.","code":"masspay_not_activated"}The default method is a MassPay wallet the payee has not activated yet.
400{"error":"Minimum payout is $20.00.","code":"below_minimum"}The available balance is below the account’s minimum (or not positive).
401{"error":"Unauthorized","code":"unauthorized"}Missing or invalid API key.
403{"error":"Verify your identity (KYC) before requesting a payout.","code":"kyc_required"}The account has not passed the ID check.
403{"error":"Payouts are not enabled on your account yet.","code":"payouts_disabled"}Dropfans has paused payouts for the account.
403{"error":"Payouts are not available for this account","code":"consumer_account"}A buyer account.
403{"error":"Payout requests need the account’s own key — a key an agency minted for a managed account cannot request or cancel payouts.","code":"agency_key_not_allowed"}The key was minted by an agency for an account it manages.
403{"error":"This endpoint is only available to Dropfans-operated integrations.","code":"first_party_only"}During launch, payout requests are open to Dropfans-operated integrations only.
409{"error":"You already have a payout request awaiting review.","code":"request_open"}Every side with money already has an open request.
409{"error":"A payout is already in progress. Try again once it has settled.","code":"in_flight"}A payout is pending or processing.
409{"error":"Another payout operation is running for this account. Try again in a moment.","code":"payout_busy"}Another payout operation holds the account’s payout lock (e.g. a concurrent request). Retry with the same key.
409{"error":"This Idempotency-Key was already used with a different request body.","code":"idempotency_conflict"}The key was used before with another body.
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` names another account. An agency can never request or cancel a payout for a creator it manages.

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 -X POST "https://www.dropfans.io/api/external/payouts/requests" \
  -H "Authorization: Bearer $DROPFANS_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"note":"October"}'

Questions? [email protected]