---
title: "Create Quote"
method: POST
path: "/v1/instances/{instance_id}/quotes"
tags: ["Payouts Quotes"]
---

# Create Quote

`POST /v1/instances/{instance_id}/quotes`

## Path parameters

- `instance_id` string, required

## Headers

- `Idempotency-Key` string — Optional key to safely retry this request without performing the action twice. Retrying with the same key and an identical body replays the original response; reusing a key with a different body returns an error. Keys are kept for 24 hours.

## Request body

- QuoteIn
  - `bank_account_id` string, nullable — The bank account to pay. Exactly one of bank_account_id or payable_id must be set.
  - `payable_id` string, nullable — The payable to pay (boleto / PIX QR code). Exactly one of bank_account_id or payable_id must be set. The amount comes from the payable, so request_amount and currency_type are not accepted.
  - `network` 'base' | 'sepolia' | 'arbitrum_sepolia' | 'base_sepolia' | 'arbitrum' | 'polygon' | 'polygon_amoy' | 'ethereum' | 'stellar' | 'stellar_testnet' | 'tron' | 'solana' | 'solana_devnet' | 'tempo' | 'tempo_testnet', required — Check blindpay available networks
  - `token` 'USDC' | 'USDT' | 'USDB', required — Check blindpay available tokens
  - `description` string, nullable
  - `partner_fee_id` string, nullable
  - `refund_wallet_address` string, nullable — Optional wallet address to receive the refund if this payout fails or is refunded. Must be a valid address on the quote network. When omitted, refunds are sent back to the sender wallet address.
  - `currency_type` 'sender' | 'receiver'
  - `cover_fees` boolean, nullable — If true, the sender will cover the fees. If false, the customer will cover the fees. Omitting it means false on bank account quotes. Payable quotes are always true.
  - `request_amount` integer, nullable — 1000 represents 10.00, 2050 represents 20.50. Minimum 500 for bank account quotes; derived from the payable for payable quotes.

## Response `200`

Quote creation details

- QuoteOut
  - `id` string, required
  - `expires_at` number, nullable, required — Epoch unix timestamp that represents the final datetime to transaction be received on blockchain. For SEPA payouts this may be shorter than the default 5 minute window if Circle CPN returns an earlier expiry.
  - `commercial_quotation` number, nullable, required — 1 USD = 4.95 BRL
  - `blindpay_quotation` number, nullable, required — 1 USD = 4.85 BRL (commercial quotation - (blindpay taxes))
  - `receiver_amount` number, nullable, required — 52.40 BRL
  - `sender_amount` number, nullable, required — 10.10 USDC needs to be sent to bank account blockchain address
  - `partner_fee_amount` number, nullable — 1.5 USDC
  - `flat_fee` number, nullable — 0.5 USDC
  - `billing_fee_amount` number, nullable — Billing fee in cents (charged via invoice at the end of the month)
  - `contract` object, nullable
    - `abi` object[], required
    - `address` string, required — Token address related to the network you send in request params
    - `functionName` 'approve', required — Function name from ERC20 smart contract
    - `blindpayContractAddress` string, required — Blindpay contract address
    - `amount` string, required — Amount to approve with correct decimal places
    - `network` object, required
      - `name` string, required
      - `chainId` number, required
  - `customer_local_amount` number, nullable — Estimated amount in the currency of recipient bank account
  - `description` string, nullable

## Other responses

- `400` — Possible error codes: `BANK_ACCOUNTS_INCOMPLETE`, `BANK_ACCOUNTS_INVALID_BANK_CODE`, `BANK_ACCOUNTS_INVALID_ROUTING`, `BANK_ACCOUNTS_NOT_APPROVED`, `BANK_ACCOUNTS_NOT_FOUND`, `BANK_ACCOUNTS_OWNED_BY_PAYABLE`, `BANK_ACCOUNTS_PARTNER_NOT_SUPPORTED`, `BANK_ACCOUNTS_RTP_NOT_SUPPORTED`, `BLOCKCHAIN_NETWORK_NOT_SUPPORTED`, `CUSTOMERS_COUNTRY_NOT_SUPPORTED`, `CUSTOMERS_INVALID_PHONE`, `CUSTOMERS_INVALID_TAX_ID`, `CUSTOMERS_KYC_NOT_APPROVED`, `CUSTOMERS_KYC_TYPE_NOT_AVAILABLE`, `CUSTOMERS_NAME_INVALID`, `FEES_PARTNER_FEE_EXCEEDED`, `FILES_UNREADABLE`, `LIMITS_AMOUNT_OUT_OF_RANGE`, `LIMITS_VOLUME_EXCEEDED`, `PAYABLES_ALREADY_PAID_OR_EXPIRED`, `PAYABLES_ALREADY_PAID_OR_IN_FLIGHT`, `PAYABLES_AMOUNT_NEGATIVE`, `PAYABLES_BANK_ACCOUNT_INVALID`, `PAYABLES_BOLETO_WOULD_BE_OVERDUE`, `PAYABLES_CODE_UNRESOLVABLE`, `PAYABLES_CURRENCY_MUST_BE_BRL`, `PAYABLES_DESTINATION_NOT_SUPPORTED`, `PAYABLES_DOCUMENT_INVALID`, `PAYABLES_DUPLICATE`, `PAYABLES_NETWORK_NOT_SUPPORTED`, `PAYABLES_NOT_CANCELABLE`, `PAYABLES_PIX_AMOUNT_REQUIRED`, `PAYOUTS_AMOUNT_BELOW_MINIMUM`, `QUOTES_RATE_UNAVAILABLE`, `TOS_NOT_ACCEPTED`, `VALIDATION_FAILED`, `VALIDATION_INVALID_REQUEST`, `VIRTUAL_ACCOUNTS_NOT_APPROVED`, `VIRTUAL_ACCOUNTS_NOT_FOUND`, `VIRTUAL_ACCOUNTS_PARTNER_NOT_ELIGIBLE`. See the Error responses section for retry semantics.
- `401` — Possible error codes: `AUTH_UNAUTHORIZED`. See the Error responses section for retry semantics.
- `403` — Possible error codes: `AUTH_FORBIDDEN`. See the Error responses section for retry semantics.
- `404` — Possible error codes: `BANK_ACCOUNTS_NOT_FOUND`, `CUSTOMERS_NOT_FOUND`, `FEES_NOT_FOUND`, `INSTANCES_NOT_FOUND`, `PAYABLES_NOT_FOUND`. See the Error responses section for retry semantics.
- `422` — Possible error codes: `CUSTOMERS_INVALID_DATA`. See the Error responses section for retry semantics.
- `429` — Possible error codes: `AUTH_RATE_LIMITED`. See the Error responses section for retry semantics.
- `500` — Possible error codes: `FILES_UNREADABLE`, `INTERNAL_ERROR`. See the Error responses section for retry semantics.
- `503` — Possible error codes: `QUOTES_RATE_UNAVAILABLE`. See the Error responses section for retry semantics.

---

[API](https://skmtc.dev/blindpay/apis/blindpay-api.md) · [All operations](https://skmtc.dev/blindpay/apis/blindpay-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/blindpay/blindpay-api/revisions/470de27afb7b/schema)
