---
title: "Execute payment quote"
method: POST
path: "/payments/execute"
tags: ["Payments"]
---

# Execute payment quote

`POST /payments/execute`

Executes the quote identified by `quote_id` and creates the underlying fiat transaction. The quote must not have expired.

## Headers

- `X-SCX-SIGNED` string, required
- `X-SCX-TIMESTAMP` string, required

## Request body

- PostPaymentsExecutePaymentRequest
  - `participant_code` string, required — Participant code of the customer executing the quote.
  - `quote_id` string, uuid, required — Identifier of the quote returned by `POST /payments/rfq`. Must not have expired.
  - `ach_signed_agreement` number, required — Unix timestamp in seconds at which the customer accepted the ACH debit authorization.
  - `description` string — Optional free-text descriptor for the transaction (max 10 characters).
  - `external_account_id` string, required — Identifier of the previously-linked external fiat account that will be debited.
  - `account_group` string — Optional override of the account group on the customer side. Defaults to the calling platform.
  - `network` string[] — Ordered list of acceptable fiat rails. When omitted, the service picks the best eligible rail for the account.

## Response `200`

Quote executed. Poll `/payments/status` with the returned `transaction_id` to observe lifecycle transitions.

- PostPaymentsExecutePaymentResponse
  - `message` object
    - `request_id` string, uuid — Request identifier echoed back from the request.
    - `transaction_id` string, uuid — Identifier of the resulting fiat transaction. Use this value to poll `/payments/status` for settlement updates.
    - `status` 'submitted' | 'pending' | 'pending_trade' | 'posted' | 'settled' | 'cancelled' | 'failed' | 'returned' | 'returned_settled' | 'rejected' | 'retried' | 'unspecified' — Initial transfer status on execution; typically `submitted`. Subsequent lifecycle states are surfaced via `/payments/status`.
    - `warning` string — Non-blocking warning message, e.g. insufficient balance. Empty string when no warning is applicable.

## Other responses

- `400` — Bad Request
- `403` — Forbidden
- `404` — Not Found
- `500` — Internal Server Error
- `503` — Service Unavailable

---

[API](https://skmtc.net/zerohash/apis/zerohash-api.md) · [All operations](https://skmtc.net/zerohash/apis/zerohash-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zerohash/zerohash-api/revisions/8b647d934363/schema)
