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
Get authorized
The user signs in and grants your application scopes. → Client-facing OAuth grant flow
3
Verify
Mint a user access token and run KYC with
verifyUserInformation, or hand the user a document verification link. → User KYC Verification4
Operate
Mint a user access token and use the API on their behalf. → Authentication
Consent mode
Fluz turns consent mode on per application. Contact your account manager to switch.
registerUser creates no user, account, or grant when you call it. It returns a link where the person signs up or logs in with the phone number you submitted and approves your application’s scopes, all in one flow. When they approve, your application holds the grant, so there is no separate authorization step and no “already in use” branch to handle. One exception: if the person’s Fluz account is already linked to your application under a different externalReferenceId, approval fails unless your application allows multiple external links. Approval also fails if the person signs in with a different phone number from the one you submitted, so submit the number they use with Fluz.
dateOfBirth, billingAddress, and acceptCardholderAgreement are not used. List KYC in steps to have the person verify their identity in the flow. Add the billing address with addVirtualCardAddress after the grant.
The response depends on whether your application already holds a grant for this externalReferenceId:
Each call returns a new link, and nothing is stored until the person approves, so an expired or unused link needs no cleanup. Call
registerUser again to get a new one. The full field and error reference is on registerUser.
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 user can authorize your app.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. Both branches end in the same place: the user authorizes your app.
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.
How a registered user signs in
A user created withregisterUser has no password. When you send them to /authorize, Fluz signs them in with a one-time code sent by SMS to the phoneNumber you registered.
- It’s an SMS code, not a TOTP code. Authenticator apps such as Authy or Okta Verify can’t produce it.
- In staging, no SMS is sent. Enter
123456as the code for any user you registered. - If the code is rejected in staging, check that the user is signing in with the same phone number you registered, then share the full
/authorizeURL with your Fluz contact.
After registration
A registered account is not yet an authorized or verified one. Before the user can move money, in this order:- An authorization grant. Registering someone doesn’t give you permission to act for them — that’s a separate, explicit step the user completes. → 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 - Identity verification. With a token from the grant, pass the SSN and address you hold to
verifyUserInformation, or issue a document verification link for the user to complete. → User KYC Verification
Known issue — business applicants created with
registerUser. Some users created with registerUser are missing an OAuth setting, so registerBusiness fails with AUTH-0008 (“does not have permission to access the application”) even after a valid grant. Until the fix ships, send the user through /authorize once, choose Apply for a business account on the account picker, and reuse the same external_id as their existing grant. generateUserAccessToken tokens then work for registerBusiness. If it still fails, contact your Fluz contact with the user ID.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
From registerUser
AUTH-0026 and AUTH-0027 are never returned in consent mode.
Right after registration
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
Grant flow
Get permission to act on their behalf.
User KYC verification
Verify the account you just created.
External reference IDs
Address them by your own user ID.
Embedded widgets
Hand the whole onboarding to Fluz instead.