# Get an Operation

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

One operation, with every state it passed, and what its signing points decoded, simulated and checked.

## Overview

- The operation as [List Operations](https://docs.aureahub.com/docs/operations-list.md) shows it — `sourceAccountId` included —, plus `events`: each state in order — `seq` from 1, `state`, `subState`, `failureReason`, `txHash` and `at`.
- `404` `OPERATION_NOT_FOUND` (`Operation not found`) for an operation the caller may not read — another user's, for a user — or that doesn't exist; and for every id while recording is off.
- An operation a policy held for approval (institutional tenants: `PENDING_AUTHORIZATION` `awaiting_approval`): its request, decisions and the answer it went on with are in [An Operation's Approval](https://docs.aureahub.com/docs/operation-approval.md).
- An operation your institution callback holds (institutional tenants: `PENDING_AUTHORIZATION` `awaiting_callback`): its callback requests — status, attempts, deadline, and the status its call answered once it went on — are in [Institution Callback › List Requests](https://docs.aureahub.com/docs/institution-callback-requests.md), with `operationId`.
- `simulations` and `signingChecks`: what the operation's signing points did with it, oldest first — below. Both are `[]` where none ran: the transaction simulation and exact approvals run where your tenant asked for them [Coming soon, upon request](https://docs.aureahub.com/docs/feature-availability.md); the message rules and the server's build of swaps are in `log` for every tenant ([Signing Rules](https://docs.aureahub.com/docs/guide-signing-rules.md)). [Get by Your Own Id](https://docs.aureahub.com/docs/operation-by-external-id.md) answers them too; [List Operations](https://docs.aureahub.com/docs/operations-list.md) does not.
- A refused operation's check is in `signingChecks` when its call had an operation — an earlier step's, or the one an approved operation continues. A refusal that came before any operation was recorded is read by its `details.checkId` with [Get a Signing Check](https://docs.aureahub.com/docs/operation-signing-check.md).

## Simulations

Each entry of `simulations` is one signing point's decoding and simulation of the transaction it was about to sign or send:

| Field | Meaning |
| --- | --- |
| point | The signing point, e.g. `custodial_transfer` (a Solana send too), `client_prepare`, `client_broadcast`, `custodial_swap`, `custodial_swap_solana`, `dapp_broadcast`, `mpc_sign_start`. |
| mode | `log`: recorded beside the signing, never refusing; `enforce`: the signing waited for it. |
| chain, chainId | Where the transaction runs. |
| summary | What the transaction does, in words. |
| decoded | The call decoded: its `kind` — `native_transfer`, `erc20_transfer`, `erc20_approve`, `erc20_permit`, `swap`, `lending_supply`, `lending_withdraw`, `vault_deposit`, `forwarded_transfer`, `safe_transaction`, `unknown_contract_call`, `solana_transaction`… —, its function, and the asset, amount, recipient or spender it names. A call is decoded only when its data is exactly what it decodes to; anything else is `unknown_contract_call`, never a guess. |
| intent | What was asked — `send`, `approve`, `swap`, `supply`, `withdraw`, `spend` or `none` — with its asset, amount and counterparty. |
| status | `simulated` (it would run), `reverted` (it would fail), `unavailable` (it could not be simulated — never taken for a success), `not_applicable` (a message signature: no transaction). |
| method | How it was simulated: `eth_simulateV1` or `debug_traceCall` on the platform's node of the chain, `simulateTransaction` on the platform's Solana node, or `provider`; `null` when it was not. |
| verdict | `matches` (the outcome keeps to what was asked), `diverges` (it does not: `reasons`), `no_intent` (simulated, with nothing precise asked of it — a dApp's own call), `not_simulated`, `not_a_transaction`. |
| reasons, findings | Why it diverges or was not simulated — `reverted`, `more_out_than_asked`, `unexpected_asset_out`, `unexpected_recipient`, `recipient_short`, `unexpected_approval`, `approval_differs`, `approval_not_set`, `nothing_received`, `less_in_than_asked`, `call_differs_from_request`, `simulation_unavailable`, `undecodable` —, and each reason with what it is about (`code`, `asset`, `address`, `field`, `expected`, `actual`, `detail`). |
| refused | `true` when the signing was refused for it (`TX_NOT_SIMULATED` or `TX_SIMULATION_DIVERGES`). |
| outcome | The simulation's result: `reason` (why it could not be simulated), `revertReason`, `gasUsed`, `balanceChanges` (`address`, `asset` — `native` or the token's address —, `delta` in the asset's smallest unit, negative when it leaves), `approvals` (`owner`, `token`, `spender`, `amount`, `kind` `erc20` — an ERC-20 allowance —, `operator` — `ApprovalForAll` — or `spl` — a Solana token account's delegate), `contractsTouched`, `durationMs`. |
| id, createdAt | The entry's id and when it was made. |

## Signing Checks

Each entry of `signingChecks` is what the message rules, the exact approvals or the server's build of a swap said at one signing point ([Signing Rules](https://docs.aureahub.com/docs/guide-signing-rules.md)) — whatever its verdict, a refusal included. [Get a Signing Check](https://docs.aureahub.com/docs/operation-signing-check.md) answers one entry by its `id`:

| Field | Meaning |
| --- | --- |
| point | The signing point. |
| control | `message_signing` (the message rules), `exact_approvals` (exact approvals, the residue revoked) or `swap_server_build` (the swap's route built on the server). |
| mode | `log` or `enforce`. |
| subject | `personal_sign`, `eip712`, `raw`, `transaction`, `approval`, `revoke` or `swap_route`. |
| verdict | `allowed` (a rule allowed it); in `log`, `would_refuse` and `would_change` — what `enforce` would refuse or change; in `enforce`, `refused` and `changed` — what it did; `unchanged`; `failed` (a revoke that could not be sent or seen in time, or a residue that could not be read). |
| code | The refusal's code, or `null`: `MESSAGE_DOMAIN_NOT_ALLOWED`, `PERSONAL_SIGN_NOT_ALLOWED`, `RAW_SIGN_NOT_ALLOWED`, `APPROVAL_SPENDER_NOT_ALLOWED`, `APPROVAL_AMOUNT_REQUIRED`, `APPROVAL_RESET_REQUIRED`, `SWAP_QUOTE_UNKNOWN`, `SWAP_ROUTER_NOT_ALLOWED`; for a revoke (subject `revoke`), `REVOKE_FAILED`, `SWAP_RECEIPT_TIMEOUT`, `REVOKE_RECEIPT_TIMEOUT`, `RESIDUE_LEFT` or `RESIDUE_UNREAD`, or the refusal's code at the revoke's own signing point. |
| rule | The rule that allowed it: `builtin:<name>` (a rule Aurea builds in), `tenant:<rule id>` (one of your tenant's rules) or `dapp:<dApp id>` (one of your enabled dApps); `null` otherwise. |
| details | Numbers in the smallest unit, codes and public contract addresses: the token and the spender, the amount, the allowance before, the residue after, the reasons. |
| id, createdAt | The entry's id and when it was made. |

## Endpoint

### `GET /v1/operations/{id}`

Authentication: bearer token required.

One operation with its history.

**Path parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes | The operation's id |

**Responses**

`200` OK

```json
{
  "id": "1d7a3c52-8e4b-4f19-a0c6-2b9e7d5f3a18",
  "type": "TRANSFER",
  "state": "CONFIRMING",
  "subState": "awaiting_confirmation",
  "failureReason": null,
  "legacyStatus": "pending",
  "origin": "transactions.create",
  "userId": "5d2c1b0a-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
  "walletId": "7c1e9b24-3f5a-4d8e-9b6c-1a2f3e4d5c6b",
  "chain": "base",
  "chainId": 8453,
  "isTestnet": false,
  "asset": "native",
  "amount": "1000000000000000000",
  "destination": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
  "externalTxId": null,
  "idempotencyKey": "order-7781",
  "transactionId": "4b2e6f81-0c3d-4a5e-9f7b-8d1c2e3f4a5b",
  "preparedTxId": "9e3d1a7c-5b2f-4c68-8a0e-3f6b1d9c4e27",
  "providerRef": null,
  "tokenizedOperationId": null,
  "txHashes": ["0x5c9e1b7a3d2f4e6c8b0a9d1e3f5c7b9a2d4e6f8a0c1b3d5e7f9a1c3e5b7d9f1a"],
  "createdAt": "2026-10-06T12:01:44.120Z",
  "updatedAt": "2026-10-06T12:02:03.587Z",
  "finishedAt": null,
  "sourceAccountId": "5d2c1b0a-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
  "events": [
    { "seq": 1, "state": "SUBMITTED", "subState": null, "failureReason": null, "txHash": null, "at": "2026-10-06T12:01:44.120Z" },
    { "seq": 2, "state": "PENDING_SCREENING", "subState": "not_gated", "failureReason": null, "txHash": null, "at": "2026-10-06T12:01:44.120Z" },
    { "seq": 3, "state": "PENDING_ENRICHMENT", "subState": "not_gated", "failureReason": null, "txHash": null, "at": "2026-10-06T12:01:44.120Z" },
    { "seq": 4, "state": "PENDING_POLICY", "subState": "not_gated", "failureReason": null, "txHash": null, "at": "2026-10-06T12:01:44.120Z" },
    { "seq": 5, "state": "PENDING_AUTHORIZATION", "subState": "not_gated", "failureReason": null, "txHash": null, "at": "2026-10-06T12:01:44.120Z" },
    { "seq": 6, "state": "QUEUED", "subState": "not_gated", "failureReason": null, "txHash": null, "at": "2026-10-06T12:01:44.120Z" },
    { "seq": 7, "state": "PENDING_SIGNATURE", "subState": "awaiting_client_signature", "failureReason": null, "txHash": null, "at": "2026-10-06T12:01:44.120Z" },
    { "seq": 8, "state": "SIGNED", "subState": "signed_by_client", "failureReason": null, "txHash": null, "at": "2026-10-06T12:02:03.211Z" },
    { "seq": 9, "state": "BROADCASTING", "subState": "sending", "failureReason": null, "txHash": null, "at": "2026-10-06T12:02:03.214Z" },
    { "seq": 10, "state": "CONFIRMING", "subState": "awaiting_confirmation", "failureReason": null, "txHash": "0x5c9e1b7a3d2f4e6c8b0a9d1e3f5c7b9a2d4e6f8a0c1b3d5e7f9a1c3e5b7d9f1a", "at": "2026-10-06T12:02:03.587Z" }
  ],
  "simulations": [],
  "signingChecks": []
}
```

`404` Not found

```json
{
  "statusCode": 404,
  "error": "NotFoundError",
  "message": "Operation not found",
  "details": { "code": "OPERATION_NOT_FOUND" }
}
```

---

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