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

# Claim non-custodial control for a customer

> Initiates a multi-signer non-custodial provisioning flow. Returns 202 with a claimId; per-signer verification URLs are delivered via wallet_signer.invited webhooks.

A business customer's roster needs at least 2 admins (`400 ROSTER_BELOW_MIN_ADMINS` otherwise). An individual customer's roster has exactly one admin and at most one person. The person is the member under the individual's email on file, with `credentialType: "passkey"`, and must be the admin; every other member is an api_key member with `role: "signer"`. With no person, which only programmatic unattended allows, the admin is one api_key member. Any other roster returns `422 INDIVIDUAL_ROSTER_INVALID`, and so does a later add of a passkey member or an admin, or a promote to admin. Unlike a business, an individual's roster cannot have the person and an api_key admin together. The person enrolls two passkeys (for example on two devices) before the wallet activates, so one lost device does not lose the funds. Conduit holds one administrative seat on the wallet and can never sign alone.

Valid roster shapes depend on the customer's signing mode, which Conduit sets per organization (with an optional per-customer override) — confirm the customer's configured mode before building the roster: **passkey required** — any api_key member returns `422 SIGNING_MODE_ROSTER_INVALID`; **programmatic** — api_key members must have `role: "signer"` (an api_key admin returns `422 SIGNING_MODE_ROSTER_INVALID`); **programmatic unattended** — api_key admins are allowed. In every mode the active signers of any credential type must be able to reach `signingThreshold`; passkeys count toward it. Each api_key member carries a `publicKey` — the compressed public key, 33 bytes / 66 hex chars, `02`/`03` prefix, on the curve of its `signatureScheme` (`p256` by default, or `secp256k1` / `secp256k1_eip191`) — and is seated active at claim — an all-machine roster activates the wallets without an enrollment phase; mixed rosters wait on every passkey enrollment. Omitting `chains` provisions the default set: `base`, `ethereum`, `polygon`, `tron`. A default chain that does not settle in the environment is left out. A chain whose addresses need a one-time on-chain setup is not in the default set: name it in `chains`. Its wallet reads `pending` until the signers approve that setup, announced by `wallet.awaiting_setup_signature`. See [Programmatic payout signing](/guides/machine-signer-stamping) and [Add a crypto wallet](/guides/add-crypto-wallet).



## OpenAPI

````yaml https://api.sandbox.conduit.financial/v2/api-docs/openapi.json post /customers/{customerId}/wallets/claim-non-custodial
openapi: 3.0.0
info:
  title: Conduit Sandbox API
  description: >-
    **Sandbox API** — clients integrate against this surface to exercise happy
    and unhappy paths without consuming real KYC/PSP credits or moving real
    money. Customer KYC, banking partners, and crypto custody are stubbed;
    org-level KYB runs against real providers. Simulation endpoints under
    `/v2/sandbox/*` drive specific scenarios.


    Internal and portal endpoints are excluded from this spec.
  version: '2.0'
  contact: {}
servers:
  - url: https://api.sandbox.conduit.financial/v2
    description: Sandbox
  - url: https://api.conduit.financial/v2
    description: Production
security:
  - api-key: []
tags:
  - name: Customers
  - name: Registered Addresses
  - name: Wallets
  - name: Wallet Signers
  - name: Signing Quorum
  - name: Virtual Accounts
  - name: Applications
  - name: RFIs
  - name: Documents
  - name: Verifications
  - name: Signing Requests
  - name: Transactions
  - name: Payouts
  - name: Whitelist Recipients
  - name: Orders
  - name: Asset Chain Pairs
  - name: Quotes
  - name: Webhook Endpoints
  - name: Webhook Deliveries
  - name: Webhook Event Types
  - name: Features
  - name: Customer Onboarding
  - name: Markup
  - name: Sandbox
