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

# Discover feature requirements for a customer

> Same response shape as `GET /v2/onboarding/requirements`, resolved as a delta against what the customer already has on file. `country` echoes the customer's registered country. Returns 422 `ONBOARDING_NOT_READY` if the customer has no business record yet.



## OpenAPI

````yaml https://api.sandbox.conduit.financial/v2/api-docs/openapi.json get /customers/{customerId}/features/requirements
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: Documents
  - name: Verifications
  - name: Signing Requests
  - name: Transactions
  - name: Payouts
  - name: Whitelist Recipients
  - name: Orders
  - name: RFIs
  - name: Webhook Endpoints
  - name: Webhook Deliveries
  - name: Webhook Event Types
  - name: Features
  - name: Customer Onboarding
  - name: Sandbox
paths:
  /customers/{customerId}/features/requirements:
    get:
      tags:
        - Features
      summary: Discover feature requirements for a customer
      description: >-
        Same response shape as `GET /v2/onboarding/requirements`, resolved as a
        delta against what the customer already has on file. `country` echoes
        the customer's registered country. Returns 422 `ONBOARDING_NOT_READY` if
        the customer has no business record yet.
      operationId: FeaturesController_resolveRequirements_v2
      parameters:
        - name: customerId
          required: true
          in: path
          schema:
            type: string
        - name: type
          required: true
          in: query
          description: Feature whose requirements you want to discover.
          schema:
            enum:
              - virtual_account
              - crypto_wallet
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExternalRequirementsResponseDto'
        '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.
          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: req_a1b2c3d4
                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: req_a1b2c3d4
                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.


            **NOT_FOUND**: The requested resource does not exist or you do not
            have access to it.
          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: req_a1b2c3d4
                timestamp: '2026-01-15T09:30:00.000Z'
        '422':
          description: >-
            **ONBOARDING_NOT_READY**: The onboarding submission cannot be
            completed because one or more required fields or documents are still
            missing, or a submitted value is not one of the accepted options for
            a closed-set field (e.g. a country-specific field like
            `companyClassification.legalStructure`). Each blocker is reported
            per field in `errors[]` with a `category` and, for closed-set
            fields, the accepted `allowedValues`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationErrorDto'
              example:
                type: ONBOARDING_NOT_READY
                title: Onboarding Not Ready
                status: 422
                detail: >-
                  The onboarding submission cannot be completed because one or
                  more required fields or documents are still missing, or a
                  submitted value is not one of the accepted options for a
                  closed-set field (e.g. a country-specific field like
                  `companyClassification.legalStructure`). Each blocker is
                  reported per field in `errors[]` with a `category` and, for
                  closed-set fields, the accepted `allowedValues`.
                resolution: >-
                  Use the onboarding requirements endpoint to check which fields
                  and documents are required and which values each field
                  accepts, then submit valid values before retrying.
                docs: https://conduit-v2.mintlify.app/errors#onboarding-not-ready
                instance: /v2/...
                correlationId: req_a1b2c3d4
                timestamp: '2026-01-15T09:30:00.000Z'
                errors:
                  - pointer: /businessInfo/taxId
                    detail: Tax ID is required
                    category: field
                  - pointer: /documentIds
                    detail: At least one document is required
                    category: document
        '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,
            X-RateLimit-Remaining, and X-RateLimit-Reset on rate-limited route
            responses.
          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, X-RateLimit-Remaining, and
                  X-RateLimit-Reset on rate-limited route responses.
                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: req_a1b2c3d4
                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: req_a1b2c3d4
                timestamp: '2026-01-15T09:30:00.000Z'
