Skip to main content
POST
/
orders
Place multiple orders
curl --request POST \
  --url https://clob.forka.st/orders \
  --header 'Content-Type: application/json' \
  --data '
[
  {
    "orderType": "GTC",
    "order": {
      "tokenId": "0x51524f4c595f5945535f544f4b454e5f4944",
      "conditionId": "0x504f4c595f434f4e444954494f4e5f4944",
      "expiration": "1767225599",
      "maker": "0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa",
      "signer": "0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa",
      "taker": "0x0000000000000000000000000000000000000000",
      "makerAmount": "75000000",
      "takerAmount": "100000000",
      "side": "BUY",
      "referrer": "0x9aE9d1b7b5C0F4a8C6D3E1f2A9B7C8D6E4F5A3B2",
      "affiliate": "0x0000000000000000000000000000000000000000",
      "affiliatePercentage": 0,
      "metadata": {
        "strategy": "manual_limit"
      },
      "nonce": "42",
      "feeRateBps": "200",
      "salt": "176543219998812345678901234",
      "signatureType": 0,
      "signature": "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
    },
    "owner": "0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa"
  },
  {
    "orderType": "FAK",
    "order": {
      "tokenId": "0x93025177978745967226369398316375153283719303181694312089956059680730874301533",
      "conditionId": "0x93025177978745967226369398316375153283719303181694312089956059680730874301530",
      "expiration": "1767225599",
      "maker": "0xBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBb",
      "signer": "0xBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBbBb",
      "taker": "0x0000000000000000000000000000000000000000",
      "makerAmount": "50000000",
      "takerAmount": "60000000",
      "side": "SELL",
      "referrer": "0x0000000000000000000000000000000000000000",
      "affiliate": null,
      "affiliatePercentage": null,
      "metadata": null,
      "nonce": "99",
      "feeRateBps": "0",
      "salt": "176543219998812345678901235",
      "signatureType": 1,
      "signature": "0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd"
    },
    "owner": "0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa"
  },
  {
    "orderType": "FOK",
    "order": {
      "tokenId": "0x71321045679252212594626385532706912750332728571942532289631379312455583992563",
      "conditionId": "0x71321045679252212594626385532706912750332728571942532289631379312000000000000",
      "expiration": "1767225800",
      "maker": "0xCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCc",
      "signer": "0xCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCcCc",
      "taker": "0x0000000000000000000000000000000000000000",
      "makerAmount": "25000000",
      "takerAmount": "30000000",
      "side": "BUY",
      "referrer": "0x0000000000000000000000000000000000000000",
      "affiliate": null,
      "affiliatePercentage": null,
      "metadata": null,
      "nonce": "123",
      "feeRateBps": "0",
      "salt": "176543219998812345678901236",
      "signatureType": 0,
      "signature": "0xfeebdaedfeebdaedfeebdaedfeebdaedfeebdaedfeebdaedfeebdaedfeebdaed"
    },
    "owner": "0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa"
  }
]
'
[
  {
    "success": true,
    "error_code": null,
    "error_msg": "",
    "order_id": "01JABCD4XY7M5Q1PQW8ZMN9ABC",
    "order_hashes": []
  },
  {
    "success": true,
    "error_code": "INVALID_ORDER_MIN_TICK_SIZE",
    "error_msg": "order is invalid. Price breaks minimum tick size rules",
    "order_id": null,
    "order_hashes": []
  },
  {
    "success": false,
    "error_code": "FOK_ORDER_NOT_FILLED_ERROR",
    "error_msg": "order couldn't be fully filled, FOK orders are fully filled/killed",
    "order_id": null,
    "order_hashes": []
  }
]
Submit up to 15 orders in one request. Every entry in the array shares the same payload shape as POST /order, so you can mix execution policies or token IDs while saving round trips.
Batch placement also requires L2 authentication headers: FORKAST_ADDRESS, FORKAST_SIGNATURE, FORKAST_TIMESTAMP, FORKAST_API_KEY, and FORKAST_PASSPHRASE. Review the flow in the Authentication overview.
If the system-wide pause is active, the batch request responds with 409 and {"error":"system_paused"}. Books paused individually still return 409 along with {"error":"condition_paused"}. Every entry in the batch must use an owner value that matches FORKAST_ADDRESS; otherwise the API returns 400 with {"error":"owner_address_mismatch"}.
Each entry in the response includes a status field with the same meanings described in Place single order (live, matched, delayed, or unmatched). Every array entry mirrors the single-order placement response structure, enabling you to inspect insert success, warnings, and order IDs independently. Need to check the final state of a submitted order? Call GET /data/order/{id}. To revoke any remaining quantity, use DELETE /order.

Batch item fields

