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

# Build a market (swap) order

> **Deprecated — use `POST /v1/order/swap`.** This endpoint keeps its original response body so existing integrators keep working; it is not removed. `signer` is required here.

**Deprecated** — use `POST /v1/order/swap`; identical request and response. This endpoint is an alias kept, shape unchanged, until integrators have migrated.



## OpenAPI

````yaml /openapi.json post /v1/order/market
openapi: 3.0.3
info:
  description: >-
    REST API for the Archer Exchange — a high-performance Solana-based order
    book exchange.


    All monetary values (prices, sizes, fees) are returned as decimal strings
    for precision.


    ### Rate Limiting

    All endpoints are rate-limited via a token-bucket algorithm. When the limit
    is exceeded, the API returns `429 Too Many Requests`.


    ### Error Format

    All errors follow a consistent JSON format:

    ```json

    {
      "error": "ERROR_CODE",
      "message": "Human-readable description"
    }

    ```


    ### Handling errors

    Every error falls into one of five actions. REST errors come back as
    `{"error": CODE, "message"}`. A transaction that fails on-chain reports
    `{"InstructionError": [index, {"Custom": code}]}`; codes are the `errors`
    list of the program IDL (`archer-sdk/idl/archer_v1.json`). When a build
    endpoint's preflight catches an on-chain error first, it returns `400
    INVALID_PARAMS` with the reason in `message`.


    | Action | REST | On-chain (code) |

    |---|---|---|

    | **Retry as is**, with backoff | `RATE_LIMITED` (429),
    `SERVICE_UNAVAILABLE` (503), `INTERNAL_ERROR` (500); relay `OVERLOADED`,
    `PREFLIGHT_UNAVAILABLE`. Keep backing off on 429: 50 of them within a minute
    from one IP returns `BANNED` (403) for 10 minutes | none |

    | **Refetch, rebuild, retry**: the book or registry changed under you | |
    `LevelSizeMismatch` (527), `StaleSequenceNumber` (509),
    `SequenceNumberTooFarAhead` (522), `RegistryBooksMismatch` (525),
    `IncompleteMakerBooks` (513), `NoMatchingLiquidity` (507); relay status
    `expired` (re-sign with a fresh blockhash) |

    | **Reprice** | `CROSSES_SPREAD`, `SLIPPAGE_EXCEEDED` | `PostOnlyWouldCross`
    (524), `CrossingOrderLevels` (505), `InvalidPrice` (503),
    `SlippageToleranceExceeded` (703) |

    | **Resize** | `INSUFFICIENT_LIQUIDITY` (the body's `availableSize` is what
    fits) | `MakerBookSideFull` (528: cancel a level first),
    `InvalidSizeAtLevel` (506), `InsufficientBalance` (402) and SPL Token `1`
    (fund the account or shrink), `ZeroSwapAmount` (702) |

    | **Stop**: fix the request or the setup; retrying cannot help |
    `INVALID_PARAMS`, `MISSING_API_KEY` / `INVALID_API_KEY` (401), `FORBIDDEN`,
    `NOT_FOUND`, `MARKET_NOT_FOUND`, `METHOD_NOT_ALLOWED`; `MARKET_PAUSED` /
    `MARKET_FROZEN` until the market resumes |
    `UnauthorizedArcherAccountDelegate` (1001), `BuilderFeeExceedsAccountCap`
    (1003), `UnauthorizedMaker` (502), `MakerNotRegistered` (512),
    `PostOnlyRequiresLimitOrderBook` (526), `MarketNotActive` (107),
    `MarketFrozen` (114); any 200–399 code (wrong account wiring, a bug to
    report) |
  title: Archer Exchange API
  version: 1.0.0
servers:
  - description: Production
    url: https://api.archer.exchange
  - description: Staging
    url: https://api-staging.archer.exchange
  - description: Local
    url: http://localhost:8080
security:
  - apiKey: []
tags:
  - description: Discover and inspect available trading markets
    name: Markets
  - description: Token metadata for every mint Archer lists
    name: Tokens
  - description: Get price quotes before placing an order
    name: Quote
  - description: Build unsigned Solana transactions for swaps
    name: Orders
  - description: Build unsigned Solana transactions for limit orders
    name: Limit Orders
  - description: >-
      ArcherAccount — a wallet's delegated trading identity. Collateral sits in
      token accounts owned by the account PDA; an authorized delegate can trade
      and quote as the account but never withdraw.
    name: Account
  - description: Read a maker book — balances and resting levels — by PDA or by owner
    name: Maker Books
  - description: Deposit / withdraw / close — fund movement for a maker book
    name: Maker Funds
  - description: Public protocol-wide aggregate statistics
    name: Stats
  - description: >-
      Submit signed Solana transactions and let Archer land them. Hosted at
      `https://send.archer.exchange`, separate from the REST API, using the same
      API key.
    name: Transaction Relay
