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

Verify

Run KYC with verifyUserInformation, or hand the user a document verification link. → User KYC Verification
3

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

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.

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.

After registration

A registered account is not yet a verified one. Before the user can move money you need:
  1. 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
  2. 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
  3. 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

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.