1. Create a user
Create a user with their email address. Spritz returns a user API key (prefixedak_)
that you use to authenticate requests on that user’s behalf.
apiKey securely. You send it as the Authorization bearer for every request
you make on this user’s behalf (see Authentication). You can
also pass an optional timezone.
2. Verify identity
Before a user can move money, they complete identity verification (KYC). Start a verification session for the user:sessionId is the Persona inquiry ID and
sessionToken is the session token.
Recommended: embed Persona natively. For the best experience, run verification
inside your own app with the Persona SDK that matches your platform, passing the inquiry
ID and session token. Persona provides:
- Web: the embedded flow
- React Native: Persona’s React Native SDK
- iOS and Android: Persona’s native mobile SDKs
verification.status.
Fallback: hosted flow. If you’d rather not embed, open verificationUrl in a
browser tab, iframe, or mobile web view. It’s single-use and short-lived; if it expires
before the user finishes, create another session.
The user’s verification state is reported on their profile as verification.status:
not_started, verified, failed, retry, or disabled. A retry status means
they can try again; create a new session to do so.
3. Read capabilities
GET /v1/users/me returns the user’s verification status and their capabilities.
Capabilities are the source of truth for what a user can do right now, and what’s
blocking anything they can’t.
- Products:
fiat_to_crypto,crypto_to_fiat,bill_pay,crypto_card - Methods:
ach_credit,ach_debit,wire,sepa_credit_transfer,rtp,push_to_card,canadian_eft
status tells you where it stands:
When a capability is
requirements_needed, its requirements[] lists what to do, and
nextRequirement points to the one to tackle first. Each requirement has a type, a
human-readable description, an actionUrl where the user completes it, a retryable
flag, and its own status (not_started, pending, completed, failed).
Drive your UI from capabilities
Render your onboarding and product UI off the capabilities list rather than tracking state yourself:- Show a capability as available when its
statusisactive. - When it’s
requirements_needed, surface the requirementdescriptionand send the user to itsactionUrl. - After the user completes a requirement, re-fetch
GET /v1/users/me, or react to thecapabilities.updatedwebhook so you update without polling.
Connect an existing Spritz user
If the person already has a Spritz account, with you or with another integrator, use Integrator Connect to gain access with their consent instead of creating a new user. It’s an OAuth-style authorization flow.1
Create a connect session
From your backend, create a session with a pre-registered HTTPS redirect URI and an
optional
state value you can use to tie the result back to a request.2
Send the user to approve
Redirect the user to
authorizationUrl. They sign in to Spritz, review your
integration, and approve. The session is valid for about 10 minutes.3
Receive the authorization code
On approval, Spritz redirects the user back to your
redirectUri with a code and
the state you sent.4
Exchange the code for a user key
From your backend, exchange the code for that user’s API key. The code is
single-use and expires after a few minutes.
Next
Authentication
Use the user API key to sign requests.
What we support
Rails, tokens, and regions behind each capability.
Off-ramp
Put an active capability to work.
Webhooks
React to capabilities.updated and verification changes.