If you’re migrating, expect to split any v2 “create user” call into several v3 calls: create the bare user, then submit compliance/KYC data, then provision a wallet — instead of one call that did all three.
Endpoints
ToS link endpoints (
POST /tos-link, GET /tos-link/:signedAgreementId, POST /tos-link/:signedAgreementId/accept) are unchanged in path and shape between v2 and v3.
Request changes: create a user
v2 accepted a large, open-ended body — identity/KYC fields,chains to provision wallets on, isDeveloper, and unknown fields were silently ignored:
firstName, email, chains, etc.) is rejected outright rather than ignored:
Response changes
v2 (GET /v2/users/:userId):
GET /v3/users/:userId):
v2 itself was inconsistent here —
GET /v2/users/:userId included createdAt, but POST/create-or-update responses on the same v2 resource did not. v3 is consistent across create, get, and list.GET /users): v2 returned { count, users: [...], nextCursor } where nextCursor was a raw ISO timestamp string. v3 returns the standard { data: [...], pagination: { hasMore, startCursor, endCursor } } — see platform-wide changes. There’s no count field in the v3 list response.