Prerequisites
- A Fluz account with a staging application — see Prepare your accounts and API credentials.
- 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.
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.They’re redirected back to your
Authorization URL
redirect_uri with ?code=...&state=.... Validate state, then capture the single-use code server-side.Full parameter reference: Client-Facing OAuth Grant Flow.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.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.Three things that reject most first attempts: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.
- 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:isInvited: true are emailed by Fluz and verify themselves. Keep going until kybStatus is final and every owner reports READY.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. 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.
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.