---
title: "Broadcast your externally-signed on-chain transactions (step 2 of 2)"
method: POST
path: "/v2/onchain/submit"
tags: ["Orders"]
---

# Broadcast your externally-signed on-chain transactions (step 2 of 2)

`POST /v2/onchain/submit`

## Request

- Base URL: `https://execution.kairos.trade`
- URL: `https://execution.kairos.trade/v2/onchain/submit`
- Auth: API key in header `X-Client-Id` and API key in header `X-Api-Key` and API key in header `X-Api-Secret`

Hand back the `payload_id` and one signature per transaction, in the order `POST /v2/onchain/intent` returned them. The server claims the stored intent atomically (single-use Redis `GETDEL` — a replay gets `400`), re-verifies each signature recovers to the declared owner AND to a wallet registered to you, reassembles the signed transactions, and broadcasts them **in nonce order, waiting up to 90 s for each to confirm** before sending the next.
**Partial failure is possible and is reported.** If leg `i` fails to broadcast or revert-checks, the response is a `502` whose message lists the transaction hashes already mined (`already broadcast: [...]`). Earlier legs stay on chain; re-intent only the remainder.
**Auth & scope.** Identical gate to `POST /v2/onchain/intent`.

## Request body

- OrderOnchainSubmitRequest: Body for `POST /v2/onchain/submit`.
  - `payload_id` string, uuid, required
  - `signatures` string[], required: One 0x-hex 65-byte signature per transaction, in the same order as `transactions[]` from the intent. The count must match exactly.

## Response `200`

All transactions broadcast and confirmed.

- OrderOnchainSubmitResponse: Response for `POST /v2/onchain/submit`.
  - `transaction_hashes` string[], required
  - `status` 'confirmed', required: Always `confirmed` on a 200 — each transaction is broadcast and waited on (90 s) in nonce order before the next.

## Other responses

- `400`: Exact `error` strings: `payload_id not found, expired, or already claimed`; `payload_id does not belong to authenticated user`; `payload_id expired`; `expected N signature(s), got M`; `tx <i>: invalid signature hex`; `tx <i>: <verification error>` (e.g. wrong length, or the signature does not recover to the declared owner); `tx <i>: signer is not a registered wallet`; `tx <i>: <reassembly error>`.
- `401`: No valid credential presented — missing/invalid API-key headers or an invalid/expired session token.
- `403`: Same set as `POST /v2/onchain/intent`.
- `500`: `internal server error` — Redis claim failure, the stored intent no longer deserializes, or the Polygon RPC is not configured on this deployment.
- `502`: `tx <i> failed to broadcast: <error> (already broadcast: [...])` — earlier transactions in the batch may already be mined.
- `503`: `API-key access to polymarket is unavailable`.

---

[API](https://skmtc.dev/kairos/apis/kairos-order-execution-api.md) - [All operations](https://skmtc.dev/kairos/apis/kairos-order-execution-api/llms.txt) - [OpenAPI document](https://skmtc.dev/kairos/apis/kairos-order-execution-api/revisions/9ba7d463d505?raw)
