202 with a scan job.
Try ?wait=8 first; keep this flow as the fallback.
1
Request the wallet
GET /v1/solana/wallets/{wallet}/defi-positions (cost 5). A fresh snapshot returns 200 at once. Otherwise you get
202 with job_id, poll_url and retry_after_seconds, plus a Retry-After header.2
Wait, then poll the job
Wait
retry_after_seconds, then GET the poll_url (cost 1). Poll the job, not the wallet (cost 5). Repeat with
backoff while status is queued or running.3
Request the wallet again
On
succeeded or partial, request the wallet again for the 200 snapshot. On failed or expired, stop: the
positions request returns 503 (see Errors).The async flow (202)
status is queued, running, succeeded, partial (finished with some protocols incomplete), failed (the
positions request then returns 503 SCAN_FAILED) or expired (503 SNAPSHOT_UNAVAILABLE). A stale snapshot is
returned immediately with refreshing: true. The quickstart loop
implements this.
Long-poll shortcut: ?wait=N (0 to 10 seconds, default 0). The API kicks the scan as above, then holds the request
open for up to N seconds. If the scan finishes in time you get the normal fresh 200 for the new snapshot in one
call; if not, you get exactly the 202 (or the stale 200 with refreshing: true) you would have got without wait,
and the flow above continues. A waiting request costs 5 units once.
Captured example
Captured example
GET /v1/solana/wallets/BWJUG6W67qRq7Xbkv3cLo7m4zEr21oJKg93ens3mLmBg/defi-positions/jobs/600aa76a-4e8b-4a66-ae70-9410c8eaa601 → 200 (captured 2026-11-12 from local job-succeeded)