Overview
Poll the lifecycle of an intent returned by the calldata endpoints.
status is derived:
failed: a failure reason was recorded (including pre-transaction failures);fulfilled_tx_hashis always null.fulfilled:fulfilled_atis set and the intent did not fail.expired: unfulfilled and pastexpires_at.pending: everything else.
404 intent_not_found covers both a missing intent and an intent
belonging to another strategy. Raw calldata is never returned.
Endpoint
GET https://earn-api.quicknode.dev/functions/v1/api/v1/strategies/{id}/intents/{intentId}
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. |
| intentId | path | string | Yes | Intent id, returned as `intentId` by the calldata endpoints. |
Example request
curl --request GET \
--url 'https://earn-api.quicknode.dev/functions/v1/api/v1/strategies/b7c1e2d3-0000-4000-8000-000000000001/intents/7f3a1c2b-0000-4000-8000-000000000abc' \
--header 'Accept: application/json' \
--header 'apikey: <EARN_PUBLIC_API_KEY>'
Response
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Intent UUID. |
| strategy_id | string | Yes | UUID of the strategy that owns the intent. |
| chain_id | integer | Yes | Chain on which the intent transaction is executed. |
| kind | string | Yes | One of `deposit`, `close`, `emergency_claim` (from the calldata endpoints), or system-written `rebalance`, `withdraw_bridge`, `relay_deposit`. |
| created_at | string | Yes | ISO 8601 timestamp when the intent was created. |
| expires_at | string | Yes | The intent attribution TTL (30 days for user kinds), NOT the calldata plan-freshness bound. |
| status | string (pending | fulfilled | failed | expired) | Yes | Derived, not a stored column. `failed`: a failure reason was recorded (including pre-transaction failures; failed wins over fulfilled). `fulfilled`: `fulfilled_at` set and not failed. `expired`: unfulfilled and past `expires_at`. `pending`: everything else. |
| fulfilled_at | string | null | Yes | When the intent was closed. Also set on some FAILED intents, so branch on `status`, never this field alone. |
| fulfilled_tx_hash | string | null | Yes | The fulfilling transaction hash; always null on a failed intent. |
| submitted_tx_hash | string | null | Yes | Broadcast-time hash set on rebalance intents before fulfillment, when known. |
| failure_reason | string | null | Yes | Human-readable failure detail when `status` is `failed`. Sanitized: URLs are redacted and the text is capped at 200 characters. |
Example response
{
"id": "7f3a1c2b-0000-4000-8000-000000000abc",
"strategy_id": "b7c1e2d3-0000-4000-8000-000000000001",
"chain_id": 10,
"kind": "close",
"created_at": "2026-07-07T18:00:00.000Z",
"expires_at": "2026-08-06T18:00:00.000Z",
"status": "pending",
"fulfilled_at": null,
"fulfilled_tx_hash": null,
"submitted_tx_hash": null,
"failure_reason": null
}
HTTP responses
| Status | Description |
|---|---|
| 200 | The intent row with its derived status. |
| 400 | The strategy id or intent id is not a UUID (`invalid_request`). |
| 404 | No such intent for THIS strategy (`intent_not_found`; also returned when the intent belongs to another strategy). |
| 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 getIntentStatus in the Earn OpenAPI 3.1 specification.