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

# What this application still needs to accept, and who may accept it

> Returns exactly what the accept-agreements page renders: the agreements
this application still owes, and the people permitted to accept them.

This exists so that page does not need `GET /applications/{application_id}?include=all`.
That response carries the full KYB record — the business entity, and every
associated individual's date of birth, nationality and email address —
none of which this page displays. The link that reaches this endpoint is
emailed and travels in a URL query string, so the credential it carries
is scoped to this endpoint and the attestation submission, and cannot
read the application.

**Authentication:** Accepts Application Token (X-Application-Token header),
including the narrow legal-acceptance token issued by a terms refusal.




## OpenAPI

````yaml /openapi.yaml get /applications/{application_id}/legal-acceptance
openapi: 3.0.3
info:
  title: Dakota Platform API
  version: 1.0.0
  description: >-
    Combined API specification for Dakota Platform services:

    - Issuance API: Asset minting and burning operations

    - Onboarding API: Know Your Business/Customer verification

    - On/Off Ramp API: Managing on-ramp and off-ramp accounts

    - Recipients API: Managing destinations for KYB'd entities

    - Transactions API: Viewing transaction history across platform operations


    ## Authentication and API Headers


    All API endpoints require the following headers:


    - `X-Idempotency-Key`: Required for all POST endpoints to ensure request
    idempotency

    - `x-api-key`: Required for authentication across all endpoints


    Note: On /applications endpoints you need a token for authentication instead
    of a x-api-key

    - `x-application-token`: Required for authentication on public /applications
    endpoints (alternative to `x-api-key` where documented)



    ## Rate Limits


    Requests are rate limited per API key. Every response includes the following
    headers:


    | Header | Description |

    | --- | --- |

    | `X-RateLimit-Limit` | Maximum requests allowed in the current one-minute
    window. |

    | `X-RateLimit-Remaining` | Requests remaining in the current window. |

    | `X-RateLimit-Reset` | Absolute Unix timestamp (seconds since epoch) when
    the current rate-limit window resets. |


    When a request is throttled (`429`), responses also include `Retry-After`
    with seconds to wait before retrying.
servers:
  - url: https://api.platform.dakota.xyz
    description: Production environment
  - url: https://api.platform.sandbox.dakota.xyz
    description: Sandbox — safe for testing with simulated data
security:
  - ApiKeyAuth: []
