Accounts and identity
Headless provisioning without confusing app identity with custody.
POST /v1/accounts accepts only:
| Field | Rules |
|---|---|
| externalUserId | Required stable string, 1–200 letters/digits or ., _, :, @, - |
| Optional contact email; encrypted, not verified or login-enabled | |
| externalWalletAddress | Optional 20-byte EVM address; encrypted, unverified, not managed wallet or default withdrawal destination |
| externalIdentity | Optional { 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 state | What your product does |
|---|---|
| provisioning / wallet_pending | Wait and poll |
| polymarket_pending | Wallet exists, venue setup is incomplete; wait |
| ready | Enable eligible funding/trading capabilities |
| failed | Keep trading unavailable; send safe failure/request IDs to CRISP |
| revoked | Deny 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.