components:
  schemas:
    ExternalRequirementsResponseDto:
      type: object
      properties:
        schemaVersion:
          type: string
          description: >-
            Discovery response schema version. Bumps on any breaking
            discovery-response change (field renamed, removed, type changed,
            conditional semantics changed). Distinct from the webhook envelope's
            `apiVersion` which tracks the API major. Clients pin the literal and
            fail loudly on mismatch; servers do not negotiate.
          enum:
            - '3'
        context:
          type: string
          enum:
            - onboarding
            - feature
            - order
          description: The discovery context that produced this requirements set.
          example: onboarding
        country:
          type: string
          pattern: ^[A-Z]{3}$
          description: >-
            ISO 3166-1 alpha-3 country code the requirements were resolved for.
            Always three uppercase letters.
          example: USA
        fields:
          type: array
          items:
            type: object
            properties:
              pointer:
                type: string
                description: >-
                  RFC 6901 JSON Pointer to the field in the submission payload.
                  Always starts with /. Array indices appear as integers.
                example: /businessInfo/taxId
              label:
                type: string
                description: Human-readable label for display
                example: Tax Identification Number
              helpText:
                description: >-
                  One-line guidance for the field, intended to render as a
                  tooltip / info pill next to the label. Plain text, no markup.
                  For `businessInfo.taxId` and `businessInfo.businessEntityId`
                  this is the country-specific identifier description from
                  `countries.json` (with the issuing authority prefixed when
                  known, e.g. 'Issued by HMRC.'). For other fields it is
                  universal copy from the server-side field registry. Silently
                  absent when neither source has guidance on file. See
                  api-conventions §5.1.5.
                example: >-
                  Issued by HMRC. 10-digit number; auto-assigned on CT
                  registration; appears on HMRC correspondence. VAT Registration
                  Number (GB + 9 digits; XI prefix for NI–EU trade) is
                  supplementary — collect separately if VAT-registered.
                type: string
              type:
                type: string
                enum:
                  - string
                  - number
                  - integer
                  - boolean
                  - date
                  - email
                  - url
                  - phone
                  - country
                  - enum
                  - stringArray
                  - enumArray
                description: Data type of the field
                example: string
              required:
                type: boolean
                description: Whether the field is required at submit
              group:
                description: >-
                  Section grouping code for renderers. Stable camelCase token
                  drawn from a closed set per discovery context (onboarding
                  today: `businessInfo`, `companyClassification`,
                  `registeredAddress`, `operatingAddress`, `businessActivity`,
                  `regulatoryHistory`, `certification`). Omitted on top-level
                  scalars without a section and on fields nested inside
                  `individualRequirements[].fields[]` (already a logical group).
                  Presentation metadata; submit ignores it.
                type: string
              mustEqual:
                description: >-
                  Required-with-const marker. Submit enforces strict equality on
                  the field value (not just presence). Most common case:
                  legal-certification booleans
                  (`certification.termsAndConditions: { required: true,
                  mustEqual: true }`) where `false` submits are rejected.
                  Omitted when not constrained to a single value.
                anyOf:
                  - type: boolean
                  - type: string
                  - type: number
              constraints:
                description: >-
                  Per-value constraints integrators should enforce client-side;
                  the server enforces the same set at submit.
                type: object
                properties:
                  pattern:
                    description: Regex the submitted value must match
                    example: ^\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}$
                    type: string
                  example:
                    description: Example value matching the pattern
                    example: 12.345.678/0001-95
                    type: string
                  format:
                    description: >-
                      Advertised server-enforced semantic format marker. Closed
                      enum: `safeString` (structured short fields — rejects
                      control characters, HTML tags, and punctuation outside the
                      documented allowlist) or `prose` (free-text fields —
                      allows ordinary punctuation and multi-line text, rejecting
                      control characters, invisible-format characters,
                      line/paragraph separators, and lone surrogates). The
                      server enforces the rule at submit; the marker advertises
                      it so clients can pre-validate. Arbitrary regex aliases
                      belong in `pattern`.
                    type: string
                    enum:
                      - safeString
                      - prose
                  minLength:
                    description: Minimum string length
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  maxLength:
                    description: Maximum string length
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  min:
                    description: Minimum numeric value
                    type: number
                  max:
                    description: Maximum numeric value
                    type: number
                  minDate:
                    description: >-
                      Earliest allowed date as ISO 8601 (YYYY-MM-DD) or the
                      literal 'today'
                    example: '1800-01-01'
                    type: string
                  maxDate:
                    description: >-
                      Latest allowed date as ISO 8601 (YYYY-MM-DD) or the
                      literal 'today'
                    example: today
                    type: string
                  minAgeYears:
                    description: Minimum age in years (for date-of-birth-style fields)
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                additionalProperties: false
              conditions:
                description: >-
                  Conditional applicability rules. The field applies (is shown /
                  required) only when every condition evaluates true against the
                  current submission. Empty / absent means unconditional.
                type: array
                items:
                  type: object
                  properties:
                    pointer:
                      type: string
                      description: >-
                        RFC 6901 JSON Pointer to the submitted-data field this
                        condition reads. Resolution is governed by the sibling
                        scope (root by default; person-scoped when
                        scope='person').
                      example: /companyClassification/legalStructure
                    operator:
                      type: string
                      enum:
                        - eq
                        - in
                        - not_in
                        - exists
                        - is_true
                        - is_false
                      description: >-
                        Comparison operator. The field is required / applies
                        only when the condition evaluates true against the
                        current submitted data.
                      example: eq
                    value:
                      description: Single comparison value, used with eq / exists operators
                      type: string
                    values:
                      description: >-
                        Array of comparison values, used with in / not_in
                        operators
                      type: array
                      items:
                        type: string
                    scope:
                      description: >-
                        Evaluation scope for `pointer`. Default `root` evaluates
                        against the top-level submission; `person` evaluates
                        against the current `ownership.persons[i]` row (used
                        inside `individualRequirements[].fields[].conditions`).
                      type: string
                      enum:
                        - root
                        - person
                  required:
                    - pointer
                    - operator
                  additionalProperties: false
              allowedValues:
                description: >-
                  Allowed values for enum / enumArray fields. The submitted
                  value MUST be one of these.
                example:
                  - LLC
                  - CORPORATION
                  - PARTNERSHIP
                type: array
                items:
                  type: string
              options:
                description: >-
                  Structured per-option metadata for enum fields with display /
                  grouping hints (label, abbr, description, category). `value`
                  mirrors an entry in `allowedValues`. Present when the
                  projector has localized data to surface (e.g. country-specific
                  legal structures); enum fields without rich metadata use
                  `allowedValues` alone.
                type: array
                items:
                  type: object
                  properties:
                    value:
                      type: string
                      description: >-
                        Submitted value. Must be one of the entries in the
                        sibling `allowedValues` array.
                      example: Sociedad Anónima
                    label:
                      type: string
                      description: Human-readable label for display
                      example: Sociedad Anónima
                    abbr:
                      type: string
                      description: Short-form / acronym for the option
                      example: S.A.
                      nullable: true
                    description:
                      description: Long-form description of the option
                      type: string
                    category:
                      type: string
                      enum:
                        - Corp
                        - LLC
                        - Sole Proprietorship
                        - Partnership
                        - Other
                        - regulatory_review
                      description: >-
                        Out-of-band metadata for an option that affects how it
                        should be rendered or handled. Values: the
                        legal-structure canonical bucket (`Corp` / `LLC` / `Sole
                        Proprietorship` / `Partnership` / `Other`) — used to map
                        the localised `value` to a standardised type; and
                        `regulatory_review` — indicates this option is subject
                        to additional regulatory review and may warrant a
                        pre-submission warning to the user. Silently absent on
                        options that carry no such metadata.
                  required:
                    - value
                    - label
                  additionalProperties: false
            required:
              - pointer
              - label
              - type
              - required
          description: >-
            Scalar fields the integrator must collect, with format hints and
            allowedValues for enum fields.
        documents:
          type: array
          items:
            type: object
            properties:
              canonicalType:
                type: string
                enum:
                  - BUSINESS_REGISTRATION
                  - ARTICLES_OF_INCORPORATION
                  - TAX_CERTIFICATE
                  - OPERATING_LICENSE
                  - REGULATORY_LICENSE
                  - SHAREHOLDERS_REGISTRY
                  - DIRECTORS_REGISTRY
                  - AUTHORIZATION_TO_ACT
                  - PROOF_OF_ADDRESS
                  - CERTIFICATE_OF_GOOD_STANDING
                  - FLOW_OF_FUNDS
                  - AUDITED_FINANCIAL_STATEMENT
                  - BANK_STATEMENT
                  - ORG_STRUCTURE_CHART
                  - AML_AUDIT
                  - COMPLIANCE_POLICY
                  - INSTITUTIONAL_INVESTOR_DOCUMENTATION
                  - IDENTITY_VERIFICATION
                  - IDENTITY_VERIFICATION_ATTESTATION
                  - BANK_VERIFICATION_LETTER
                  - INVOICE
                  - CONTRACT
                  - PAYROLL_REGISTER
                  - INVESTMENT_AGREEMENT
                description: >-
                  Canonical category label for this document slot.
                  Informational: the integrator collects a document matching the
                  title/category and uploads it via POST /v2/documents (no type
                  field needed). The AI classifier determines the canonical type
                  at review time.
              title:
                type: string
                description: Human-readable artifact name for UI display
                example: Articles of Incorporation
              from:
                description: Issuing authority when known
                type: string
              alternatives:
                description: >-
                  Acceptable alternative artifacts. Collect ANY ONE of these to
                  satisfy the requirement.
                type: array
                items:
                  type: object
                  properties:
                    title:
                      type: string
                      description: Human-readable artifact name for UI display
                      example: Certificate of Incorporation
                    from:
                      description: Issuing authority when known
                      type: string
                  required:
                    - title
                  additionalProperties: false
              requiredArtifacts:
                description: >-
                  Present only when the slot mixes required artifacts with
                  alternative or optional artifacts. Single required-only slots
                  are flattened to the row itself.
                type: array
                items:
                  type: object
                  properties:
                    title:
                      type: string
                      description: Human-readable artifact name for UI display
                      example: Certificate of Incorporation
                    from:
                      description: Issuing authority when known
                      type: string
                  required:
                    - title
                  additionalProperties: false
              optionalArtifacts:
                description: >-
                  Recommended artifacts for this canonical document slot. These
                  are not required for submission.
                type: array
                items:
                  type: object
                  properties:
                    title:
                      type: string
                      description: Human-readable artifact name for UI display
                      example: Certificate of Incorporation
                    from:
                      description: Issuing authority when known
                      type: string
                  required:
                    - title
                  additionalProperties: false
              optional:
                description: >-
                  True when collection is recommended but not required for
                  submission.
                type: boolean
              minCount:
                description: >-
                  Number of files of this canonical type the integrator must
                  upload. Absent / 1 means a single file satisfies the slot;
                  values greater than 1 require N distinct uploads (e.g. 3
                  consecutive bank statements). Server-side validation at submit
                  enforces the same floor.
                type: integer
                minimum: 1
                maximum: 9007199254740991
              groupId:
                description: >-
                  When present, this document row is one branch of an `any-of`
                  alternation. Every row sharing the same `groupId` forms a
                  single decision point: satisfying ANY branch's own minCount
                  satisfies the group. The integrator should render grouped rows
                  together (e.g. a single slab with each branch as a
                  sub-option). The `group:` prefix namespaces the id away from
                  canonical type names (which are SCREAMING_SNAKE_CASE and never
                  contain `:` or `+`).
                example: group:any-of:AUDITED_FINANCIAL_STATEMENT+BANK_STATEMENT
                type: string
              policyFallback:
                description: >-
                  True when this row exists because the requirement rule asks
                  for the canonicalType but the country has no
                  jurisdiction-specific document. Conduit substitutes a generic,
                  company-producible alternative (e.g. an internal share
                  register, board resolution, utility bill). The customer is
                  still expected to provide evidence; see `guidance` for what to
                  collect.
                type: boolean
              guidance:
                description: >-
                  One-line collection guidance shown to the integrator's end
                  customer: what evidence to collect for this slot. Present on
                  `policyFallback: true` rows (what to supply absent a
                  jurisdiction-specific document) and on address-targeted
                  proof-of-address rows (which address the document must show —
                  registered vs operating).
                type: string
              addressTarget:
                description: >-
                  Which submitted address this proof-of-address row must be
                  shown to prove. Present ONLY on `PROOF_OF_ADDRESS` rows that
                  are address-targeted: the requirement can surface as two rows
                  sharing `canonicalType: "PROOF_OF_ADDRESS"`, disambiguated by
                  this field (`registered` always; `operating` when the
                  operating address differs). Both must be collected.
                  Machine-readable key for these rows — do NOT dedupe
                  address-targeted rows by `canonicalType`.
                type: string
                enum:
                  - registered
                  - operating
            required:
              - canonicalType
              - title
            additionalProperties: false
          description: >-
            Customer-level documents to collect. Rows are usually keyed by
            canonicalType — EXCEPT address-targeted proof-of-address, which can
            appear as two rows sharing canonicalType `PROOF_OF_ADDRESS`
            disambiguated by `addressTarget` (registered / operating); collect
            both, and key those rows on `addressTarget`, not canonicalType
            alone. Upload every requiredArtifacts[] entry and any one
            alternatives[] entry when present, otherwise upload the row itself
            via POST /v2/documents.
        minDocuments:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: >-
            Document floor: the minimum number of customer-level documents POST
            /v2/onboarding accepts — currently 0 or 1. `1` means at least one
            customer-level document must be uploaded before submit (submitting
            `documentIds: []` is rejected with 422 ONBOARDING_NOT_READY); `0`
            means documents are optional at submit. This is the authoritative
            floor — individual `documents[]` rows are a checklist of acceptable
            types and do not each carry a required flag; per-document
            completeness is assessed after submission.
          example: 1
        individualRequirements:
          type: array
          items:
            anyOf:
              - type: object
                properties:
                  role:
                    type: string
                    description: >-
                      Role discriminant. BENEFICIAL_OWNER is the only role that
                      carries `ownershipThreshold`.
                    enum:
                      - BENEFICIAL_OWNER
                  minCount:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                    description: >-
                      Minimum number of persons that must fill this role.
                      BENEFICIAL_OWNER may be 0 when the rule only conditionally
                      requires beneficial-owner disclosure (e.g. only when
                      actual ownership crosses `ownershipThreshold`).
                  maxCount:
                    description: >-
                      Maximum number of persons accepted under this role. Absent
                      when unbounded.
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  ownershipThreshold:
                    example: 25
                    type: number
                    description: >-
                      Minimum ownership percentage qualifying a person as a
                      beneficial owner under this rule. Absent when the rule
                      doesn't constrain ownership disclosure.
                  fields:
                    type: array
                    items:
                      type: object
                      properties:
                        pointer:
                          type: string
                          description: >-
                            RFC 6901 JSON Pointer to the field in the submission
                            payload. Always starts with /. Array indices appear
                            as integers.
                          example: /businessInfo/taxId
                        label:
                          type: string
                          description: Human-readable label for display
                          example: Tax Identification Number
                        helpText:
                          description: >-
                            One-line guidance for the field, intended to render
                            as a tooltip / info pill next to the label. Plain
                            text, no markup. For `businessInfo.taxId` and
                            `businessInfo.businessEntityId` this is the
                            country-specific identifier description from
                            `countries.json` (with the issuing authority
                            prefixed when known, e.g. 'Issued by HMRC.'). For
                            other fields it is universal copy from the
                            server-side field registry. Silently absent when
                            neither source has guidance on file. See
                            api-conventions §5.1.5.
                          example: >-
                            Issued by HMRC. 10-digit number; auto-assigned on CT
                            registration; appears on HMRC correspondence. VAT
                            Registration Number (GB + 9 digits; XI prefix for
                            NI–EU trade) is supplementary — collect separately
                            if VAT-registered.
                          type: string
                        type:
                          type: string
                          enum:
                            - string
                            - number
                            - integer
                            - boolean
                            - date
                            - email
                            - url
                            - phone
                            - country
                            - enum
                            - stringArray
                            - enumArray
                          description: Data type of the field
                          example: string
                        required:
                          type: boolean
                          description: Whether the field is required at submit
                        group:
                          description: >-
                            Section grouping code for renderers. Stable
                            camelCase token drawn from a closed set per
                            discovery context (onboarding today: `businessInfo`,
                            `companyClassification`, `registeredAddress`,
                            `operatingAddress`, `businessActivity`,
                            `regulatoryHistory`, `certification`). Omitted on
                            top-level scalars without a section and on fields
                            nested inside `individualRequirements[].fields[]`
                            (already a logical group). Presentation metadata;
                            submit ignores it.
                          type: string
                        mustEqual:
                          description: >-
                            Required-with-const marker. Submit enforces strict
                            equality on the field value (not just presence).
                            Most common case: legal-certification booleans
                            (`certification.termsAndConditions: { required:
                            true, mustEqual: true }`) where `false` submits are
                            rejected. Omitted when not constrained to a single
                            value.
                          anyOf:
                            - type: boolean
                            - type: string
                            - type: number
                        constraints:
                          description: >-
                            Per-value constraints integrators should enforce
                            client-side; the server enforces the same set at
                            submit.
                          type: object
                          properties:
                            pattern:
                              description: Regex the submitted value must match
                              example: ^\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}$
                              type: string
                            example:
                              description: Example value matching the pattern
                              example: 12.345.678/0001-95
                              type: string
                            format:
                              description: >-
                                Advertised server-enforced semantic format
                                marker. Closed enum: `safeString` (structured
                                short fields — rejects control characters, HTML
                                tags, and punctuation outside the documented
                                allowlist) or `prose` (free-text fields — allows
                                ordinary punctuation and multi-line text,
                                rejecting control characters, invisible-format
                                characters, line/paragraph separators, and lone
                                surrogates). The server enforces the rule at
                                submit; the marker advertises it so clients can
                                pre-validate. Arbitrary regex aliases belong in
                                `pattern`.
                              type: string
                              enum:
                                - safeString
                                - prose
                            minLength:
                              description: Minimum string length
                              type: integer
                              minimum: -9007199254740991
                              maximum: 9007199254740991
                            maxLength:
                              description: Maximum string length
                              type: integer
                              minimum: -9007199254740991
                              maximum: 9007199254740991
                            min:
                              description: Minimum numeric value
                              type: number
                            max:
                              description: Maximum numeric value
                              type: number
                            minDate:
                              description: >-
                                Earliest allowed date as ISO 8601 (YYYY-MM-DD)
                                or the literal 'today'
                              example: '1800-01-01'
                              type: string
                            maxDate:
                              description: >-
                                Latest allowed date as ISO 8601 (YYYY-MM-DD) or
                                the literal 'today'
                              example: today
                              type: string
                            minAgeYears:
                              description: >-
                                Minimum age in years (for date-of-birth-style
                                fields)
                              type: integer
                              minimum: -9007199254740991
                              maximum: 9007199254740991
                          additionalProperties: false
                        conditions:
                          description: >-
                            Conditional applicability rules. The field applies
                            (is shown / required) only when every condition
                            evaluates true against the current submission. Empty
                            / absent means unconditional.
                          type: array
                          items:
                            type: object
                            properties:
                              pointer:
                                type: string
                                description: >-
                                  RFC 6901 JSON Pointer to the submitted-data
                                  field this condition reads. Resolution is
                                  governed by the sibling scope (root by
                                  default; person-scoped when scope='person').
                                example: /companyClassification/legalStructure
                              operator:
                                type: string
                                enum:
                                  - eq
                                  - in
                                  - not_in
                                  - exists
                                  - is_true
                                  - is_false
                                description: >-
                                  Comparison operator. The field is required /
                                  applies only when the condition evaluates true
                                  against the current submitted data.
                                example: eq
                              value:
                                description: >-
                                  Single comparison value, used with eq / exists
                                  operators
                                type: string
                              values:
                                description: >-
                                  Array of comparison values, used with in /
                                  not_in operators
                                type: array
                                items:
                                  type: string
                              scope:
                                description: >-
                                  Evaluation scope for `pointer`. Default `root`
                                  evaluates against the top-level submission;
                                  `person` evaluates against the current
                                  `ownership.persons[i]` row (used inside
                                  `individualRequirements[].fields[].conditions`).
                                type: string
                                enum:
                                  - root
                                  - person
                            required:
                              - pointer
                              - operator
                            additionalProperties: false
                        allowedValues:
                          description: >-
                            Allowed values for enum / enumArray fields. The
                            submitted value MUST be one of these.
                          example:
                            - LLC
                            - CORPORATION
                            - PARTNERSHIP
                          type: array
                          items:
                            type: string
                        options:
                          description: >-
                            Structured per-option metadata for enum fields with
                            display / grouping hints (label, abbr, description,
                            category). `value` mirrors an entry in
                            `allowedValues`. Present when the projector has
                            localized data to surface (e.g. country-specific
                            legal structures); enum fields without rich metadata
                            use `allowedValues` alone.
                          type: array
                          items:
                            type: object
                            properties:
                              value:
                                type: string
                                description: >-
                                  Submitted value. Must be one of the entries in
                                  the sibling `allowedValues` array.
                                example: Sociedad Anónima
                              label:
                                type: string
                                description: Human-readable label for display
                                example: Sociedad Anónima
                              abbr:
                                type: string
                                description: Short-form / acronym for the option
                                example: S.A.
                                nullable: true
                              description:
                                description: Long-form description of the option
                                type: string
                              category:
                                type: string
                                enum:
                                  - Corp
                                  - LLC
                                  - Sole Proprietorship
                                  - Partnership
                                  - Other
                                  - regulatory_review
                                description: >-
                                  Out-of-band metadata for an option that
                                  affects how it should be rendered or handled.
                                  Values: the legal-structure canonical bucket
                                  (`Corp` / `LLC` / `Sole Proprietorship` /
                                  `Partnership` / `Other`) — used to map the
                                  localised `value` to a standardised type; and
                                  `regulatory_review` — indicates this option is
                                  subject to additional regulatory review and
                                  may warrant a pre-submission warning to the
                                  user. Silently absent on options that carry no
                                  such metadata.
                            required:
                              - value
                              - label
                            additionalProperties: false
                      required:
                        - pointer
                        - label
                        - type
                        - required
                    description: >-
                      Scalar fields each person filling this role must submit.
                      Each `pointer` is rooted at the person object
                      (un-prefixed, e.g. `/firstName`, not
                      `/ownership/persons/firstName`). Conditions on these
                      fields default to `scope: 'root'`; per-person conditional
                      applicability uses `scope: 'person'`.
                  documents:
                    type: array
                    items:
                      type: object
                      properties:
                        canonicalType:
                          type: string
                          enum:
                            - BUSINESS_REGISTRATION
                            - ARTICLES_OF_INCORPORATION
                            - TAX_CERTIFICATE
                            - OPERATING_LICENSE
                            - REGULATORY_LICENSE
                            - SHAREHOLDERS_REGISTRY
                            - DIRECTORS_REGISTRY
                            - AUTHORIZATION_TO_ACT
                            - PROOF_OF_ADDRESS
                            - CERTIFICATE_OF_GOOD_STANDING
                            - FLOW_OF_FUNDS
                            - AUDITED_FINANCIAL_STATEMENT
                            - BANK_STATEMENT
                            - ORG_STRUCTURE_CHART
                            - AML_AUDIT
                            - COMPLIANCE_POLICY
                            - INSTITUTIONAL_INVESTOR_DOCUMENTATION
                            - IDENTITY_VERIFICATION
                            - IDENTITY_VERIFICATION_ATTESTATION
                            - BANK_VERIFICATION_LETTER
                            - INVOICE
                            - CONTRACT
                            - PAYROLL_REGISTER
                            - INVESTMENT_AGREEMENT
                          description: >-
                            Canonical category label for this document slot.
                            Informational: the integrator collects a document
                            matching the title/category and uploads it via POST
                            /v2/documents (no type field needed). The AI
                            classifier determines the canonical type at review
                            time.
                        title:
                          type: string
                          description: Human-readable artifact name for UI display
                          example: Government-issued photo ID
                        optional:
                          description: >-
                            True when collection is recommended but not required
                            for submission.
                          type: boolean
                      required:
                        - canonicalType
                        - title
                      additionalProperties: false
                    description: >-
                      Documents each person in this role must supply. Upload via
                      POST /v2/documents and reference the returned id under
                      `ownership.persons[i].documentIds[]`.
                required:
                  - role
                  - minCount
                  - fields
                  - documents
              - type: object
                properties:
                  role:
                    type: string
                    description: >-
                      Role label, e.g. CONTROLLING_PERSON. Matches values
                      accepted under ownership.persons[].roles[] at submit time.
                      Each row is self-contained: `documents[]` already includes
                      any requirement authored with the sentinel role 'any', so
                      a client only needs this one row per role. The 'any' row
                      itself still appears separately to cover persons whose
                      declared roles have no dedicated row.
                    example: CONTROLLING_PERSON
                  minCount:
                    type: integer
                    minimum: 1
                    maximum: 9007199254740991
                    description: Minimum number of persons that must fill this role
                  maxCount:
                    description: >-
                      Maximum number of persons accepted under this role. Absent
                      when unbounded.
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  fields:
                    type: array
                    items:
                      type: object
                      properties:
                        pointer:
                          type: string
                          description: >-
                            RFC 6901 JSON Pointer to the field in the submission
                            payload. Always starts with /. Array indices appear
                            as integers.
                          example: /businessInfo/taxId
                        label:
                          type: string
                          description: Human-readable label for display
                          example: Tax Identification Number
                        helpText:
                          description: >-
                            One-line guidance for the field, intended to render
                            as a tooltip / info pill next to the label. Plain
                            text, no markup. For `businessInfo.taxId` and
                            `businessInfo.businessEntityId` this is the
                            country-specific identifier description from
                            `countries.json` (with the issuing authority
                            prefixed when known, e.g. 'Issued by HMRC.'). For
                            other fields it is universal copy from the
                            server-side field registry. Silently absent when
                            neither source has guidance on file. See
                            api-conventions §5.1.5.
                          example: >-
                            Issued by HMRC. 10-digit number; auto-assigned on CT
                            registration; appears on HMRC correspondence. VAT
                            Registration Number (GB + 9 digits; XI prefix for
                            NI–EU trade) is supplementary — collect separately
                            if VAT-registered.
                          type: string
                        type:
                          type: string
                          enum:
                            - string
                            - number
                            - integer
                            - boolean
                            - date
                            - email
                            - url
                            - phone
                            - country
                            - enum
                            - stringArray
                            - enumArray
                          description: Data type of the field
                          example: string
                        required:
                          type: boolean
                          description: Whether the field is required at submit
                        group:
                          description: >-
                            Section grouping code for renderers. Stable
                            camelCase token drawn from a closed set per
                            discovery context (onboarding today: `businessInfo`,
                            `companyClassification`, `registeredAddress`,
                            `operatingAddress`, `businessActivity`,
                            `regulatoryHistory`, `certification`). Omitted on
                            top-level scalars without a section and on fields
                            nested inside `individualRequirements[].fields[]`
                            (already a logical group). Presentation metadata;
                            submit ignores it.
                          type: string
                        mustEqual:
                          description: >-
                            Required-with-const marker. Submit enforces strict
                            equality on the field value (not just presence).
                            Most common case: legal-certification booleans
                            (`certification.termsAndConditions: { required:
                            true, mustEqual: true }`) where `false` submits are
                            rejected. Omitted when not constrained to a single
                            value.
                          anyOf:
                            - type: boolean
                            - type: string
                            - type: number
                        constraints:
                          description: >-
                            Per-value constraints integrators should enforce
                            client-side; the server enforces the same set at
                            submit.
                          type: object
                          properties:
                            pattern:
                              description: Regex the submitted value must match
                              example: ^\d{2}\.\d{3}\.\d{3}/\d{4}-\d{2}$
                              type: string
                            example:
                              description: Example value matching the pattern
                              example: 12.345.678/0001-95
                              type: string
                            format:
                              description: >-
                                Advertised server-enforced semantic format
                                marker. Closed enum: `safeString` (structured
                                short fields — rejects control characters, HTML
                                tags, and punctuation outside the documented
                                allowlist) or `prose` (free-text fields — allows
                                ordinary punctuation and multi-line text,
                                rejecting control characters, invisible-format
                                characters, line/paragraph separators, and lone
                                surrogates). The server enforces the rule at
                                submit; the marker advertises it so clients can
                                pre-validate. Arbitrary regex aliases belong in
                                `pattern`.
                              type: string
                              enum:
                                - safeString
                                - prose
                            minLength:
                              description: Minimum string length
                              type: integer
                              minimum: -9007199254740991
                              maximum: 9007199254740991
                            maxLength:
                              description: Maximum string length
                              type: integer
                              minimum: -9007199254740991
                              maximum: 9007199254740991
                            min:
                              description: Minimum numeric value
                              type: number
                            max:
                              description: Maximum numeric value
                              type: number
                            minDate:
                              description: >-
                                Earliest allowed date as ISO 8601 (YYYY-MM-DD)
                                or the literal 'today'
                              example: '1800-01-01'
                              type: string
                            maxDate:
                              description: >-
                                Latest allowed date as ISO 8601 (YYYY-MM-DD) or
                                the literal 'today'
                              example: today
                              type: string
                            minAgeYears:
                              description: >-
                                Minimum age in years (for date-of-birth-style
                                fields)
                              type: integer
                              minimum: -9007199254740991
                              maximum: 9007199254740991
                          additionalProperties: false
                        conditions:
                          description: >-
                            Conditional applicability rules. The field applies
                            (is shown / required) only when every condition
                            evaluates true against the current submission. Empty
                            / absent means unconditional.
                          type: array
                          items:
                            type: object
                            properties:
                              pointer:
                                type: string
                                description: >-
                                  RFC 6901 JSON Pointer to the submitted-data
                                  field this condition reads. Resolution is
                                  governed by the sibling scope (root by
                                  default; person-scoped when scope='person').
                                example: /companyClassification/legalStructure
                              operator:
                                type: string
                                enum:
                                  - eq
                                  - in
                                  - not_in
                                  - exists
                                  - is_true
                                  - is_false
                                description: >-
                                  Comparison operator. The field is required /
                                  applies only when the condition evaluates true
                                  against the current submitted data.
                                example: eq
                              value:
                                description: >-
                                  Single comparison value, used with eq / exists
                                  operators
                                type: string
                              values:
                                description: >-
                                  Array of comparison values, used with in /
                                  not_in operators
                                type: array
                                items:
                                  type: string
                              scope:
                                description: >-
                                  Evaluation scope for `pointer`. Default `root`
                                  evaluates against the top-level submission;
                                  `person` evaluates against the current
                                  `ownership.persons[i]` row (used inside
                                  `individualRequirements[].fields[].conditions`).
                                type: string
                                enum:
                                  - root
                                  - person
                            required:
                              - pointer
                              - operator
                            additionalProperties: false
                        allowedValues:
                          description: >-
                            Allowed values for enum / enumArray fields. The
                            submitted value MUST be one of these.
                          example:
                            - LLC
                            - CORPORATION
                            - PARTNERSHIP
                          type: array
                          items:
                            type: string
                        options:
                          description: >-
                            Structured per-option metadata for enum fields with
                            display / grouping hints (label, abbr, description,
                            category). `value` mirrors an entry in
                            `allowedValues`. Present when the projector has
                            localized data to surface (e.g. country-specific
                            legal structures); enum fields without rich metadata
                            use `allowedValues` alone.
                          type: array
                          items:
                            type: object
                            properties:
                              value:
                                type: string
                                description: >-
                                  Submitted value. Must be one of the entries in
                                  the sibling `allowedValues` array.
                                example: Sociedad Anónima
                              label:
                                type: string
                                description: Human-readable label for display
                                example: Sociedad Anónima
                              abbr:
                                type: string
                                description: Short-form / acronym for the option
                                example: S.A.
                                nullable: true
                              description:
                                description: Long-form description of the option
                                type: string
                              category:
                                type: string
                                enum:
                                  - Corp
                                  - LLC
                                  - Sole Proprietorship
                                  - Partnership
                                  - Other
                                  - regulatory_review
                                description: >-
                                  Out-of-band metadata for an option that
                                  affects how it should be rendered or handled.
                                  Values: the legal-structure canonical bucket
                                  (`Corp` / `LLC` / `Sole Proprietorship` /
                                  `Partnership` / `Other`) — used to map the
                                  localised `value` to a standardised type; and
                                  `regulatory_review` — indicates this option is
                                  subject to additional regulatory review and
                                  may warrant a pre-submission warning to the
                                  user. Silently absent on options that carry no
                                  such metadata.
                            required:
                              - value
                              - label
                            additionalProperties: false
                      required:
                        - pointer
                        - label
                        - type
                        - required
                    description: >-
                      Scalar fields each person filling this role must submit.
                      Each `pointer` is rooted at the person object
                      (un-prefixed, e.g. `/firstName`, not
                      `/ownership/persons/firstName`). Conditions on these
                      fields default to `scope: 'root'`; per-person conditional
                      applicability uses `scope: 'person'`.
                  documents:
                    type: array
                    items:
                      type: object
                      properties:
                        canonicalType:
                          type: string
                          enum:
                            - BUSINESS_REGISTRATION
                            - ARTICLES_OF_INCORPORATION
                            - TAX_CERTIFICATE
                            - OPERATING_LICENSE
                            - REGULATORY_LICENSE
                            - SHAREHOLDERS_REGISTRY
                            - DIRECTORS_REGISTRY
                            - AUTHORIZATION_TO_ACT
                            - PROOF_OF_ADDRESS
                            - CERTIFICATE_OF_GOOD_STANDING
                            - FLOW_OF_FUNDS
                            - AUDITED_FINANCIAL_STATEMENT
                            - BANK_STATEMENT
                            - ORG_STRUCTURE_CHART
                            - AML_AUDIT
                            - COMPLIANCE_POLICY
                            - INSTITUTIONAL_INVESTOR_DOCUMENTATION
                            - IDENTITY_VERIFICATION
                            - IDENTITY_VERIFICATION_ATTESTATION
                            - BANK_VERIFICATION_LETTER
                            - INVOICE
                            - CONTRACT
                            - PAYROLL_REGISTER
                            - INVESTMENT_AGREEMENT
                          description: >-
                            Canonical category label for this document slot.
                            Informational: the integrator collects a document
                            matching the title/category and uploads it via POST
                            /v2/documents (no type field needed). The AI
                            classifier determines the canonical type at review
                            time.
                        title:
                          type: string
                          description: Human-readable artifact name for UI display
                          example: Government-issued photo ID
                        optional:
                          description: >-
                            True when collection is recommended but not required
                            for submission.
                          type: boolean
                      required:
                        - canonicalType
                        - title
                      additionalProperties: false
                    description: >-
                      Documents each person in this role must supply. Upload via
                      POST /v2/documents and reference the returned id under
                      `ownership.persons[i].documentIds[]`.
                required:
                  - role
                  - minCount
                  - fields
                  - documents
          description: >-
            Per-role count and person-level field + document requirements for
            ownership.persons[].
      required:
        - schemaVersion
        - context
        - country
        - fields
        - documents
        - minDocuments
        - individualRequirements
    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_abc123 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_abc123
        correlationId:
          description: Request correlation ID
          example: req_a1b2c3d4
          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_abc123 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_abc123
        correlationId:
          description: Request correlation ID
          example: req_a1b2c3d4
          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_abc123 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_abc123
        correlationId:
          description: Request correlation ID
          example: req_a1b2c3d4
          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

````