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

# Get agent customer

> Retrieve the individual customer associated with the authenticated agent. Requires the MANAGE_IDENTITY permission in the agent's policy.



## OpenAPI

````yaml /openapi.yaml get /agents/me/customer
openapi: 3.1.0
info:
  title: Grid API
  description: >
    API for managing global payments on the open Money Grid. Built by
    Lightspark. See the full documentation at https://docs.lightspark.com/.
  version: '2025-10-13'
  contact:
    name: Lightspark Support
    email: support@lightspark.com
  license:
    name: Proprietary
    url: https://lightspark.com/terms
servers:
  - url: https://api.lightspark.com/grid/2025-10-13
    description: Production server
security:
  - BasicAuth: []
  - AgentAuth: []
tags:
  - name: Platform Configuration
    description: >-
      Platform configuration endpoints for managing global settings. You can
      also configure these settings in the Grid dashboard.
  - name: Customers
    description: >-
      Customer management endpoints for creating and updating customer
      information
  - name: Contact Verification
    description: >-
      Endpoints for verifying a customer's email and phone via one-time codes.
      Required only for customers whose payment provider mandates contact
      verification (e.g. EU customers); other providers return 409.
  - name: Strong Customer Authentication
    description: >-
      Endpoints for authorizing money-movement operations that require Strong
      Customer Authentication. Relevant only for customers in a region where SCA
      is required (e.g. EU); customers outside SCA-regulated regions never see
      an SCA challenge and these endpoints return 409.
  - name: KYC/KYB Verifications
    description: >-
      Endpoints for Know Your Customer (KYC) and Know Your Business (KYB)
      verification, including managing beneficial owners and triggering
      verification for customers.
  - name: Documents
    description: >-
      Endpoints for uploading and managing verification documents for customers
      and beneficial owners. Supports KYC and KYB document requirements.
  - name: Internal Accounts
    description: >-
      Internal account management endpoints for creating and managing internal
      accounts
  - name: Periodic Statements
    description: >
      Build, deliver, and evidence a Regulation E periodic statement for a
      customer's internal account. A statement period is a calendar month in US
      Central time (`America/Chicago`).


      A statement is issued for each customer's own USD internal account and
      covers their whole balance. Money received through a rule-based account
      appears on its owner's statement; rule-based, bulk settlement and
      platform-owned accounts have no statement of their own.


      **1. The statement — `GET
      /internal-accounts/{id}/balance-changes?startDate=&endDate=`**


      One row per change to the balance, in the order the money moved, with the
      opening and closing balances for the window in the same response. Page
      until `hasMore` is false, then assert this identity across every page
      before you render anything:


      ```

      openingBalance + Σ(data[].amount) == closingBalance

      ```


      If it does not hold, do not send the statement; contact support instead.
      `startDate` and `endDate` bound a half-open window `[startDate, endDate)`:
      for a monthly statement, pass the first instant of the month and the first
      instant of the following month, both in US Central time (for August 2026,
      `2026-08-01T00:00:00-05:00` and `2026-09-01T00:00:00-05:00`). Grid records
      a statement as fetched only for a window that is exactly one such month.


      **2. The receipt — `POST /internal-accounts/{id}/confirm-statement`**


      Once a month, after you have pulled and issued a period's statement, send
      a receipt with the `statementMonth` it covers. Grid stores it as the
      delivery record for that account and period. Sending it again is harmless:
      the first receipt's time is kept.


      **Timing**


      A window whose card settlement has not closed is refused with `409
      NOT_YET_AVAILABLE` rather than answered with figures that could still
      change; retry once it has settled.
  - name: External Accounts
    description: >-
      External account management endpoints for creating and managing external
      bank accounts
  - name: Same-Currency Transfers
    description: >-
      Deprecated endpoints for transferring funds between internal and external
      accounts with the same currency. Use the quote endpoints under
      Cross-Currency Transfers instead, which now serve same-currency transfers
      as well.
  - name: Cross-Currency Transfers
    description: >-
      Endpoints for creating and confirming quotes for transfers, both
      same-currency and cross-currency
  - name: Payout Runs
    description: >-
      Endpoints for paying many recipients from one internal account in one
      request, and for reconciling the result
  - name: Settlement Rules
    description: >-
      Endpoints for standing instructions that split a customer's matching
      incoming payments among recipients as soon as the payments complete
  - name: Transactions
    description: Endpoints for retrieving transaction information
  - name: Webhooks
    description: Webhook endpoints and configuration for receiving notifications
  - name: Invitations
    description: Endpoints for creating, claiming and managing UMA invitations
  - name: Sandbox
    description: Endpoints to trigger test cases in sandbox
  - name: API Tokens
    description: Endpoints to programmatically manage API tokens
  - name: Exchange Rates
    description: >-
      Endpoints for retrieving cached foreign exchange rates. Rates are cached
      for approximately 5 minutes and include platform-specific fees.
  - name: Discoveries
    description: >-
      Endpoints for discovering available payment rails, banks, and providers
      for a given country and currency corridor.
  - name: Embedded Wallet Auth
    description: >-
      Endpoints for registering and verifying end-user authentication
      credentials (email OTP, OAuth, passkey) used to sign Embedded Wallet
      actions.
  - name: Agent Management
    description: >-
      Endpoints for creating and managing agents, called by the partner's
      backend using platform credentials. Covers the full agent lifecycle:
      creation, policy configuration, pausing, deletion, the device code
      installation flow, and approving or rejecting transactions initiated by
      agents.
  - name: Agent Operations
    description: >-
      Endpoints called by the agent itself using its own credentials (obtained
      via device code redemption). Scoped to the agent's associated customer —
      all requests automatically operate on behalf of that customer and are
      subject to the agent's policy. When a request requires approval, it is
      held as an agent action in `PENDING_APPROVAL` until the platform approves
      it via `POST /agents/{agentId}/actions/{actionId}/approve` or rejects it.
  - name: Claimable Payouts
    description: >-
      Endpoints the platform's claim page calls for a claimable payout an agent
      sent to a person by phone number or email: issue the claim token for the
      recipient's link, look the payout up by it, list how Grid can pay her,
      lock a quote to her account and confirm it.
  - name: Cards
    description: >-
      Card management endpoints. Issue debit cards against an internal account,
      freeze / unfreeze, close, manage a card's funding source, and list card
      transactions.
  - name: Stablecoins
    description: >-
      Stablecoin issuance endpoints. Link provider accounts, register
      provider-created stablecoins, create direct mint/burn issuer operations,
      and track operation status.
  - name: Embedded Care
    description: |
      A support chat between the cardholder and Lightspark's care agent, driven
      from the partner's own app. The platform calls with its ordinary Grid
      credential, but the person typing is the cardholder rather than the
      caller, so reaching that cardholder's account takes a second proof: an
      SMS code they send into the chat, after which the partner carries a
      session token in the `X-Ls-Care-Session` header.

      **The surface is two routes, and verification happens inside the
      conversation.**

      1. **Open the chat.** `POST /care/chats/{chatId}/messages` with an empty
         `message`, addressed to the cardholder as `Customer:<uuid>`. Returns
         the chat's id and the agent's opening line in `reply`, which is what
         a chat window renders before anybody has typed. Sends no SMS, needs
         no `Idempotency-Key` and consumes none, and is safe to call again: a
         widget that reloaded gets the same chat back, this time without a
         `reply`.
      2. **Send the cardholder's first message.** The same route with their
         text and an `Idempotency-Key` header. One turn runs synchronously and
         the agent's answer comes back in `reply`. On a chat that cannot yet
         reach the account this call also texts the cardholder a code, and the
         agent's `reply` asks for it.
      3. **The cardholder sends the code as an ordinary message.** When it is
         correct, the response to that turn carries `sessionToken` and
         `expiresAt`. Send that token as the `X-Ls-Care-Session` header on
         every message from then on. A code that does not match is answered in
         `reply`, and the cardholder can simply send it again.
      4. **Close the chat** with `DELETE /care/chats/{chatId}` when the
         cardholder is done. Every response also carries `chatEnded`, and the
         agent can end the chat itself: when `chatEnded` is true, the closing
         line is in `reply` and the chat takes no further messages, so stop
         sending to it. An opening addressed to that `CareChat:<id>` answers
         `409 CARE_CHAT_ENDED`; address the cardholder as `Customer:<uuid>`
         to open a new chat.

      **Render `redactedCustomerMessage` if present, then `reply` if
      present.** That one rule covers an opening, a resume and a turn.

      **A cardholder whose code never arrived asks the agent for another
      one.** The agent sends a new code to the number on file and says so in
      its `reply`. There is no separate route for it.

      **The verification fields are optional hints.** `verificationRequired`
      and `codeLength` let an app show a dedicated one-time-code input of the
      right length, marked as a one-time code so iOS and Android offer to fill
      it from the SMS. A partner can ignore them, since the agent asks for the
      code in its reply and says where it went, and the app still sends the
      code as an ordinary message.

      Step 1 is optional. A message addressed to a `Customer:` id opens that
      cardholder's chat if they have none, so a partner whose cardholder has
      just typed something spends one call rather than two.

      A cardholder who has not verified yet is never a `401`, because the
      first message from every new cardholder is unverified and a `401` there
      would be indistinguishable from a bad credential. On these endpoints a
      `401` means the platform's Grid credential is wrong, the session token
      presented is malformed, or a replay lacks the session token its original
      request required.

      **Verification expires, and a lost session is recoverable in the
      chat.** A chat reaches the cardholder's account only while its
      verification is newer than the session lifetime, fifteen minutes in the
      default deployment, which is also how long a session token lives. Past
      that window a message gets a fresh code, and the agent asks the
      cardholder to send it back inside the conversation, which hands the
      partner the next session token. A new message sent with no
      `X-Ls-Care-Session` header, or with a token past its expiry, on a chat
      whose verification is still current is treated the same way: the
      verification is cancelled before the turn runs, a new code is sent, and
      the agent asks for it. So a client that lost its token, or held one too
      long, simply keeps sending messages. Only a token that is malformed, or
      that was minted for another platform, chat or cardholder, is refused.

      Two things an integration has to get right:

      - **Render `redactedCustomerMessage`, never your own copy of what was
        typed.** Grid masks card numbers and other sensitive digit strings in
        it. A UI that renders its own copy of the input instead puts a card
        number the cardholder pasted back on their screen unmasked, and into
        your logs.
      - **The session token is returned once and is never re-readable.** No
        endpoint hands it back, it cannot be revoked, and it is short-lived by
        design. Hold it for the life of the cardholder's session. It arrives
        on the message response to the turn in which the cardholder sent their
        code, and on no other. Losing it costs the cardholder a new code, never
        access to the chat.

      Some things are absent by construction, so no integration can come to
      depend on them: nothing returns a transcript or an earlier turn's reply
      (retrying under the original `Idempotency-Key` is how an answer that was
      produced but not delivered is recovered; a replay requires the same
      session token its original request required and never carries a
      `sessionToken`, so a lost token is recovered by sending the cardholder's
      next message as a new message, which verifies them again), nothing sets
      a verification state, and nothing changes the number a code is sent to.

      Errors from these endpoints carry `code` and `reason` only (see the
      `CareError` schema), unlike the `Error4xx` schemas used elsewhere in this
      specification.
