# Place a Limit Order

> Coming soon, upon request — this feature is turned on for your tenant by the Aurea team. [Contact us](https://www.aureahub.com/contact)

An order placed on chain from the user's own wallet, filled later at the limit price or better — or not at all before it expires.

## Overview

- For a tenant whose users hold the assets in their own wallets, from a wallet its owner signs for (non-custodial or MPC) that Aurea registered for trading: `409` `TOKENIZED_ASSETS_LIMIT_ORDER_NOT_SUPPORTED` otherwise. A wallet Aurea signs for executes a [binding quote](https://docs.aureahub.com/docs/tok-quote-create.md) at once instead.
- `limitPrice` is US dollars per token: the most a buy pays, the least a sale takes. Give `tokenAmount` (exactly, at most 18 digits after the point) or `notionalValue` (at most the payment token's decimals); `paymentToken` as for a [quote](https://docs.aureahub.com/docs/tok-quote-indicative.md). Your tenant's limits apply at the limit price.
- How long it stays open: `expiresInSeconds`, at most 30 minutes today (a longer one is shortened, not refused) and the market's own maximum; when your tenant trades in the regular session only, it must be placed in it (`409` `TOKENIZED_ASSETS_AFTER_HOURS_OFF`) and lapses at its close at the latest. Under 60 seconds left: `400` `TOKENIZED_ASSETS_ORDER_EXPIRY_INVALID`.
- `201` with the operation `quoted` and its `steps` — an exact approval, then `limit_order`: sign and send them to [Send Signatures](https://docs.aureahub.com/docs/tok-operation-broadcast.md) before `signingExpiresAt` (ten minutes, or less for a short order). Once placed the operation stays `submitted` with `order.orderId`; it is `completed` when the order is filled (`order.filledTokenAmount`), `expired` when it lapses or is cancelled (`TOKENIZED_ASSETS_ORDER_EXPIRED`, `TOKENIZED_ASSETS_ORDER_CANCELLED`). There is no route to cancel an order. Aurea follows it about once a minute; read the operation ([Get an Operation](https://docs.aureahub.com/docs/tok-operation-get.md)) to see it at once.
- Takes an `Idempotency-Key`. 10 a minute. User token and the tenant signature ([Calling the Routes](https://docs.aureahub.com/docs/guide-tokenized-assets.md)); for `user`, `owner`, `tenantadmin` and `signer`, for themselves (another role: `403`).

## Errors

Besides [the answers every tokenized assets route can give](https://docs.aureahub.com/docs/guide-tokenized-assets.md) (no valid token or signature, the module not set up or not switched on, a field that does not fit):

| Status | details.code | When |
| --- | --- | --- |
| 403 | — | The caller's role may not call it (`Your role does not have permission to perform this action.`). |
| 404 | TOKENIZED_ASSETS_ASSET_NOT_OFFERED | Your tenant does not offer the asset (any more). |
| 409 | TOKENIZED_ASSETS_NOT_SUPPORTED_FOR_ASSET | An asset not traded with quotes. |
| 400 | TOKENIZED_ASSETS_QUOTE_NOT_SUPPORTED | `This asset is not traded with quotes.` |
| 400 | TOKENIZED_ASSETS_CHAIN_UNSUPPORTED | `This asset has no token on this chain.` |
| 400 | TOKENIZED_ASSETS_PAYMENT_TOKEN_UNSUPPORTED | `This asset is paid in USDC or USDon on this chain.` (`details.accepted`). |
| 409 | TOKENIZED_ASSETS_LIMIT_ORDER_NOT_SUPPORTED | `Limit orders are placed from the user's own wallet; this tenant trades through its own.`; `A wallet the Hub signs for executes a binding quote at once: limit orders are for a wallet its owner signs for.` |
| 400 | TOKENIZED_ASSETS_INVALID_AMOUNT | As for a quote, and `A limit price is above zero`, `notionalValue has at most 6 digits after the point in USDC`. |
| 403 | TOKENIZED_ASSETS_… (eligibility) | The user's eligibility is read again: `COUNTRY_EXCLUDED`, `US_PERSON`, `NOT_APPROPRIATE`, `PROFESSIONAL_ONLY`, `PROSPECTUS_EXPIRED` or `ELIGIBILITY_INCOMPLETE` ([Binding Quote](https://docs.aureahub.com/docs/tok-quote-create.md)). |
| 409 | TOKENIZED_ASSETS_WALLET_NOT_REGISTERED | The user's wallet is not registered for trading on this chain. |
| 409 | TOKENIZED_ASSETS_WALLET_NOT_SIGNABLE | Nobody Aurea can have sign for the wallet the way it needs (`The registered wallet is not one the Hub signs for.`, `Nobody can sign for this wallet.`). |
| 409 | TOKENIZED_ASSETS_AFTER_HOURS_OFF | `Limit orders are placed in the regular session only.` (`details.session`). |
| 409 | TOKENIZED_ASSETS_EXECUTION_UNAVAILABLE | `This operation is not available in this environment and chain.` — in the test environment, always today. |
| 503 | TOKENIZED_ASSETS_CHAIN_UNAVAILABLE | `The chain cannot be reached for this tenant at the moment.` (`details.chainId`). |
| 409 | TOKENIZED_ASSETS_MARKET_PAUSED | `Trading is paused for the moment: try again shortly.` |
| 400 | TOKENIZED_ASSETS_ORDER_EXPIRY_INVALID | `The order's expiry is outside what the market accepts.` |
| 409 | TOKENIZED_ASSETS_ASSET_NOT_ACCEPTED, …_ASSET_PAUSED, …_INSUFFICIENT_BALANCE | What the chain says before anything is signed. |
| 423 | TENANT_FROZEN, USER_FROZEN, ACCOUNT_FROZEN, WALLET_FROZEN | Something is frozen ([Freezes](https://docs.aureahub.com/docs/guide-freezes.md)); `503` `FREEZE_STATUS_UNREAD` when that cannot be read. |
| 403 / 423 / 503 | POLICY_… | Institutional tenants only: the tenant's policy refuses ([Policy Sets](https://docs.aureahub.com/docs/guide-policy-sets.md)); nothing is held for approval on these routes. |
| 409 | TOKENIZED_ASSETS_TENANT_LIMIT_EXCEEDED | `The order is above one of the tenant's limits.` (`details.limit`, `maxUsd`, `requestedUsd`). |

## Endpoint

### `POST /v1/tokenized-assets/limit-orders`

Authentication: bearer token required.

Places a limit order from the user's own wallet.

**Headers**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `Idempotency-Key` | string | no | Optional — required for a tenant on the institutional security profile (`400` `IDEMPOTENCY_KEY_REQUIRED` without it). Up to 255 letters, digits, - or _. The same key with the same request answers with the first answer (`idempotency-replayed: true`) instead of running it again; see [Idempotency](https://docs.aureahub.com/docs/idempotency.md) |

**Request body**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `isTestnet` | boolean | no | `true` for the test environment; `false` (the default) for production. |
| `symbol` | string | yes | The token's symbol, as its contract names it (case matters). Pattern `^[A-Za-z0-9.-]{1,32}$`. |
| `chainId` | number | yes | The chain: 1 (Ethereum) or 56 (BNB Chain). One of `1`, `56`. |
| `side` | string | yes | One of `buy`, `sell`. |
| `tokenAmount` | string | no | How many tokens, exactly (at most 18 digits after the point). Give this or notionalValue. At most 80 characters. |
| `notionalValue` | string | no | How many US dollars, exactly, in the payment token's decimals. Give this or tokenAmount. At most 80 characters. |
| `limitPrice` | string | yes | US dollars per token: the most a buy pays, the least a sale takes. At most 80 characters. |
| `paymentToken` | string | no | What the buy is paid in, or the sale paid out in, as for a quote. One of `USDC`, `USDT`, `USDon`. |
| `expiresInSeconds` | integer | no | How long the order stays open, 60 to 604800; today at most 1800 (a longer one is shortened), and no later than the session's close when the tenant trades in the regular session only. |

**Responses**

`201` To Sign

```json
{
  "operationId": "0c7d3e91-5a2b-4f60-9e18-7b4d2a6c1e05",
  "kind": "limit_order",
  "status": "quoted",
  "isTestnet": false,
  "symbol": "AAPLon",
  "chainId": 1,
  "side": "buy",
  "unit": "token",
  "tokenAmount": "2",
  "valueUsd": "500",
  "paymentToken": "USDC",
  "paymentAmount": "500",
  "wallet": "own",
  "signer": "client",
  "quoteId": null,
  "order": {
    "orderId": null,
    "limitPrice": "250",
    "expiresAt": null,
    "filledTokenAmount": null
  },
  "steps": [
    {
      "stepIndex": 0,
      "purpose": "approve",
      "txHashToSign": "0x6b1f…c4e2",
      "to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
      "data": "0x095ea7b3…",
      "value": "0",
      "chainId": 1,
      "nonce": 41,
      "gasLimit": "65000",
      "maxFeePerGas": "31000000000",
      "maxPriorityFeePerGas": "1500000000"
    },
    {
      "stepIndex": 1,
      "purpose": "limit_order",
      "txHashToSign": "0x3fa0…91cc",
      "to": "0x2c1d…9a07",
      "data": "0x…",
      "value": "0",
      "chainId": 1,
      "nonce": 42,
      "gasLimit": "400000",
      "maxFeePerGas": "31000000000",
      "maxPriorityFeePerGas": "1500000000"
    }
  ],
  "signingExpiresAt": "2026-10-07T15:13:02.000Z",
  "txHashes": [],
  "received": null,
  "failureCode": null,
  "createdAt": "2026-10-07T15:03:02.000Z",
  "updatedAt": "2026-10-07T15:03:02.000Z"
}
```

`409` Tenant's Wallet

```json
{
  "statusCode": 409,
  "error": "ConflictError",
  "message": "Limit orders are placed from the user's own wallet; this tenant trades through its own.",
  "details": {
    "code": "TOKENIZED_ASSETS_LIMIT_ORDER_NOT_SUPPORTED"
  }
}
```

[Contact us for details](https://www.aureahub.com/contact).

---

Web version: https://docs.aureahub.com/#tok-limit-order
