---
updatedAt: 2026-06-19T20:31:44.000Z
agentTools:
  projectIndex: https://docs.zerohash.com/llms.txt
---

# Portfolio Strategy Operations

Webhook events triggered by potfolio strategy operations activity.

## `trade_strategy.operation.status_changed`

An **operation** represents one cycle of work against a strategy — an `enrollment` (initial onboarding of a participant), a `top_up` (additional funding into an already-enrolled strategy), or a `partial_sell` (selling part of an enrolled trader's crypto holdings back to fiat). This webhook fires on every state transition of that operation.

| Parameter       | Description                                                                                                                                                       | Type          |
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- |
| `id`            | Unique identifier for this operation.                                                                                                                             | string (UUID) |
| `strategy_id`   | Identifier of the strategy this operation belongs to.                                                                                                             | string (UUID) |
| `request_id`    | Idempotency key from the client request that created this operation.                                                                                              | string (UUID) |
| `type`          | Kind of operation. One of `enrollment`, `top_up`, `partial_sell`.                                                                                                 | string        |
| `status`        | Current operation status. See [Operation statuses](#operation-statuses) below.                                                                                    | string        |
| `status_reason` | Machine-readable reason for the current status. Empty when not applicable. See [Operation status reasons](#operation-status-reasons).                             | string        |
| `allocations`   | Array of `{underlying_currency, weight}` entries describing the target asset mix for this operation. Weights are strings carrying decimal values that sum to `1`. | array         |
| `created_at`    | Operation creation timestamp (UTC, RFC3339).                                                                                                                      | string        |
| `updated_at`    | Timestamp of the transition that triggered this webhook (UTC, RFC3339).                                                                                           | string        |

### Operation statuses

| Status       | Description                                                                                                                                                    |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `validating` | Request received, payload accepted, initial checks underway.                                                                                                   |
| `pricing`    | Quotes are being requested for the configured allocations.                                                                                                     |
| `settling`   | Quotes accepted, underlying trades and balance movements are being applied.                                                                                    |
| `settled`    | Operation completed successfully and balances are reflected on the strategy account.                                                                           |
| `skipped`    | Operation completed without performing any work. *(Planned — fires once the rebalance / dust-skip flow lands; current operations do not produce this status.)* |
| `failed`     | Operation did not complete. Check `status_reason` for details.                                                                                                 |

### Operation status reasons

| Reason            | Description                                                                                                                                                                                                  |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `no_executions`   | Operation ended without producing any executions.                                                                                                                                                            |
| `all_rejected`    | Every underlying execution was rejected — see the corresponding execution webhook for the per-execution reason. Operation status is `failed`.                                                                |
| `all_skipped`     | Every underlying execution ended `skipped`. Operation status is `skipped`. *(Planned — fires once the rebalance / dust-skip flow lands.)*                                                                    |
| `partial_success` | Mixed outcome — at least one execution settled and at least one was rejected. Operation status is `settled` (not `failed`) with this reason; inspect each execution webhook for the per-participant outcome. |

<br />

***

### Payload Examples

#### Operation status `pricing`

```json
{
    "id": "663a258c-5e7c-456f-9759-73e02db8b5d9",
    "strategy_id": "9ba5e569-a966-42a9-a7ad-666b0a5300f3",
    "request_id": "e4edff9d-422e-41e2-a2a2-a887c6444fde",
    "type": "enrollment",
    "status": "pricing",
    "status_reason": "",
    "allocations": [
        { "underlying_currency": "BTC", "weight": "0.5" },
        { "underlying_currency": "ETH", "weight": "0.5" }
    ],
    "created_at": "2026-05-29T18:56:43Z",
    "updated_at": "2026-05-29T18:56:43Z"
}
```

#### Operation status `settled`

```json
{
    "id": "663a258c-5e7c-456f-9759-73e02db8b5d9",
    "strategy_id": "9ba5e569-a966-42a9-a7ad-666b0a5300f3",
    "request_id": "e4edff9d-422e-41e2-a2a2-a887c6444fde",
    "type": "enrollment",
    "status": "settled",
    "status_reason": "",
    "allocations": [
        { "underlying_currency": "BTC", "weight": "0.5" },
        { "underlying_currency": "ETH", "weight": "0.5" }
    ],
    "created_at": "2026-05-29T18:56:43Z",
    "updated_at": "2026-05-29T18:56:46Z"
}
```

#### Operation status `failed`

```json
{
    "id": "7fb46299-9e74-4c14-9f04-172a005e9aca",
    "strategy_id": "78e8282c-2363-40c2-879a-52e1ee090e45",
    "request_id": "bd64a9bd-0f65-481b-af7a-03e033bc920c",
    "type": "top_up",
    "status": "failed",
    "status_reason": "all_rejected",
    "allocations": [
        { "underlying_currency": "BTC", "weight": "0.5" },
        { "underlying_currency": "ETH", "weight": "0.5" }
    ],
    "created_at": "2026-05-29T18:40:29Z",
    "updated_at": "2026-05-29T18:40:29Z"
}
```

***

<br />