# Send an Operation's Signatures

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

The signatures of an operation a wallet's owner signs for, one per step, in order.

## Overview

- For an operation answered with `steps` (`signer: "client"`): sign each step's `txHashToSign` with the operation's wallet — the device key, or the MPC signing ceremony — as a raw secp256k1 signature of that hash (no message prefix), and send `{ v, r, s }` for every step, in the order of the steps, before `signingExpiresAt`. `v` is `0` or `1` (also `0x0`, `0x1`), or 27 or 28 — written in decimal (`27`, `28`, as most libraries write it) or in hexadecimal (`1b`, `1c`, `0x1b`, `0x1c`).
- Each signature is checked against the operation's wallet over the step as built. For a trade, what the chain says is read again first, as at its execution; a refusal there marks the operation `failed`. Then Aurea sends the transactions exactly as it built them, in order — you never send a transaction.
- `200` with the operation: `submitted` once the first is accepted, `completed` when every receipt is in within about a minute — or `failed` when one reverted or a later step was refused (`failureCode`). A limit order stays `submitted` once placed.

## 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_OPERATION_NOT_FOUND | `There is no such operation of yours in this environment.` (`details.operationId`). |
| 404 | TOKENIZED_ASSETS_ASSET_NOT_OFFERED | Your tenant does not offer the asset. |
| 403 | TOKENIZED_ASSETS_… (eligibility) | The user's eligibility, read again ([Binding Quote](https://docs.aureahub.com/docs/tok-quote-create.md)). |
| 409 | TOKENIZED_ASSETS_OPERATION_NOT_AWAITING_SIGNATURES | `This operation is not waiting for signatures.` (`details.status`): Aurea signs for its wallet, it was sent already, or it is over. |
| 409 | TOKENIZED_ASSETS_SIGNING_EXPIRED | `The time to sign this operation is over. Start it again.` (`details.expiresAt`); the operation is then `expired` or `failed`. |
| 400 | TOKENIZED_ASSETS_SIGNATURES_MISMATCH | `Send one signature for each step, in order.` (`details.steps`). |
| 400 | TOKENIZED_ASSETS_SIGNATURE_INVALID | `A signature's v is 0 or 1 (or 27 or 28).`, `A signature could not be read.` or `A signature is not the operation's wallet's.` (`details.stepIndex`). |
| 503 | TOKENIZED_ASSETS_CHAIN_UNAVAILABLE | `The chain cannot be reached for this tenant at the moment.` |
| 409 | TOKENIZED_ASSETS_QUOTE_ALREADY_USED | `This quote has been used already.` |
| 409 | TOKENIZED_ASSETS_ASSET_NOT_ACCEPTED | `This asset cannot be traded at the moment.` |
| 409 | TOKENIZED_ASSETS_ASSET_PAUSED | `Trading in this asset is paused.` |
| 409 | TOKENIZED_ASSETS_QUOTE_EXPIRED | The chain's time is past the quote's. |
| 409 | TOKENIZED_ASSETS_MARKET_CLOSED | `The market is closed: try again when it opens.` |
| 409 | TOKENIZED_ASSETS_PRICE_OUT_OF_BOUNDS | `The price is outside the range the market accepts now. Ask for a new quote.` |
| 409 | TOKENIZED_ASSETS_WALLET_BLOCKED | `The wallet cannot hold or move this asset.` (a blocklist, sanctions). |
| 400 | TOKENIZED_ASSETS_ORDER_TOO_SMALL | `The amount is below the least the market takes for this operation.` |
| 409 | TOKENIZED_ASSETS_INSUFFICIENT_BALANCE | `The wallet does not hold enough to carry out this operation.` |
| 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)). |
| 400 | TOKENIZED_ASSETS_BROADCAST_REFUSED | The node refused the first transaction (`details.reason`: `insufficient_gas`, `nonce_conflict`, `reverted`, `rejected`). Nothing was sent; the same signatures may be sent again before `signingExpiresAt` — with a new `Idempotency-Key`. |

## Endpoint

### `POST /v1/tokenized-assets/operations/{operationId}/broadcast`

Authentication: bearer token required.

Sends the signatures of an operation waiting for them.

**Path parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `operationId` | string | yes | A UUID. |

**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. |
| `signatures` | array | yes | One signature per step, in order, over the step's txHashToSign. At least 1 item, at most 8 items. |
| `signatures[].v` | string | yes | `0` or `1` (also `0x0`, `0x1`), or 27 or 28 — in decimal, `27`, `28`, or in hexadecimal, `1b`, `1c` (`0x` optional). At most 4 characters. |
| `signatures[].r` | string | yes | 32 bytes, hex (`0x…`). |
| `signatures[].s` | string | yes | 32 bytes, hex (`0x…`). |

**Responses**

`200` Submitted

```json
{
  "operationId": "5f0c2a7e-91d4-4b8e-a3c6-7d2e18b94f05",
  "kind": "trade",
  "status": "submitted",
  "isTestnet": false,
  "symbol": "AAPLon",
  "chainId": 1,
  "side": "buy",
  "unit": "token",
  "tokenAmount": "2",
  "valueUsd": "508.62",
  "paymentToken": "USDC",
  "paymentAmount": "508.62",
  "wallet": "own",
  "signer": "client",
  "quoteId": "8b1e4f23-6c0a-4d7e-9f35-2a8c1b7e6d40",
  "order": null,
  "steps": [],
  "signingExpiresAt": "2026-10-07T15:07:50.000Z",
  "txHashes": [
    "0x5f2a…e810",
    "0x9e41…07bd"
  ],
  "received": null,
  "failureCode": null,
  "createdAt": "2026-10-07T15:03:02.000Z",
  "updatedAt": "2026-10-07T15:04:40.000Z"
}
```

`409` Too Late

```json
{
  "statusCode": 409,
  "error": "ConflictError",
  "message": "The time to sign this operation is over. Start it again.",
  "details": {
    "code": "TOKENIZED_ASSETS_SIGNING_EXPIRED",
    "expiresAt": "2026-10-07T15:07:50.000Z"
  }
}
```

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

---

Web version: https://docs.aureahub.com/#tok-operation-broadcast
