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

# Simulate a card authorization

> Simulate an inbound card authorization in the sandbox environment. Drives the same internal `authorize` + `reconcile` paths the card issuer would call in production, so platforms can exercise Grid's decisioning + funding-source pull behavior end-to-end without an external network round-trip.

The decisioning outcome is controlled by the last three characters of `merchant.descriptor`:

| Suffix | Outcome | | ------ | ------- | | `002`  | Decline — `INSUFFICIENT_FUNDS` (the pull on the funding source fails) | | `003`  | Decline — `CARD_PAUSED` (intended to verify a frozen card refuses auths) | | `005`  | Delayed pull (~30s) — exercises the `PENDING → CONFIRMED` path | | `006`  | Pull succeeds but the confirmation event reports `FAILED` — exercises the high-urgency `EXCEPTION` alert | | any other | Approved |

Production returns `404` on this path.




## OpenAPI

````yaml https://app.stainless.com/api/spec/documented/grid/openapi.documented.yml post /sandbox/cards/{id}/simulate/authorization
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: 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: External Accounts
    description: >-
      External account management endpoints for creating and managing external
      bank accounts
  - name: Same-Currency Transfers
    description: >-
      Endpoints for transferring funds between internal and external accounts
      with the same currency
  - name: Cross-Currency Transfers
    description: Endpoints for creating and confirming quotes for cross-currency transfers
  - 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 (experimental), 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 an action requires approval, the
      resulting transaction enters a pending state and must be approved by the
      platform via `POST /transactions/{transactionId}/approve`.
  - name: Cards
    description: >-
      Card management endpoints. Issue debit cards against an internal account,
      freeze / unfreeze, close, manage card funding sources, and list card
      transactions.
