Set up the MassPay wallet
API reference

Set up the MassPay wallet

Set up the account's MassPay payout wallet from the same profile the dashboard's setup form collects, and make it the default payout method.

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

Set up the account's MassPay payout wallet from the same profile the dashboard's setup form collects, and make it the default payout method.

Required: firstName, lastName, email, country, address1, city, stateProvince, postalCode, plus businessName when accountType is BUSINESS. Optional: middleName, mobileNumber, language, dateOfBirth, address2. Enter everything as on the payee's government-issued ID. Every field is checked before anything is sent to MassPay; a refused profile answers 400 invalid_profile naming the first bad field, with all of them in errors.

  • No payee yet → the payee is created at MassPay with the full profile (201).
  • Payee exists but lacks required details (see missingFields on GET /payouts/masspay/profile) → the fields you send fill them in. country, email and businessName stay as MassPay has them; send at least the missing fields.
  • Payee complete → the body is not needed; the wallet is (re)attached.

Activation: before the first payout to the wallet, the payee must open activationUrl once in a browser (a MassPay requirement). The link expires — get a fresh one from GET /payouts/masspay/activation when you send the payee there. Payout requests to a wallet that is not activated are refused (masspay_not_activated).

Safe to retry: there is one MassPay payee and one wallet per account. The key's own account only, after the ID check.

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 — The payout profile. Optional when the payee already exists and is complete.

NameTypeRequiredDescription
accountTypestringOptionalWho the payee is. BUSINESS makes businessName required; the person fields are then the authorized representative’s.
One of: INDIVIDUAL, BUSINESS
Default: "INDIVIDUAL"
businessNamestringOptional**Required when accountType is BUSINESS.** The company’s registered legal name. Its presence is what makes the payee a business account at MassPay; the person fields are then the authorized representative’s. Cannot be changed once set.
Max length: 150
firstNamestringRequiredAs on the government-issued ID.
Max length: 100
middleNamestringOptionalOptional. As on the ID.
Max length: 100
lastNamestringRequiredAs on the ID.
Max length: 100
emailstringRequiredMust not be used by another MassPay account.
Format: email
Max length: 254
mobileNumberstringOptionalOptional. With country code; 7–15 digits once spaces and symbols are removed.
Max length: 32
languagestringOptionalOptional. ISO 639-1 code for MassPay’s e-mails and portal (default "en").
Max length: 2
dateOfBirthstringOptionalOptional. YYYY-MM-DD, a real date; the payee must be at least 18.
Format: date
Max length: 10
countrystringRequiredISO 3166-1 alpha-3 country of residence.
Max length: 3
address1stringRequiredStreet address.
Max length: 150
address2stringOptionalOptional. Apartment, suite, c/o.
Max length: 150
citystringRequiredCity.
Max length: 100
stateProvincestringRequiredState, province, county or region.
Max length: 100
postalCodestringRequiredPostal / ZIP code.
Max length: 20
An individual
{
  "accountType": "INDIVIDUAL",
  "firstName": "Jane",
  "lastName": "Doe",
  "email": "[email protected]",
  "country": "SWE",
  "address1": "Storgatan 1",
  "city": "Stockholm",
  "stateProvince": "Stockholm County",
  "postalCode": "111 22",
  "dateOfBirth": "1994-05-17",
  "language": "sv"
}
Completing an existing payee
{
  "address1": "Storgatan 1",
  "city": "Stockholm",
  "stateProvince": "Stockholm County",
  "postalCode": "111 22"
}

Responses

