---
title: "Health of every chain, one generic row each"
method: GET
path: "/health/chains"
tags: ["Agents and status"]
---

# Health of every chain, one generic row each

`GET /health/chains`

## Request

- Base URL: `https://api.getchord.xyz/v1`
- URL: `https://api.getchord.xyz/v1/health/chains`
- Auth: none declared

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`

- object
  - `at` string: ISO time the rows were read.
  - `chains` object[]
    - `key` 'monad' | 'robinhood' | 'arc' | 'avalanche' | 'base' | 'bnb' | 'arbitrum' | 'ethereum' | 'solana'
    - `id` integer, nullable
    - `name` string
    - `quotes` object, nullable
      - `engine` string
      - `latencyMs` integer, nullable: Round trip from the API to the engine.
      - `lastSyncBlock` integer, nullable
      - `canary` object, nullable: 10 units of the chain's first dollar stable into its wrapped native (Arc: into EURC).
        - `inputMint` string
        - `outputMint` string
        - `amount` string: Amount in the token's smallest unit, as a decimal string. Never a float.
    - `data` object, nullable
      - `ageSec` integer, nullable: Null = the age could not be read.
      - `maxAgeSec` integer

## Other responses

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

---

[API](https://skmtc.dev/getchord/apis/chord-api.md) · [All operations](https://skmtc.dev/getchord/apis/chord-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getchord/apis/chord-api/revisions/d3bc4640fea0?raw)
