# Complete a Backup Proof

Send the signature the backup proof's ceremony produced: Aurea records that the wallet's backup share is held.

## Overview

- `challengeId`: from [Start a Backup Proof](https://docs.aureahub.com/docs/mpc-backup-proof-start.md). `signature`: the ceremony's signature of `digest`, `0x` hex — on `secp256k1` 65 bytes (r, s, v) or 64 (r, s); on `ed25519` the 64 bytes R‖S.
- **Accepted** when the signature is the wallet's over the challenge's digest **and** Aurea's cosigner finished the signature of the proof's own session. If the cosigner has not answered yet, the call waits up to about ten seconds for it, then answers `409` `BACKUP_PROOF_PENDING`: send the same body again.
- `200` with the wallet's backup state (as [Get the Backup State](https://docs.aureahub.com/docs/mpc-backup-get.md)): `backupPresent` `true`, `backupConfirmedAt` now, `backupReconfirmDue` `false`. The challenge is used.
- **Five wrong or unreadable signatures burn the challenge**: each answers `422` with `details.attemptsLeft`, the fifth `409` `BACKUP_PROOF_BURNT`. Start another.
- The wallet's owner only, as at Start.

## Endpoint

### `POST /v1/mpc/wallets/{walletId}/backup-proof/complete`

Authentication: bearer token required.

Completes a backup proof with the BACKUP+AUREA ceremony's signature and records the wallet's backup.

**Path parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `walletId` | string (uuid) | yes | The MPC wallet's id |

**Request body**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `challengeId` | string (uuid) | yes | The challenge Start answered |
| `signature` | string | yes | The ceremony's signature of `digest`, `0x` hex, up to 200 characters |

**Responses**

`200` Proven

```json
{
  "walletId": "7c1e9b24-3f5a-4d8e-9b6c-1a2f3e4d5c6b",
  "backupPresent": true,
  "backupConfirmedAt": "2026-10-14T09:13:05.412Z",
  "backupReconfirmDue": false,
  "reconfirmDays": 90
}
```

`409` Pending

```json
{
  "statusCode": 409,
  "error": "ConflictError",
  "message": "the cosigner has not finished this backup proof's signature yet: try again",
  "details": { "code": "BACKUP_PROOF_PENDING" }
}
```

`422` Wrong signer

```json
{
  "statusCode": 422,
  "error": "ValidationError",
  "message": "The signature is not the wallet's over this backup proof",
  "details": { "code": "BACKUP_PROOF_SIGNATURE_WRONG_SIGNER", "attemptsLeft": 4 }
}
```

**Example request**

```bash
curl -X POST https://api.aureahub.com/v1/mpc/wallets/7c1e9b24-3f5a-4d8e-9b6c-1a2f3e4d5c6b/backup-proof/complete \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "challengeId": "2a7d9c41-6e3b-4f85-b0d2-8c1e5a9f3b67", "signature": "0x…" }'
```

## Refusals

| Status | details.code | Message, and what to do |
| --- | --- | --- |
| 404 | MPC_WALLET_NOT_FOUND | `mpc wallet not found`. |
| 403 | MPC_WALLET_NOT_OWNED | `not your wallet`. |
| 404 | BACKUP_PROOF_NOT_FOUND | `no such backup proof of this wallet` — also another user's or tenant's challenge. |
| 409 | BACKUP_PROOF_USED | `this backup proof was already used: start another`. |
| 410 | BACKUP_PROOF_EXPIRED | `this backup proof expired: start another` — past its ten minutes. |
| 409 | BACKUP_PROOF_CEREMONY_FAILED | `the cosigner did not finish this backup proof's signature: start another`. |
| 409 | BACKUP_PROOF_PENDING | `the cosigner has not finished this backup proof's signature yet: try again`. |
| 422 | BACKUP_PROOF_SIGNATURE_MALFORMED | `The signature cannot be read`, with `attemptsLeft`. |
| 422 | BACKUP_PROOF_SIGNATURE_WRONG_SIGNER | `The signature is not the wallet's over this backup proof`, with `attemptsLeft`. |
| 409 | BACKUP_PROOF_BURNT | `Too many wrong signatures (5): this backup proof is burnt, start another`. |
| 429 | — | `too many backup proof completions: try again in a second`, with `Retry-After: 1`. |

---

Web version: https://docs.aureahub.com/#mpc-backup-proof-complete
