> ## 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.

# Create a child organization

> Creates a new child organization under the caller's organization. The child org is created
in an unapproved state — approval happens separately through the Etherfuse approval workflow.

Optionally include wallets and a bank account to set up the child org in a single call.
Wallets are registered but not claimed — claiming and KYC sync happen after org approval.

If any provided UUID collides with an existing record, the request returns 409.

All fields are optional — sending an empty body `{}` creates a bare organization with no wallets or bank account.

## Account types

Every organization has an `accountType` of either `personal` (an individual customer
completing KYC) or `business` (a company completing KYB). The two are handled differently
downstream: personal orgs go through individual KYC and Plaid; business orgs go through
KYB and skip per-wallet compliance.

- `personal` — pass `userInfo` so the end user records are created and we can email them on status changes.
- `business` — `userInfo` is rejected (business orgs do not have a single end user).

`accountType` is currently optional and defaults to `personal`. **It will become required
in a future release** — start sending it explicitly now.




## OpenAPI

````yaml /openapi.yaml post /ramp/organization
openapi: 3.1.0
info:
  title: FX API
  version: 1.0.0
  description: >
    API for managing FX operations including onboarding, quotes, orders, and
    customer management.

    This API provides endpoints for managing customers, bank accounts, crypto
    wallets, orders, and webhooks.
servers:
  - url: https://api.etherfuse.com
    description: Production API
  - url: https://api.sand.etherfuse.com
    description: Sandbox API (for testing)
security: []
tags:
  - name: Lookup
    description: Public endpoints for looking up stablebond and exchange rate data
  - name: Assets
    description: Get available assets for ramping
  - name: Onboarding
    description: Customer onboarding and KYC
  - name: Bank Accounts
    description: Manage customer bank accounts
  - name: Agreements
    description: Handle customer agreements and consents
  - name: Quotes
    description: Get quotes for conversions
  - name: Orders
    description: Create and manage orders
  - name: Swaps
    description: Create and manage swaps
  - name: Customers
    description: Manage customers
  - name: Crypto Wallets
    description: Manage crypto wallets
  - name: Webhooks
    description: Manage webhook subscriptions
  - name: Organizations
    description: Manage organizations and child organizations
