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

# Add organization member

> Adds a person to a customer business organization, by `email` or `memberId`. A `memberId` is the `sub` you sign into the person's JWT. Members sign in with that JWT and complete the organization's KYB.

- **By `email`**: if the email belongs to someone who already signed in through your JWT, they become a member at once. Otherwise we create a pending invite, accepted the first time that email signs in with your `kyb` JWT. Send `emailInviteLink` to have us email them that link, or leave it out and tell them yourself.
- **By `memberId`**: adds someone by their `sub`, and sends no email. The `sub` exists once that person has exchanged a JWT with [POST /auth/token](/v2/api-reference/authentication/exchange-a-partner-jwt) or been launched. An unknown `sub` returns `404`, and a business organization's id is rejected.

Adding someone who was removed earlier brings them back. Adding a current member returns `409` `conflict`. The response lists the members and invites: someone added at once is under `members`, an invite is under `invited`.

Your own organization's members are managed in the Etherfuse portal, so naming it returns `403` `forbidden`. A personal organization has no members and returns `400` `invalid-request`.



## OpenAPI

````yaml openapi-v2.json POST /organization/{organizationId}/member
openapi: 3.1.0
info:
  title: Etherfuse FX API
  description: >-
    Partner-facing ramp API, version 2: payment accounts, quotes, orders and
    webhooks.
  license:
    name: Proprietary
  version: 2.0.0
servers:
  - url: https://api.sand.etherfuse.com
    description: Sandbox
security:
  - ApiKeyAuth: []
tags:
  - name: Payment Accounts
    description: >-
      Register the bank accounts and wallets that money moves from and to, and
      read their readiness per rail.
  - name: Quotes
    description: Price a transfer between two registered payment accounts.
  - name: Orders
    description: Create orders from quotes and track them.
  - name: Webhook Subscriptions
    description: Subscribe to webhook events.
  - name: Webhook Events
    description: Payloads Etherfuse sends to your webhook subscriptions.
  - name: Sandbox
    description: Endpoints that work only in sandbox, for testing.
  - name: Assets
    description: The markets and tokens a quote can use, and the balances of a wallet.
  - name: Authentication
    description: >-
      Partner JWT authentication: exchange a JWT for an access token, or launch
      a user into the app.
  - name: KYC
    description: >-
      Submit a customer's verification data, documents and questionnaire
      answers, import a verification they already passed elsewhere, and check
      where their KYC stands.
  - name: KYB
    description: Check where a business organization's KYB stands.
  - name: Lookup
    description: >-
      Public reference data: exchange rates, stablebonds, bond costs, country
      codes.
  - name: Organizations
    description: >-
      Your organization, your default partner fee, and the customer
      organizations you create.
  - name: Members
    description: >-
      The people who belong to a customer business organization and complete its
      KYB.
  - name: Statements
    description: >-
      Monthly revenue share statements for closed months, as a list or as a CSV
      or PDF download.
