registerUser provisions a Fluz account for someone using profile data you already hold — no redirect, no hosted form, no asking the user to re-type their name and date of birth.
Where this fits
Registration is one step of an onboarding arc, and it’s optional — you can hand the whole thing to a widget instead.
Register users yourself when you already hold clean profile data and don’t want the user typing it twice. If you’d be collecting name, date of birth, and contact details purely to pass them to Fluz, use an embedded widget instead — it keeps that collection inside Fluz’s compliance scope.
The full sequence for the API path:
1
Register
registerUser with name, phone, email, and date of birth.2
Verify
Run KYC with
verifyUserInformation, or hand the user a document verification link. → User KYC Verification3
Get authorized
The user grants your application scopes. → Client-facing OAuth grant flow
4
Operate
Mint a user access token and use the API on their behalf. → Authentication
The mutation
error is an object (RegisterUserError), not a string — always select code and message as subfields. Requesting bare error won’t compile.Parameters
Names should match the identity documents the user will verify with — a mismatch surfaces later as a KYC failure that’s much harder to diagnose than a registration error.
What gets created
A complete Fluz account: the user record, their wallet and balances, and their rewards eligibility. There’s nothing further to provision before the account can be verified and used.Handling the response
Success
Failure
“Already in use” is a routing signal, not an error
AUTH-0026 (phone) and AUTH-0027 (email) mean the person already has a Fluz account. That’s a normal, expected outcome — Fluz accounts are not scoped to your application, so anyone who has used Fluz before, through any app or the consumer product, already exists.
Treating this as a failure is the most common integration mistake here. The right response is to stop trying to create an account and start asking for access to the existing one: send the user through the OAuth grant flow, or open a widget. They log in to the account they already have and authorize you.
Design your onboarding so the register-then-fall-back path is the normal case rather than an exception branch, and it stays clean at scale.
Retries and duplicates
If a call times out or the connection drops, the registration may well have succeeded. Retrying the identical request then returnsAUTH-0026 — which is indistinguishable from the user having had an account all along.
That ambiguity is harmless as long as you treat both the same way: on timeout, retry once, and route AUTH-0026 / AUTH-0027 to authorization rather than to an error state. Either the account you just made or the account that already existed ends up authorized, which is the outcome you wanted. What you must not do is surface “phone number already in use” to a user who just gave you their number for the first time.
After registration
A registered account is not yet a verified one. Before the user can move money you need:- Identity verification. Pass the SSN and address you hold to
verifyUserInformation, or issue a document verification link for the user to complete. → User KYC Verification - An authorization grant. Registering someone doesn’t give you permission to act for them — that’s a separate, explicit step. → Client-facing OAuth grant flow
- Your own identifier attached. Pass
external_idon the authorization so you can address this person by your own user ID from then on. → Managing External Reference IDs
Handling the data
You’re transmitting full name, date of birth, email, and phone number — a set that identifies a real person. Send it over TLS from your server, keep it out of logs and error-tracking payloads, and don’t echo it back in client-visible responses. Note that date of birth in particular is regulated identity data in most jurisdictions, and it stays sensitive on your side after the call succeeds. If you’d rather not hold any of it, that’s the argument for the widget — Fluz collects it inside its own compliance scope and you never touch it.Error codes
Environments
Point at the GraphQL host for your environment —https://transactional-graph.staging.fluzapp.com/api/v1/graphql for staging, https://transactional-graph.fluzapp.com/api/v1/graphql for production. Registration permission is granted per application, so a production app needs it enabled separately. → Deploying to Production
Never register real people in staging. → Staging vs. Live
Next steps
User KYC verification
Verify the account you just created.
Grant flow
Get permission to act on their behalf.
External reference IDs
Address them by your own user ID.
Embedded widgets
Hand the whole onboarding to Fluz instead.