# Health of every chain, one generic row each

`GET https://api.getchord.xyz/v1/health/chains`

Source: https://getchord.xyz/docs/api-reference/operations/chainhealth/

What the status page is built from, readable directly. `quotes.engine` is the routing engine's own state (`ok`, `starting` after a deploy, `stale` when its pool sync stopped, `down`); `quotes.canary` is the small quote the status probe sends. `data.ageSec` is how old the newest indexed trade is and `data.maxAgeSec` the age past which the chain's data counts as delayed. `quotes` is null where Chord does not route (Solana), `data` is null where no tape runs. Answers from a 15-second memo.

## Response 200

Example (captured from the live API):

```json
{
  "at": "2026-10-11T17:33:02.088Z",
  "chains": [
    {
      "key": "monad",
      "id": 143,
      "name": "Monad",
      "quotes": {
        "engine": "ok",
        "latencyMs": 4,
        "lastSyncBlock": 112529162,
        "canary": {
          "inputMint": "0x754704bc059f8c67012fed69bc8a327a5aafb603",
          "outputMint": "0x3bd359c1119da7da1d913d1c4d2b7c461115433a",
          "amount": "10000000"
        }
      },
      "data": {
        "ageSec": 10,
        "maxAgeSec": 600
      }
    },
    {
      "key": "robinhood",
      "id": 4663,
      "name": "Robinhood Chain",
      "quotes": {
        "engine": "ok",
        "latencyMs": 5,
        "lastSyncBlock": 86010669,
        "canary": {
          "inputMint": "0x5fc5360d0400a0fd4f2af552add042d716f1d168",
          "outputMint": "0x0bd7d308f8e1639fab988df18a8011f41eacad73",
          "amount": "10000000"
        }
      },
      "data": {
        "ageSec": 4,
        "maxAgeSec": 2700
      }
    }
  ]
}
```

- **429**: Over the per-minute limit (`RATE_LIMIT_EXCEEDED`). Read `X-RateLimit-Reset` and back off.
