Skip to content

Users ​

Authenticated creator profile, payout data, device tokens, and creator-level default compliance flags.


GET /api/user ​

Return the authenticated user's current profile.

  • Auth required: Yes
  • Roles: Authenticated creator

Success response example ​

json
{
  "success": true,
  "errors_message": null,
  "data": {
    "id": 7,
    "type": "business",
    "email": "creator@example.com",
    "first_name": "Alyssa",
    "last_name": "Creator",
    "birth_date": "1998-05-12",
    "stripe_url": null,
    "fee": {
      "percentage": 3
    },
    "bank_data": {
      "iban": "LU150103994632856918",
      "bic_swift": "UNCRIT2B912"
    },
    "address": "1 Main Street",
    "is_verified": true,
    "veriff_first_name": "Alyssa",
    "veriff_last_name": "Creator",
    "veriff_is_matched": true,
    "is_adult_content": true,
    "is_verif_age": false,
    "is_epoch_enabled": true,
    "currency_id": 1
  }
}

Returned fields ​

FieldTypeNotes
idintegerUser id.
typestringLegacy/internal account type. Do not build feature logic on this field alone.
emailstringCreator email.
first_namestringCreator first name.
last_namestringCreator last name.
birth_datestringYYYY-MM-DD.
stripe_urlstring or nullLegacy / conditional onboarding link.
feeobjectCurrent creator fee resource.
ibanstring or omittedConvenience exposure when IBAN exists in bank data.
bic_swiftstring or omittedConvenience exposure when BIC/SWIFT exists in bank data.
bank_dataobject or nullCurrent payout fields.
country_codestring or nullThe creator's country of residence, ISO 3166-1 alpha-2 (since 2026-10-08); null until set.
payout_methodstringwire or crypto (since 2026-10-08): which saved details the next payout uses. Both sets stay stored. Omitted where bank_data is.
tron_usdt_walletstring or nullTRON (TRC-20) USDT address for crypto payouts, or null. Omitted where bank_data is.
vat_numberstring or nullThe creator's VAT number (since 2026-10-08). Set through PATCH /api/user, stored only once the EU VAT register (VIES) confirms it. Omitted where bank_data is.
payout_recipientobject or omittedWho a payout is made out to - never a name the creator types in (since 2026-09-27): name and basis (company: the company's legal name from the creator's company record; verified_person: the name on the ID Veriff verified; account_name: the account's own name, shown until the identity is verified). The bank details may change, the recipient may not. Omitted in an agency session and for the Telegram Mini App, like bank_data.
addressstring or nullOptional creator address.
is_verifiedbooleanCreator identity verification result.
veriff_first_namestring or nullVerified first name snapshot.
veriff_last_namestring or nullVerified last name snapshot.
veriff_is_matchedboolean or nullName-match status from verification flow.
is_adult_contentbooleanDefault AVS flag for new uploads.
is_verif_agebooleanDefault buyer age-check requirement for new uploads.
upload_defaultsobject or nullAccount-level upload presets (see below).
is_epoch_enabledbooleanCurrent payment-provider enablement state.
currency_idintegerCreator currency id.

upload_defaults object ​

Optional JSON stored on the user. Used as defaults for bulk uploads and product creation:

FieldTypeDescription
is_adult_contentbooleanDefault AVS flag
is_downloadablebooleanDefault download setting
is_verif_agebooleanDefault age verification
default_priceintegerSuggested price in cents (e.g. 500 = $5.00)
folder_idintegerDefault content folder

PATCH /api/user/ ​

Update user profile fields and payout fields.

  • Auth required: Yes
  • Roles: Authenticated creator
  • Content type: application/json

Request body ​

FieldTypeRequiredNotes
first_namestringYesMax 255 chars.
last_namestringYesMax 255 chars.
ibanstringNoLegacy convenience field.
bic_swiftstringNoLegacy convenience field.
bank_dataobjectNoFlexible payout fields by currency.
country_codestringNoCountry of residence, ISO 3166-1 alpha-2; an unknown code answers 422.
payout_methodstringNowire or crypto: which saved details a payout uses. Switching does not delete the other set.
tron_usdt_walletstring or nullNoTRON (TRC-20) USDT address (T + 33 characters); null removes it. Another format answers 422.
vat_numberstring or nullNoVAT number with the country prefix (DE123456789). Checked against VIES first: an invalid or unknown number answers 422 and nothing is stored; null removes it.
upload_defaultsobjectNoAccount-level upload presets (see upload_defaults schema above).

Success response example ​

json
{
  "success": true,
  "errors_message": null,
  "data": {
    "user": {
      "id": 7,
      "first_name": "Alyssa",
      "last_name": "Creator",
      "bank_data": {
        "iban": "LU150103994632856918",
        "bic_swift": "UNCRIT2B912"
      }
    }
  }
}

Important notes ​

  • The route is parameterized as /api/user/{user}. {user} must be the id of the authenticated account (the id from GET /api/user); any other id answers 403 with errors_code: "forbidden".
  • This endpoint does not update creator default flags. Use /api/user/profile/has-adult for that - of its two defaults only is_verif_age still matters: every product is AVS+, whatever the account's is_adult_content says.

GET /api/user/payment-options ​

Read the account-wide payment options for customers: which checkout tiles a buyer sees, whether the Send a tip button is offered on the product pages, and the smallest tip. Every product follows these values until it carries its own — see Payment options.

  • Auth required: Yes
  • Roles: Authenticated creator, login token only. A generated API key answers 403 with errors_code: "forbidden" (Account settings are not available for generated API keys.); a generated key sets the options per product instead. An agency account is refused with 403 as well.

Success response example ​

json
{
  "success": true,
  "errors_message": null,
  "data": {
    "tiles": { "paypal": true, "card": true, "crypto": false },
    "tips_enabled": true,
    "min_tip_cents": 500,
    "min_tip_override_cents": 500,
    "tip_limits": { "min_cents": 500, "max_cents": 30000 }
  }
}

Returned fields ​

FieldTypeNotes
tilesobjecttrue = the tile is shown at the checkout. Keys: paypal, card (the tile "Credit Card / Other") and crypto. See what a buyer sees.
tips_enabledbooleanThe tip button on the product pages. The creator's own tip page and the tip card in Telegram are not affected.
min_tip_centsintegerThe smallest tip in effect, minor units.
min_tip_override_centsinteger or nullThe creator's own value; null = the platform minimum.
tip_limitsobjectThe platform range in minor units: min_cents, max_cents.

PATCH /api/user/payment-options ​

Change those account-wide values. They apply to every product that does not carry its own value, existing products included.

  • Auth required: Yes
  • Roles: Authenticated creator, login token only (same 403 as above)
  • Content type: application/json

Request body ​

FieldTypeRequiredNotes
tilesobjectNoAny subset of paypal, card, crypto. A key that is left out keeps its current value.
tips_enabledbooleanNoThe tip button on the product pages.
min_tip_centsinteger or nullNoMinor units, within tip_limits and a whole amount (a multiple of 100). null = back to the platform minimum.

Success response example ​

The response body is the same as for GET /api/user/payment-options.

json
{
  "success": true,
  "errors_message": null,
  "data": {
    "tiles": { "paypal": true, "card": true, "crypto": false },
    "tips_enabled": false,
    "min_tip_cents": 100,
    "min_tip_override_cents": null,
    "tip_limits": { "min_cents": 500, "max_cents": 30000 }
  }
}

Important notes ​

  • Hiding a tile only hides the tile. The payment method itself stays switched on, and a buyer can still end up using it through the provider's own page.
  • At least one tile has to stay shown. Hiding all three answers 422 with errors_code: "validation_failed" and the message At least one payment option has to stay visible.
  • If none of the shown tiles is available for a product, the checkout shows all available ones, so a product always stays buyable. The fallback offered after a declined card payment is always shown.
  • A product that carries its own payment_options keeps them and no longer follows the account.

PATCH /api/user/profile/has-adult ​

Update creator-level default compliance toggles for new uploads and optionally cascade them to existing products.

  • Auth required: Yes
  • Roles: Authenticated creator
  • Content type: application/json

Request body ​

FieldTypeRequiredNotes
is_adult_contentbooleanYesStill required by the call, without effect on products: every product is AVS+.
is_verif_agebooleanYesDefault age-check flag.
is_update_productsbooleanNoIf true, backend also updates existing products for enabled flags.

Success response example ​

json
{
  "success": true,
  "errors_message": null,
  "data": {
    "id": 7,
    "is_adult_content": true,
    "is_verif_age": true
  }
}

Side effects ​

  • updates user defaults immediately
  • if is_update_products=true and a flag is true, backend updates existing products for that flag as well

POST /api/user/fcm ​

Store an FCM token for push notifications.

  • Auth required: Yes
  • Roles: Authenticated creator

Request body ​

FieldTypeRequired
tokenstringYes

Success response example ​

json
{
  "success": true,
  "errors_message": null,
  "data": "Token stored"
}

DELETE /api/user/fcm ​

Delete an FCM token.

  • Auth required: Yes
  • Roles: Authenticated creator

Request body ​

FieldTypeRequired
tokenstringYes

Success response example ​

json
{
  "success": true,
  "errors_message": null,
  "data": "Token removed"
}

DELETE /api/user ​

Delete the authenticated creator account.

  • Auth required: Yes
  • Roles: Authenticated creator

Success response example ​

json
{
  "success": true,
  "errors_message": null,
  "data": "Deleted"
}

Side effects ​

  • deletes all current auth tokens
  • soft-deletes the user
  • dispatches UserDeleteJob

AI models of a creator ​

Since 2026-10-12 a creator opens AI models of its own, the way an agency does. An AI model is an account of kind ai_model that belongs to the creator: its own library, vault, products, sales links and statistics, no login of its own. It sells fully AI-generated content only - a file declared as anything but synthetic is refused (422, see AI content). It is never verified itself: the creator behind it is the responsible seller, so the model takes uploads and sells while the creator's identity verification is complete and the creator account is not blocked. Everything it earns is booked to the creator's wallet, in the creator's currency, and counts as the creator's sale - on the creator's transaction report, in the creator's referrer's commission, and in the webhooks the creator registered (see below). Nothing is shared with an agency the creator is connected to.

MethodPathPurpose
GET/api/user/ai-modelsYour AI models, each with its account_key; can_create, blocked_reason, limit
POST/api/user/ai-modelsCreate one: { "name": "Luna Vale" } (2 to 80 characters)
PATCH/api/user/ai-models/{model}Rename
DELETE/api/user/ai-models/{model}Deactivate - final: its pages go offline for good, the sales history and refunds stay
POST/api/user/ai-models/{model}/sessionThe session the dashboard works in the model with (login token only)

Login token, or an API key with can_manage_ai_models (API keys). The model is addressed by its own id - there is no relationship. A creator runs up to limit active models at the same time (422 beyond it); deactivated ones do not count. The name is the model's stage name and is free; the profile address is ten random lower-case letters and digits, given once and never changed by a rename.

Working in a model with a key. The model's account_key has the form aim_<id>. Send it as the X-Fangate-Account header on any call your key may make - upload, vault, products, webhooks - and the call runs as the model, within the key's own permissions, exactly as an agency works in its accounts. A bare id is refused (422 agency_account_key_invalid); a deactivated model, or a model that is not yours, answers 404 agency_account_not_found. Inside a model the account's own matters stay closed: no payout, no bank details, no password, no account deletion (403).

Webhooks. The webhooks of the creator's own account hear the model's events as well (a sale, a refund, a product that became sellable, a file verdict). Such a delivery carries an account block naming the model: { "account_key": "aim_90211", "kind": "ai_model", "name": "Luna Vale" }. Webhooks an agency registered on the creator's account do not hear the creator's models.

Why a model cannot upload. 422 ai_model_owner_verification_required (requires_verification: false): the creator behind the model is not verified, or the model is deactivated. The creator verifies in the creator's own account, never in the model.


Payout account ​

Fangate stores the payout account in bank_data. Since 2026-09-27 the account type is the creator's choice whatever currency the account earns in (GET /api/app-data → bank_account_types[]); the fields decide the type:

TypeKeys
IBAN / BICiban, bic_swift
US routing numberrouting_number, account_number
UK sort codesort_code, account_number

One account receives every payout, whatever currency it was earned in; the payout currency decides the rail and its fee (withdrawal_fees[], see App data). The payout is made out to payout_recipient (see GET /api/user), not to a name in bank_data. The account is optional on Fangate's own registration (a collapsed tile on the currency step); a creator without one sees a reminder and POST /api/wallet/cashout answers 422 with payout_account_required.

Crypto payouts (since 2026-10-08). Available once Fangate has switched them on: GET /api/app-data carries crypto_payouts_enabled; while it is false, payout_method: crypto answers 422 validation_failed (errors_field: payout_method) and the tile is shown as "coming soon". payout_method decides which saved details a payout uses: wire pays to bank_data, crypto pays USDT to tron_usdt_wallet (a TRON TRC-20 address, T + 33 characters). Both sets stay stored; switching the method does not delete anything. With crypto and no wallet the cashout answers 422 payout_account_required as well. The crypto rail has a withdrawal fee of its own (withdrawal_fees[] in App data). The USDT amount sent is the payout minus the withdrawal fee and any bank conversion fee, at the rate of the day; the payout confirmation names the USDT amount that was actually sent and the wallet it went to.

Fangate backend developer documentation