tags:
  - name: Agentic Payments
    x-beta: true
    description: >-
      Beta — agent-driven payments: provision agents, draft and approve spending
      mandates, accept reviewed instructions, and manage scheduled payments.


      **Prerequisites:** Customer onboarded; signer groups attached for
      recognition.

      **Related:** Wallets, Signer Groups, Transactions
  - name: Mandates
    x-beta: true
    description: >-
      Beta — spending mandates: signed, signer-bound authorizations governing
      what may be spent, approved or cancelled by a second recognized signer (§8
      — the dual-control rule that every mandate mutation must be signed by a
      recognized signer OTHER than the bound one). Independent of agents and
      scheduled payments.


      **Prerequisites:** Signer groups attached for recognition.

      **Related:** Signer Groups, Transactions
  - name: Insights
    x-beta: true
    description: >-
      Beta — read-only insight: a deterministic report over a customer's agentic
      activity (funding balances, upcoming obligations, failures, mandate
      headroom and expiry), or — via `GET /insights` — over the whole client's
      book, with portfolio KPIs, daily series and a per-customer roll-up. Never
      moves money, never creates or changes anything.


      **Prerequisites:** Customer onboarded; insight is computed from the
      customer's scheduled payments, mandates, and wallets.

      **Related:** Agentic Payments, Mandates
  - name: Customers
    description: >-
      Manage customer entities representing businesses and organizations
      onboarded to Dakota.


      **Prerequisites:** Complete KYB via Onboarding endpoints before initiating
      money movement.

      **Related:** Onboarding, Recipients, Transactions, Accounts, Wallets
  - name: Wallets
    description: >-
      Manage wallets, balances, and wallet-to-signer-group relationships for
      custody and movement controls.


      **Prerequisites:** Customer must exist. Configure signer groups before
      policy-enforced workflows.

      **Related:** Signer Groups, Policies, Transactions, Customers
  - name: Transactions
    description: >-
      Create, cancel, and retrieve transaction records across account and wallet
      flows.


      **Prerequisites:** Accounts or destinations must be configured based on
      flow type.

      **Related:** Accounts, Recipients, Policies, Events
  - name: Recipients
    description: >-
      Manage recipient entities and destination rails used by customers for
      payouts and transfers.


      **Prerequisites:** Customer must be onboarded and active.

      **Related:** Customers, Transactions, Accounts, Onboarding
  - name: Cards
    description: >-
      Issue and manage cardholders and cards, and follow card transactions.
      Every change is also delivered as a webhook event.


      **Prerequisites:** Customer must be onboarded and the cards capability
      must be available.

      **Related:** Customers, Wallets, Events


      ### Webhook event catalog (v1)


      Every card-family event a client can subscribe to, in one place:


      | Event | Fires when |

      | -- | -- |

      | `cardholder.created` | A cardholder is created. |

      | `cardholder.updated` | Any cardholder change, including every
      review-status transition and deletion (`status: closed`). |

      | `cardholder.information_requested` | A reviewer asks for more
      information; the payload lists the open requirements. Not yet emitted; the
      review pipeline that opens a request for information is still to land. |

      | `card.created` | A card is created. |

      | `card.updated` | Any card change: status, spend limit, last4, freeze
      sources. A close arrives here with `status: closed`. |

      | `card_transaction.created` | The first event for a transaction, normally
      an authorization (`status: authorized`) placing a hold. A declined
      authorization also arrives here, with `status: declined`. |

      | `card_transaction.updated` | Every later change to the same transaction
      (see below). |

      | `wallet.card_enablement.completed` | A wallet's card-settlement
      enablement became active. |


      **Card event ordering.** `card.created` and `card.updated` carry the card
      as it stands after

      the change, including `version` and `freeze_sources` (always an array,
      empty when nothing

      holds the card). `version` is strictly increasing per card and matches the
      `version` on the

      card resource. Deliveries can arrive out of order, so keep the highest
      `version` you have

      applied for each card and drop any event whose `version` is not greater
      than it.


      **One transaction stream.** Holds, releases, partial clearings,
      settlement, returns,

      disputes and force posts are not separate event types. They are `status`
      transitions on

      the transaction, delivered as `card_transaction.updated` with the same
      payload shape as

      `card_transaction.created`:


      | What happened | `status` on the event |

      | -- | -- |

      | Transaction known before its first authorization event | `pending` (on
      `card_transaction.created`) |

      | Hold placed (authorization) | `authorized` (on
      `card_transaction.created`, or `card_transaction.updated` after a
      `pending` start) |

      | Hold released without clearing (merchant, issuer or network reversal) |
      `auth_reversed` |

      | Hold expired unused | `expired` |

      | Part of the hold settled | `partially_cleared` (with the new
      `cleared_amount`) |

      | Fully settled | `cleared` |

      | Settled with no prior hold | `force_posted` |

      | Merchant refund | `returned`, on a new card transaction for the refund;
      the original purchase stays `cleared`. The network returned the money;
      read `refund_state` for whether it reached the customer's wallet
      (`pending` then `paid`). `returned` alone is not proof of payout. |

      | Chargeback opened | `disputed` (reserved; not emitted yet) |

      | Authorization refused | `declined` (on `card_transaction.created`, or
      `card_transaction.updated` when the transaction already exists). Moves no
      money; read `decline_reason` and `decline_code` for why. |


      `outstanding_amount` is the part of `cleared_amount` that no authorization
      covered, less any refunds: non-zero after a force post or an over-capture.


      **Naming.** A dotted segment names a sub-resource of the resource before
      it, so

      `wallet.card_enablement.*` is a wallet's card enablement.
      `card_transaction.*` carries an

      underscore because the resource is `card_transactions`, a top-level
      resource, not a

      sub-resource of a card. It is not a typo, and there is no
      `card.transaction.*` family, and

      no separate settlement event: settlement is a `status` on
      `card_transaction.updated`.
  - name: Accounts
    description: >-
      Manage account resources used for onramp, offramp, and swap operations.


      **Prerequisites:** Customer must be created and network/asset constraints
      must be known.

      **Related:** Customers, Transactions, Auto Transactions, Info
  - name: Auto Transactions
    description: >-
      Manage automated transaction configurations and execution history for
      account automation workflows.


      **Prerequisites:** Source account must exist and be configured for
      automation.

      **Related:** Accounts, Transactions, Events
  - name: Onboarding
    description: >-
      Manage KYB/KYC onboarding lifecycle, application documents, attestations,
      and verification steps.


      **Prerequisites:** Customer context and required entity/application
      metadata.

      **Related:** Customers, Exceptions, Recipients, Transactions
  - name: Policies
    description: >-
      Define and manage policy objects and rules used for transaction governance
      and risk controls.


      **Prerequisites:** Wallet and signer group resources should be configured
      for enforcement scenarios.

      **Related:** Wallets, Signer Groups, Transactions
  - name: Signer Groups
    description: >-
      Manage signer groups and signer assignments for multi-party authorization
      models.


      **Prerequisites:** Wallets should exist before linking signer groups.

      **Related:** Wallets, Policies, Transactions
  - name: Authentication
    description: >-
      Manage API authentication credentials and key lifecycle for platform
      access.


      **Prerequisites:** Client organization must be provisioned.

      **Related:** Users, Info
  - name: Users
    description: >-
      Manage client users, roles, and identity metadata for platform access
      control.


      **Prerequisites:** Auth credentials and client context must be
      established.

      **Related:** Authentication
  - name: Webhooks
    description: >-
      Manage outbound webhook targets and delivery configuration for event
      notifications.


      **Prerequisites:** Subscriber endpoint must be reachable and secured.

      **Related:** Events, Authentication
  - name: Payouts
    description: >-
      Manage where Dakota sends your accrued developer-fee payouts.


      **Prerequisites:** Auth credentials and client context must be
      established.

      **Related:** Events
  - name: RD Marketing Fee
    description: >-
      Everything behind your RD marketing fee: read what a month came to,
      declare the wallets you hold outside Dakota so the RD in them counts, and
      say where the fee should be sent.


      **Prerequisites:** Client must be in the RD marketing-fee programme. A
      month is readable once it has closed.

      **Related:** Wallets, Events
  - name: Self Serve
    description: >-
      Buy and track prepaid credits, and read the tiers and pricing they are
      sold at.


      **Prerequisites:** Auth credentials and client context must be
      established.

      **Related:** Billing
  - name: Events
    description: >-
      Retrieve event records emitted by platform operations for audit and
      troubleshooting.


      **Prerequisites:** Requesting client must have access to referenced
      resources.

      **Related:** Webhooks, Transactions, Onboarding
  - name: Info
    description: >-
      Read platform capability metadata, such as supported rails, networks, and
      assets.

      These operations are served under `/capabilities/*` - `GET
      /capabilities/countries`

      and `GET /capabilities/networks`. The tag name does not appear in the
      request paths.


      **Prerequisites:** Valid authentication headers.

      **Related:** Accounts, Transactions
  - name: Sandbox
    description: >-
      Trigger sandbox-only simulation endpoints for safe end-to-end integration
      testing with synthetic data. The sandbox host
      (`https://api.platform.sandbox.dakota.xyz`) also accepts a family of
      `X-Sandbox-*` request headers on most write endpoints (`Customers`,
      `Accounts`, `Transactions`, simulate endpoints) that let integrators drive
      deterministic failure modes — pick a preset via `X-Sandbox-Scenario`, or
      compose a custom one with
      `X-Sandbox-Error-Step`/`X-Sandbox-Error-Status`/`X-Sandbox-Error-Message`.
      `X-Sandbox-Instant-Completion` collapses async flows to a single
      synchronous step, and `X-Sandbox-Skip-Auto-Approval` keeps newly created
      KYB applications in `pending` for manual-review testing. All `X-Sandbox-*`
      headers are ignored in production.


      **Prerequisites:** Sandbox environment and test customer data.

      **Related:** Customers, Accounts, Transactions, Onboarding
  - name: Legal
    description: |-
      The legal documents customers accept — terms of service, privacy policy,
      e-sign notice, and partner agreements.

      Dakota publishes these here, and this is the authoritative source: the
      hosted onboarding flow, the dakota.xyz website, and your own integration
      all read the same revisions. Present the current revision to your customer
      before capturing their acceptance so the record reflects the text they
      actually saw.
