Overview
Single-strategy detail: config, live-valued positions, cycle/gauge fields
(cycle_state, swap_signals, last_skip, …), closed positions, and the
same computed rollups as the list. Poll this endpoint to watch a status
transition (e.g. pending_setup → active, closing → closed).
Endpoint
GET https://earn-api.quicknode.dev/functions/v1/api/v1/strategies/{id}
Authorization
Include the published apikey header. This read request is public and does not require a SIWE signature.
Parameters
| Parameter | Location | Type | Required | Description |
|---|---|---|---|---|
| id | path | string | Yes | Strategy UUID. |
Example request
curl --request GET \
--url 'https://earn-api.quicknode.dev/functions/v1/api/v1/strategies/b7c1e2d3-0000-4000-8000-000000000001' \
--header 'Accept: application/json' \
--header 'apikey: <EARN_PUBLIC_API_KEY>'
Response
The strategy object includes every field documented by List strategies, plus the detail-only fields below.
| Field | Type | Required | Description |
|---|---|---|---|
| strategy | object | Yes | `closed_positions` is OMITTED (not an empty array) when the strategy has no deactivated positions; every other detail-only field is always present. `live_apy` and `strategy_apy` are always present on detail. |
| strategy.positions | array<object> | Yes | Active positions with current APY and live USDC values. |
| strategy.positions[].current_apy | number | null | No | APY currently attributed to the position at the strategy's smoothing window. Present only on detail responses. |
| strategy.closed_positions | array<object> | No | Deactivated positions. Omitted when none exist. |
| strategy.vault_names | object | Yes | Map of vault keys to display names. |
| strategy.last_cycle_at | string | null | Yes | Timestamp of the most recent strategy cycle. |
| strategy.cycle_state | string | null | Yes | `idle`, `pending`, `rebalancing`, `error`, `action_needed`, or `null`. |
| strategy.last_error | string | null | Yes | Most recent cycle error. |
| strategy.swap_signals | array<object> | null | Yes | Opaque internal swap signals; clients should not depend on their shape. |
| strategy.unmatched_exits | array<object> | null | Yes | Exit records not matched to a position. |
| strategy.last_skip | object | null | Yes | Most recent skipped-cycle details. |
| strategy.has_agreement | boolean | Yes | Whether the owner recorded the Terms of Service agreement. |
| strategy.pending_rebalance | object | null | Yes | Current same-chain rebalance state, or `null`. |
| strategy.cover | object | No | OpenCover premium summary, present only for covered strategies. |
Example response
This abbreviated response uses synthetic strategy data:
{
"strategy": {
"id": "b7c1e2d3-0000-4000-8000-000000000001",
"wallet_address": "0x1234567890abcdef1234567890abcdef12345678",
"name": "My USDC Strategy",
"capital_usdc": 1000,
"delta_pct": 3,
"cross_chain_delta_pct": 5,
"delta_confirmations": 2,
"max_positions": 2,
"chain_ids": "8453,42161",
"status": "active",
"active": true,
"total_value_usdc": 1012.34,
"pending_bridge_value_usdc": 0,
"net_value_usdc": 1012.34,
"realized_apy": 5.87,
"live_apy": 6.42,
"strategy_apy": 6.18,
"cycle_state": "idle",
"has_agreement": true,
"positions": [
{
"vault_name": "Seamless USDC Vault",
"chain_id": 8453,
"usdc_value": 600.25,
"current_apy": 6.48
}
]
}
}
HTTP responses
| Status | Description |
|---|---|
| 200 | Strategy detail. |
| 404 | Strategy not found. |
| 429 | Rate limit exceeded. `Retry-After` (seconds) tells you when to retry. Reads, feedback, and push writes are keyed per IP; create/update/delete are keyed per wallet+IP; deposit/withdraw/claim calldata is keyed per strategy+IP. |
| 500 | Internal server error. |
OpenAPI source
This page is based on operation getStrategy in the Earn OpenAPI 3.1 specification.