paths:
  /organization/{organizationId}/member:
    post:
      tags:
        - Members
      summary: Add organization member
      description: >-
        Adds a person to a customer business organization, by `email` or
        `memberId`. A `memberId` is the `sub` you sign into the person's JWT.
        Members sign in with that JWT and complete the organization's KYB.


        - **By `email`**: if the email belongs to someone who already signed in
        through your JWT, they become a member at once. Otherwise we create a
        pending invite, accepted the first time that email signs in with your
        `kyb` JWT. Send `emailInviteLink` to have us email them that link, or
        leave it out and tell them yourself.

        - **By `memberId`**: adds someone by their `sub`, and sends no email.
        The `sub` exists once that person has exchanged a JWT with [POST
        /auth/token](/v2/api-reference/authentication/exchange-a-partner-jwt) or
        been launched. An unknown `sub` returns `404`, and a business
        organization's id is rejected.


        Adding someone who was removed earlier brings them back. Adding a
        current member returns `409` `conflict`. The response lists the members
        and invites: someone added at once is under `members`, an invite is
        under `invited`.


        Your own organization's members are managed in the Etherfuse portal, so
        naming it returns `403` `forbidden`. A personal organization has no
        members and returns `400` `invalid-request`.
      operationId: v2AddMember
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddMemberRequest'
      responses:
        '200':
          description: The organization's members and pending invites after the change.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MembersResponse'
        '400':
          $ref: '#/components/responses/InvalidRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/OrganizationNotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    OrganizationId:
      name: organizationId
      in: path
      required: true
      description: >-
        The organization this call acts for: your API key's organization or one
        of its customer organizations. Any other id returns `404` `not-found`.
      schema:
        type: string
        format: uuid
  schemas:
    AddMemberRequest:
      type: object
      required:
        - role
      properties:
        email:
          type:
            - string
            - 'null'
          description: >-
            Invite or add a member by email address. If the email matches a user
            who has already signed in through your JWT, they're added as a
            member immediately; otherwise a pending invite is created and
            accepted automatically the first time that email signs in via your
            `kyb` JWT. Use `email` when you don't have the person's `memberId`
            yet, or when you want Etherfuse to email them an invite (see
            `emailInviteLink`). Send exactly one of `email` or `memberId`.
        memberId:
          type:
            - string
            - 'null'
          description: >-
            Add someone directly by their `sub` (the value you put in the JWT
            `sub` when they sign in); no email is sent. The person must already
            exist, which happens the first time they exchange a JWT via [POST
            /auth/token](/v2/api-reference/authentication/exchange-a-partner-jwt)
            (or are launched); an unknown `sub` returns 404. A business
            organization's id is rejected. Send exactly one of `email` or
            `memberId`.
        role:
          type: string
          enum:
            - admin
            - member
          description: The member's role in the organization.
        emailInviteLink:
          type:
            - string
            - 'null'
          description: >-
            Optional. When adding by `email` and a pending invite is created
            (the email isn't already a member), Etherfuse emails them this URL
            **as-is** (you control the full link, including any query params) as
            the call to action. Omit it to create the invite silently and notify
            the user yourself. Ignored when the email already matches a member
            who is added immediately.
      example:
        email: alice@acme.com
        role: admin
        emailInviteLink: >-
          https://partner.example.com/kyb-invite?org=a1b2c3d4-e5f6-7890-abcd-ef1234567890
    MembersResponse:
      type: object
      required:
        - members
        - invited
      properties:
        members:
          type: array
          description: Active members. The org's own service account is never listed.
          items:
            $ref: '#/components/schemas/MemberRecord'
        invited:
          type: array
          description: Pending invites that have not been accepted yet.
          items:
            $ref: '#/components/schemas/InvitedRecord'
      example:
        members:
          - memberId: 9f1c4b2a-7d3e-4c5f-8a6b-1e2d3c4b5a6f
            email: alice@acme.com
            role: admin
            joinedAt: '2026-06-17T00:00:00Z'
        invited:
          - email: bob@acme.com
            role: member
            invitedAt: '2026-06-17T00:00:00Z'
    MemberRecord:
      type: object
      required:
        - memberId
        - role
        - joinedAt
      properties:
        memberId:
          type: string
          description: >-
            The member's `sub`. Empty if the member does not yet have a `sub` in
            your namespace.
        email:
          type:
            - string
            - 'null'
          description: The member's email, if known.
        role:
          type: string
          enum:
            - admin
            - member
        joinedAt:
          type: string
          format: date-time
    InvitedRecord:
      type: object
      required:
        - email
        - role
        - invitedAt
      properties:
        email:
          type: string
        role:
          type: string
          enum:
            - admin
            - member
        invitedAt:
          type: string
          format: date-time
    Problem:
      type: object
      description: >-
        RFC 9457 problem details. Every v2 error uses this body with content
        type `application/problem+json`. `errors` is present only on
        `validation-error`. `required` and `missing` are present only on
        `registration-info-required`.
      required:
        - type
        - title
        - status
        - detail
        - instance
      properties:
        type:
          type: string
          format: uri
          description: >-
            `https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem
            slug, for example
            `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on
            this value.
          example: https://docs.etherfuse.com/ramp/v2/errors/quote-expired
        title:
          type: string
          description: Short summary of the problem type.
          example: Quote expired
        status:
          type: integer
          description: The HTTP status code.
          example: 400
        detail:
          type: string
          description: Human-readable explanation of this occurrence. Do not parse it.
          example: >-
            quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not
            exist
        instance:
          type: string
          description: Unique identifier for this occurrence. Quote it to support.
          example: >-
            tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d
        errors:
          type: array
          description: Present on `validation-error`. One entry per invalid field.
          items:
            $ref: '#/components/schemas/FieldViolation'
        required:
          type: array
          description: >-
            Present on `registration-info-required`. Every registration field
            the route requires, as JSON Pointers into the request, for example
            `#/registrationInfo/taxId`.
          items:
            type: string
        missing:
          type: array
          description: >-
            Present on `registration-info-required`. The required fields you
            must still send, as JSON Pointers into the request.
          items:
            type: string
    FieldViolation:
      type: object
      required:
        - pointer
        - detail
      properties:
        pointer:
          type: string
          description: >-
            JSON Pointer to the field in the request, for example
            `#/accountDetails/clabe`.
          example: '#/accountDetails/clabe'
        detail:
          type: string
          description: What is wrong with the field.
          example: This field is required.
  responses:
    InvalidRequest:
      description: >-
        `invalid-request`: a path, query or body value is malformed, or
        `pageSize` is 0 or over 100.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    Unauthorized:
      description: >-
        `unauthorized`: the `Authorization` header is missing, not ASCII, or
        does not hold a valid API key.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    Forbidden:
      description: '`forbidden`: your API key''s organization may not do this.'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    OrganizationNotFound:
      description: '`not-found`: your API key cannot act for this organization.'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    Conflict:
      description: >-
        `conflict`: the request conflicts with the resource's current state.
        `detail` says how.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    InternalError:
      description: >-
        `internal-error`: an unexpected error on our side. Retry with backoff,
        and quote `instance` to support if it persists.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: API key sent in the Authorization header, with no `Bearer` prefix.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.