paths:
  /sandbox/cards/{id}/simulate/authorization:
    post:
      tags:
        - Sandbox
      summary: Simulate a card authorization
      description: >
        Simulate an inbound card authorization in the sandbox environment.
        Drives the same internal `authorize` + `reconcile` paths the card issuer
        would call in production, so platforms can exercise Grid's decisioning +
        funding-source pull behavior end-to-end without an external network
        round-trip.


        The decisioning outcome is controlled by the last three characters of
        `merchant.descriptor`:


        | Suffix | Outcome | | ------ | ------- | | `002`  | Decline —
        `INSUFFICIENT_FUNDS` (the pull on the funding source fails) | | `003`  |
        Decline — `CARD_PAUSED` (intended to verify a frozen card refuses auths)
        | | `005`  | Delayed pull (~30s) — exercises the `PENDING → CONFIRMED`
        path | | `006`  | Pull succeeds but the confirmation event reports
        `FAILED` — exercises the high-urgency `EXCEPTION` alert | | any other |
        Approved |


        Production returns `404` on this path.
      operationId: sandboxSimulateCardAuthorization
      parameters:
        - name: id
          in: path
          required: true
          description: The id of the card to simulate an authorization against.
          schema:
            type: string
          example: Card:019542f5-b3e7-1d02-0000-000000000010
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SandboxCardAuthorizationRequest'
            examples:
              coffeeAuth:
                summary: Approved $12.50 auth at a coffee shop
                value:
                  amount: 1250
                  currency:
                    code: USD
                  merchant:
                    descriptor: BLUE BOTTLE COFFEE SF
                    mcc: '5814'
                    country: US
              declinedInsufficientFunds:
                summary: Declined — insufficient funds (descriptor suffix `002`)
                value:
                  amount: 50000
                  currency:
                    code: USD
                  merchant:
                    descriptor: AMAZON RETAIL US-002
                    mcc: '5942'
                    country: US
      responses:
        '200':
          description: >-
            Simulated authorization processed. Returns the resulting card
            transaction.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CardTransaction'
        '400':
          description: Bad request - Invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error400'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error401'
        '403':
          description: Forbidden - request was made with a production platform token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error403'
        '404':
          description: Card not found (also returned in production for this path)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error404'
        '500':
          description: Internal service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error500'
      security:
        - BasicAuth: []
      x-codeSamples:
        - lang: JavaScript
          source: >-
            import LightsparkGrid from '@lightsparkdev/grid';


            const client = new LightsparkGrid({
              username: process.env['GRID_CLIENT_ID'], // This is the default and can be omitted
              password: process.env['GRID_CLIENT_SECRET'], // This is the default and can be omitted
            });


            const cardTransaction = await
            client.sandbox.cards.simulate.authorization(
              'Card:019542f5-b3e7-1d02-0000-000000000010',
              {
                amount: 1250,
                currency: { code: 'USD' },
                merchant: {
                  descriptor: 'BLUE BOTTLE COFFEE SF',
                  mcc: '5814',
                  country: 'US',
                },
              },
            );


            console.log(cardTransaction.id);
        - lang: Python
          source: |-
            import os
            from grid import LightsparkGrid

            client = LightsparkGrid(
                username=os.environ.get("GRID_CLIENT_ID"),  # This is the default and can be omitted
                password=os.environ.get("GRID_CLIENT_SECRET"),  # This is the default and can be omitted
            )
            card_transaction = client.sandbox.cards.simulate.authorization(
                id="Card:019542f5-b3e7-1d02-0000-000000000010",
                amount=1250,
                currency={
                    "code": "USD"
                },
                merchant={
                    "descriptor": "BLUE BOTTLE COFFEE SF",
                    "mcc": "5814",
                    "country": "US",
                },
            )
            print(card_transaction.id)
        - lang: Go
          source: "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/stainless-sdks/grid-go\"\n\t\"github.com/stainless-sdks/grid-go/option\"\n)\n\nfunc main() {\n\tclient := grid.NewClient(\n\t\toption.WithUsername(\"My Username\"),\n\t\toption.WithPassword(\"My Password\"),\n\t)\n\tcardTransaction, err := client.Sandbox.Cards.Simulate.Authorization(\n\t\tcontext.TODO(),\n\t\t\"Card:019542f5-b3e7-1d02-0000-000000000010\",\n\t\tgrid.SandboxCardSimulateAuthorizationParams{\n\t\t\tAuthorizationRequest: grid.AuthorizationRequestParam{\n\t\t\t\tAmount:   1250,\n\t\t\t\tCurrency: grid.CurrencyParam{},\n\t\t\t\tMerchant: grid.CardMerchantParam{\n\t\t\t\t\tDescriptor: \"BLUE BOTTLE COFFEE SF\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tfmt.Printf(\"%+v\\n\", cardTransaction.ID)\n}\n"
        - lang: Kotlin
          source: >-
            package com.lightspark.grid.example


            import com.lightspark.grid.client.LightsparkGridClient

            import com.lightspark.grid.client.okhttp.LightsparkGridOkHttpClient

            import com.lightspark.grid.models.cards.CardTransaction

            import com.lightspark.grid.models.quotes.Currency

            import
            com.lightspark.grid.models.sandbox.cards.simulate.AuthorizationRequest

            import
            com.lightspark.grid.models.sandbox.cards.simulate.CardMerchant

            import
            com.lightspark.grid.models.sandbox.cards.simulate.SimulateAuthorizationParams


            fun main() {
                val client: LightsparkGridClient = LightsparkGridOkHttpClient.fromEnv()

                val params: SimulateAuthorizationParams = SimulateAuthorizationParams.builder()
                    .id("Card:019542f5-b3e7-1d02-0000-000000000010")
                    .authorizationRequest(AuthorizationRequest.builder()
                        .amount(1250L)
                        .currency(Currency.builder().build())
                        .merchant(CardMerchant.builder()
                            .descriptor("BLUE BOTTLE COFFEE SF")
                            .build())
                        .build())
                    .build()
                val cardTransaction: CardTransaction = client.sandbox().cards().simulate().authorization(params)
            }
        - lang: Ruby
          source: >-
            require "grid"


            lightspark_grid = Grid::Client.new(username: "My Username",
            password: "My Password")


            card_transaction =
            lightspark_grid.sandbox.cards.simulate.authorization(
              "Card:019542f5-b3e7-1d02-0000-000000000010",
              amount: 1250,
              currency: {},
              merchant: {descriptor: "BLUE BOTTLE COFFEE SF"}
            )


            puts(card_transaction)
        - lang: PHP
          source: |-
            <?php

            require_once dirname(__DIR__) . '/vendor/autoload.php';

            use Grid\Client;
            use Grid\Core\Exceptions\APIException;

            $client = new Client(
              username: getenv('GRID_CLIENT_ID') ?: 'My Username',
              password: getenv('GRID_CLIENT_SECRET') ?: 'My Password',
            );

            try {
              $cardTransaction = $client->sandbox->cards->simulate->authorization(
                'Card:019542f5-b3e7-1d02-0000-000000000010',
                amount: 1250,
                currency: [
                  'code' => 'USD',
                  'decimals' => 2,
                  'name' => 'United States Dollar',
                  'symbol' => '$',
                ],
                merchant: [
                  'descriptor' => 'BLUE BOTTLE COFFEE SF',
                  'country' => 'US',
                  'mcc' => '5814',
                ],
              );

              var_dump($cardTransaction);
            } catch (APIException $e) {
              echo $e->getMessage();
            }
        - lang: C#
          source: >-
            using System;

            using Grid;

            using Grid.Models.Sandbox.Cards.Simulate;


            LightsparkGridClient client = new();


            SimulateAuthorizationParams parameters = new()

            {
                ID = "Card:019542f5-b3e7-1d02-0000-000000000010",
                Amount = 1250,
                Currency = new()
                {
                    Code = "USD",
                    Decimals = 2,
                    Name = "United States Dollar",
                    Symbol = "$",
                },
                Merchant = new()
                {
                    Descriptor = "BLUE BOTTLE COFFEE SF",
                    Country = "US",
                    Mcc = "5814",
                },
            };


            var cardTransaction = await
            client.Sandbox.Cards.Simulate.Authorization(parameters);


            Console.WriteLine(cardTransaction);
        - lang: CLI
          source: |-
            grid sandbox:cards:simulate authorization \
              --username 'My Username' \
              --password 'My Password' \
              --id Card:019542f5-b3e7-1d02-0000-000000000010 \
              --amount 1250 \
              --currency '{}' \
              --merchant '{descriptor: BLUE BOTTLE COFFEE SF}'