paths:
  /ramp/organization:
    post:
      tags:
        - Organizations
      summary: Create a child organization
      description: >
        Creates a new child organization under the caller's organization. The
        child org is created

        in an unapproved state — approval happens separately through the
        Etherfuse approval workflow.


        Optionally include wallets and a bank account to set up the child org in
        a single call.

        Wallets are registered but not claimed — claiming and KYC sync happen
        after org approval.


        If any provided UUID collides with an existing record, the request
        returns 409.


        All fields are optional — sending an empty body `{}` creates a bare
        organization with no wallets or bank account.


        ## Account types


        Every organization has an `accountType` of either `personal` (an
        individual customer

        completing KYC) or `business` (a company completing KYB). The two are
        handled differently

        downstream: personal orgs go through individual KYC and Plaid; business
        orgs go through

        KYB and skip per-wallet compliance.


        - `personal` — pass `userInfo` so the end user records are created and
        we can email them on status changes.

        - `business` — `userInfo` is rejected (business orgs do not have a
        single end user).


        `accountType` is currently optional and defaults to `personal`. **It
        will become required

        in a future release** — start sending it explicitly now.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  format: uuid
                  description: >-
                    Optional UUID to use as the organization's primary key. If
                    omitted, a UUID is generated automatically.
                displayName:
                  type: string
                  description: >-
                    Optional display name for the new organization. At most 200
                    characters. If omitted, defaults to "Customer for {parent
                    org name}".
                  maxLength: 200
                accountType:
                  type: string
                  enum:
                    - personal
                    - business
                  description: >
                    Type of organization. Defaults to `personal`. Will become
                    required in a

                    future release. See "Account types" above for guidance.
                userInfo:
                  $ref: '#/components/schemas/UserInfo'
                wallets:
                  type: array
                  description: >-
                    Optional wallets to register for the new organization.
                    Maximum 50 wallets per request.
                  maxItems: 50
                  items:
                    type: object
                    required:
                      - publicKey
                      - blockchain
                    properties:
                      id:
                        type: string
                        format: uuid
                        description: >-
                          Optional UUID for the wallet record. Generated if
                          omitted.
                      publicKey:
                        type: string
                        description: Public key of the wallet
                      blockchain:
                        type: string
                        enum:
                          - solana
                          - stellar
                          - base
                          - polygon
                          - monad
                        description: Blockchain type for the wallet
                partnerFeeDefaultBps:
                  type: integer
                  minimum: 0
                  maximum: 500
                  description: >-
                    Optional default partner fee in basis points for this child
                    organization (0–500). If omitted, defaults to 0 (no partner
                    fee).
                bankAccount:
                  type: object
                  description: >-
                    Optional bank account to register for the new organization.
                    Uses the same schema as the bank account creation endpoint.
                  properties:
                    bankAccountId:
                      type: string
                      format: uuid
                      description: >-
                        Optional UUID for the bank account. Generated if
                        omitted.
                    label:
                      type: string
                      nullable: true
                      description: Optional label for the bank account
                    skipAutoApproval:
                      type: boolean
                      default: false
                      description: >-
                        If true, skips automatic approval in sandbox/devnet
                        environments
                    account:
                      $ref: '#/components/schemas/AccountRegistration'
            example:
              id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
              displayName: Ana García
              accountType: personal
              userInfo:
                email: ana@example.com
                displayName: Ana García
              wallets:
                - publicKey: 9Qx7r...
                  blockchain: solana
                - id: b2c3d4e5-f6a7-8901-bcde-f12345678901
                  publicKey: GCRYUGD5...
                  blockchain: stellar
      responses:
        '201':
          description: Organization created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  organizationId:
                    type: string
                    format: uuid
                    description: ID of the newly created organization
                  displayName:
                    type: string
                    description: Display name of the organization
                  accountType:
                    type: string
                    enum:
                      - personal
                      - business
                    description: Account type the organization was created with.
                  partnerFeeDefaultBps:
                    type: integer
                    description: Default partner fee in basis points for this organization
                  wallets:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          format: uuid
                          description: Wallet record ID
                        publicKey:
                          type: string
                          description: Public key of the wallet
                        blockchain:
                          type: string
                          description: Blockchain type
                  bankAccount:
                    type: object
                    nullable: true
                    properties:
                      id:
                        type: string
                        format: uuid
                        description: Bank account ID
                      label:
                        type: string
                        nullable: true
                        description: Bank account label
                      status:
                        type: string
                        description: Bank account status
              example:
                organizationId: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                displayName: Ana García
                accountType: personal
                wallets:
                  - id: c3d4e5f6-a7b8-9012-cdef-123456789012
                    publicKey: 9Qx7r...
                    blockchain: solana
                  - id: b2c3d4e5-f6a7-8901-bcde-f12345678901
                    publicKey: GCRYUGD5...
                    blockchain: stellar
                bankAccount: null
        '400':
          description: >-
            Invalid request — empty name, name exceeds 200 characters, invalid
            wallet data, or wallet count exceeds 50
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: A provided UUID collides with an existing record
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    UserInfo:
      type: object
      description: >
        Optional info about the end user (the individual customer behind a
        personal organization).


        **Recommended.** When provided, Etherfuse pre-creates the user record so
        that when the

        customer eventually signs in via the hosted onboarding UI their Firebase
        identity attaches

        to the right user. It also enables personalized status-change emails
        (KYC approved/rejected,

        bank account verified, etc.).


        **Will eventually be required** for personal organizations. Reject early
        in your integration

        if you don't have this data — partners that don't migrate before the
        cutover will start

        receiving 400 errors.
      required:
        - email
        - displayName
      properties:
        email:
          type: string
          format: email
          description: End user's email address.
        displayName:
          type: string
          description: End user's display name.
      example:
        email: ana@example.com
        displayName: Ana García
    AccountRegistration:
      oneOf:
        - $ref: '#/components/schemas/PersonalAccountRegistration'
        - $ref: '#/components/schemas/BusinessAccountRegistration'
      description: >
        Bank account registration data. Accepts either Personal or Business
        format.

        The variant is auto-detected based on the fields present (untagged
        union).
    Error:
      type: object
      properties:
        error:
          type: string
          description: Error message
      example:
        error: Invalid request parameters
    PersonalAccountRegistration:
      type: object
      description: Personal bank account registration data
      required:
        - transactionId
        - firstName
        - paternalLastName
        - maternalLastName
        - birthDate
        - curp
        - rfc
        - clabe
      properties:
        transactionId:
          type: string
          format: uuid
          description: Unique transaction ID for this registration
        firstName:
          type: string
          description: Account holder's first name
        paternalLastName:
          type: string
          description: Account holder's paternal last name
        maternalLastName:
          type: string
          description: Account holder's maternal last name
        birthDate:
          type: string
          description: Date of birth in YYYYMMDD format
          example: '19900101'
        birthCountryIsoCode:
          type: string
          description: >-
            ISO 3166-1 alpha-2 country code for birth country. Defaults to MX if
            omitted.
          example: MX
        birthCountryId:
          type: string
          description: Legacy numeric country ID. Prefer birthCountryIsoCode instead.
          deprecated: true
        curp:
          type: string
          description: Mexican CURP (Clave Única de Registro de Población)
        rfc:
          type: string
          description: Mexican RFC (Registro Federal de Contribuyentes)
        clabe:
          type: string
          description: >-
            18-digit CLABE number (digits only, no letters or special
            characters)
      example:
        transactionId: 123e4567-e89b-12d3-a456-426614174000
        firstName: Juan
        paternalLastName: García
        maternalLastName: López
        birthDate: '19900101'
        birthCountryIsoCode: MX
        curp: GALJ900101HDFRRN09
        rfc: GALJ9001016V3
        clabe: '012345678901234567'
    BusinessAccountRegistration:
      type: object
      description: Business bank account registration data
      required:
        - transactionId
        - name
        - incorporatedDate
        - rfc
        - clabe
      properties:
        transactionId:
          type: string
          format: uuid
          description: Unique transaction ID for this registration
        name:
          type: string
          description: Business legal name
        countryIsoCode:
          type: string
          description: ISO 3166-1 alpha-2 country code. Defaults to MX if omitted.
          example: MX
        countryId:
          type: string
          description: Legacy numeric country ID. Prefer countryIsoCode instead.
          deprecated: true
        incorporatedDate:
          type: string
          description: Date of incorporation in YYYYMMDD format
          example: '20100315'
        rfc:
          type: string
          description: Mexican RFC (Registro Federal de Contribuyentes)
        clabe:
          type: string
          description: >-
            18-digit CLABE number (digits only, no letters or special
            characters)
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        API key for authentication. Pass the key directly (e.g., `Authorization:
        your-api-key`). Do not use a `Bearer` prefix.

````