Skip to main content
POST
Build an unsigned EIP-712 order payload for self-custody signing (step 1 of 2)

Authorizations

X-Client-Id
string
header
required

Credential client id (kairos_ck_...). Must be sent together with X-Api-Key and X-Api-Secret.

X-Api-Key
string
header
required

64-char hex API key.

X-Api-Secret
string
header
required

64-char hex API secret.

Body

application/json

Body for POST /v2/orders/intent.

intent
object
required

The unsigned order intent — intent field of OrderIntentRequest, mirrored inside the one-RTT WSS submit_signed_order command.

provider
enum<string>
default:polymarket

Target venue for the external-signing lane. Only these two venues are implemented; Kalshi and Solana variants exist in the internal types but are not reachable on /v2/orders/*. The one-RTT WebSocket submit_signed_order command and the whole /v2/onchain/* lane are Polymarket-only and have no provider field.

Available options:
polymarket,
predictfun
Example:

"polymarket"

market_id
string | null

Condition id — METADATA ONLY, not part of the signed digest, but REQUIRED in practice. The server resolves intent.token_id against it and rejects a blank value with 400 market_id is required for external orders, a token that does not belong to it with 400 token_id does not belong to the supplied market_id. Max 256 chars.

outcome
string | null

REQUIRED — outcome label (e.g. "Yes"/"No"); metadata only, not signed. A missing/empty value is 400 outcome is required for external orders, and a label that does not match the resolved token is 400 token_id does not match the supplied outcome. Max 64 chars.

Example:

"Yes"

Response

Unsigned EIP-712 payload + digest. Sign eip712_digest_hex as a raw 32-byte hash, or run unsigned_payload through eth_signTypedData — both yield an identical signature.

Response for POST /v2/orders/intent.

payload_id
string<uuid>
required

Single-use handle for this stored intent. Pass back to POST /v2/orders/submit.

unsigned_payload
object
required

Full EIP-712 typed-data payload — pass directly to eth_signTypedData as an alternative to raw-hash-signing eip712_digest_hex.

eip712_digest_hex
string
required

Convenience copy of unsigned_payload.eip712_digest_hex — the digest to sign.

expires_at_us
integer<int64>
required

Wall-clock expiry, UNIX microseconds (60 s out by default, EXTERNAL_SIGNING_INTENT_TTL_SECS). The stored intent is claimed with an atomic Redis GETDEL at the very top of /submit, BEFORE any signature verification — so it is consumed by ANY submit attempt, not only a successful one. A /submit that fails verification burns the payload_id; retrying needs a fresh POST /v2/orders/intent.