> ## Documentation Index
> Fetch the complete documentation index at: https://docs.panofx.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Place a limit order

> Book a signed draft. The relay re-derives every term and checks the taker's funds and approval.

<ParamField body="draft" type="object" required>The draft from `prepare`, unchanged.</ParamField>
<ParamField body="signature" type="hex" required>The taker's signature over the draft's `typedData`.</ParamField>
<ParamField body="erc2612" type="object">`{ value, deadline, v, r, s }` when the sell token supports EIP-2612 and Permit2 is not yet approved.</ParamField>

Returns `201` with the order. The keeper leader auctions it every `LIMIT_POLL_MS` (5 s) while its price is
within 150 bps of the oracle mid, and fills it through `executeLimit` when a resolver meets the price.

<ResponseField name="limitOrderId" type="string" />

<ResponseField name="chainId" type="number" />

<ResponseField name="status" type="string">`open`, `filling`, `filled`, `cancelled` or `expired`.</ResponseField>

<ResponseField name="taker, recipient, sellToken, buyToken, sellAmount, limitAmount, minOut" />

<ResponseField name="gasFee" type="object">`{ token, max }`.</ResponseField>
<ResponseField name="permit" type="object">`{ token, amount, nonce, deadline }`.</ResponseField>

<ResponseField name="expiresAt" type="string" />

<ResponseField name="quoteId" type="string | null">The quote that filled it.</ResponseField>
<ResponseField name="attempts" type="number">Auctions run so far.</ResponseField>

<ResponseField name="lastError" type="string | null" />

<ResponseField name="lastCheckedAt" type="string | null" />

<ResponseField name="bestReceived" type="string | null">The best offer at the last auction.</ResponseField>

<ResponseField name="createdAt, filledAt, cancelledAt" />

<ResponseField name="cancelMessage" type="string">The EIP-191 text to sign to cancel: `panofx-cancel-limit|<chainId>|<orderId>`.</ResponseField>
<ResponseField name="revoke" type="object">`{ permit2, wordPos, mask }`: the `invalidateUnorderedNonces` call that ends the Permit2 signature itself.</ResponseField>

Errors: `400 terms_mismatch`, `bad_signature`, `below_minimum`, `bad_expiry`, `limit_below_fees`,
`taker_not_ready`; `409 nonce_used`, `wrong_chain`; `429 too_many_open`.
