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

# Place a signed order

> Places a non-custodial order. `signed_order` is an EIP-712 signature over the CTF Exchange Order struct. Atlas validates it — a signature it cannot verify is rejected rather than placed — then relays to the engine and attaches the signature. Placing locks the stake PLUS the maximum taker fee the fill could incur; the unused reserve is released. PASSKEY WALLETS: a passkey signs only in the browser it was registered in, and browser-held session keys are non-extractable, so neither can sign from a script. To place orders programmatically, add a SECOND SIGNING KEY to your wallet (Settings → Wallet → Signing keys) — an address you hold the key for, which becomes an owner of the same Safe. Orders stay `signature_type` 3 with maker == signer == the Safe; the signature becomes a standard Safe owner signature over the EIP-712 `SafeMessage(bytes message)` whose message is `abi.encode(orderHash)`, in a domain of (chainId, the Safe). Signing the order hash directly always fails. MARKET ORDERS AND EXPIRY: a market-style order is a limit at a price ceiling; send `ioc: true` and the unfilled remainder is refunded rather than rested. The signature's `expiration` is enforced by the engine — it never matches an order within 30 seconds of its expiry (a fill must settle on-chain before the signature lapses), cancels and refunds a resting order at that point, and rejects an order that arrives inside that window (`market.order.expired`).



## OpenAPI

````yaml /api-reference/openapi/calibri.yaml post /api/v2/atlas/account/orders
openapi: 3.1.0
info:
  title: Calibri API
  version: 1.0.0
  description: >-
    The Calibri API. Discover markets, read live books, place signed orders, and
    manage positions and account data.

    Routed by path prefix to the service that answers it — which is an
    implementation detail, not something a caller has to reason about.
servers:
  - description: Production
    url: https://calibri.io
security: []
tags:
  - name: Health
    description: Service liveness.
    x-displayName: Health
  - name: Events
    description: Discover events and their metadata.
    x-displayName: Events
  - name: Markets
    description: List markets and load market detail for trading.
    x-displayName: Markets
  - name: Series
    description: Recurring event series.
    x-displayName: Series
  - name: Tags
    description: Editorial shelves used to browse the catalogue.
    x-displayName: Tags
  - name: Market Data
    description: Order book, depth, trade tape, tickers, and candles.
    x-displayName: Market Data
  - name: Assets
    description: Underlying asset price history for price-feed markets.
    x-displayName: Assets
  - name: Community
    description: Leaderboard and platform activity.
    x-displayName: Community
  - name: Currencies
    description: Currency registry.
    x-displayName: Currencies
  - name: Trade
    description: Place, list, and cancel orders.
    x-displayName: Trade
  - name: Positions
    description: Your matched contracts.
    x-displayName: Positions
  - name: Wallet
    description: Self-custody Safe, passkey, session keys, and relay.
    x-displayName: Wallet
  - name: Rewards
    description: Maker rebates and referral earnings.
    x-displayName: Rewards
  - name: Account
    description: Balances, ledger, PnL, limits, preferences, and profile.
    x-displayName: Account
  - name: Categories
    description: Categories
    x-displayName: Categories
  - name: Other
    description: Other
    x-displayName: Other
externalDocs:
  description: ''
  url: ''
paths:
  /api/v2/atlas/account/orders:
    post:
      tags:
        - Trade
      summary: Place a signed order
      description: >-
        Places a non-custodial order. `signed_order` is an EIP-712 signature
        over the CTF Exchange Order struct. Atlas validates it — a signature it
        cannot verify is rejected rather than placed — then relays to the engine
        and attaches the signature. Placing locks the stake PLUS the maximum
        taker fee the fill could incur; the unused reserve is released. PASSKEY
        WALLETS: a passkey signs only in the browser it was registered in, and
        browser-held session keys are non-extractable, so neither can sign from
        a script. To place orders programmatically, add a SECOND SIGNING KEY to
        your wallet (Settings → Wallet → Signing keys) — an address you hold the
        key for, which becomes an owner of the same Safe. Orders stay
        `signature_type` 3 with maker == signer == the Safe; the signature
        becomes a standard Safe owner signature over the EIP-712
        `SafeMessage(bytes message)` whose message is `abi.encode(orderHash)`,
        in a domain of (chainId, the Safe). Signing the order hash directly
        always fails. MARKET ORDERS AND EXPIRY: a market-style order is a limit
        at a price ceiling; send `ioc: true` and the unfilled remainder is
        refunded rather than rested. The signature's `expiration` is enforced by
        the engine — it never matches an order within 30 seconds of its expiry
        (a fill must settle on-chain before the signature lapses), cancels and
        refunds a resting order at that point, and rejects an order that arrives
        inside that window (`market.order.expired`).
      parameters: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOrderRequest'
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderEntity'
          description: ''
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEntity'
          description: Signature or validation failure
      security:
        - apiKey: []
