> ## Documentation Index
> Fetch the complete documentation index at: https://docs.etherfuse.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Business Onboarding (KYB)

> Onboard a business customer by launching them into Etherfuse for KYB.

Business customers complete **Know Your Business** verification inside the Etherfuse app. As a partner, you don't drive KYB through the API; you authenticate the user with a `kyb`-scoped JWT and launch them into the app's KYB flow, and the app collects everything and walks them through it.

<Steps>
  <Step title="(Optional) Pre-create the business and invite its members">
    This step is optional. If you skip it, your customer creates the business themselves when they first launch into KYB, and the app asks them for a company name and country. Pre-create it yourself when you want the organization and its members in place before anyone launches.

    Create the business with [`POST /ramp/organization`](/api-reference/organizations/create-child-org) and `accountType: business`. You may pass your own `id` (a UUID) to match an identifier from your own system. If you omit it, Etherfuse assigns one and returns it as `organizationId`. Pass `country` to generate the KYB onboarding at creation so the user lands straight in KYB. Omit it and they choose their country when they begin.

    <CodeGroup>
      ```json Request theme={null}
      {
        "displayName": "Acme Inc.",
        "accountType": "business",
        "country": "MX"
      }
      ```

      ```json Response theme={null}
      {
        "organizationId": "00000000-0000-4000-8000-000000000001",
        "displayName": "Acme Inc.",
        "accountType": "business"
      }
      ```
    </CodeGroup>

    <Note>
      The `organizationId` identifies the **business**. A **person** is identified separately by their `customerId`, the `sub` you sign into their JWT. The two are never interchangeable. To keep them apart, this guide writes organization ids as `00000000-0000-4000-8000-000000000001` and customer ids as `cccccccc-cccc-4ccc-8ccc-cccccccccc01`.
    </Note>

    Now add the people who'll complete KYB with [`POST /ramp/organization/00000000-0000-4000-8000-000000000001/member`](/api-reference/organizations/add-organization-member), two ways:

    * **By `email`**: the invite is accepted automatically the first time that email launches via your `kyb` JWT. You may pass an optional `emailInviteLink` to send them an email invite pointing at your own page.
    * **By `customerId`**: add an existing customer directly by their `sub`. No email is sent. A `customerId` exists only after that person has [launched](/guides/jwt-authentication#launch-the-user-into-the-app) or exchanged a JWT via [`POST /auth/token`](/guides/jwt-authentication).

    <CodeGroup>
      ```json By email theme={null}
      { "email": "bob@acme.com", "role": "member" }
      ```

      ```json By customerId theme={null}
      { "customerId": "cccccccc-cccc-4ccc-8ccc-cccccccccc01", "role": "admin" }
      ```
    </CodeGroup>

    <Note>
      You can change membership anytime: [add a member](/api-reference/organizations/add-organization-member), [list members](/api-reference/organizations/list-organization-members), [remove a member](/api-reference/organizations/remove-organization-member), or [revoke a pending invite](/api-reference/organizations/revoke-organization-invite).
    </Note>
  </Step>

  <Step title="Launch your users into their organization's KYB">
    Sign a user JWT with `scope: kyb` for the person signing in (their `sub` is their `customerId`) and hand their browser to [`/auth/launch`](/guides/jwt-authentication#launch-the-user-into-the-app) with `target: /kyb`. If that person belongs to more than one organization, append `?org=<organizationId>` to the target (for example `target: /kyb?org=00000000-0000-4000-8000-000000000001`) to choose which one. With a single organization it's selected automatically. The signing and launch mechanics are in [JWT User Authentication](/guides/jwt-authentication#sign-a-user-jwt). This flow's scope and target are in [Business KYB](/guides/user-launch-flows#business-kyb). The launch lives on the **app host**, not the API host.

    If you pre-created the business, the user lands directly in its KYB flow (an emailed invite is accepted automatically at this point). If you didn't, the app first prompts them to create the business, then continues into KYB.
  </Step>

  <Step title="Watch for status changes">
    Subscribe to the [`kyb_updated` webhook](/webhooks#event-types). It fires whenever a business's KYB status changes and carries the business's `organizationId` and new `status`, so you learn the moment verification is approved (or needs attention) without anyone watching the app.

    To read the current state on demand, [`GET /ramp/organization/{id}/kyb/progress`](/api-reference/organizations/get-kyb-progress) returns the status and requirement counts. When a customer created their own business and you only have their `sub`, [`GET /ramp/customer/{customer_id}/organization`](/api-reference/customers/list-a-customers-organizations) lists the businesses they belong to so you can find its `organizationId`.
  </Step>
</Steps>

Once a business is approved, it can transact. The forms, document collection, and review all live in the Etherfuse app. That's the whole integration.
