Partner API

Accounts and identity

Headless provisioning without confusing app identity with custody.

POST /v1/accounts accepts only:

FieldRules
externalUserIdRequired stable string, 1–200 letters/digits or ., _, :, @, -
emailOptional contact email; encrypted, not verified or login-enabled
externalWalletAddressOptional 20-byte EVM address; encrypted, unverified, not managed wallet or default withdrawal destination
externalIdentityOptional { label, value }; label starts with a letter, up to 64 letters/digits/spaces/underscores/hyphens; value up to 320 characters

No generic attributes, hosted return URLs, provider credentials or arbitrary metadata. externalIdentity is your operator-facing canonical display label, not wallet authority. Keep external IDs opaque and stable; display names can change.

{
  "externalUserId": "example:user-123",
  "email": "user@example.com",
  "externalIdentity": { "label": "Telegram", "value": "@example" }
}

Successful create returns 202 with data.crispAccountId, externalUserId, status, failureCode, createdAt and updatedAt. Persist the account mapping. Repeated provisioning upserts the same external ID, rather than making a second wallet. Display identity can be updated by provisioning again. Do not use this endpoint as a general profile/contact editor. Provisioning replay resolves the current account rather than freezing an obsolete asynchronous status.

Account stateWhat your product does
provisioning / wallet_pendingWait and poll
polymarket_pendingWallet exists, venue setup is incomplete; wait
readyEnable eligible funding/trading capabilities
failedKeep trading unavailable; send safe failure/request IDs to CRISP
revokedDeny access to integration activity

Reads: GET /v1/accounts/{externalUserId}, /profile, /wallet. Encode path segments with encodeURIComponent. Profile can return profile_not_available when no contact/display/profile data exists; account provisioning can still be valid. Managed addresses only appear once created. Do not confuse an external contact wallet with the actual trading/deposit address.

GET /v1/accounts?limit=50&offset=0 lists the authenticated partner's accounts; status optionally filters. General offset pagination allows limit 1–200. Do not expose this partner-wide endpoint directly to every end user.

Your BFF must authorize every account path. A valid partner key can access its tenant's accounts and therefore is more privileged than a single user's login.

CRISP Partner Developer Documentation