paths:
  /v1/order/market:
    post:
      tags:
        - Limit Orders
      summary: Build a market (swap) order
      description: >-
        **Deprecated — use `POST /v1/order/swap`.** This endpoint keeps its
        original response body so existing integrators keep working; it is not
        removed. `signer` is required here.


        **Deprecated** — use `POST /v1/order/swap`; identical request and
        response. This endpoint is an alias kept, shape unchanged, until
        integrators have migrated.
      operationId: buildMarketOrder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BuildOrderRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LegacyBuildOrderResponse'
          description: Unsigned swap transaction.
        '400':
          $ref: '#/components/responses/InsufficientLiquidity'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Missing or invalid API key.
      deprecated: true
components:
  schemas:
    BuildOrderRequest:
      properties:
        accountOwner:
          description: >-
            The wallet that owns the ArcherAccount this request acts through.
            With `platform` it derives the account PDA server-side — you never
            handle a PDA. Omit for a plain wallet-owned book. Replaces the
            earlier `archerAccount` field, which is no longer read.
          nullable: true
          type: string
        market:
          description: Base58-encoded market address.
          example: u8tnfCb1JSSghuNFquQ2beStYgAN1kmd1f1Lhxbaec4
          type: string
        maxSlippageBps:
          description: Maximum allowed slippage in basis points.
          minimum: 0
          type: integer
        platform:
          default: self
          description: >-
            Platform namespace for `accountOwner`. Ignored unless `accountOwner`
            is set.
          enum:
            - self
            - treadfi
          nullable: true
          type: string
        preflight:
          default: false
          description: >-
            Simulate the built transaction before returning it, and reject with
            the program's reason if it would fail (insufficient balance,
            slippage, liquidity gone, unauthorised signer). Off by default: a
            transaction is otherwise returned whether or not the signer could
            land it right now, which callers that build at quote time rely on.
            Ignored without `signer`.
          nullable: true
          type: boolean
        priorityFeeMicroLamports:
          description: >-
            Priority fee for the transaction's compute-budget instruction, in
            micro-lamports per compute unit. Omitted → the server default.
          example: 50000
          format: int64
          type: integer
        side:
          description: Trade side.
          enum:
            - buy
            - sell
          type: string
        signer:
          description: >-
            The wallet that signs the swap: the taker, or with `accountOwner`
            the account's owner or delegate. Omit for a quote only: the response
            then carries `quoteResponse` and no `transaction`, and the caller's
            own maker books (if any) cannot be excluded from the quote. Existing
            clients may keep sending it as `takerAddress`; send one name only.
          type: string
        size:
          description: >-
            Amount to trade (decimal string). Interpretation depends on
            `swapMode`.
          type: string
        swapMode:
          description: >-
            Controls how `size` is interpreted. When omitted, size is in base
            tokens.
          enum:
            - MaxAmountIn
            - MinAmountOut
          type: string
        withInstructions:
          default: false
          description: >-
            Also return the unsigned instructions under `instructions`, for
            composing your own transaction instead of signing ours. Omitted or
            `false` leaves the response exactly as it was.
          nullable: true
          type: boolean
      required:
        - market
        - side
        - size
        - maxSlippageBps
      type: object
    LegacyBuildOrderResponse:
      description: >-
        Legacy body of the deprecated `POST /v1/orders/build` and `POST
        /v1/order/market`, unchanged from what production has always served.
        `orderType` is always "market" and `intentId` always null — async
        execution is gone, every order is a sync swap. Same engine and same
        transaction as `POST /v1/order/swap`, which returns the cleaner
        `BuildOrderResponse`.
      properties:
        addressLookupTables:
          description: Always empty; none configured.
          items:
            type: string
          type: array
        availableSize:
          description: Base size the book could fill.
          type: string
        estimatedBaseSize:
          description: Base tokens that would trade.
          type: string
        estimatedFee:
          description: Protocol fee, in quote tokens.
          type: string
        estimatedPrice:
          description: Average execution price.
          type: string
        estimatedQuoteSize:
          description: Quote tokens that would trade, before fees.
          type: string
        estimatedTotal:
          description: Quote tokens paid or received, fees included.
          type: string
        expiresAt:
          description: Blockhash expiry (unix seconds).
          format: int64
          type: integer
        fullyFilled:
          description: Always true; a short book is refused, not partially built.
          type: boolean
        intentId:
          description: Always null. Vestigial.
          nullable: true
          type: string
        makerBooksUsed:
          description: Maker books the transaction attached.
          format: int32
          type: integer
        orderType:
          description: Always "market". Vestigial.
          type: string
        swapMode:
          description: 'Resolved swap mode: MaxAmountIn or MinAmountOut.'
          type: string
        transaction:
          description: Base64 unsigned VersionedTransaction.
          type: string
        worstPrice:
          description: Price of the last level consumed.
          type: string
      required:
        - transaction
        - orderType
        - swapMode
        - expiresAt
        - estimatedBaseSize
        - estimatedQuoteSize
        - estimatedPrice
        - estimatedFee
        - estimatedTotal
        - worstPrice
        - fullyFilled
        - availableSize
        - makerBooksUsed
        - addressLookupTables
      type: object
    ErrorResponse:
      properties:
        error:
          description: Machine-readable error code.
          enum:
            - INVALID_PARAMS
            - MARKET_NOT_FOUND
            - MARKET_PAUSED
            - INSUFFICIENT_LIQUIDITY
            - SLIPPAGE_EXCEEDED
            - NOT_FOUND
            - FORBIDDEN
            - RATE_LIMITED
            - INTERNAL_ERROR
            - SERVICE_UNAVAILABLE
            - MARKET_FROZEN
            - CROSSES_SPREAD
            - MISSING_API_KEY
            - INVALID_API_KEY
            - BANNED
            - METHOD_NOT_ALLOWED
          type: string
        message:
          description: Human-readable error description.
          type: string
      required:
        - error
        - message
      type: object
    InsufficientLiquidityError:
      description: >-
        Returned when the order book cannot fill the requested size. Includes
        the maximum available fill.
      properties:
        availableAvgPrice:
          description: Average price for the available fill.
          type: string
        availableSize:
          description: Maximum size that can be filled at current liquidity.
          type: string
        error:
          example: INSUFFICIENT_LIQUIDITY
          type: string
        message:
          type: string
      required:
        - error
        - message
        - availableSize
        - availableAvgPrice
      type: object
  responses:
    InsufficientLiquidity:
      content:
        application/json:
          examples:
            insufficientLiquidity:
              value:
                availableAvgPrice: '150.104000'
                availableSize: '12.500000000'
                error: INSUFFICIENT_LIQUIDITY
                message: Insufficient liquidity
            invalidParams:
              value:
                error: INVALID_PARAMS
                message: 'Invalid size: not a decimal number: abc'
          schema:
            oneOf:
              - $ref: '#/components/schemas/ErrorResponse'
              - $ref: '#/components/schemas/InsufficientLiquidityError'
      description: >-
        Invalid parameters, or the registered maker books cannot cover the
        requested size. An `INSUFFICIENT_LIQUIDITY` body carries `availableSize`
        — the base size the book could fill — and `availableAvgPrice`, its
        average price, so a client can retry at that size.
  securitySchemes:
    apiKey:
      in: header
      name: X-API-Key
      type: apiKey

````

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