paths:
  /applications/{application_id}/legal-acceptance:
    get:
      tags:
        - Onboarding
      summary: What this application still needs to accept, and who may accept it
      description: >
        Returns exactly what the accept-agreements page renders: the agreements

        this application still owes, and the people permitted to accept them.


        This exists so that page does not need `GET
        /applications/{application_id}?include=all`.

        That response carries the full KYB record — the business entity, and
        every

        associated individual's date of birth, nationality and email address —

        none of which this page displays. The link that reaches this endpoint is

        emailed and travels in a URL query string, so the credential it carries

        is scoped to this endpoint and the attestation submission, and cannot

        read the application.


        **Authentication:** Accepts Application Token (X-Application-Token
        header),

        including the narrow legal-acceptance token issued by a terms refusal.
      operationId: getLegalAcceptanceContext
      parameters:
        - name: application_id
          in: path
          required: true
          description: The unique identifier for the application
          schema:
            $ref: '#/components/schemas/KSUID'
      responses:
        '200':
          description: Outstanding agreements and permitted attestors
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LegalAcceptanceContext'
              example:
                application_type: business
                outstanding_documents:
                  - key: dakota_tos
                    title: Dakota Terms of Service
                    version: 2026-09
                    revision: 4
                accepted_agreements:
                  - attestation_type: terms_of_service
                    version: 2026-02
                  - attestation_type: e_sign
                    version: 2025-11
                attestors:
                  - id: 3H96fIU3lr1KQwe5cXmgD5x6kHy
                    name: Ada Lovelace
        '403':
          description: Invalid or expired token, or a token not scoped to this action
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Application not found
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - ApplicationTokenAuth: []
components:
  schemas:
    KSUID:
      type: string
      title: KSUID
      description: >-
        KSUID is a 27-character globally unique ID that combines a timestamp
        with a random component. Used for all entity identifiers in the Dakota
        platform.
      pattern: ^[0-9A-Za-z]{27}$
      minLength: 27
      maxLength: 27
      example: 1NFHrqBHb3cTfLVkFSGmHZqdDPi
    LegalAcceptanceContext:
      type: object
      description: >
        The minimum an acceptance page needs: what is still owed, and who may

        sign it. Deliberately NOT the application — see the endpoint
        description.
      required:
        - application_type
        - outstanding_documents
        - attestors
      properties:
        application_type:
          type: string
          enum:
            - business
            - individual
          description: |
            Decides whether a signer is chosen or stated. A business may have
            several control persons; an individual application has exactly one
            permissible attestor, so asking them to pick themselves from a list
            of one is a step with no purpose.
        outstanding_documents:
          type: array
          description: |
            Agreements this application has not accepted at the revision now in
            force. Identity only — no document text. The bodies are served by
            `GET /legal/documents/{document_key}`, which is cacheable and shared
            with the published pages, and are ~120KB of markdown that would
            otherwise ride this response.
          items:
            $ref: '#/components/schemas/OutstandingLegalDocument'
        outstanding_disclosures:
          type: array
          description: |
            Dakota-published terms a capability requires of this customer, that
            are still outstanding, and that have no onboarding attestation type
            - today the card terms: `cards_tos` (commercial, for a business) or
            `cards_consumer_tos` (consumer, for an individual). Which one a
            customer owes is decided by the capability, so read the key from
            here rather than assuming it. Accept each through SubmitAttestation
            with the `disclosure_id` and `disclosure_version` given here.

            Only terms that can be collected are listed: the revision is
            servable, or the deployment is sandbox. Empty when the customer's
            capabilities cannot be read.
          items:
            $ref: '#/components/schemas/PartnerAttestationRequirement'
        attestors:
          type: array
          description: |
            People permitted to record an acceptance for this application. For a
            business this is its control persons; the API enforces the same rule
            on submission, so offering anyone else would only produce a 400.
          items:
            $ref: '#/components/schemas/LegalAcceptanceAttestor'
        accepted_agreements:
          type: array
          description: >
            What is already on file, per attestation type. The page compares
            each

            against the revision now in force to decide whether an agreement is

            genuinely outstanding — having signed an OLDER revision is not the

            same as never having signed, and the two need different copy.


            Separate from `outstanding_documents`, which reports only documents

            never accepted at all. A customer on a superseded revision appears

            here and not there.
          items:
            $ref: '#/components/schemas/AcceptedAgreement'
    ProblemDetails:
      type: object
      required:
        - type
        - title
        - status
      description: |
        Error response following RFC 9457 Problem Details.
        Public API error responses use this format.
      example:
        type: https://docs.dakota.xyz/api-reference/errors#not-found
        title: Customer Not Found
        status: 404
        detail: Customer cst_2abc123 was not found in your organization.
        instance: https://api.platform.dakota.xyz/customers/cst_2abc123
        request_id: req_7f3a8b2c
      properties:
        type:
          type: string
          format: uri
          description: |
            URI reference identifying the problem type.
            Resolves to human-readable documentation.
          example: https://docs.dakota.xyz/api-reference/errors#not-found
        title:
          type: string
          description: >-
            Short, human-readable summary of the problem type. Stable across
            occurrences.
          example: Customer Not Found
        status:
          type: integer
          description: HTTP status code for this occurrence.
          example: 404
        detail:
          type: string
          description: Human-readable explanation specific to this occurrence.
          example: Customer cst_2abc123 was not found in your organization.
        instance:
          type: string
          format: uri
          description: The request path that triggered this error.
          example: https://api.platform.dakota.xyz/customers/cst_2abc123
        request_id:
          type: string
          description: Unique request identifier. Include when contacting support.
          example: req_7f3a8b2c
        errors:
          type: array
          description: Field-level validation errors (present for validation failures).
          items:
            $ref: '#/components/schemas/ValidationError'
        resolution_url:
          type: string
          format: uri
          description: |
            A link the customer can follow to CLEAR this error, present only on
            problems with a concrete self-service remedy.

            Today this is returned by
            `#terms-not-accepted`, where it points at the hosted flow in which
            the outstanding agreement can be signed. The link is token-gated and
            usable as-is — send the customer to it directly rather than parsing
            it out of `detail`.
          example: >-
            https://onboarding.dakota.xyz/applications/2abc123?token=tok_7f3a8b2c
        user_message:
          type: string
          description: |
            A plain-language rendition of `detail` written for the end
            customer, present when one exists for this error. `detail` names
            request fields and actions so a machine caller (such as a payment
            agent drafting proposals) can self-correct; `user_message` says the
            same thing without API vocabulary. Clients that relay errors into a
            human surface (chat, email, UI) should show `user_message` when
            present and fall back to `detail`.
          example: >-
            ACH payments pay out USD, so a USDC payout isn't possible on this
            rail. Change the payout currency to USD and try again.
        reason:
          type: string
          description: >
            A stable, machine-readable code for why the request was refused,

            present only when Dakota has a typed reason for this error. Branch

            on `reason` rather than parsing `detail`. `detail` is unchanged.


            This is an open set: new values are added over time and a value is

            never repurposed, so treat an unrecognized `reason` as absent.


            Which operations return it today:


            - `createAccount` (onramp, offramp and swap) and `createTransaction`
              (a one-off transaction creates an account): every value in the
              table except `immutable_field`; `signature_required` comes from
              `createTransaction` only.
            - `updateAccount`: `field_invalid` (a developer fee that is out of
              range), `resource_not_found`, and `immutable_field` (the change
              would alter the account's routing; create a new account instead).
            - `deleteAccount`: `resource_not_found`.

            - `createInstructions`: a payment-agent instruction that creates an
              account fails with the same `reason` values as `createAccount`,
              but `params.field` is never returned there: the response carries
              the other `params` keys only, because this operation has no
              public field names to map to.
            - Other operations may also set `reason`. Treat a `reason` you do
              not recognize as absent, as above, and never assume an operation
              that is not listed here omits it.

            | `reason` | Meaning | `params` |

            | --- | --- | --- |

            | `field_required` | A required request field is missing. | `field`
            |

            | `field_invalid` | A field is present but unusable. | `field`,
            `constraint`, `rail` |

            | `field_too_long` | A field is longer than the rail allows. |
            `field`, `max`, `actual`, `rail` |

            | `field_too_short` | A field is shorter than the rail allows. |
            `field`, `min`, `actual` |

            | `address_incomplete` | An address lacks parts the route needs. |
            `subject`, `fields` |

            | `unsupported_network` | The network is not supported. | `network`
            |

            | `unsupported_asset` | The asset does not exist on the network. |
            `asset`, `network` |

            | `no_route_available` | No payment route covers the request. |
            `direction`, `rail`, `currency`, `network` |

            | `onboarding_required` | The customer has not completed onboarding
            for a capability. | `capability` |

            | `entity_not_active` | Onboarding for a capability exists but is
            not yet usable. | `capability`, `status` |

            | `destination_unreachable` | The destination cannot be reached over
            the requested rail. | `rail`, `alternative`, `direction` |

            | `limit_exceeded` | An amount exceeds a ceiling. | `limit`, `max`,
            `configured`, `currency` |

            | `resource_not_found` | The named resource does not exist. |
            `resource` |

            | `duplicate_resource` | A matching resource already exists. |
            `resource` |

            | `request_rejected` | The request was refused and the reason is not
            disclosed. | none |

            | `signature_required` | The request must be signed. | none |

            | `immutable_field` | The field cannot be changed on an existing
            account; create a new one. | none |
          example: field_too_long
        params:
          type: object
          description: |
            Parameters of `reason`. Every value is a string: a number, a
            token from a closed set, or the public name of a request field
            (`field` is expressed in this operation's request body, and is
            omitted when the offending value has no public name). Never free
            text. Present only alongside `reason`, and only when the reason
            has parameters.
          additionalProperties:
            type: string
          example:
            field: payment_reference
            max: '35'
            actual: '40'
            rail: swift
    OutstandingLegalDocument:
      type: object
      description: |
        A legal document the customer has never accepted.

        The revision named is the one currently in force. Fetch its text with
        `GET /legal/documents/{document_key}` — it is deliberately not inlined
        here, because these documents run to tens of kilobytes each and this
        field rides on every application read.
      required:
        - key
        - version
        - revision
        - title
      properties:
        key:
          type: string
          description: Stable identifier of the document
          example: dakota_tos
        version:
          type: string
          description: Version of the revision that needs accepting
          example: '2026-08-04'
        revision:
          type: integer
          description: Monotonic ordinal of the revision within this document
          example: 5
        title:
          type: string
          description: Human-readable title
          example: Dakota Terms of Service
        attestation_type:
          $ref: '#/components/schemas/AttestationType'
    PartnerAttestationRequirement:
      type: object
      description: >
        A single outstanding partner disclosure the customer must accept online,

        keyed by an opaque terms key + version — never a partner identifier.
        Rendered

        in the hosted attestations UI; accepted via POST
        /applications/{id}/attestations

        with disclosure_id = key and disclosure_version = version.
      required:
        - disclosure_id
        - disclosure_version
        - title
      properties:
        disclosure_id:
          type: string
          description: >-
            The partner disclosure terms key to accept (the opaque join key the
            provider declared, e.g. partner_disclosures). Never a partner name.
          example: partner_disclosures
        disclosure_version:
          type: string
          description: >-
            The version of the disclosure being accepted. For a Dakota-published
            document it is the revision currently in force; for a partner's
            disclosure it is the version the partner declares. Pass back
            verbatim as disclosure_version.
          example: 2026-06
        title:
          type: string
          description: Human-readable label for the disclosure to show the customer.
          example: Partner Disclosures
        url:
          type: string
          description: >
            Optional. Where the disclosure content / acceptance lives — the
            token-gated

            hosted onboarding URL for this application (a real redirect target).
            Absent

            when no usable link is resolvable.
          example: >-
            https://apply.dakota.xyz/applications/2hCjxJzUAW6JVRkZqaF9E0KpM3a/attestations
        text_published:
          type: boolean
          description: >
            Whether the revision `disclosure_version` names is published with
            text the customer

            can read. Present on the legal-acceptance context; when false the

            page shows a labelled notice instead of the text, which happens in

            sandbox only. Absent elsewhere.
    LegalAcceptanceAttestor:
      type: object
      required:
        - id
        - name
      properties:
        id:
          allOf:
            - $ref: '#/components/schemas/KSUID'
          description: |
            The applicant id to submit as `applicant_id`. This is the
            application-individual link, not the individual — the same value the
            attestation endpoint validates against.
        name:
          type: string
          description: |
            Display name: first, middle and last name on file, each trimmed and
            joined by single spaces, skipping any part that is absent or blank.
            NOTHING else about the person is returned: this page shows a name in
            a picker, and date of birth, nationality and email are exactly the
            fields the scoped credential exists to keep out of an emailed link.
          example: Ada Lovelace
    AcceptedAgreement:
      type: object
      required:
        - attestation_type
      properties:
        attestation_type:
          type: string
          description: The attestation type this acceptance was recorded under.
          example: terms_of_service
        version:
          type: string
          description: >
            The revision accepted. Empty for an acceptance predating the
            registry,

            whose revision is derived from its timestamp rather than stored.
          example: '2026-07-23'
    ValidationError:
      type: object
      required:
        - field
        - message
      properties:
        field:
          type: string
          description: Field path using dot notation for nested fields.
          example: bank_account.routing_number
        message:
          type: string
          description: Human-readable description of the field error.
          example: Routing number must be exactly 9 digits
        code:
          type: string
          description: Machine-readable error code for this field.
          example: invalid_format
    AttestationType:
      type: string
      description: Type of attestation being submitted
      enum:
        - information_accuracy
        - terms_of_service
        - privacy_policy
        - funds_transfer_agreement
        - lead_bank_privacy_policy
        - e_sign
      example: information_accuracy
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
    ApplicationTokenAuth:
      type: apiKey
      in: header
      name: X-Application-Token
      description: >
        Application-specific token for public URL access. Generated when a
        customer is created.

        Provides access to a single application without requiring an API key.

        Token is valid for 90 days and rate-limited to 250 requests per hour.

````

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