Prerequisites
- A Fluz account with a staging application — see Prepare your accounts and API credentials. It must be an OAuth Integration application that Fluz has moved to
ACTIVE; apps made with Create new app fail withAUTH-0030. - A
client_id,client_secret, and registeredredirect_uri— see Configure OAuth App. - Requests go to the sandbox — no real money, no real PII. See Staging vs. Live Environment.
Which token, when
Two tokens appear in this flow, and using the wrong one is the most common cause of a failed first run.The full flow
Configure the application for businesses
Two permission lists live on the Permissions tab of your app, and they are edited independently.
A non-empty Business permissions list is what makes your app business-enabled. Leave it empty and users are never offered the option to apply for a business account, no matter what else you configure.While you’re in the app editor, register your
redirect_uri on the OAuth tab and add a webhook URL subscribed to KYB status update — that’s how you’ll learn the review finished without polling.Ask Fluz to restrict the app to business accounts
Fluz can configure your application so the flow never settles on a personal account. With that in place, a user who has no business account skips the account picker entirely and goes straight into business registration.Skip this if your app legitimately serves both consumers and businesses. Asking for it is a statement that a personal-account grant is always a bug for you.
Send the owner through the OAuth grant
Build the authorize URL:With the app restricted to business accounts, a first-time user sees: sign-in and 2FA, then a consent screen carrying two groups — the consumer permissions they’re granting now, and the business permissions being pre-approved for the business they’re about to create. The list is read-only; they accept all of it or they don’t finish. If the app isn’t restricted, the user picks Apply for a business account on the account picker.They’re redirected back to your Full parameter reference: Client-Facing OAuth Grant Flow.
Authorization URL
redirect_uri with ?code=...&state=.... Validate state, then capture the single-use code server-side.Did you create this owner with
registerUser? Registration doesn’t authorize your app, so this step is still required. These users have no password and sign in with a one-time code sent by SMS to the registered phone — authenticator apps can’t complete it. In staging, no SMS is sent: enter 123456.Known issue: some users created with registerUser are missing an OAuth setting, so registerBusiness later fails with AUTH-0008. Until the fix ships, make sure this pass through /authorize chooses Apply for a business account and reuses the same external_id as the user’s existing grant.Exchange the code for the applicant's token
Same exchange as any other grant — Basic auth with base64 of The
client_id:client_secret:Exchange (cURL)
redirect_uri must byte-match the one you used at /authorize.The business doesn’t exist yet, so this token belongs to the applicant’s personal account — that is correct, and it’s the token
registerBusiness requires. Read the account off the exchange response and persist it rather than inferring it from your own records of who started the flow.Verify the applicant's identity (KYC)
KYB verifies the business and the other owners. It does not verify the applicant, so the applicant has to be verified before you register anything — otherwise registration fails with Which check the applicant needs depends on the
ARG-0001.Call verifyUserInformation with the applicant’s token. In staging this test identity always returns APPROVED:isUsPerson value you’ll send for them in the next step: true requires a successful SSN (CIP) verification on file, false requires a successful document verification. See User KYC Verification and Testing KYC Flows.If the applicant’s owner record later shows
PENDING_CIP with verificationType: SSN and provided: false, they were isUsPerson: true without a successful SSN verification on file. Run this step for them with the SSN path.Register the business
First resolve the category the entity trades under — never hardcode these UUIDs:Then submit the entity and the full ownership roster in one call, still with the applicant’s personal-account token:A success response returns an
accountId and a kybStatus of SUBMITTED. Store the accountId immediately — it’s your only handle on the application.Four things that reject most first attempts:- The wrong token.
getBusinessCategoriesandregisterBusinessboth need the applicant’sCONSUMERtoken. ABUSINESStoken fails withAUTH-0002(“requires account type CONSUMER”). isUsPersonis required on every owner, including the applicant and invited owners. It’s the single most common cause of a rejected roster.- Exactly one owner must be the applicant — matched by email or phone against the token’s user — and exactly one must be the control person. Beneficial owners are only required for anyone holding 25% or more.
- The legal address is checked against an address-validation provider. Invented streets fail with
BS-0002; use Test Addresses.
Get the remaining owners verified, then wait
SUBMITTED means the payload validated and a case opened. It does not mean approved.Mint a business-account token — generateUserAccessToken with the applicant’s userId and the new business accountId — and read the roster. The applicant’s grant extends to the new business automatically, so this works while KYB is still pending.verifyUserInformation (the link returns ARG-0001 for them). Owners you marked isInvited: true are emailed by Fluz and verify themselves. Keep going until kybStatus is final and every owner reports READY — an approved business can still have an owner at PENDING_CIP.The status moves PENDING → APPROVED or DECLINED, usually within one to two business days. Take the decision off the KYB status update webhook you configured in Step 1 and use getBusiness for reconciliation — hourly, not per page load.Show the user an honest “under review” state. Don’t drop them into a business dashboard that can’t transact yet, and don’t auto-retry a decline — a second submission is blocked by
BS-0007. There’s no API to change the business’s legal name, address, or owners after submission; those changes go through Fluz support. Full lifecycle: Register & Verify Businesses.Operate on the business account — prove it
Once An
kybStatus is APPROVED, run any Fluz operation with the business-account token and it executes against the business. There is no separate business API.ACTIVE card back means the loop is closed: configured → authorized → verified → registered → approved → operating.You’re done 🎉
You’ve taken a business from an empty application to a verified account that can spend. From here:Business accounts in OAuth
The two permission lists, the account picker, and which account a code resolves to.
Register & verify businesses
Prerequisites, the KYB status lifecycle, and tracking a case to a decision.
Submit business documents
Authorized-signer uploads and responding to documentation requests.
KYB testing
Staging tax IDs, owner verification, and the errors you’ll hit along the way.
Onboard & connect a customer
The same journey for individuals.
Want to learn more? Contact us at support@fluz.app to speak with our experts or request a demo.