Skip to main content
POST
/
ft
/
p2p
/
{chainId}
Post a signed OTC order
curl --request POST \
  --url https://api.velora.xyz/ft/p2p/{chainId}/ \
  --header 'Content-Type: application/json' \
  --data '
{
  "nonceAndMeta": "0",
  "expiry": 1735689600,
  "makerAsset": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "takerAsset": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "makerAmount": "1000000000000000000",
  "takerAmount": "1000000000000000000",
  "maker": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "taker": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "signature": "0x…",
  "permitMakerAsset": "<string>"
}
'
{
  "orderHash": "<string>",
  "chainId": 1,
  "nonceAndMeta": "<string>",
  "expiry": 123,
  "maker": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "taker": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "makerAsset": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "takerAsset": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "makerAmount": "1000000000000000000",
  "takerAmount": "1000000000000000000",
  "signature": "<string>",
  "permitMakerAsset": "<string>",
  "takerFromMeta": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
  "makerBalance": "1000000000000000000",
  "fillableBalance": "1000000000000000000",
  "reservedBalance": "1000000000000000000",
  "swappableBalance": "1000000000000000000",
  "transactionHash": "<string>",
  "createdAt": 123,
  "updatedAt": 123
}
Submit a maker-signed order to the OTC book. The maker builds the order, signs the EIP-712 typed data, and posts the order fields plus the signature here, all without sending a transaction or paying gas. The server verifies the signature against the AugustusRFQ verifyingContract, stores the order, and returns it with an orderHash and an initial state.
The taker field is what makes an order OTC. Set it to the intended counterparty’s address and only that address can fill the order (type P2P). The EIP-712 domain is name: "AUGUSTUS RFQ", version: "1", the order’s chainId, and verifyingContract set to the AugustusRFQ address for that chain.
Size the order against GET /ft/fillablebalance/:chainId/:account first: if makerAmount exceeds the maker’s balance or AugustusRFQ allowance, the order is accepted but lands in SUSPENDED. To skip a separate approve transaction, encode permitMakerAsset.

OTC overview

Lifecycle, endpoints, and order states end to end.

GET /ft/order/:orderHash

Read back the order you just posted.

SDK → OTC

sdk.otcOrders.submitOTCOrder wraps build → sign → post.

Troubleshooting

Signature and order-shape failures: symptom, cause, fix.

Path Parameters

chainId
integer
required

EVM chain ID the order settles on. Must match the chainId in the signed EIP-712 domain. EVM chain ID. AugustusRFQ is deployed on 1 (Mainnet), 10 (Optimism), 56 (BSC), 137 (Polygon), 8453 (Base), 42161 (Arbitrum), 43114 (Avalanche), and 100 (Gnosis). See /resources/chains-and-contracts for per-chain addresses.

Example:

1

Body

application/json

A maker-signed order, posted as-is. The signed fields plus the maker's signature.

nonceAndMeta
string
required

uint256 packing the maker in the upper 160 bits and a per-maker nonce in the lower 96 bits.

Example:

"0"

expiry
integer
required

Unix timestamp (seconds) after which the order can no longer be filled.

Example:

1735689600

makerAsset
string
required

Token the maker is selling. Must be an ERC-20 (wrap native ETH first).

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"

takerAsset
string
required

Token the maker wants in return.

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"

makerAmount
string
required

Amount of makerAsset offered, in raw units.

Example:

"1000000000000000000"

takerAmount
string
required

Amount of takerAsset requested, in raw units.

Example:

"1000000000000000000"

maker
string
required

The maker's wallet address — the order's signer.

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"

taker
string
required

The named counterparty. Set to a specific address for an OTC (P2P) order; the zero address makes it open.

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"

signature
string
required

EIP-712 signature over the order. Domain: name: "AUGUSTUS RFQ", version: "1", chainId, verifyingContract: <AugustusRFQ>.

Example:

"0x…"

permitMakerAsset
string | null

Optional encoded permit for makerAsset, to skip a separate approve transaction.

Response

Order accepted and stored.

A stored order as returned by the API, including server-tracked balances and state.

orderHash
string

The order's EIP-712 hash — its unique identifier.

chainId
integer

EVM chain ID. AugustusRFQ is deployed on 1 (Mainnet), 10 (Optimism), 56 (BSC), 137 (Polygon), 8453 (Base), 42161 (Arbitrum), 43114 (Avalanche), and 100 (Gnosis). See /resources/chains-and-contracts for per-chain addresses.

Example:

1

nonceAndMeta
string
expiry
integer
maker
string

EVM address (20 bytes, hex-encoded with 0x prefix).

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"

taker
string

EVM address (20 bytes, hex-encoded with 0x prefix).

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"

makerAsset
string

EVM address (20 bytes, hex-encoded with 0x prefix).

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"

takerAsset
string

EVM address (20 bytes, hex-encoded with 0x prefix).

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"

makerAmount
string

Token amount in raw units / wei (no decimal point). Serialized as a string to preserve precision beyond JavaScript Number range.

Example:

"1000000000000000000"

takerAmount
string

Token amount in raw units / wei (no decimal point). Serialized as a string to preserve precision beyond JavaScript Number range.

Example:

"1000000000000000000"

signature
string
permitMakerAsset
string | null
state
enum<string>

Lifecycle state. SUSPENDED means the maker's balance or allowance dropped below the order. FULFILLED means fully filled.

Available options:
DRAFT,
PENDING,
FULFILLED,
CANCELLED,
SUSPENDED,
EXPIRED
type
enum<string>

P2P is a counterparty-restricted OTC order (a named taker). LIMIT is an open AugustusRFQ order. The OTC API surface is P2P.

Available options:
P2P,
LIMIT
takerFromMeta
string

Intended receiver decoded from nonceAndMeta.

Pattern: ^0x[a-fA-F0-9]{40}$
Example:

"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"

makerBalance
string

Min of the maker's balance, allowance, and balance backing this order.

Example:

"1000000000000000000"

fillableBalance
string

Remaining unfilled makerAmount.

Example:

"1000000000000000000"

reservedBalance
string

Amount currently reserved by this order.

Example:

"1000000000000000000"

swappableBalance
string

Amount available to fill right now.

Example:

"1000000000000000000"

transactionHash
string | null

Fill or cancellation transaction hash, once settled on-chain.

createdAt
integer

Unix timestamp the order was created.

updatedAt
integer

Unix timestamp the order was last updated.

Last modified on June 10, 2026