---
title: "Submit a signed order"
method: POST
path: "/v1/orders"
---

# Submit a signed order

`POST /v1/orders`

## Request

- Base URL: `https://api.epsilon.exchange`
- URL: `https://api.epsilon.exchange/v1/orders`
- Auth: API key in header `X-API-Key`

Places an EIP-712-signed limit/stop-loss/DCA/trailing order. The developer key provides attribution and rate limiting; authorization is the maker's signature over the Order struct (domain EpsilonRouter v7, chain 4663). Fee fields must exact-match the feeLegs served by GET /v1/route for the same maker. Per-maker submit limits apply in addition to per-key limits.

## Request body

- object
  - `orderType` 'limit' | 'stop_loss' | 'take_profit' | 'dca' | 'trailing', required
  - `order` object, required
    - `salt` string, required: random 32-byte salt, 0x-hex uint256
    - `maker` string, required: maker wallet address
    - `receiver` string, required: output receiver (normally the maker)
    - `tokenIn` string, required
    - `tokenOut` string, required
    - `amountIn` string, required: raw token units, decimal string
    - `triggerPrice` string, required: price scaled to tokenOut decimals, decimal string; 0 = market
    - `makerTraits` string, required: packed traits (nonce, deadline, slippage ppm, flags), decimal string
    - `referrer` string, required: referrer address from the route's feeLegs — the FeeVault by default, or your own payout address when the route was requested with ?referrer= (permissionless rev-share). Never invent: it must match what the route served.
    - `referralFeePpm` integer, required: must exact-match the route's feeLegs.fees.triggered.referralPpm
  - `signature` string, required: EIP-712 signature by maker (EOA or EIP-1271)
  - `orderHash` string, required: client-computed hash; the server recomputes and uses its own
  - `intervalSeconds` string: DCA only: seconds between executions
  - `totalExecutions` string: DCA only: number of chunks
  - `totalAmountIn` string: DCA only: total raw amount across all executions
  - `flexibilityPpm` integer: DCA only: timing flexibility in ppm
  - `shortCircuit` boolean: DCA only: stop early once totalAmountIn is spent
  - `trailPpm` integer: trailing only: trail distance in ppm
  - `designatedKeeper` string: trailing only: optional keeper address

## Response `201`

Order accepted (status pending)

- object
  - `success` boolean
  - `orderHash` string

## Other responses

- `400`: Malformed order, traits invalid for orderType, or fee params mismatch
- `401`: Missing or invalid API key
- `409`: Order already indexed
- `429`: Per-key or per-maker rate limit exceeded

---

[API](https://skmtc.dev/epsilon/apis/epsilon-public-api.md) · [All operations](https://skmtc.dev/epsilon/apis/epsilon-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/epsilon/apis/epsilon-public-api/revisions/8a6e06ae2b0d?raw)
