# 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 client's signatures of an operation answered `submitted`; Aurea sends the steps exactly as it built them.

## Overview

- One signature per step, in the order of the steps (`400` `EARN_SIGNATURES_MISMATCH` otherwise). Each is checked against the operation's wallet (`422` `EARN_SIGNATURE_INVALID`); the product is read again, then the steps are sent. You send signatures only, never a transaction.
- `v` is the y parity, a string: `0` or `1` in hexadecimal, `0x` optional (`0x0`, `0x1`), or the legacy 27 or 28 — in decimal (`27`, `28`, as most libraries write `String(signature.v)`) or in hexadecimal (`1b`, `1c`, `0x1b`, `0x1c`); 27 and 28 are read as 0 and 1. Any other `v` — `26`, `29`, `0x27` — is refused `422` `EARN_SIGNATURE_INVALID` (`A signature's v is 0 or 1 (or 27 or 28).`, with `details.stepIndex`) and nothing is sent. `r` and `s` are `0x` + 64 hex characters.
- `404` `EARN_OPERATION_NOT_FOUND` (`No such operation`); `409` `EARN_OPERATION_NOT_AWAITING_SIGNATURES` for an operation in another state; `410` `EARN_SIGNING_EXPIRED` past `signing.expiresAt` (the operation is then `expired`: start it again); `400` `EARN_BROADCAST_REFUSED` when the node refuses the first step — nothing was sent, and the same signatures may be sent again.
- Once a step is out, the answer is the operation in the state it reached. An optional `Idempotency-Key` makes a retry safe.

## Endpoint

### `POST /v1/earn/operations/{operationId}/broadcast`

Authentication: bearer token required.

Sends the signatures of an operation awaiting them.

**Path parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `operationId` | string | yes | `operationId` of the operation |

**Headers**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `Idempotency-Key` | string | no | Optional. Up to 255 letters, digits, - or _; see [Retries](https://docs.aureahub.com/docs/guide-earn.md) |

**Request body**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `signatures` | array | yes | `[{ v, r, s }]`, one per step, in the order of the steps; `v` `0x0`/`0x1`, or `27`/`28` in decimal or hexadecimal |

**Responses**

`200` OK

```json
{
  "operationId": "3f9a…",
  "productId": "lumen",
  "kind": "deposit",
  "route": "direct",
  "signer": "client",
  "state": "completed",
  "txHashes": ["0x…", "0x…"],
  "signing": null,
  "broadcastAt": "2026-10-05T10:03:40.000Z",
  "completedAt": "2026-10-05T10:03:52.000Z"
}
```

`410` Expired

```json
{
  "statusCode": 410,
  "error": "GoneError",
  "message": "The time to sign this operation is over. Start it again.",
  "details": { "code": "EARN_SIGNING_EXPIRED", "expiresAt": "2026-10-05T10:16:00.000Z" }
}
```

The 200 above shows the fields that changed; the answer is the whole operation, as [Deposit](https://docs.aureahub.com/docs/earn-deposit.md) returns it.

---

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