---
updatedAt: 2026-05-07T18:17:26.000Z
agentTools:
  projectIndex: https://docs.joinforage.app/llms.txt
---

# Capture payments for an order

> 📘 Endpoint Relevance By Integration Type
>
> This endpoint is only relevant to Fully Hosted and Custom integrations.
>
> If you're building with a Forage SDK, then use the [`Payments` endpoints](ref:payments).
>
> Learn more about the high-level phases of an SDK integration in the [Forage JS Quickstart](doc:forage-js-quickstart), or check out the Payments API introduction for a list of [resources by integration type](ref:introduction#forage-resources).

This request will attempt to process all payments associated with the referenced Order.

The Order will first be checked for a consistent state, i.e. all associated payments must add up to the order total and the amounts charged to an EBT payment method cannot exceed the SNAP eligible total. If these checks fail, you will receive a 400 response and no payment methods will be charged.

Payments are always processed in a consistent order. Payments to an EBT Card are processed first. If there are any errors encountered when processing a EBT payment, then the Forage backend will not attempt to process any further payment methods.

Once EBT payments have been processed successfully, the Forage backend will attempt to process the charges to non-EBT cards.

Once all payments are processed successfully,
- The status of the Order will be updated to succeeded
- A POST request will be made to your client indicating whether the Order succeeded or failed.

Note that 2 PIN entries must be posted in the request body if there are payments on both the EBT SNAP and EBT Cash accounts. The server will only look at the PIN data if it is needed to process any associated payments. Pass an emptry string if the PIN data is not needed.


# OpenAPI definition

```json
{
  "openapi": "3.0.0",
  "x-readme": {
    "explorer-enabled": false,
    "proxy-enabled": false
  },
  "info": {
    "title": "Forage Payments API",
    "description": "The Forage Payments API is a REST API for processing Electronic Benefits Transfer (EBT) payments (SNAP and EBT Cash) in your e-commerce or in-store application.\n\nProcessing any EBT payment, or checking an EBT card's balance, requires the cardholder's PIN. Federal regulations require all PIN entry to happen through a PCI-compliant, USDA-approved interface. Forage provides that interface, so EBT PIN collection always happens through a Forage-hosted surface (Forage Checkout or a Forage SDK), never directly in your own form. Some endpoints (for example, capture and balance) are only reachable through that surface because they require PIN data in the request.\n\nEBT rarely covers an entire order: items like delivery fees and non-eligible products can't be paid with SNAP or EBT Cash. You decide how to handle the remaining balance (split tender) and any credit or debit processing alongside the EBT portion.\n\nForage offers four integration options. Pick the one that fits your platform and engineering resources:\n\n1. **Fully Hosted Checkout.** Forage processes EBT and credit/debit through a Forage-hosted Checkout UI. Lowest engineering effort, and Forage absorbs most error handling. See the [Fully Hosted Checkout guide](https://docs.joinforage.app/docs/fully-hosted).\n2. **Custom Checkout.** Forage processes EBT; you handle split tender, taxes, and credit/debit in your own checkout flow. Best when you want minimal changes to your existing UX. See the [Custom Checkout guide](https://docs.joinforage.app/docs/custom).\n3. **Online SDKs.** Client-side SDKs for [web](https://docs.joinforage.app/docs/forage-js), [iOS](https://docs.joinforage.app/docs/ios), and [Android](https://docs.joinforage.app/docs/android) that collect EBT PINs in your app while keeping you out of PCI scope.\n4. **POS Terminal SDK.** Accept in-person EBT payments on an Android POS device. See the [POS Terminal guide](https://docs.joinforage.app/docs/forage-terminal-android).\n\nAs a general principle, any data created by your requests, or by your customers on a Forage-hosted surface, is retrievable through GET requests to the appropriate resource.\n\nHave more questions? Use our [contact form](https://www.joinforage.com/get-in-touch) to reach our sales and engineering support teams.\n",
    "contact": {
      "name": "API Support",
      "email": "engineering@joinforage.com"
    },
    "version": "2025-08-04"
  },
  "externalDocs": {
    "description": "Forage documentation",
    "url": "https://docs.joinforage.app/"
  },
  "servers": [
    {
      "url": "https://{environment}.joinforage.app",
      "variables": {
        "environment": {
          "default": "api.sandbox",
          "enum": [
            "api",
            "api.sandbox"
          ]
        }
      }
    }
  ],
  "security": [],
  "paths": {
    "/api/orders/{order_ref}/capture/": {
      "parameters": [
        {
          "name": "order_ref",
          "in": "path",
          "description": "The Order's unique reference hash",
          "required": true,
          "schema": {
            "type": "string"
          }
        },
        {
          "$ref": "#/components/parameters/MerchantAccountHeader"
        },
        {
          "$ref": "#/components/parameters/IdempotencyKeyHeader"
        },
        {
          "$ref": "#/components/parameters/APIVersionHeader"
        }
      ],
      "post": {
        "tags": [
          "Orders"
        ],
        "summary": "Capture payments for an existing Order.",
        "description": "> 📘 Endpoint Relevance By Integration Type\n>\n> This endpoint is only relevant to Fully Hosted and Custom integrations.\n>\n> If you’re building with a Forage SDK, then use the [`Payments` endpoints](https://docs.joinforage.app/reference/payments).\n>\n> Learn more about the high-level phases of an SDK integration in the [Forage JS Quickstart](https://docs.joinforage.app/docs/forage-js-quickstart), or check out the Payments API introduction for a list of [resources by integration type](https://docs.joinforage.app/reference/introduction#forage-resources).\n\nThis request will attempt to process all payments associated with the referenced Order.\n\nThe Order will first be checked for a consistent state, i.e. all associated payments must add up to the order total and the amounts charged to an EBT payment method cannot exceed the SNAP eligible total. If these checks fail, you will receive a 400 response and no payment methods will be charged.\n\nPayments are always processed in a consistent order. Payments to an EBT Card are processed first. If there are any errors encountered when processing a EBT payment, then the Forage backend will not attempt to process any further payment methods.\n\nOnce EBT payments have been processed successfully, the Forage backend will attempt to process the charges to non-EBT cards.\n\nOnce all payments are processed successfully,\n- The status of the Order will be updated to succeeded\n- A POST request will be made to your client indicating whether the Order succeeded or failed.\n\nNote that 2 PIN entries must be posted in the request body if there are payments on both the EBT SNAP and EBT Cash accounts. The server will only look at the PIN data if it is needed to process any associated payments. Pass an emptry string if the PIN data is not needed.\n",
        "operationId": "Capture order",
        "security": [
          {
            "OAuth2": [
              "internal",
              "pin-protected"
            ]
          }
        ],
        "requestBody": {
          "$ref": "#/components/requestBodies/DoublePin"
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/Order200"
          },
          "400": {
            "$ref": "#/components/responses/Error400"
          },
          "401": {
            "$ref": "#/components/responses/Error401"
          },
          "402": {
            "$ref": "#/components/responses/Error402"
          },
          "403": {
            "$ref": "#/components/responses/Error403"
          },
          "404": {
            "$ref": "#/components/responses/Error404"
          },
          "423": {
            "$ref": "#/components/responses/Error423"
          },
          "429": {
            "$ref": "#/components/responses/Error429"
          },
          "500": {
            "$ref": "#/components/responses/Error500"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ErrorsArray": {
        "type": "array",
        "description": "An array with information about the error.",
        "items": {
          "type": "object",
          "properties": {
            "code": {
              "type": "string",
              "description": "A short string that represents the error."
            },
            "message": {
              "type": "string",
              "description": "A developer-facing message with more details about the error, not to be displayed to customers."
            },
            "source": {
              "type": "object",
              "properties": {
                "resource": {
                  "type": "string",
                  "description": "The type of the Forage resource involved in the error."
                },
                "ref": {
                  "type": "string",
                  "description": "If applicable, the ten character reference hash of the Forage resource that caused the error. An empty string if no specific individual resource was involved."
                }
              }
            },
            "details": {
              "type": "object",
              "description": "Additional details about the error, if applicable."
            }
          }
        },
        "example": []
      },
      "ErrorResponseObject": {
        "type": "object",
        "description": "An object that includes details about the error.",
        "properties": {
          "path": {
            "type": "string",
            "description": "The requested endpoint."
          },
          "errors": {
            "$ref": "#/components/schemas/ErrorsArray"
          }
        }
      },
      "DoublePinData": {
        "type": "object",
        "description": "This object contains an EBT cardholder's PIN data when two PIN entries are required",
        "properties": {
          "snap_pin": {
            "type": "string",
            "description": "The EBT SNAP PIN that was entered by the customer",
            "example": "1234"
          },
          "cash_pin": {
            "type": "string",
            "description": "The EBT Cash PIN that was entered by the customer",
            "example": "5678"
          },
          "card_number_token": {
            "type": "string",
            "description": "The token field of the TokenizedPaymentMethod.card object. This token is an input to Forage's secure PIN encryption.",
            "example": "tok_live_123456789012345"
          }
        }
      },
      "OrderResponse": {
        "type": "object",
        "required": [
          "ref",
          "snap_total",
          "ebt_cash_total",
          "delivery_address",
          "is_delivery",
          "success_redirect_url",
          "cancel_redirect_url",
          "supported_benefits",
          "psp_customer_id",
          "customer_id",
          "external_order_id",
          "external_location_id",
          "status",
          "payments",
          "refunds",
          "success_date",
          "receipt",
          "expires_at",
          "is_commercial_shipping",
          "previous_errors"
        ],
        "properties": {
          "ref": {
            "type": "string",
            "description": "A unique reference hash for the Forage `Order` object.",
            "example": "93410bcaff"
          },
          "snap_total": {
            "type": "string",
            "format": "currency",
            "description": "The SNAP eligible portion of the order cost in USD, represented as a numeric string. Precision is supported to the penny.",
            "example": "25.99"
          },
          "ebt_cash_total": {
            "type": "string",
            "format": "currency",
            "description": "The portion of the `Order` total, in USD, that is EBT Cash eligible only, represented as a numeric string. Precision is supported to the penny.",
            "example": "5.99"
          },
          "remaining_total": {
            "type": "string",
            "format": "currency",
            "description": "The portion of the `Order` total, in USD, that is neither SNAP eligible nor EBT Cash eligible, represented as a numeric string. This amount must be charged to a credit or debit card, with precision supported to the penny. _This value is returned only for [Fully Hosted Sessions](https://docs.joinforage.app/reference/forage-sessions#fully-hosted-session) and is not included if the `Order` was created using a POST request to [`/capture_sessions/`](https://docs.joinforage.app/reference/create-capture-session)._",
            "example": "10.99"
          },
          "product_list": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductDataResponse"
            },
            "description": "A list of the products in the customer's cart. If there are no taxes applied to any of the products, then this field can be empty. _This value is only returned for [Fully Hosted Sessions](https://docs.joinforage.app/reference/forage-sessions#fully-hosted-session). It is not returned if the `Order` was created via a POST to [`/capture_sessions/`](https://docs.joinforage.app/reference/create-capture-session)._",
            "example": []
          },
          "platform_fee": {
            "type": "string",
            "format": "decimal",
            "description": "An optional field, for use by a platform supporting multiple merchants, that indicates the percentage cut of each payment that the platform charges as a fee. Represented as a decimal string.",
            "example": "0.05"
          },
          "delivery_address": {
            "$ref": "#/components/schemas/DeliveryAddressData"
          },
          "is_delivery": {
            "type": "boolean",
            "description": "Whether the order is for delivery or pickup. This information is required per FNS regulations. Defaults to `false` if not provided.",
            "example": true
          },
          "success_redirect_url": {
            "type": "string",
            "description": "The URL to redirect your customer to if the order is completed successfully, passed in the original request to create a `Session`.",
            "example": "https://www.your-app.com/?status=SUCCEEDED"
          },
          "cancel_redirect_url": {
            "type": "string",
            "description": "The URL to redirect your customer to if they cancel the order, passed in the original request to create a `Session`.",
            "example": "https://www.your-app.com/?status=CANCELED"
          },
          "supported_benefits": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "A list that limits the types of payment methods that can be applied at checkout, including any or all of the values in: `[\"snap\", \"ebt_cash\", \"non_ebt\"]`. Use `supported_benefits` **only** if you want to restrict the possible payment method types. Omit this field in all other cases. For example, pass `[\"snap\", \"non_ebt\"]` if you want to accept SNAP and credit card payments only (excluding EBT Cash).\n",
            "example": [
              "snap",
              "non_ebt"
            ]
          },
          "psp_customer_id": {
            "type": "string",
            "nullable": true,
            "description": "The third-party credit/debit payment processor's unique identifier for the customer. _This value is returned as `null` if the `Order` was created via a POST to [`/capture_sessions/`](https://docs.joinforage.app/reference/create-capture-session)._\n\n**You must build with Forage Version `2023-05-15` or later to use `psp_customer_id`.** Either pass `2023-05-15` as the `API-Version` header on a per request basis, or set the version for all requests in the Forage dashboard.\n",
            "example": "cus_AJ6yA7mRH34mJT"
          },
          "customer_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CustomerIDField"
              }
            ],
            "nullable": true,
            "example": "my_user_id"
          },
          "external_order_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ExternalOrderIDField"
              }
            ],
            "nullable": true
          },
          "external_location_id": {
            "type": "string",
            "nullable": true,
            "description": "A unique identifier for the physical fulfillment location."
          },
          "status": {
            "type": "string",
            "description": "The status of the `Order` in the Forage lifecycle. One of:\n\n- `canceled`\n- `draft` (the status at the start, when a Session is created)\n- `failed`\n- `processing`\n- `succeeded`\n\nIf the value is `failed`, then [inspect the associated Order Payments](https://docs.joinforage.app/reference/get-all-order-payments) to determine the cause of the error.\n",
            "enum": [
              "draft",
              "processing",
              "failed",
              "succeeded",
              "canceled"
            ],
            "example": "draft"
          },
          "payments": {
            "type": "array",
            "description": "An array of the unique reference hashes for any Forage `OrderPayment` objects associated with the `Order`.",
            "items": {
              "type": "string",
              "description": "Payment ref"
            },
            "example": []
          },
          "refunds": {
            "type": "array",
            "description": "An array of the unique reference hashes for any Forage `OrderRefund` objects associated with the `Order`.",
            "items": {
              "type": "string",
              "description": "Refund ref"
            },
            "example": []
          },
          "success_date": {
            "type": "string",
            "nullable": true,
            "format": "date-time",
            "description": "A UTC timestamp of the date when the `Order` was successfully charged. This value is `null` if the `status` of the `Order` is not yet `succeeded`.",
            "example": "2021-06-16T00:11:50.000000Z"
          },
          "receipt": {
            "nullable": true,
            "description": "Most of the information that you're required to display to the customer, according to FNS regulations.\n\nThis field is `null` if the data that populates the receipt is not yet available.\n\nThe total amount paid by the customer is `snap_amount` + `ebt_cash_amount` + `other_amount`. This amount will be settled with the merchant after applying Forage's fees.\n",
            "allOf": [
              {
                "$ref": "#/components/schemas/ReceiptData"
              }
            ]
          },
          "expires_at": {
            "type": "string",
            "nullable": true,
            "format": "date-time",
            "description": "A UTC timestamp of when the `Order` will expire if it is not captured or canceled, set to 30 minutes from when the `Order` is created.\n\nIf the `status` of the `Order` is `succeeded` or `canceled`, then the `expires_at` value is `null`.\n",
            "example": "2021-06-16T00:41:50.000000Z"
          },
          "is_commercial_shipping": {
            "type": "boolean",
            "nullable": true,
            "description": "Whether the order is to be shipped commercially. FNS uses this value in its database for statistics."
          },
          "previous_errors": {
            "$ref": "#/components/schemas/ErrorsArray"
          }
        }
      },
      "BalanceResponse": {
        "type": "object",
        "description": "An object that represents an EBT cardholder's account balance.",
        "properties": {
          "id": {
            "type": "integer",
            "description": "The unique identifier for the balance record.",
            "example": 12345
          },
          "snap": {
            "type": "string",
            "format": "currency",
            "description": "The available SNAP balance in USD on the customer’s EBT Card, represented as a numeric string."
          },
          "non_snap": {
            "type": "string",
            "format": "currency",
            "description": "The available EBT Cash balance in USD on the customer's EBT Card, represented as a numeric string."
          },
          "updated": {
            "type": "string",
            "format": "date-time",
            "description": "A UTC timestamp that indicates when the funds in the account last changed, represented as an [ISO 8601 date-time](https://www.iso.org/iso-8601-date-and-time-format.html) string."
          },
          "sequence_number": {
            "type": "string",
            "description": "A transaction number for this `PaymentMethod`'s most recent balance check. Returned only for POS Terminal transactions; omitted from online merchant balance checks."
          }
        }
      },
      "ProductDataResponse": {
        "type": "object",
        "required": [
          "id",
          "name",
          "upc",
          "unit_price",
          "quantity",
          "eligibility",
          "snap_amount",
          "cash_amount",
          "credit_debit_amount",
          "tax_collected",
          "taxes_charged",
          "taxes_exempted"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "description": "The unique identifier for the product."
          },
          "name": {
            "type": "string",
            "description": "The name of the product."
          },
          "upc": {
            "type": "string",
            "nullable": true,
            "description": "The UPC of the product."
          },
          "gtin": {
            "type": "string",
            "description": "The GTIN (Global Trade Item Number) of the product."
          },
          "unit_price": {
            "type": "string",
            "format": "currency",
            "description": "The unit price of the product, represented as a numeric string."
          },
          "quantity": {
            "type": "integer",
            "description": "The quantity of the product."
          },
          "tax_rate": {
            "type": "string",
            "format": "decimal",
            "description": "The tax rate for the product, represented as a decimal string with at most six decimal places. A value of `0` indicates a tax rate of 0%, and a value of `1` indicates a tax rate of 100%. To set a 2% tax rate, for example, set the value to `0.02`. Use this field if the product is subject to only one tax rate. If multiple tax rates apply, for example both a state grocery tax and a sweetened beverage tax, then use the `tax_rate_list` param instead of `tax_rate`."
          },
          "tax_rate_list": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "imposed_by",
                "tax_rate"
              ],
              "properties": {
                "imposed_by": {
                  "type": "string",
                  "description": "The entity applying the tax to this item."
                },
                "tax_rate": {
                  "type": "string",
                  "format": "decimal",
                  "description": "The tax rate applied to the item by the entity described in the `imposed_by` field, represented as a decimal string. If the product is subject to only one tax rate, then use the single `tax_rate` param instead of `tax_rate_list`."
                },
                "taxes_charged": {
                  "type": "string",
                  "format": "currency",
                  "nullable": true,
                  "description": "The portion of taxes charged for this item attributable to the `imposed_by` entity, represented as a numeric string."
                },
                "taxes_exempted": {
                  "type": "string",
                  "format": "currency",
                  "nullable": true,
                  "description": "The portion of taxes exempted for this item attributable to the `imposed_by` entity, represented as a numeric string."
                }
              }
            }
          },
          "eligibility": {
            "type": "string",
            "nullable": true,
            "enum": [
              "snap",
              "ebt_cash",
              "non_ebt"
            ],
            "description": "The eligibility of the product. Must be `snap`, `ebt_cash`, or `non_ebt`."
          },
          "snap_amount": {
            "type": "string",
            "format": "currency",
            "nullable": true,
            "description": "The amount paid for this product using SNAP benefits in USD, represented as a numeric string. Precision is supported to the penny."
          },
          "cash_amount": {
            "type": "string",
            "format": "currency",
            "nullable": true,
            "description": "The amount paid for this product using EBT Cash benefits in USD, represented as a numeric string. Precision is supported to the penny."
          },
          "credit_debit_amount": {
            "type": "string",
            "format": "currency",
            "nullable": true,
            "description": "The amount paid for this product using credit or debit card in USD, represented as a numeric string. Precision is supported to the penny."
          },
          "tax_collected": {
            "type": "string",
            "format": "currency",
            "nullable": true,
            "description": "The tax amount collected for this product in USD, represented as a numeric string. Precision is supported to the penny."
          },
          "taxes_charged": {
            "type": "string",
            "format": "currency",
            "nullable": true,
            "description": "The amount of taxes charged for this product in USD, represented as a numeric string. Precision is supported to the penny.",
            "example": "2.47"
          },
          "taxes_exempted": {
            "type": "string",
            "format": "currency",
            "nullable": true,
            "description": "The amount of taxes exempted for this product in USD, represented as a numeric string. Precision is supported to the penny.",
            "example": "1.83"
          }
        }
      },
      "DeliveryAddressData": {
        "type": "object",
        "required": [
          "line1",
          "zipcode"
        ],
        "description": "⚠️ **Exception**: If the purchase is made in-store via a POS Terminal, then a `delivery_address` is not required when creating a `Payment`.\n\nThe address for delivery or pickup of the `Order`. Per FNS regulations, this value must always be provided. If the `Order` is for pickup, then use the merchant address.\n",
        "properties": {
          "city": {
            "type": "string",
            "description": "The name of the city."
          },
          "country": {
            "type": "string",
            "description": "Either `us` or `US`. Defaults to `US` if not provided."
          },
          "line1": {
            "type": "string",
            "description": "The first line of the street address."
          },
          "line2": {
            "type": "string",
            "nullable": true,
            "description": "The second line of the street address."
          },
          "zipcode": {
            "type": "string",
            "description": "The zip or postal code."
          },
          "state": {
            "type": "string",
            "description": "The two-letter abbreviation, can be upper or lowercase, for the US state."
          }
        }
      },
      "ReceiptData": {
        "type": "object",
        "description": "Most of the information that you're required to display to the customer, according to FNS regulations.\n\nThis field is `null` if the data that populates the receipt is not yet available.\n\nThe total amount paid by the customer is `snap_amount` + `ebt_cash_amount` + `other_amount`. This amount will be settled with the merchant after applying Forage's fees.\n",
        "properties": {
          "ref_number": {
            "type": "string",
            "description": "A unique reference hash for the Forage `Order`, `Payment`, or `Refund` associated with this receipt.\n\nNote: `receipt.ref_number` equals `ref`.\n",
            "default": "45e3f12a90"
          },
          "is_voided": {
            "type": "boolean",
            "description": "Whether the transaction associated with this receipt has been voided. If `false`, then the transaction finished processing as expected. If `true`, then the transaction was reversed."
          },
          "snap_amount": {
            "type": "string",
            "description": "The USD amount charged/refunded to the SNAP balance of the EBT Card, represented as a numeric string.",
            "default": "25.99"
          },
          "ebt_cash_amount": {
            "type": "string",
            "format": "currency",
            "description": "The USD amount charged/refunded to the EBT Cash balance of the EBT Card, represented as a numeric string.",
            "default": "10.99"
          },
          "cash_back_amount": {
            "type": "string",
            "format": "currency",
            "nullable": true,
            "description": "The USD amount of cash back given to the customer, represented as a numeric string.",
            "default": "0.00"
          },
          "other_amount": {
            "type": "string",
            "format": "currency",
            "description": "The USD amount charged/refunded to any payment method that is not an EBT Card, represented as a numeric string.",
            "default": "5.99"
          },
          "sales_tax_applied": {
            "type": "string",
            "format": "currency",
            "description": "The USD amount of taxes charged to the customer’s non-EBT payment instrument, represented as a numeric string.",
            "default": "5.16"
          },
          "balance": {
            "nullable": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/BalanceResponse"
              }
            ]
          },
          "last_4": {
            "type": "string",
            "description": "The last four digits of the EBT Card number.",
            "default": "3456"
          },
          "message": {
            "type": "string",
            "description": "A message from the EBT payment network that must be displayed to the EBT cardholder.",
            "default": "Approved"
          },
          "transaction_type": {
            "type": "string",
            "enum": [
              "Order",
              "Refund",
              "Payment"
            ],
            "description": "A constant string that is used to identify the transaction type associated with the receipt.\n",
            "default": "Refund"
          },
          "created": {
            "type": "string",
            "format": "date-time",
            "description": "A UTC timestamp of when the Forage transaction object was created, represented as an [ISO 8601 date-time](https://www.iso.org/iso-8601-date-and-time-format.html) string.",
            "default": "2021-06-16T00:11:50.000000Z"
          },
          "sequence_number": {
            "type": "string",
            "nullable": true,
            "description": "The terminal transaction sequence number for POS transactions. `null` for online (non-POS) transactions."
          }
        }
      },
      "CustomerIDField": {
        "type": "string",
        "maxLength": 64,
        "description": "**⚠️ If you’re integrating Forage with a POS Terminal, then do not use this param. It is only supported for online transactions.**\n\nA unique identifier for the end customer making the payment.\n\nForage automatically adds the `customer_id` to the Session's corresponding `Order` and `OrderPayments`.\n\nThis field helps Forage's servers more quickly identify the customer associated with the request. While `customer_id` is not technically required, if you omit it then requests could take longer to process. **It is strongly recommended to pass customer_id.**\n\nIf you're providing your internal customer ID, then we recommend that you hash the value before sending it on the payload.\n\nEach customer should only have one unique `customer_id`. For example, if you create both a `PaymentMethod` and a Forage `Session` (Fully Hosted or Custom) or `Payment` (SDK) for the same customer, then the `customer_id` should be the same in both requests to ensure continuity of stored payment methods.\n"
      },
      "ExternalOrderIDField": {
        "type": "string",
        "maxLength": 64,
        "description": "A unique identifier for the order as created by the merchant or platform (not Forage).\n\nWhen a merchant or platform passes this order ID to Forage, it persists in each Forage transaction related to the `Order`. This field enables merchants to map order IDs in their system to corresponding Forage `Order` IDs.\n\n**You must build with Forage Version `2023-05-15` or later to use `external_order_id`.** Either pass `2023-05-15` as the `API-Version` header on a per request basis, or set the version for all requests in the Forage dashboard.\n"
      }
    },
    "requestBodies": {
      "DoublePin": {
        "description": "An EBT cardholder's PIN data",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DoublePinData"
            }
          }
        }
      }
    },
    "responses": {
      "Order200": {
        "description": "__OK__ - Success",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/OrderResponse"
            }
          }
        }
      },
      "Error400": {
        "description": "__Bad Request__ The request was not accepted because of errors in the request body.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponseObject"
            }
          }
        }
      },
      "Error401": {
        "description": "__Unauthorized__ Missing valid API key.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponseObject"
            }
          }
        }
      },
      "Error402": {
        "description": "__Request Failed__ The request failed even though the parameters are valid. This often occurs due to a payment decline.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponseObject"
            }
          }
        }
      },
      "Error403": {
        "description": "__Forbidden__ The API key lacks permissions to perform the request.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponseObject"
            }
          }
        }
      },
      "Error404": {
        "description": "__Not Found__ The requested resource does not exist.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponseObject"
            }
          }
        }
      },
      "Error423": {
        "description": "__Locked__ - The request could not be completed because the target resource is currently locked.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponseObject"
            },
            "examples": {
              "resource_locked": {
                "summary": "Resource Locked",
                "value": {
                  "path": "/api/example_path/",
                  "errors": [
                    {
                      "code": "resource_locked",
                      "message": "Request could not be completed because the resource is currently locked. Please try again later.",
                      "source": {
                        "resource": "Idempotency_Key",
                        "ref": ""
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      },
      "Error429": {
        "description": "__Limit Reached__ Request limit reached.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponseObject"
            }
          }
        }
      },
      "Error500": {
        "description": "__Server Errors__ Something went wrong on Forage's servers. Try again."
      }
    },
    "parameters": {
      "MerchantAccountHeader": {
        "name": "Merchant-Account",
        "in": "header",
        "description": "A unique merchant ID that Forage provides during onboarding, as in `123ab45c67`. The Merchant ID can be found in the Forage [sandbox](https://dashboard.sandbox.joinforage.app/login/) or [production](https://dashboard.joinforage.app/login/) dashboard.",
        "schema": {
          "type": "string"
        },
        "required": true
      },
      "IdempotencyKeyHeader": {
        "name": "Idempotency-Key",
        "in": "header",
        "description": "An alphanumeric key that clients can use to identify repeated requests that are dropped in transit. Generate a distinct key for every unique request and only re-use keys for retries.",
        "schema": {
          "type": "string"
        },
        "required": true
      },
      "APIVersionHeader": {
        "name": "API-Version",
        "in": "header",
        "description": "The [Forage version](https://docs.joinforage.app/reference/version-history), represented as a string with the format of a `YYYY-MM-DD` date.\n\nIf not specified in the request header, then the version defaults to the value set in the Forage dashboard.\n",
        "schema": {
          "type": "string"
        },
        "required": false
      }
    },
    "securitySchemes": {
      "OAuth2": {
        "type": "oauth2",
        "description": "Pass the access token in the 'Authorization' header with the format \"Bearer ${token}\", i.e. the word \"Bearer\" and your access token from the /o/token/ API, separated by whitespace.\n",
        "flows": {
          "password": {
            "tokenUrl": "/o/token/",
            "scopes": {
              "hosted_checkout": "Scope for tokens used by merchant applications which allow Forage to manage split tender processing (i.e. EBT + Credit/Debit).\n",
              "pinpad_only": "Scope for tokens used by merchant applications which manage their own split tender (i.e. Forage Checkout is used only for EBT processing).\n"
            }
          },
          "clientCredentials": {
            "tokenUrl": "/o/token/",
            "scopes": {
              "internal": "Scope for tokens used by Forage internal applications.\n",
              "pin-protected": "Scope for tokens which can access secure storage.\n",
              "disbursement": "Scope for tokens which can disburse money to merchants.\n"
            }
          }
        }
      }
    }
  }
}
```