paths:
  /agents/me/customer:
    get:
      tags:
        - Agent Operations
      summary: Get agent customer
      description: >-
        Retrieve the individual customer associated with the authenticated
        agent. Requires the MANAGE_IDENTITY permission in the agent's policy.
      operationId: agentGetCustomer
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IndividualCustomer'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '403':
          description: >-
            Forbidden - Agents API is not enabled for the platform or the agent
            does not have the MANAGE_IDENTITY permission
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error403'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
      security:
        - AgentAuth: []
components:
  schemas:
    IndividualCustomer:
      title: Individual Customer
      allOf:
        - $ref: '#/components/schemas/Customer'
        - $ref: '#/components/schemas/IndividualCustomerFields'
    Error401:
      type: object
      required:
        - reason
        - code
      properties:
        code:
          type: string
          description: >
            | Error Code | Description |

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

            | UNAUTHORIZED | Issue with API credentials |

            | INVALID_SIGNATURE | Signature header is invalid |

            | WALLET_SIGNATURE_MISSING | The `Grid-Wallet-Signature` header is
            required for this Embedded Wallet action but was not supplied |

            | WALLET_SIGNATURE_MALFORMED | The `Grid-Wallet-Signature` header
            could not be parsed (bad encoding, structure, or fields) |

            | WALLET_SIGNATURE_BODY_MISMATCH | The `Grid-Wallet-Signature` was
            computed over a different request body than the one received |

            | WALLET_SIGNATURE_INVALID | The `Grid-Wallet-Signature` failed
            cryptographic verification against the registered credential |

            | REQUEST_ID_MISSING | The `Request-Id` header is required on the
            signed retry but was not supplied (paired with
            `Grid-Wallet-Signature`) |
          enum:
            - UNAUTHORIZED
            - INVALID_SIGNATURE
            - WALLET_SIGNATURE_MISSING
            - WALLET_SIGNATURE_MALFORMED
            - WALLET_SIGNATURE_BODY_MISMATCH
            - WALLET_SIGNATURE_INVALID
            - REQUEST_ID_MISSING
        reason:
          type: string
          description: Error message
        details:
          type: object
          description: Additional error details
          additionalProperties: true
    Error403:
      type: object
      required:
        - reason
        - code
      properties:
        code:
          type: string
          description: >
            | Error Code | Description |

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

            | FORBIDDEN | Insufficient permissions. `details.refusalReason`
            names the cause when Grid knows it |

            | USER_NOT_READY | Customer exists but is not ready for operation |

            | COUNTERPARTY_NOT_ALLOWED | Counterparty has not been enabled for
            your account |

            | VELOCITY_LIMIT_EXCEEDED | Counterparty has exceeded velocity
            limits |

            | END_USER_TERMS_NOT_ACCEPTED | Customer has not accepted the End
            User Terms |

            | CUSTOMER_NOT_VERIFIED | The customer is not verified and cannot
            perform this action |

            | SANCTION_BLOCKED | Blocked by sanction screening |

            | DESTINATION_NOT_ALLOWED | The agent may not pay this destination |

            | CORRIDOR_UNDER_MAINTENANCE | Payments to this corridor are paused
            for maintenance. |
          enum:
            - FORBIDDEN
            - USER_NOT_READY
            - COUNTERPARTY_NOT_ALLOWED
            - VELOCITY_LIMIT_EXCEEDED
            - END_USER_TERMS_NOT_ACCEPTED
            - CUSTOMER_NOT_VERIFIED
            - SANCTION_BLOCKED
            - DESTINATION_NOT_ALLOWED
            - CORRIDOR_UNDER_MAINTENANCE
        reason:
          type: string
          description: Error message
        details:
          type: object
          description: >-
            Additional error details. Shape varies by `code`. A `FORBIDDEN`
            refusal with a known cause carries `refusalReason`, plus the fields
            that reason names.
          properties:
            refusalReason:
              $ref: '#/components/schemas/RefusalReason'
            permission:
              type: string
              description: >-
                The `AgentPermission` the agent's policy lacks. Present with
                refusal reason `AGENT_PERMISSION_REQUIRED`. Grid may add
                permissions, so accept a value not yet listed there.
              example: ISSUE_CARDS
            policyDenialReason:
              $ref: '#/components/schemas/AgentPolicyDenialReason'
              description: >-
                The policy rule that denied the quote or purchase card. Present
                with refusal reason `AGENT_POLICY_DENIED` or
                `AGENT_PURCHASE_CARD_POLICY_DENIED`.
          additionalProperties: true
    Error500:
      type: object
      required:
        - reason
        - code
      properties:
        code:
          type: string
          description: |
            | Error Code | Description |
            |------------|-------------|
            | GRID_SWITCH_ERROR | Grid switch error |
            | INTERNAL_ERROR | Internal server or UMA error |
          enum:
            - GRID_SWITCH_ERROR
            - INTERNAL_ERROR
        reason:
          type: string
          description: Error message
        details:
          type: object
          description: Additional error details
          additionalProperties: true
    Customer:
      type: object
      required:
        - umaAddress
        - platformCustomerId
        - customerType
      properties:
        id:
          type: string
          description: System-generated unique identifier
          example: Customer:019542f5-b3e7-1d02-0000-000000000001
        platformCustomerId:
          type: string
          description: Platform-specific customer identifier
          example: 9f84e0c2a72c4fa
        customerType:
          $ref: '#/components/schemas/CustomerType'
        endUserTermsConsent:
          deprecated: true
          readOnly: true
          allOf:
            - $ref: '#/components/schemas/EndUserTermsConsent'
          description: >-
            Deprecated; read `agreementConsents` instead. Mirrors the customer's
            `LIGHTSPARK_END_USER_TERMS` acceptance when one is on file, and is
            omitted otherwise.
        agreementConsents:
          type: array
          readOnly: true
          description: >-
            The customer's recorded agreement acceptances, one entry per
            accepted type holding that type's most recent acceptance. Omitted
            when the customer has not accepted any agreement yet.
          items:
            $ref: '#/components/schemas/AgreementConsent'
        region:
          type: string
          description: >-
            Country code (ISO 3166-1 alpha-2) representing the customer's
            regional identity and regulatory jurisdiction.
          example: US
        currencies:
          type: array
          items:
            type: string
          description: List of currency codes enabled for this customer.
          example:
            - USD
            - USDC
        email:
          type: string
          format: email
          description: Email address for the customer.
          example: john.doe@example.com
        phoneNumber:
          type: string
          pattern: ^\+[1-9]\d{1,14}$
          description: Phone number for the customer in strict E.164 format.
          example: '+14155551234'
        umaAddress:
          type: string
          description: >-
            Full UMA address (always present in responses, even if
            system-generated). This is an optional identifier to route payments
            to the customer.
          example: $john.doe@uma.domain.com
        createdAt:
          type: string
          format: date-time
          description: Creation timestamp
          example: '2025-07-21T17:32:28Z'
        updatedAt:
          type: string
          format: date-time
          description: Last update timestamp
          example: '2025-07-21T17:32:28Z'
        isDeleted:
          type: boolean
          description: Whether the customer is marked as deleted
          example: false
        contactVerification:
          allOf:
            - $ref: '#/components/schemas/ContactVerification'
          description: >-
            Email and phone verification state. **Only present when the
            customer's payment provider requires it** (e.g. EU customers);
            omitted otherwise.
    IndividualCustomerFields:
      allOf:
        - type: object
          required:
            - customerType
          properties:
            customerType:
              type: string
              enum:
                - INDIVIDUAL
            kycStatus:
              $ref: '#/components/schemas/KycStatus'
            fullName:
              type: string
              maxLength: 250
              description: Individual's full name
              example: John Michael Doe
            birthDate:
              type: string
              format: date
              description: Date of birth in ISO 8601 format (YYYY-MM-DD)
              example: '1990-01-15'
            nationality:
              type: string
              description: Country code (ISO 3166-1 alpha-2)
              example: US
            address:
              $ref: '#/components/schemas/Address'
            idType:
              $ref: '#/components/schemas/IdentificationType'
            identifier:
              type: string
              maxLength: 100
              writeOnly: true
              description: >-
                The individual's tax identification number: an SSN (format
                `###-##-####`) or ITIN, or a non-US tax ID (`idType`
                `NON_US_TAX_ID`) with its non-US `countryOfIssuance`. US
                residents must provide an SSN or ITIN. Write-only — never
                returned in customer responses.
              example: 123-45-6789
            countryOfIssuance:
              type: string
              description: >-
                Country that issued the identification (ISO 3166-1 alpha-2). For
                an SSN or ITIN this is optional, defaults to `US`, and is
                rejected if set to anything else. For a `NON_US_TAX_ID`, set it
                to the issuing non-US country; `US` is rejected.
              example: US
        - $ref: '#/components/schemas/CustomerEdd'
    RefusalReason:
      type: string
      description: >
        Why Grid refused the request, as `details.refusalReason`. Several
        refusals

        share one `code`, and `reason` is a message that may be reworded, so
        branch

        on this value rather than on `reason`. Treat it as an open set, not a
        fixed

        list: Grid may add values, and an unknown one is a refusal without a
        known

        cause.


        | Refusal reason | Status | Description |

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

        | `AGENT_API_DISABLED` | 403 | The agent API is not enabled for the
        platform |

        | `AGENT_CUSTOMER_INACTIVE` | 403 | The agent's customer is not active |

        | `AGENT_INACTIVE` | 403 | The agent is paused or deleted |

        | `AGENT_NO_DELEGATED_KEY` | 403 | The agent holds no active delegated
        key for the source wallet |

        | `AGENT_PERMISSION_REQUIRED` | 403 | The agent's policy lacks a
        permission this call needs. `details.permission` names it |

        | `AGENT_ACCOUNT_NOT_ALLOWED` | 403 | The agent's policy does not allow
        the source account or funding source |

        | `AGENT_DEPOSIT_ACCOUNT_NOT_ALLOWED` | 403 | The agent's policy does
        not allow deposits to this account |

        | `AGENT_POLICY_DENIED` | 403 | The agent's policy denied executing the
        quote. `details.policyDenialReason` says which rule |

        | `AGENT_QUOTE_HELD` | 403 | The quote cannot be sent and is held for
        manual follow-up |

        | `AGENT_CARDS_DISABLED` | 403 | Agent cards are not enabled for the
        platform |

        | `AGENT_CARDS_CUSTOMER_NOT_VERIFIED` | 403 | Agent cards need a
        verified individual customer |

        | `AGENT_CARD_HANDOVER_DISABLED` | 403 | Handing an agent's card over to
        its customer is not enabled for the platform |

        | `AGENT_PURCHASE_CARDS_DISABLED` | 403 | Agent purchase cards are not
        enabled for the platform |

        | `AGENT_RECURRING_PURCHASE_CARDS_DISABLED` | 403 | Agent recurring
        purchase cards are not enabled for the platform |

        | `AGENT_PURCHASE_CARD_POLICY_DENIED` | 403 | The agent's policy denied
        the purchase card. `details.policyDenialReason` says which rule |

        | `STORED_CARDS_DISABLED` | 403 | Stored cards are not enabled for the
        platform |

        | `CARDS_DISABLED` | 403 | Cards are not enabled for the platform |

        | `CARDHOLDER_INFO_MISSING` | 400 | The cardholder record lacks fields a
        card needs. `details.missingFields` lists them; supply them through the
        customers API |

        | `CARDHOLDER_BANK_ACCOUNT_NOT_OPEN` | 400 | The cardholder's USD bank
        account is not open yet, so no card can be issued until it is |

        | `CARDHOLDER_COUNTRY_NOT_SUPPORTED` | 400 | The cardholder's address is
        outside the United States, where agent cards are not offered yet |

        | `CARDHOLDER_HOLDS_CARD` | 409 | The cardholder already holds a card
        and the platform allows one per cardholder. Close it before issuing
        another |

        | `INVOICE_SUB_SAT_AMOUNT` | 400 | The Lightning invoice's amount is not
        a whole number of satoshis |

        | `INVOICE_FUNDS_DEPOSIT` | 400 | The Lightning invoice was issued by
        Lightspark to fund a deposit and cannot be paid with a send |

        | `INVOICE_FUNDS_OWN_DEPOSIT` | 400 | The Lightning invoice funds a
        deposit of the sender's own. Quote a transfer between the customer's
        accounts instead |
      example: AGENT_POLICY_DENIED
    AgentPolicyDenialReason:
      type: string
      description: >
        Which agent policy rule denied executing a quote or issuing a purchase
        card.

        Sent as `details.policyDenialReason` with refusal reason

        `AGENT_POLICY_DENIED` or `AGENT_PURCHASE_CARD_POLICY_DENIED`. Treat it
        as an

        open set, not a fixed list: Grid may add values.


        | Reason | Description |

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

        | `INVALID_AMOUNT` | The amount is not one the policy can evaluate |

        | `AGENT_PAUSED` | The agent is paused |

        | `PERMISSION_MISSING` | The policy lacks `EXECUTE_QUOTES` |

        | `ACCOUNT_NOT_ALLOWED` | The policy does not allow the source account |

        | `PER_TRANSACTION_LIMIT_EXCEEDED` | The amount exceeds the
        per-transaction limit |

        | `DAILY_LIMIT_EXCEEDED` | The amount would exceed the daily spending
        limit |

        | `MONTHLY_LIMIT_EXCEEDED` | The amount would exceed the monthly
        spending limit |

        | `DAILY_TRANSACTION_LIMIT_EXCEEDED` | The agent has made its daily
        number of transactions |

        | `POOL_LIMIT_EXCEEDED` | The amount would exceed a limit of the agent's
        spending pool |

        | `POOL_PAYMENT_TYPE_NOT_ALLOWED` | The agent's spending pool does not
        allow this kind of payment |
      example: DAILY_LIMIT_EXCEEDED
    CustomerType:
      type: string
      enum:
        - INDIVIDUAL
        - BUSINESS
      description: Whether the customer is an individual or a business entity
      example: INDIVIDUAL
    EndUserTermsConsent:
      type: object
      deprecated: true
      required:
        - acceptedAt
        - ipAddress
        - termsVersion
        - acceptanceMethod
      description: >-
        Deprecated; use `agreementConsents` instead, which records acceptance of
        each agreement separately. Reported only for a customer whose acceptance
        predates that field, and always as the `LIGHTSPARK_END_USER_TERMS`
        agreement.
      properties:
        acceptedAt:
          type: string
          format: date-time
          description: Date and time when the customer accepted the End User Terms.
        ipAddress:
          type: string
          maxLength: 45
          description: IP address of the device the customer used when accepting the terms.
          example: 198.51.100.24
        termsVersion:
          type: string
          description: Version identifier of the accepted Grid End User Terms.
          example: V1
        acceptanceMethod:
          $ref: '#/components/schemas/AgreementAcceptanceMethod'
    AgreementConsent:
      allOf:
        - $ref: '#/components/schemas/AgreementConsentRequest'
    ContactVerification:
      type: object
      description: >-
        Email and/or phone verification state for the customer. This object is
        **only present when the customer's regulatory jurisdiction requires
        contact verification** (e.g. EU customers). For customers who have no
        such requirement, this object is omitted entirely — no action is needed.


        Each channel is reported independently: only the channels the customer's
        provider actually requires are present. A provider may require both
        email and phone, just one of them, or — when the object is absent —
        neither. Every channel that **is** present must reach `VERIFIED` before
        the customer can begin KYC. Drive each present channel with `POST
        /customers/{customerId}/verify-email` and/or `POST
        /customers/{customerId}/verify-phone` (and their `/confirm` sub-routes).
      properties:
        email:
          $ref: '#/components/schemas/ContactVerificationStatus'
          description: >-
            Verification status of the customer's email address. Present only
            when the provider requires email verification.
        phone:
          $ref: '#/components/schemas/ContactVerificationStatus'
          description: >-
            Verification status of the customer's phone number. Present only
            when the provider requires phone verification.
    KycStatus:
      type: string
      enum:
        - UNVERIFIED
        - PENDING
        - APPROVED
        - REJECTED
        - HOLD
      description: >-
        The current KYC status of a customer. `HOLD` means the customer is
        placed on hold and may be required to update or provide more
        information.
      example: APPROVED
    Address:
      type: object
      required:
        - line1
        - postalCode
        - country
      properties:
        line1:
          type: string
          description: Street address line 1
          example: 123 Main Street
        line2:
          type: string
          description: Street address line 2
          example: Apt 4B
        city:
          type: string
          description: City
          example: San Francisco
        state:
          type: string
          description: State/Province/Region
          example: CA
        postalCode:
          type: string
          description: Postal/ZIP code
          example: '94105'
        country:
          type: string
          description: Country code (ISO 3166-1 alpha-2)
          example: US
    IdentificationType:
      type: string
      enum:
        - SSN
        - ITIN
        - EIN
        - NON_US_TAX_ID
      description: Type of tax identification
      example: SSN
    CustomerEdd:
      type: object
      description: >-
        Enhanced-due-diligence (EDD) fields available as optional patchable
        attributes on an individual customer. Referenced via `allOf` from
        `IndividualCustomerFields`, so these appear as top-level optional fields
        on the customer resource itself; there is no separate EDD resource. The
        specific set required for a given customer is driven by the KYC
        provider's per-jurisdiction / per-flow / per-volume-tier rules (surfaced
        through `MISSING_FIELD` errors on `POST /verifications`).
      properties:
        sourceOfFundsCategories:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/IndividualSourceOfFundsCategory'
          description: >-
            Structured source-of-funds categories (FLOW of funds for this
            account).
          example:
            - SALARY
        sourceOfFundsOtherDescription:
          type: string
          maxLength: 500
          description: >-
            Free-form description of the customer's source of funds. Required
            when `sourceOfFundsCategories` includes `OTHER`; otherwise omitted.
          example: Contest winnings
        sourceOfWealthCategories:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/SourceOfWealthCategory'
          description: >-
            Structured source-of-wealth categories (STOCK — origin of
            accumulated wealth).
          example:
            - SALARY
            - INVESTMENTS
        sourceOfWealthOtherDescription:
          type: string
          maxLength: 500
          description: >-
            Free-form description of the customer's source of wealth. Required
            when `sourceOfWealthCategories` includes `OTHER`; otherwise omitted.
          example: Royalty income from published works
        purposeOfAccount:
          $ref: '#/components/schemas/PurposeOfAccount'
        purposeOfAccountOtherDescription:
          type: string
          maxLength: 500
          description: >-
            Free-form description of the customer's intended purpose for the
            Grid account. Required when `purposeOfAccount` is `OTHER`; otherwise
            omitted.
          example: Household budgeting between spouses
        expectedMonthlyTransactionCount:
          $ref: '#/components/schemas/ExpectedMonthlyTransactionCount'
        expectedMonthlyTransactionVolume:
          $ref: '#/components/schemas/ExpectedMonthlyTransactionVolume'
        annualIncomeRange:
          $ref: '#/components/schemas/AnnualIncomeRange'
        netWorthRange:
          $ref: '#/components/schemas/NetWorthRange'
        pepStatus:
          $ref: '#/components/schemas/PepStatus'
    AgreementAcceptanceMethod:
      type: string
      description: Method the customer used to affirmatively accept an agreement.
      enum:
        - CHECKBOX
        - CLICK_TO_ACCEPT
      example: CHECKBOX
    AgreementConsentRequest:
      type: object
      required:
        - type
        - acceptedAt
        - ipAddress
        - termsVersion
        - acceptanceMethod
      properties:
        type:
          $ref: '#/components/schemas/AgreementType'
        acceptedAt:
          type: string
          format: date-time
          description: >-
            Date and time when the customer accepted this agreement. Must
            include a timezone offset and must not be in the future.
        ipAddress:
          type: string
          maxLength: 45
          description: >-
            IP address of the device the customer used when accepting this
            agreement.
          example: 198.51.100.24
        termsVersion:
          type: string
          maxLength: 64
          description: >-
            Version identifier of the accepted agreement, as returned for this
            type by the agreement documents endpoint. A version is scoped to its
            type; a version valid for one agreement is not valid for another.
          example: '2025-10-13'
        acceptanceMethod:
          $ref: '#/components/schemas/AgreementAcceptanceMethod'
    ContactVerificationStatus:
      type: string
      description: >-
        Status of an individual contact-verification channel (email or phone).
        `PENDING` means verification is required but not yet completed;
        `VERIFIED` means the channel has been confirmed.
      enum:
        - PENDING
        - VERIFIED
      example: VERIFIED
    IndividualSourceOfFundsCategory:
      type: string
      enum:
        - SALARY
        - SELF_EMPLOYMENT_INCOME
        - INVESTMENT_INCOME
        - PENSION
        - RENTAL_INCOME
        - GIFT
        - INHERITANCE
        - LOAN
        - SAVINGS
        - SALE_OF_ASSETS
        - OTHER
      description: >-
        A structured source-of-funds category for an individual customer (FLOW
        of funds into this account). Distinct from `SourceOfFundsCategory`,
        which covers business customers.
      example: SALARY
    SourceOfWealthCategory:
      type: string
      enum:
        - SALARY
        - BUSINESS_INCOME
        - INVESTMENTS
        - INHERITANCE
        - PROPERTY_SALE
        - GIFT
        - RETIREMENT
        - SAVINGS
        - OTHER
      description: >-
        Origin of the customer's accumulated wealth (STOCK). Distinct from
        `SourceOfFundsCategory` which describes the FLOW of funds for this
        specific account.
      example: SALARY
    PurposeOfAccount:
      type: string
      enum:
        - CONTRACTOR_PAYOUTS
        - CREATOR_PAYOUTS
        - EMPLOYEE_PAYOUTS
        - MARKETPLACE_SELLER_PAYOUTS
        - SUPPLIER_PAYMENTS
        - CROSS_BORDER_B2B
        - AR_AUTOMATION
        - AP_AUTOMATION
        - EMBEDDED_PAYMENTS
        - PLATFORM_FEE_COLLECTION
        - P2P_TRANSFERS
        - CHARITABLE_DONATIONS
        - OTHER
      description: The intended purpose for using the Grid account
      example: CONTRACTOR_PAYOUTS
    ExpectedMonthlyTransactionCount:
      type: string
      enum:
        - COUNT_UNDER_10
        - COUNT_10_TO_100
        - COUNT_100_TO_500
        - COUNT_500_TO_1000
        - COUNT_OVER_1000
      description: Expected number of transactions per month
      example: COUNT_100_TO_500
    ExpectedMonthlyTransactionVolume:
      type: string
      enum:
        - VOLUME_UNDER_10K
        - VOLUME_10K_TO_100K
        - VOLUME_100K_TO_1M
        - VOLUME_1M_TO_10M
        - VOLUME_OVER_10M
      description: Expected total transaction volume per month in USD equivalent
      example: VOLUME_100K_TO_1M
    AnnualIncomeRange:
      type: string
      enum:
        - UNDER_50K
        - RANGE_50K_100K
        - RANGE_100K_250K
        - RANGE_250K_1M
        - OVER_1M
      description: >-
        Bucketed annual income (USD equivalent). Used for enhanced due diligence
        on higher-risk profiles.
      example: RANGE_100K_250K
    NetWorthRange:
      type: string
      enum:
        - UNDER_100K
        - RANGE_100K_500K
        - RANGE_500K_1M
        - RANGE_1M_5M
        - RANGE_5M_25M
        - OVER_25M
      description: >-
        Bucketed total net worth (USD equivalent). Used for enhanced due
        diligence on higher-risk profiles.
      example: RANGE_500K_1M
    PepStatus:
      type: string
      enum:
        - NONE
        - DOMESTIC
        - FOREIGN
        - HIO
        - FAMILY_OR_ASSOCIATE
      description: >-
        Political exposure declaration (Politically Exposed Person status).
        `HIO` = head of an international organization. `FAMILY_OR_ASSOCIATE`
        covers close family members and known close associates of a PEP.
      example: NONE
    AgreementType:
      type: string
      description: >-
        Identifies which Grid agreement a consent record or document refers to.
        Values are stable identifiers: a document's hosted URL or version may
        change, but its type does not. Accepting one agreement never implies
        acceptance of another, even when two agreements share a hosted page. The
        cardholder and accountholder agreements differ by customer kind: an
        `INDIVIDUAL` customer accepts the `_CONSUMER_` variant, and a `BUSINESS`
        customer accepts the `_COMMERCIAL_` one.
      enum:
        - LIGHTSPARK_END_USER_TERMS
        - LIGHTSPARK_E_SIGN_CONSENT
        - LIGHTSPARK_PRIVACY_POLICY
        - LEAD_E_SIGN_CONSENT
        - LEAD_ACCOUNTHOLDER_CONSUMER_AGREEMENT
        - LEAD_ACCOUNTHOLDER_COMMERCIAL_AGREEMENT
        - LEAD_PRIVACY_POLICY
        - LEAD_CARDHOLDER_CONSUMER_AGREEMENT
        - LEAD_CARDHOLDER_COMMERCIAL_AGREEMENT
      example: LIGHTSPARK_END_USER_TERMS
  securitySchemes:
    BasicAuth:
      type: http
      scheme: basic
      description: >-
        API token authentication using format `<api token id>:<api client
        secret>`
    AgentAuth:
      type: http
      scheme: bearer
      description: >-
        Bearer token authentication for agent-scoped endpoints. The token is the
        `accessToken` returned when redeeming a device code via `POST
        /agents/device-codes/redeem`. Agent credentials are user-scoped: all
        requests are automatically bound to the agent's associated customer and
        subject to the agent's policy.

````

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