components:
  schemas:
    CreateOrderRequest:
      properties:
        direction:
          description: >-
            Whether you are opening or closing. `buy` posts collateral and
            acquires the outcome; `sell` offers outcome tokens you already hold,
            so it locks INVENTORY rather than cash and its `locked` is zero.
            Defaults to `buy`, which is how every order behaved before position
            exit. See /account/positions for how much of a holding is sellable.
          enum:
            - buy
            - sell
          example: buy
          type: string
        ioc:
          description: >-
            Immediate-or-cancel. Set it on a marketable order — the "market"
            order a signed wallet has to send as a limit at a price ceiling:
            whatever the book cannot fill on arrival is refunded instead of
            resting at that ceiling. Ignored together with `post_only`. Recorded
            on the order as `ioc`.
          example: false
          type: boolean
        market:
          description: Market id.
          example: '12'
          type: string
        ord_type:
          enum:
            - limit
            - market
          example: limit
          type: string
        post_only:
          description: >-
            Reject the order if it would take liquidity. A post-only order
            reserves no taker fee, because it can only ever rest as a maker.
          example: false
          type: boolean
        price:
          description: >-
            Limit price, `0.01`–`0.99`, in whole cents (e.g. 0.27, not 0.275) —
            an order finer than the market precision is rejected, not rounded.
            Required for a limit order.
          example: '0.60'
          type: string
        side:
          description: >-
            The OUTCOME this order is about — never buy/sell. Pair it with
            `direction`: a sell of `yes` and a buy of `no` are different orders
            that happen to sit on the same side of the book.
          enum:
            - 'yes'
            - 'no'
          example: 'yes'
          type: string
        signed_order:
          $ref: '#/components/schemas/SignedOrderEntity'
          description: >-
            The EIP-712-signed order. Validated before anything is placed — a
            signature the server cannot verify is rejected, never rested.
        volume:
          description: Number of shares.
          example: '100'
          type: string
      required:
        - market
        - side
        - ord_type
        - volume
        - signed_order
      type: object
    OrderEntity:
      properties:
        contracts_count:
          description: Contracts formed from this order.
          example: 1
          type: number
        created_at:
          example: '2026-08-07T10:00:00Z'
          type: string
        filled_volume:
          example: '60'
          type: string
        id:
          example: usdc
          type: number
        locked:
          description: >-
            Collateral locked. A separate taker-fee reserve is held alongside it
            and released when unused.
          example: '61.68'
          type: string
        market:
          description: Market id.
          example: '12'
          type: string
        ord_type:
          enum:
            - limit
            - market
          example: limit
          type: string
        origin_volume:
          example: '100'
          type: string
        price:
          description: >-
            Limit price, `0.01`–`0.99`, in whole cents (e.g. 0.27, not 0.275) —
            finer than the market precision is rejected, not rounded.
          example: '0.60'
          type: string
        remaining_volume:
          description: Unmatched remainder.
          example: '40'
          type: string
        side:
          enum:
            - 'yes'
            - 'no'
          example: 'yes'
          type: string
        state:
          enum:
            - pending
            - wait
            - done
            - cancel
            - reject
          example: active
          type: string
        updated_at:
          example: '2026-08-07T10:05:00Z'
          type: string
      required:
        - id
        - market
        - side
        - ord_type
        - state
        - origin_volume
        - remaining_volume
        - locked
        - contracts_count
        - created_at
        - updated_at
      type: object
    ErrorEntity:
      properties:
        errors:
          description: Match on the code, not the HTTP status or the human text.
          example:
            - account.custody.deposits_disabled
          items:
            type: string
          type: array
      required:
        - errors
      type: object
    SignedOrderEntity:
      properties:
        expiration:
          description: Unix seconds. Must be non-zero, unexpired, and within 365 days.
          example: '1797600000'
          type: string
        fee_rate_bps:
          description: >-
            Must be `"0"`. The taker fee is collected separately on-chain from
            your Safe, not through this field.
          example: '0'
          type: string
        maker:
          description: >-
            Your Safe — the address the collateral comes from. For signature
            type 3 this equals `signer`.
          example: '0x0DECE7d83f8D47CD8dD8278c0F22c361C58577BD'
          type: string
        maker_amount:
          description: USDC in, 6-decimal base units. `round(price × volume × 1e6)`.
          example: '60000000'
          type: string
        nonce:
          description: Exchange nonce.
          example: '0'
          type: string
        salt:
          description: >-
            Random per-order value. Two orders with identical terms must not
            share one.
          example: '5821094412'
          type: string
        side:
          description: >-
            Always `0` (BUY). Both YES and NO legs are buys that mint — the side
            you are taking is carried by `token_id` alone.
          enum:
            - 0
          example: 0
          type: number
        signature:
          description: >-
            The EIP-712 signature. For a session-signed order this is
            `abi.encode(keyId, r, s)` — exactly 96 bytes — which is how the
            server tells a session key from a passkey.
          example: 0x4f2a…
          type: string
        signature_type:
          description: >-
            `2` POLY_GNOSIS_SAFE (your Safe, owned by your wallet) or `3`
            POLY_1271 (your Safe, owned by a passkey). Read it from
            `signature_type` on the wallet config rather than choosing one — an
            order signed the way the other type requires is rejected.
          enum:
            - 2
            - 3
          example: 2
          type: number
        signer:
          description: >-
            Whoever signed. Your wallet EOA for types 0 and 2; the Safe itself
            for type 3, where a passkey or session key produced the signature.
          example: '0xE1188438C85C98aADFf1a88f97764E607B4978C3'
          type: string
        taker:
          description: The zero address — the order is public and anyone may match it.
          example: '0x0000000000000000000000000000000000000000'
          type: string
        taker_amount:
          description: Outcome tokens out, 6-decimal. `round(volume × 1e6)`.
          example: '100000000'
          type: string
        token_id:
          description: >-
            The ERC-1155 position id for YOUR side. This is what says which
            market and which outcome — a signed order carries no market field.
          example: 7138104...
          type: string
      required:
        - salt
        - maker
        - signer
        - taker
        - token_id
        - maker_amount
        - taker_amount
        - expiration
        - nonce
        - fee_rate_bps
        - side
        - signature_type
        - signature
      type: object
  securitySchemes:
    apiKey:
      description: >-
        HMAC-signed API key. Send X-Auth-Apikey, X-Auth-Nonce and
        X-Auth-Signature.
      in: header
      name: X-Auth-Apikey
      type: apiKey

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.