paths:
  /customers/{customerId}/wallets/claim-non-custodial:
    post:
      tags:
        - Wallets
      summary: Claim non-custodial control for a customer
      description: >-
        Initiates a multi-signer non-custodial provisioning flow. Returns 202
        with a claimId; per-signer verification URLs are delivered via
        wallet_signer.invited webhooks.


        A business customer's roster needs at least 2 admins (`400
        ROSTER_BELOW_MIN_ADMINS` otherwise). An individual customer's roster has
        exactly one admin and at most one person. The person is the member under
        the individual's email on file, with `credentialType: "passkey"`, and
        must be the admin; every other member is an api_key member with `role:
        "signer"`. With no person, which only programmatic unattended allows,
        the admin is one api_key member. Any other roster returns `422
        INDIVIDUAL_ROSTER_INVALID`, and so does a later add of a passkey member
        or an admin, or a promote to admin. Unlike a business, an individual's
        roster cannot have the person and an api_key admin together. The person
        enrolls two passkeys (for example on two devices) before the wallet
        activates, so one lost device does not lose the funds. Conduit holds one
        administrative seat on the wallet and can never sign alone.


        Valid roster shapes depend on the customer's signing mode, which Conduit
        sets per organization (with an optional per-customer override) — confirm
        the customer's configured mode before building the roster: **passkey
        required** — any api_key member returns `422
        SIGNING_MODE_ROSTER_INVALID`; **programmatic** — api_key members must
        have `role: "signer"` (an api_key admin returns `422
        SIGNING_MODE_ROSTER_INVALID`); **programmatic unattended** — api_key
        admins are allowed. In every mode the active signers of any credential
        type must be able to reach `signingThreshold`; passkeys count toward it.
        Each api_key member carries a `publicKey` — the compressed public key,
        33 bytes / 66 hex chars, `02`/`03` prefix, on the curve of its
        `signatureScheme` (`p256` by default, or `secp256k1` /
        `secp256k1_eip191`) — and is seated active at claim — an all-machine
        roster activates the wallets without an enrollment phase; mixed rosters
        wait on every passkey enrollment. Omitting `chains` provisions the
        default set: `base`, `ethereum`, `polygon`, `tron`. A default chain that
        does not settle in the environment is left out. A chain whose addresses
        need a one-time on-chain setup is not in the default set: name it in
        `chains`. Its wallet reads `pending` until the signers approve that
        setup, announced by `wallet.awaiting_setup_signature`. See [Programmatic
        payout signing](/guides/machine-signer-stamping) and [Add a crypto
        wallet](/guides/add-crypto-wallet).
      operationId: WalletsCustomerController_claimNonCustodial_v2
      parameters:
        - name: customerId
          required: true
          in: path
          schema:
            type: string
            example: cus_1A2b3C4d5E6f7G8h9I0jKl
        - name: Idempotency-Key
          in: header
          description: >-
            Caller-generated unique key that lets the server safely replay this
            request. The original response is returned for 30 days on any retry
            with the same key from the same organization, with the response
            header `Idempotency-Replayed: true`. Required on every
            state-changing money-moving or resource-creating POST.
          required: true
          schema:
            type: string
            pattern: ^[A-Za-z0-9_.:-]{1,128}$
            minLength: 1
            maxLength: 128
            example: 01J7B3K2X9M8N5P6Q7R8S9T0V1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClaimNonCustodialDto'
      responses:
        '202':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClaimNonCustodialResponse'
        '400':
          description: >-
            **INVALID_OID_FORMAT**: A path or query parameter expected a valid
            object identifier but received a value that does not match the
            expected format.


            **VALIDATION_ERROR**: The request body or query parameters failed
            validation. One or more fields have invalid values, missing required
            properties, or incorrect types. A required text field that holds
            only spaces counts as missing. Multipart file uploads that fail at
            the multipart-parser layer (unexpected form-field name, too many
            parts) carry an extra 'field' member naming the offending
            form-field.


            **MALFORMED_JSON**: The request body could not be parsed as JSON.
            Bodies declared as 'application/json' — and bodies with no
            Content-Type header, which are assumed to be JSON — must contain
            syntactically valid JSON.


            **IDEMPOTENCY_KEY_REQUIRED**: This endpoint requires an
            Idempotency-Key header to prevent duplicate processing. Generate a
            unique key per logical request and resend the request.


            **IDEMPOTENCY_KEY_INVALID**: The Idempotency-Key header value did
            not match the required shape (1-128 characters, letters / digits /
            underscore / dot / colon / hyphen).


            **IDEMPOTENCY_BODY_TOO_NESTED**: The request body exceeds the
            maximum nesting depth allowed by the idempotency fingerprint hasher.
            Deeply-nested arrays or objects are rejected as a malformed payload.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorDto'
              example:
                type: INVALID_OID_FORMAT
                title: Invalid Object ID Format
                status: 400
                detail: >-
                  A path or query parameter expected a valid object identifier
                  but received a value that does not match the expected format.
                resolution: >-
                  Verify that all IDs in the request URL and query parameters
                  are correctly formatted. IDs are typically prefixed strings
                  like 'cus_...', 'app_...', or 'doc_...'.
                docs: https://conduit-v2.mintlify.app/errors#invalid-oid-format
                instance: /v2/...
                correlationId: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
                timestamp: '2026-01-15T09:30:00.000Z'
        '401':
          description: >-
            **API_KEY_MISSING**: The request did not include an API key. All API
            requests must be authenticated.


            **API_KEY_INVALID**: The provided API key is not recognized or has
            been revoked.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailDto'
              example:
                type: API_KEY_MISSING
                title: API Key Missing
                status: 401
                detail: >-
                  The request did not include an API key. All API requests must
                  be authenticated.
                resolution: >-
                  Include your API key in the 'x-api-key' header with every
                  request.
                docs: https://conduit-v2.mintlify.app/errors#api-key-missing
                instance: /v2/...
                correlationId: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
                timestamp: '2026-01-15T09:30:00.000Z'
        '403':
          description: >-
            **ORGANIZATION_ACCESS_SUSPENDED**: Conduit has suspended this
            organization's access. Requests with the organization's API keys and
            from its users are refused until Conduit restores access.


            **API_KEY_READ_ONLY**: This API key has read-only access and cannot
            perform write operations. Read-only keys may make read requests
            (GET, HEAD, OPTIONS) only.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailDto'
              example:
                type: ORGANIZATION_ACCESS_SUSPENDED
                title: Organization Access Suspended
                status: 403
                detail: >-
                  Conduit has suspended this organization's access. Requests
                  with the organization's API keys and from its users are
                  refused until Conduit restores access.
                resolution: Contact Conduit support.
                docs: >-
                  https://conduit-v2.mintlify.app/errors#organization-access-suspended
                instance: /v2/...
                correlationId: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
                timestamp: '2026-01-15T09:30:00.000Z'
        '404':
          description: >-
            **CUSTOMER_NOT_FOUND**: No customer exists with the specified ID, or
            the customer belongs to a different organization.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailDto'
              example:
                type: CUSTOMER_NOT_FOUND
                title: Customer Not Found
                status: 404
                detail: >-
                  No customer exists with the specified ID, or the customer
                  belongs to a different organization.
                resolution: >-
                  Verify the customer ID is correct. Use the list customers
                  endpoint to find valid customer IDs for your organization.
                docs: https://conduit-v2.mintlify.app/errors#customer-not-found
                instance: /v2/...
                correlationId: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
                timestamp: '2026-01-15T09:30:00.000Z'
        '409':
          description: >-
            **IDEMPOTENCY_KEY_CONFLICT**: The idempotency key was previously
            used with a different request body, and that request succeeded or
            ended in a `5xx`. A `4xx` response does not bind the key.
            Idempotency keys are bound to the exact request shape — replays must
            match the original.


            **IDEMPOTENCY_KEY_REQUEST_IN_PROGRESS**: An earlier request with
            this idempotency key has not finished, or stopped before its result
            was recorded. In the second case it may or may not have completed
            its work.


            **CUSTOMER_ALREADY_NON_CUSTODIAL**: Non-custodial control has
            already been claimed for this customer; the claim endpoint
            provisions only fresh customers.


            **CUSTOMER_ALREADY_CUSTODIAL**: This customer already has a
            custodial wallet account from initial onboarding. The claim endpoint
            provisions only fresh customers; an existing custodial wallet cannot
            be claimed as non-custodial.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailDto'
              example:
                type: IDEMPOTENCY_KEY_CONFLICT
                title: Idempotency Key Conflict
                status: 409
                detail: >-
                  The idempotency key was previously used with a different
                  request body, and that request succeeded or ended in a `5xx`.
                  A `4xx` response does not bind the key. Idempotency keys are
                  bound to the exact request shape — replays must match the
                  original.
                resolution: >-
                  Use a fresh idempotency key for the new request, or replay the
                  original request unchanged.
                docs: >-
                  https://conduit-v2.mintlify.app/errors#idempotency-key-conflict
                instance: /v2/...
                correlationId: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
                timestamp: '2026-01-15T09:30:00.000Z'
        '415':
          description: >-
            **UNSUPPORTED_MEDIA_TYPE**: The request carries a body with a
            Content-Type this endpoint cannot parse. JSON endpoints accept
            'application/json'; a body with no Content-Type header at all is
            assumed to be JSON. File-upload endpoints accept only
            'multipart/form-data' — JSON or undeclared bodies are rejected
            there.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailDto'
              example:
                type: UNSUPPORTED_MEDIA_TYPE
                title: Unsupported Media Type
                status: 415
                detail: >-
                  The request carries a body with a Content-Type this endpoint
                  cannot parse. JSON endpoints accept 'application/json'; a body
                  with no Content-Type header at all is assumed to be JSON.
                  File-upload endpoints accept only 'multipart/form-data' — JSON
                  or undeclared bodies are rejected there.
                resolution: >-
                  Send the request body with the 'Content-Type:
                  application/json' header. For file uploads, use 'Content-Type:
                  multipart/form-data' — upload endpoints accept no other body
                  type.
                docs: https://conduit-v2.mintlify.app/errors#unsupported-media-type
                instance: /v2/...
                correlationId: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
                timestamp: '2026-01-15T09:30:00.000Z'
        '422':
          description: >-
            **CUSTOMER_KYB_INCOMPLETE**: Non-custodial control can only be
            claimed after the customer's KYB application has been approved.


            **CRYPTO_FEATURE_NOT_APPROVED**: Non-custodial control can only be
            claimed after the customer's CRYPTO_WALLET feature application has
            been approved. Either no feature application exists yet, or it is
            still pending review.


            **SIGNING_MODE_ROSTER_INVALID**: The submitted signer roster is not
            valid for this customer's configured signing mode. In
            PASSKEY_REQUIRED mode all signers must be passkeys; in PROGRAMMATIC
            mode machine (api_key) signers must have role=signer and governance
            admins must be passkeys.


            **INDIVIDUAL_ROSTER_INVALID**: An individual customer's self-managed
            wallet has exactly one admin and at most one person. The person
            signs with passkeys, under the email on file, and is the admin. With
            no person, which only the programmatic unattended signing mode
            allows, the admin is one api_key key. Every other member is an
            api_key signer. After the claim, the roster can only gain api_key
            signers.


            **API_KEY_CREDENTIAL_NOT_SUPPORTED**: The request includes a machine
            signer (`credentialType: api_key`) in a context where api_key
            signers cannot be enrolled. This is reserved for future
            compatibility and should not be seen in normal operation.


            **API_KEY_PUBLIC_KEY_DUPLICATE**: Two api_key (machine) roster
            members were submitted with the same `publicKey`. Each machine
            signer must have a distinct public key.


            **NON_CUSTODIAL_CHAIN_NOT_SUPPORTED**: The chain holds custodial
            wallets only, and the customer's wallet account is non-custodial, so
            no wallet was created or claimed on it.


            **CHAIN_NOT_SUPPORTED**: This environment does not serve that chain,
            or that asset on that chain, so it cannot carry out this request.
            Other chains and assets this environment serves are unaffected, and
            the same request on one of them is accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailDto'
              example:
                type: CUSTOMER_KYB_INCOMPLETE
                title: Customer KYB Incomplete
                status: 422
                detail: >-
                  Non-custodial control can only be claimed after the customer's
                  KYB application has been approved.
                resolution: >-
                  Complete and submit the customer's KYB application, wait for
                  approval, and retry the claim once the customer is active.
                docs: https://conduit-v2.mintlify.app/errors#customer-kyb-incomplete
                instance: /v2/...
                correlationId: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
                timestamp: '2026-01-15T09:30:00.000Z'
        '429':
          description: >-
            **RATE_LIMITED**: Too many requests. This error is returned by three
            independent checks: the per-organization bucket applied to every
            authenticated API request; the per-IP bucket applied to
            unauthenticated traffic before an API key is validated; and the
            per-IP bucket applied when repeated invalid API keys are submitted
            from the same address. Honor the Retry-After header (also exposed as
            retryAfterSeconds in the body) before retrying. Current limits and
            remaining budget are visible in X-RateLimit-Limit (the bucket size),
            X-RateLimit-Remaining, and X-RateLimit-Reset (seconds until the
            bucket refills) on every response once your API key is accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitedErrorDto'
              example:
                type: RATE_LIMITED
                title: Rate Limited
                status: 429
                detail: >-
                  Too many requests. This error is returned by three independent
                  checks: the per-organization bucket applied to every
                  authenticated API request; the per-IP bucket applied to
                  unauthenticated traffic before an API key is validated; and
                  the per-IP bucket applied when repeated invalid API keys are
                  submitted from the same address. Honor the Retry-After header
                  (also exposed as retryAfterSeconds in the body) before
                  retrying. Current limits and remaining budget are visible in
                  X-RateLimit-Limit (the bucket size), X-RateLimit-Remaining,
                  and X-RateLimit-Reset (seconds until the bucket refills) on
                  every response once your API key is accepted.
                resolution: >-
                  Sleep until Retry-After seconds have elapsed, then retry. For
                  sustained workloads exceeding the per-organization defaults,
                  request a rate-limit increase through your support contact.
                docs: https://conduit-v2.mintlify.app/errors#rate-limited
                instance: /v2/...
                correlationId: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
                timestamp: '2026-01-15T09:30:00.000Z'
                retryAfterSeconds: 3
        '500':
          description: >-
            **INTERNAL_ERROR**: An unexpected error occurred while processing
            your request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailDto'
              example:
                type: INTERNAL_ERROR
                title: Internal Error
                status: 500
                detail: An unexpected error occurred while processing your request.
                resolution: >-
                  Retry the request after a brief delay. If the error persists,
                  contact support and include the correlationId from the error
                  response for investigation.
                docs: https://conduit-v2.mintlify.app/errors#internal-error
                instance: /v2/...
                correlationId: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
                timestamp: '2026-01-15T09:30:00.000Z'
        '503':
          description: >-
            **ASSET_CHAIN_PAUSED**: Conduit has temporarily paused this asset on
            this chain, or the whole chain, so it cannot accept this request
            now. Asset and chain pairs that are not paused stay available.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetailDto'
              example:
                type: ASSET_CHAIN_PAUSED
                title: Asset Chain Paused
                status: 503
                detail: >-
                  Conduit has temporarily paused this asset on this chain, or
                  the whole chain, so it cannot accept this request now. Asset
                  and chain pairs that are not paused stay available.
                resolution: >-
                  Retry the same request later; it succeeds once Conduit lifts
                  the pause. Use an asset and chain pair that is not paused if
                  you cannot wait.
                docs: https://conduit-v2.mintlify.app/errors#asset-chain-paused
                instance: /v2/...
                correlationId: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
                timestamp: '2026-01-15T09:30:00.000Z'
components:
  schemas:
    ClaimNonCustodialDto:
      type: object
      properties:
        roster:
          minItems: 1
          maxItems: 100
          type: array
          items:
            type: object
            properties:
              email:
                description: >-
                  Signer's email address. Lowercased on receipt, and the
                  identity they activate their signer with.
                type: string
                format: email
                pattern: >-
                  ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
              name:
                description: Signer's display name, shown on approval screens.
                type: string
              role:
                type: string
                enum:
                  - admin
                  - signer
                description: >-
                  How much authority this signer holds. A business roster needs
                  at least 2 admins. An individual's roster has exactly one
                  admin.
              credentialType:
                type: string
                enum:
                  - passkey
                  - api_key
                description: How this signer will stamp. `api_key` requires `publicKey`.
              signatureScheme:
                description: >-
                  Signature scheme an api_key signer stamps with: `p256`
                  (default when omitted), `secp256k1`, or `secp256k1_eip191`
                  (EVM personal_sign). Ignored for passkeys. The public key must
                  be a valid point on the matching curve.
                type: string
                enum:
                  - p256
                  - secp256k1
                  - secp256k1_eip191
              publicKey:
                description: >-
                  Machine-signer compressed public key (33 bytes, 02/03 prefix +
                  64 hex chars, optional 0x prefix), on the curve of the
                  selected `signatureScheme`. Required when
                  credentialType=api_key.
                example: >-
                  02a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2
                pattern: ^(?:0x)?(?:02|03)[0-9a-fA-F]{64}$
                type: string
            required:
              - email
              - role
              - credentialType
            additionalProperties: false
          description: >-
            Everyone who will be able to approve on this wallet. Each member
            activates their own signer afterwards. A business customer's roster
            has at least 2 admins. An individual customer's roster has exactly
            one admin and at most one person: the person is the member under the
            individual's email on file, with `credentialType: passkey`, is the
            admin, and enrolls two passkeys before the wallet activates; every
            other member is an `api_key` signer. Under programmatic unattended
            the roster can instead be one `api_key` admin and `api_key` signers.
        signingThreshold:
          type: integer
          minimum: 1
          maximum: 9007199254740991
          description: >-
            How many roster members must approve before a transaction is signed.
            At least 1, and never more than the roster size.
        chains:
          description: >-
            Optional. Chains to provision (each must be a supported chain). Omit
            to auto-provision each default chain that settles in this
            environment (recommended) so later chain use needs no
            re-authentication. Accepting a chain here does not imply Conduit
            operationally supports asset movement on it yet.
          minItems: 1
          maxItems: 100
          type: array
          items:
            type: string
            enum:
              - ethereum
              - base
              - solana
              - polygon
              - tron
              - stellar
              - tempo
      required:
        - roster
        - signingThreshold
      additionalProperties: false
    ClaimNonCustodialResponse:
      type: object
      properties:
        claimId:
          type: string
          pattern: ^wcc_[0-9A-Za-z]{22}$
          description: >-
            Id of this claim, carried by the webhooks that report its progress.
            Each id has the form `wcc_` followed by 22 alphanumeric characters.
        customerId:
          type: string
          pattern: ^cus_[0-9A-Za-z]{22}$
          description: >-
            Customer the wallets are provisioned for. Each id has the form
            `cus_` followed by 22 alphanumeric characters.
        status:
          type: string
          description: >-
            Always `provisioning`: the claim was accepted and the wallets are
            being set up in the background. Wait for the `wallet_signer.*` and
            `crypto_wallet.completed` webhooks.
          enum:
            - provisioning
        rosterSize:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: How many signers the claim put on the roster.
        signingThreshold:
          type: integer
          minimum: 0
          exclusiveMinimum: true
          maximum: 9007199254740991
          description: >-
            How many signer stamps each payout needs to proceed. Separate from
            activation, which waits for every roster member to enroll.
        estimatedActivationCompletionMinutes:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Advisory estimate of minutes to full activation (not an SLA).
      required:
        - claimId
        - customerId
        - status
        - rosterSize
        - signingThreshold
        - estimatedActivationCompletionMinutes
    ValidationErrorDto:
      type: object
      properties:
        type:
          type: string
          description: Machine-readable error code
          example: CUSTOMER_NOT_FOUND
        title:
          type: string
          description: Human-readable error type label
          example: Customer Not Found
        status:
          type: number
          description: HTTP status code
          example: 404
        detail:
          type: string
          description: Human-readable explanation of this occurrence
          example: Customer with id cus_034A0gCCVsxdV2PjHLx9k1 not found
        resolution:
          type: string
          description: What the developer should do to resolve this error
          example: >-
            Verify the customer ID. Check you are using the correct API key for
            this organization.
        docs:
          type: string
          description: URL to error documentation
          example: https://conduit-v2.mintlify.app/errors#customer-not-found
        instance:
          type: string
          description: Request path that produced the error
          example: /v2/customers/cus_034A0gCCVsxdV2PjHLx9k1
        correlationId:
          description: Request correlation ID
          example: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
          type: string
        timestamp:
          type: string
          description: ISO 8601 UTC timestamp
          example: '2026-04-27T20:00:00.000Z'
        details:
          description: >-
            Additional structured data for domain-specific errors (e.g. missing
            field lists, pair info)
        errors:
          type: array
          items:
            type: object
            properties:
              pointer:
                type: string
                description: JSON pointer to the invalid field
                example: /email
              detail:
                type: string
                description: What is wrong with this field
                example: Invalid email format
              allowedValues:
                description: The values this field accepts, when it is a closed set
                example:
                  - ach
                  - fedwire
                  - rtp
                type: array
                items:
                  type: string
              category:
                description: >-
                  Class of blocker (requirements-validator output only). 'field'
                  = form-field gap, 'document' = missing or insufficient
                  document (including per-UBO document slots), 'individual' =
                  required person missing.
                example: field
                type: string
                enum:
                  - field
                  - document
                  - individual
            required:
              - pointer
              - detail
      required:
        - type
        - title
        - status
        - detail
        - resolution
        - docs
        - instance
        - timestamp
    ProblemDetailDto:
      type: object
      properties:
        type:
          type: string
          description: Machine-readable error code
          example: CUSTOMER_NOT_FOUND
        title:
          type: string
          description: Human-readable error type label
          example: Customer Not Found
        status:
          type: number
          description: HTTP status code
          example: 404
        detail:
          type: string
          description: Human-readable explanation of this occurrence
          example: Customer with id cus_034A0gCCVsxdV2PjHLx9k1 not found
        resolution:
          type: string
          description: What the developer should do to resolve this error
          example: >-
            Verify the customer ID. Check you are using the correct API key for
            this organization.
        docs:
          type: string
          description: URL to error documentation
          example: https://conduit-v2.mintlify.app/errors#customer-not-found
        instance:
          type: string
          description: Request path that produced the error
          example: /v2/customers/cus_034A0gCCVsxdV2PjHLx9k1
        correlationId:
          description: Request correlation ID
          example: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
          type: string
        timestamp:
          type: string
          description: ISO 8601 UTC timestamp
          example: '2026-04-27T20:00:00.000Z'
        details:
          description: >-
            Additional structured data for domain-specific errors (e.g. missing
            field lists, pair info)
      required:
        - type
        - title
        - status
        - detail
        - resolution
        - docs
        - instance
        - timestamp
    RateLimitedErrorDto:
      type: object
      properties:
        type:
          type: string
          description: Machine-readable error code
          example: CUSTOMER_NOT_FOUND
        title:
          type: string
          description: Human-readable error type label
          example: Customer Not Found
        status:
          type: number
          description: HTTP status code
          example: 404
        detail:
          type: string
          description: Human-readable explanation of this occurrence
          example: Customer with id cus_034A0gCCVsxdV2PjHLx9k1 not found
        resolution:
          type: string
          description: What the developer should do to resolve this error
          example: >-
            Verify the customer ID. Check you are using the correct API key for
            this organization.
        docs:
          type: string
          description: URL to error documentation
          example: https://conduit-v2.mintlify.app/errors#customer-not-found
        instance:
          type: string
          description: Request path that produced the error
          example: /v2/customers/cus_034A0gCCVsxdV2PjHLx9k1
        correlationId:
          description: Request correlation ID
          example: 00469ea4-52c1-4ffa-bd05-9f28b236a5fe
          type: string
        timestamp:
          type: string
          description: ISO 8601 UTC timestamp
          example: '2026-04-27T20:00:00.000Z'
        details:
          description: >-
            Additional structured data for domain-specific errors (e.g. missing
            field lists, pair info)
        retryAfterSeconds:
          type: integer
          minimum: 0
          exclusiveMinimum: true
          maximum: 9007199254740991
          description: Seconds to wait before retrying
          example: 3
      required:
        - type
        - title
        - status
        - detail
        - resolution
        - docs
        - instance
        - timestamp
        - retryAfterSeconds
  securitySchemes:
    api-key:
      type: apiKey
      in: header
      name: x-api-key

````

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