Each array element accepts the same fields documented in POST /order. Provide the owner field alongside orderType and the nested order payload so it matches the FORKAST_ADDRESS header. Key constraints repeated here for convenience:
FieldTypeRequiredDescription
ownerstringYesPolygon address that owns the API key. Must match the FORKAST_ADDRESS header.
orderTypestringYesTime-in-force policy for the order (FOK, FAK, GTC, GTD).
orderobjectYesFull order payload identical to the single-order endpoint.
order.tokenIdstringYesIdentifier of the token/outcome being traded.
order.conditionIdstringYesMarket condition identifier tied to the token.
order.expirationstringConditionalRequired for GTD, optional elsewhere.
order.makerstringYesAddress that holds the asset being offered.
order.signerstringYesAddress that signed the order.
order.takerstringYesCounterparty address (use the zero address for open orders).
order.makerAmountstringYesMaker quantity with fixed precision.
order.takerAmountstringYesTaker quantity with fixed precision.
order.sidestringYesEither BUY or SELL.
order.referrerstringYesReferrer identifier (use the zero address when unused).
order.affiliatestring|nullNoAffiliate beneficiary address; supply null when unused.
order.affiliatePercentageinteger|nullNoAffiliate share in basis points.
order.metadataobject|nullNoOptional JSON metadata stored with the order.
order.noncestringYesMonotonic maker nonce.
order.feeRateBpsstringYesMaker fee rate in basis points.
order.saltstringYesUnique entropy for replay protection.
order.signatureTypenumberYes0 = EOA, 1 = proxy signer, 2 = Gnosis Safe signer.
order.signaturestringYesHex-encoded signature over the order payload.
order.metadata remains optional just like the single-order endpoint and can be omitted entirely in batch submissions. order.side must be the uppercase string BUY or SELL, and owner must align with the FORKAST_ADDRESS header.

Order types

TypePartial fills?Rests on the book?Auto expiration?
FOK (Fill-Or-Kill)❌ No❌ No✅ Immediately if not 100% filled
FAK (Fill-And-Kill / IOC)✅ Yes❌ No✅ Any remaining size cancels right away
GTC (Good-Til-Cancelled)✅ Yes✅ Yes, until cancelled❌ No
GTD (Good-Til-Date)✅ Yes✅ Yes, until the given timestamp✅ At the specified expiration time
For GTD, remember the one-minute safety buffer: if the order should expire in 90 seconds, set expiration = now + 90 + 60.

Error codes

Batch responses reuse the same errorCode catalog as POST /order. Requests with fewer than 1 or more than 15 entries return HTTP 400 Bad Request without per-order results. When the batch exceeds the limit, the response body includes the message "batch supports at most 15 orders" to clarify the rejection.
errorCodesuccesserrorMsg (default)Notes
INVALID_ORDER_MIN_TICK_SIZEtrueorder is invalid. Price breaks minimum tick size rulesPrice implied by maker/taker amounts is outside the permitted [0, 1_000_000] window.
INVALID_ORDER_MIN_SIZEtrueorder is invalid. Size lower than the minimumMaker or taker amount is non-positive or below minimum size.
INVALID_ORDER_DUPLICATEDtrueorder is invalid. Duplicated. Same order has already been placed, can’t be placed againReserved for future duplicate protection.
INVALID_ORDER_NOT_ENOUGH_BALANCEtruenot enough balance / allowanceReserved for balance/allowance enforcement.
INVALID_ORDER_EXPIRATIONtrueinvalid expirationMissing, past, or negative expiration.
INVALID_ORDER_ERRORtruecould not insert orderGeneric validation failure.
EXECUTION_ERRORtruecould not run the executionInternal engine/database failure while inserting.
ORDER_DELAYEDfalseorder match delayed due to market conditionsReserved for delayed matching path.
DELAYING_ORDER_ERRORtrueerror delaying the orderReserved for delayed matching errors.
FOK_ORDER_NOT_FILLED_ERRORfalseorder couldn’t be fully filled, FOK orders are fully filled/killedReturned when a fill-or-kill order cannot fill 100%.
MARKET_NOT_READYfalsethe market is not yet ready to process new ordersReserved for markets warming up.

Body

application/json
Required array length: 1 - 15 elements
owner
string
required

Polygon address that owns the API key. Must match the FORKAST_ADDRESS header.

Example:

"0xAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAa"

orderType
enum<string>
required

Execution policy for the order.

Available options:
FOK,
FAK,
GTC,
GTD
Example:

"GTC"

order
object
required

Response

Batch placement results

success
boolean
required

Indicates whether the order was accepted.

Example:

true

error_msg
string
required

Human-readable status for the placement.

Example:

""

order_hashes
string[]
required

Settlement hashes for immediate matches (empty if none).

Example:
[]
error_code
string | null

Machine-readable error code when placement fails (ex: FOK_ORDER_NOT_FILLED_ERROR, EXECUTION_ERROR).

Example:

null

order_id
string | null

ULID of the submitted order when accepted.

Example:

"01JABCD4XY7M5Q1PQW8ZMN9ABC"