components:
  schemas:
    SandboxCardAuthorizationRequest:
      type: object
      required:
        - amount
        - currency
        - merchant
      description: >-
        Sandbox-only request body for `POST
        /sandbox/cards/{id}/simulate/authorization`. Drives the same internal
        authorization + reconcile paths that the issuer would call in
        production. The decisioning outcome is controlled by the last three
        characters of `merchant.descriptor` — see the endpoint documentation for
        the suffix table.
      properties:
        amount:
          type: integer
          format: int64
          description: >-
            Authorization amount in the smallest unit of `currency` (e.g. cents
            for USD).
          exclusiveMinimum: 0
          example: 1250
        currency:
          $ref: '#/components/schemas/Currency'
        merchant:
          $ref: '#/components/schemas/CardMerchant'
    CardTransaction:
      type: object
      required:
        - id
        - cardId
        - status
        - merchant
        - authorizedAmount
        - accountId
        - pullSummary
        - refundSummary
        - settlementSummary
        - authorizedAt
        - createdAt
        - updatedAt
      description: >-
        Parent transaction row for a card authorization and all of the pulls /
        settlements / refunds that reconcile against it. Child events are rolled
        up into the `pullSummary`, `refundSummary`, and `settlementSummary`
        aggregates. Delivered as the payload of the generic transaction webhook
        stream (extends the Transaction model with a card destination type) on
        every transition.
      properties:
        id:
          type: string
          description: System-generated unique card transaction identifier
          readOnly: true
          example: CardTransaction:019542f5-b3e7-1d02-0000-000000000100
        cardId:
          type: string
          description: The id of the `Card` this transaction was made on.
          example: Card:019542f5-b3e7-1d02-0000-000000000010
        issuerTransactionToken:
          type: string
          description: >-
            Opaque identifier for the transaction on the underlying issuer. Used
            to cross-reference Grid records against issuer dashboards and
            webhooks.
          example: lithic_txn_b81c2a4f
          readOnly: true
        status:
          $ref: '#/components/schemas/CardTransactionStatus'
        merchant:
          $ref: '#/components/schemas/CardMerchant'
        authorizedAmount:
          $ref: '#/components/schemas/CurrencyAmount'
        settledAmount:
          $ref: '#/components/schemas/CurrencyAmount'
        refundedAmount:
          $ref: '#/components/schemas/CurrencyAmount'
        accountId:
          type: string
          description: >-
            Internal account id that funded this transaction (the funding source
            selected by Authorization Decisioning at auth time).
          example: InternalAccount:019542f5-b3e7-1d02-0000-000000000002
        pullSummary:
          $ref: '#/components/schemas/CardPullSummary'
        refundSummary:
          $ref: '#/components/schemas/CardRefundSummary'
        settlementSummary:
          $ref: '#/components/schemas/CardSettlementSummary'
        authorizedAt:
          type: string
          format: date-time
          description: When the auth was approved.
          example: '2026-05-08T14:30:00Z'
        lastEventAt:
          type: string
          format: date-time
          description: >-
            Timestamp of the most recent reconcile event (pull / clearing /
            refund) against this transaction.
          example: '2026-05-08T15:42:11Z'
        createdAt:
          type: string
          format: date-time
          description: Creation timestamp (same as `authorizedAt` for card transactions).
          readOnly: true
          example: '2026-05-08T14:30:00Z'
        updatedAt:
          type: string
          format: date-time
          description: Last update timestamp.
          readOnly: true
          example: '2026-05-08T15:42:11Z'
    Error400:
      type: object
      required:
        - message
        - status
        - code
      properties:
        status:
          type: integer
          enum:
            - 400
          description: HTTP status code
        code:
          type: string
          description: >
            | Error Code | Description |

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

            | INVALID_INPUT | Invalid input provided |

            | MISSING_MANDATORY_USER_INFO | Required customer information is
            missing |

            | INVITATION_ALREADY_CLAIMED | Invitation has already been claimed |

            | INVITATIONS_NOT_CONFIGURED | Invitations are not configured |

            | INVALID_UMA_ADDRESS | UMA address format is invalid |

            | INVITATION_CANCELLED | Invitation has been cancelled |

            | QUOTE_REQUEST_FAILED | An issue occurred during the quote process;
            this is retryable |

            | INVALID_PAYREQ_RESPONSE | Counterparty Payreq response was invalid
            |

            | INVALID_RECEIVER | Receiver is invalid |

            | PARSE_PAYREQ_RESPONSE_ERROR | Error parsing receiver PayReq
            response |

            | CERT_CHAIN_INVALID | Counterparty certificate chain is invalid |

            | CERT_CHAIN_EXPIRED | Counterparty certificate chain has expired |

            | INVALID_PUBKEY_FORMAT | Counterparty Public key format is invalid
            |

            | MISSING_REQUIRED_UMA_PARAMETERS | Counterparty required UMA
            parameters are missing |

            | SENDER_NOT_ACCEPTED | Sender is not accepted |

            | AMOUNT_OUT_OF_RANGE | Amount is out of range |

            | INVALID_CURRENCY | Currency is invalid |

            | INVALID_TIMESTAMP | Timestamp is invalid |

            | INVALID_NONCE | Nonce is invalid |

            | INVALID_REQUEST_FORMAT | Request format is invalid |

            | INVALID_BANK_ACCOUNT | Bank account is invalid |

            | SELF_PAYMENT | Self payment not allowed |

            | LOOKUP_REQUEST_FAILED | Lookup request failed |

            | PARSE_LNURLP_RESPONSE_ERROR | Error parsing LNURLP response |

            | INVALID_AMOUNT | Amount is invalid |

            | WEBHOOK_ENDPOINT_NOT_SET | Webhook endpoint is not set |

            | WEBHOOK_DELIVERY_ERROR | Webhook delivery error |

            | LOW_QUALITY | Document quality too low to process |

            | DATA_MISMATCH | Document details don't match provided information
            |

            | EXPIRED | Document has expired |

            | SUSPECTED_FRAUD | Document suspected of being forged or edited |

            | UNSUITABLE_DOCUMENT | Document type is not accepted or not
            supported |

            | INCOMPLETE | Document is missing pages or sides |

            | EMAIL_OTP_CREDENTIAL_ALREADY_EXISTS | An EMAIL_OTP credential is
            already registered on the target internal account; only one email
            OTP credential is supported per internal account at this time |

            | PASSKEY_CREDENTIAL_ALREADY_EXISTS | A PASSKEY credential with the
            same WebAuthn credentialId is already registered on the target
            internal account |
          enum:
            - INVALID_INPUT
            - MISSING_MANDATORY_USER_INFO
            - INVITATION_ALREADY_CLAIMED
            - INVITATIONS_NOT_CONFIGURED
            - INVALID_UMA_ADDRESS
            - INVITATION_CANCELLED
            - QUOTE_REQUEST_FAILED
            - INVALID_PAYREQ_RESPONSE
            - INVALID_RECEIVER
            - PARSE_PAYREQ_RESPONSE_ERROR
            - CERT_CHAIN_INVALID
            - CERT_CHAIN_EXPIRED
            - INVALID_PUBKEY_FORMAT
            - MISSING_REQUIRED_UMA_PARAMETERS
            - SENDER_NOT_ACCEPTED
            - AMOUNT_OUT_OF_RANGE
            - INVALID_CURRENCY
            - INVALID_TIMESTAMP
            - INVALID_NONCE
            - INVALID_REQUEST_FORMAT
            - INVALID_BANK_ACCOUNT
            - SELF_PAYMENT
            - LOOKUP_REQUEST_FAILED
            - PARSE_LNURLP_RESPONSE_ERROR
            - INVALID_AMOUNT
            - WEBHOOK_ENDPOINT_NOT_SET
            - WEBHOOK_DELIVERY_ERROR
            - LOW_QUALITY
            - DATA_MISMATCH
            - EXPIRED
            - SUSPECTED_FRAUD
            - UNSUITABLE_DOCUMENT
            - INCOMPLETE
            - EMAIL_OTP_CREDENTIAL_ALREADY_EXISTS
            - PASSKEY_CREDENTIAL_ALREADY_EXISTS
        message:
          type: string
          description: Error message
        details:
          type: object
          description: Additional error details
          additionalProperties: true
    Error401:
      type: object
      required:
        - message
        - status
        - code
      properties:
        status:
          type: integer
          enum:
            - 401
          description: HTTP status code
        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
        message:
          type: string
          description: Error message
        details:
          type: object
          description: Additional error details
          additionalProperties: true
    Error403:
      type: object
      required:
        - message
        - status
        - code
      properties:
        status:
          type: integer
          enum:
            - 403
          description: HTTP status code
        code:
          type: string
          description: >
            | Error Code | Description |

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

            | FORBIDDEN | Insufficient permissions |

            | 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 |
          enum:
            - FORBIDDEN
            - USER_NOT_READY
            - COUNTERPARTY_NOT_ALLOWED
            - VELOCITY_LIMIT_EXCEEDED
        message:
          type: string
          description: Error message
        details:
          type: object
          description: Additional error details
          additionalProperties: true
    Error404:
      type: object
      required:
        - message
        - status
        - code
      properties:
        status:
          type: integer
          enum:
            - 404
          description: HTTP status code
        code:
          type: string
          description: >
            | Error Code | Description |

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

            | TRANSACTION_NOT_FOUND | Transaction not found |

            | INVITATION_NOT_FOUND | Invitation not found |

            | USER_NOT_FOUND | Customer not found |

            | QUOTE_NOT_FOUND | Quote not found |

            | LOOKUP_REQUEST_NOT_FOUND | Lookup request not found |

            | TOKEN_NOT_FOUND | Token not found |

            | BULK_UPLOAD_JOB_NOT_FOUND | Bulk upload job not found |

            | REFERENCE_NOT_FOUND | Reference not found |

            | UMA_NOT_FOUND | The UMA address is well-formed but no receiver
            exists at the counterparty VASP |
          enum:
            - TRANSACTION_NOT_FOUND
            - INVITATION_NOT_FOUND
            - USER_NOT_FOUND
            - QUOTE_NOT_FOUND
            - LOOKUP_REQUEST_NOT_FOUND
            - TOKEN_NOT_FOUND
            - BULK_UPLOAD_JOB_NOT_FOUND
            - REFERENCE_NOT_FOUND
            - UMA_NOT_FOUND
        message:
          type: string
          description: Error message
        details:
          type: object
          description: Additional error details
          additionalProperties: true
    Error500:
      type: object
      required:
        - message
        - status
        - code
      properties:
        status:
          type: integer
          enum:
            - 500
          description: HTTP status code
        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
        message:
          type: string
          description: Error message
        details:
          type: object
          description: Additional error details
          additionalProperties: true
    Currency:
      type: object
      properties:
        code:
          type: string
          description: >-
            Three-letter currency code (ISO 4217) for fiat currencies. Some
            cryptocurrencies may use their own ticker symbols (e.g. "BTC" for
            Bitcoin, "USDC" for USDC, etc.)
          example: USD
        name:
          type: string
          description: Full name of the currency
          example: United States Dollar
        symbol:
          type: string
          description: Symbol of the currency
          example: $
        decimals:
          type: integer
          description: Number of decimal places for the currency
          minimum: 0
          example: 2
    CardMerchant:
      type: object
      required:
        - descriptor
      properties:
        descriptor:
          type: string
          description: >-
            Merchant descriptor string captured from the card network at
            authorization time.
          example: BLUE BOTTLE COFFEE SF
        mcc:
          type: string
          description: Merchant Category Code (ISO 18245) — four-digit numeric string.
          example: '5814'
        country:
          type: string
          description: Two-letter ISO 3166-1 alpha-2 country code of the merchant.
          example: US
    CardTransactionStatus:
      type: string
      enum:
        - AUTHORIZED
        - PARTIALLY_SETTLED
        - SETTLED
        - REFUNDED
        - EXCEPTION
      description: >
        Lifecycle status of a card transaction.


        | Status | Description |

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

        | `AUTHORIZED` | The auth has been approved and a hold placed on the
        funding source; no clearing has arrived yet. |

        | `PARTIALLY_SETTLED` | At least one clearing has arrived and posted,
        but more clearings are still expected (split shipments, tips, multi-leg
        trips). |

        | `SETTLED` | All clearings for the auth have posted and the transaction
        is closed against the funding source. |

        | `REFUNDED` | A `RETURN` was received from the merchant; the net
        settled amount has been refunded in part or whole. |

        | `EXCEPTION` | The transaction settled to the card network but the
        corresponding pull from the funding source failed (e.g. balance no
        longer covers the post-hoc clearing). Surfaces high-urgency alerts and
        is the dashboard query for stuck reconciliations. |
    CurrencyAmount:
      type: object
      required:
        - amount
        - currency
      properties:
        amount:
          type: integer
          format: int64
          description: >-
            Amount in the smallest unit of the currency (e.g., cents for
            USD/EUR, satoshis for BTC)
          example: 12550
        currency:
          $ref: '#/components/schemas/Currency'
    CardPullSummary:
      type: object
      required:
        - count
        - totalAmount
      properties:
        count:
          type: integer
          description: >-
            Total number of pulls (debits) executed against the funding source
            for this transaction. `> 1` indicates one or more post-hoc pulls —
            e.g. restaurant tip / over-auth clearings.
          example: 2
        totalAmount:
          type: integer
          format: int64
          description: >-
            Sum of all pull amounts in the smallest unit of the funding source's
            currency.
          example: 1500
        pendingCount:
          type: integer
          description: >-
            Number of pulls still in the `PENDING` state. Drops to zero when
            every pull has reached a terminal state. Non-zero values that
            persist beyond the expected settlement window are an early signal
            for the `EXCEPTION` path.
          example: 0
    CardRefundSummary:
      type: object
      required:
        - count
        - totalAmount
      properties:
        count:
          type: integer
          description: Number of refund (return) events received for this transaction.
          example: 0
        totalAmount:
          type: integer
          format: int64
          description: >-
            Sum of all refund amounts in the smallest unit of the funding
            source's currency.
          example: 0
    CardSettlementSummary:
      type: object
      required:
        - count
        - totalAmount
      properties:
        count:
          type: integer
          description: >-
            Number of settlement (clearing) events received for this
            transaction.
          example: 1
        totalAmount:
          type: integer
          format: int64
          description: >-
            Sum of all settled amounts in the smallest unit of the funding
            source's currency.
          example: 1500
  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/{code}/redeem`. Agent credentials are user-scoped:
        all requests are automatically bound to the agent's associated customer
        and subject to the agent's policy.

````