201The wallet was attached (201 when the wallet method was created, 200 when an existing one was re-attached).
NameTypeDescription
methodPayoutMethodSummaryThe wallet method, now the default.
Show child attributes
idstringPayout method id.
typestringProvider method type.
One of: PAXUM_P2P, MASSPAY, BANK_SWIFT
isDefaultbooleanTrue for the method payouts go to.
nicknamestring | nullThe creator’s own label for it.
labelstringDisplay label, masked (see Payout.method.label).
holderTypestring | nullWhether it was set up for the person or the company.
One of: INDIVIDUAL, BUSINESS
createdAtstringWhen the method was added.
Format: date-time
paxumobject | nullPAXUM_P2P only.
Show child attributes
emailstring | nullMasked Paxum e-mail, e.g. "j***@example.com".
lookupStatusstring | nullWhether the e-mail is a live Paxum account: active, inactive, not_found, unconfigured.
verificationStatusstring | nullPaxum identity match against the ID check: PENDING, COMPLETED, MISMATCH, UNAVAILABLE.
masspayobject | nullMASSPAY (payout wallet) only.
Show child attributes
countrystring | nullISO 3166-1 alpha-3 country.
currencystring | nullPayout currency (ISO 4217), when chosen.
payerNamestring | nullPayout option name, when chosen.
activatedbooleanTrue once the payee finished the wallet activation. Payout requests to a wallet need it.
bankobject | nullBANK_SWIFT only.
Show child attributes
last4string | nullLast 4 characters of the account number. The full IBAN / SWIFT is never returned.
countrystring | nullBank country (ISO alpha-2).
bankNamestring | nullBank name.
activationUrlstring | nullWhere the payee activates the wallet (once, in a browser). Null when already activated. Expires.
Format: uri
createdbooleanTrue when the MassPay payee was created by this call.
completedbooleanTrue when missing profile fields were filled in at MassPay by this call.
Example response
{
  "method": {
    "id": "clxpm0001method",
    "type": "MASSPAY",
    "isDefault": true,
    "nickname": null,
    "label": "Payout wallet · SWE",
    "holderType": "INDIVIDUAL",
    "createdAt": "2026-10-30T10:00:00.000Z",
    "paxum": null,
    "masspay": {
      "country": "SWE",
      "currency": null,
      "payerName": null,
      "activated": false
    },
    "bank": null
  },
  "activationUrl": "https://payee.masspay.io/activate/…",
  "created": true,
  "completed": false
}

Errors

StatusBodyWhen
400{"error":"City is required.","code":"invalid_profile","field":"city","errors":[{"field":"city","code":"required","message":"City is required."}]}A field is missing or invalid. Codes in `errors`: required, too_long, invalid_type, invalid_account_type, invalid_email, invalid_country, invalid_date_of_birth, under_18, invalid_mobile_number, invalid_language.
400{"error":"Invalid JSON body"}The body is not valid JSON (`invalid_body` when it is not an object).
401{"error":"Unauthorized","code":"unauthorized"}Missing or invalid API key.
403{"error":"Verify your identity (KYC) before setting up payouts.","code":"kyc_required"}The account has not passed the ID check.
403{"error":"Payout methods need the account’s own key — a key an agency minted for a managed account cannot read or change where payouts go.","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-method endpoints are open to Dropfans-operated integrations only.
409{"error":"Could not determine your payout country. Contact support.","code":"no_country"}An existing payee has no usable country. Contact support.
422{"error":"This email is already used by another MassPay account. Enter a different email.","code":"masspay_email_in_use"}MassPay refused the profile (`masspay_rejected` with MassPay’s reason for other refusals).
502{"error":"Could not read your MassPay profile. Try again in a moment.","code":"masspay_unavailable"}MassPay did not answer. Retry.
503{"error":"MassPay is not available right now.","code":"not_configured"}MassPay payouts are switched off on this environment.
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 change where a creator it manages is paid.

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/masspay/profile" \
  -H "Authorization: Bearer $DROPFANS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "accountType": "INDIVIDUAL",
  "firstName": "Jane",
  "lastName": "Doe",
  "email": "[email protected]",
  "country": "SWE",
  "address1": "Storgatan 1",
  "city": "Stockholm",
  "stateProvince": "Stockholm County",
  "postalCode": "111 22",
  "dateOfBirth": "1994-05-17",
  "language": "sv"
}'

Questions? [email protected]