Skip to main content
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.
Restricted access. This mutation requires explicit permission from Fluz. Contact your account manager to enable user registration for your application. Calls from an application without it fail with AUTH-0022.

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 Verification
4

Operate

Mint a user access token and use the API on their behalf. → Authentication
Registering a user grants your application nothing. Until the user completes the OAuth grant, you can’t act for them: generateUserAccessToken and getAccountsByUserId fail with AUTH-0031, and the user doesn’t appear in getApplicationUsers. That includes KYC — authorization comes before verification, not after.

Fluz turns consent mode on per application. Contact your account manager to switch.
In consent mode, 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:
Send authorizationUrl only to the person you registered, and treat it like a sign-in link. It carries the name, email address and phone number you submitted, and anyone who has it can open it.
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

Failures come back in data, not in errors. A failed registration is an HTTP 200 with success: false. Code that only checks the GraphQL errors array will read every failure as a success.
Success
Failure
A handler that gets all three layers right:

“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

registerUser takes no idempotency key. A retry is a genuinely new attempt, and a timeout is an unknown outcome.
If a call times out or the connection drops, the registration may well have succeeded. Retrying the identical request then returns AUTH-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 with registerUser 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 123456 as 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 /authorize URL 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:
  1. 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
  2. Your own identifier attached. Pass external_id on the authorization so you can address this person by your own user ID from then on. → Managing External Reference IDs
  3. 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.