---
title: "Request a payin quote"
method: POST
path: "/pay/rfq"
tags: ["Payins"]
---

# Request a payin quote

`POST /pay/rfq`

Retrieves a quote for a pay event for a given participant code and asset.
The response includes a deposit address and rate at which a subsequent on-chain deposit will be honored.

The quote has an expiry timestamp (`price_expire_ts`) — for volatile assets, the platform must execute the deposit before this time,
or a new quote can be requested for the same payment to refresh the price.
For stablecoins, `price_expire_ts` will be `null`.

The `request_id` you send (via the `X-Request-Id` header) is the idempotency key for this endpoint: re-submitting the same `request_id` returns the existing active quote — same `transaction_id`, deposit address, and rate — instead of creating a new one.

Use the returned `transaction_id` as the path parameter when calling `POST /pay/{id}/rfq` to refresh a quote.

After the on-chain deposit settles or fails, a `crypto_pay_status_changed` webhook reports the outcome (`success` + `status_reason_code`).

## Headers

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

## Request body

- PostPayRfqBody
  - `participant_code` string, required — The participant code for the shopper making the payment
  - `pay_asset` string, required — The cryptocurrency asset to be deposited (e.g., BTC, ETH, USDC)
  - `quoted_total` string, required — The total fiat amount the shopper is paying
  - `quoted_currency` 'USD', required — The fiat currency for the payment. Currently only USD is supported
  - `account_label` string — Optional account label for the transaction. Defaults to "pay"
  - `client_reference_id` string — An optional client-provided reference ID for tracking purposes
  - `merchant_participant_code` string — Optional participant code of the merchant tied to this transaction. When omitted, the platform itself is treated as the merchant.

## Response `200`

Pay quote created successfully

- PostPayRfqResponse
  - `message` object
    - `request_id` string — The unique identifier for the request
    - `participant_code` string — The participant code tied to the payment
    - `pay_asset` string — The cryptocurrency asset to be deposited
    - `quoted_currency` string — The fiat currency for the payment
    - `quoted_total` string — The total fiat amount
    - `underlying_quantity` string — The crypto quantity required for the deposit
    - `rate` string — The conversion rate at which the deposit will be honored
    - `price_expire_ts` number, nullable — Unix timestamp (milliseconds) when the quoted price expires. Null for stablecoins and for static quotes.
    - `deposit_address` string — The wallet address where the crypto should be deposited
    - `transaction_id` string — Unique transaction identifier (UUID). Use this as the path parameter for POST /pay/{id}/rfq to refresh the quote
    - `client_reference_id` string, nullable — The client-provided reference ID (if provided in the request)
    - `is_static` boolean — Indicates whether this quote is static (no expiry, rate held by zerohash). Static quotes return `price_expire_ts: null`.
    - `merchant_participant_code` string — The merchant participant code associated with this payment. Only present when a merchant is linked to the transaction.

## Other responses

- `400` — Bad Request
- `401` — The platform, jurisdiction, or asset is not enabled for the Pay product. The `{"error": ...}` body is one of "Your Platform is not configured to use the Pay product", "The State you live in is not authorized to use this product", or "Asset not enabled for pay".
- `403` — The transaction is not authorized. Possible causes: manual approval is required before this transaction can proceed (Level 4 shoppers — the body contains a transaction_id identifying the approval review), or the shopper has exceeded their daily spend limit at the current authorization level. A generic `{"error":"Transaction not authorized"}` body is returned when the transaction is hard-denied (no remediation).
- `404` — Not Found
- `409` — Shopper KYC requirements are not met for this transaction.
- `422` — The transaction could not be authorized. The `{"error": ...}` body is either "Participant is not authorized to transact" (the participant/merchant relationship or state precludes authorization) or "Transaction not authorized" (the authorizer returned an unrecognized status).
- `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)
