---
title: "Latency budgets and data-freshness anchors of the service, for one chain (Base by default)"
method: GET
path: "/v1/stats/slo"
tags: ["stats"]
---

# Latency budgets and data-freshness anchors of the service, for one chain (Base by default)

`GET /v1/stats/slo`

## Request

- Base URL: `https://stablescan.achivx.com`
- URL: `https://stablescan.achivx.com/v1/stats/slo`
- Auth: none required

The answer is about one chain: `chain_id` names it, and `chain_source` is `explicit` when
you passed `chain` or `default` when you did not and got Base. `graph_batch` and
`signal_firing` are per chain (`scope: chain`), `ofac_sanctions` is global, latency rows
are per API process. The graph batch runs weekly: an anchor within `budget_seconds` is
under budget, and a `last_refresh` older than the latest weekly run means that chain's run
did not land. Indexing freshness per chain is `/v1/sync/status`, not this.

## Query parameters

- `chain` union: A network — number, number in a string, slug or CAIP-2 id (the slugs and CAIP-2 ids are /v1/networks' `slug` and `caip2`). The string forms are listed exactly; the server reads them leniently, as A2A and MCP do: surrounding whitespace, a leading + and leading zeros are ignored, slugs and CAIP-2 ids match in any letter case, and an empty or blank value is no chain at all (the default; /v1/freezes/acts alone refuses an empty filter). Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference, an unindexed network) is 400 invalid_chain.
  - 1 | 10 | 56 | 8453 | 42161 | 728126428 | -1
  - '1' | '10' | '56' | '8453' | '42161' | '728126428' | '-1' | 'ethereum' | 'optimism' | 'bnb-chain' | 'base' | 'arbitrum' | 'tron' | 'solana' | 'eip155:1' | 'eip155:10' | 'eip155:56' | 'eip155:8453' | 'eip155:42161' | 'eip155:728126428' | 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp'

## Response `200`

Latency budgets and freshness anchors of one chain — chain_id names it; without chain it is Base.

- SLOResponse
  - `as_of` string, required
  - `chain_id` integer, required: The chain the per-chain rows (scope chain: graph_batch, signal_firing) are about. Without chain it is Base (8453).
  - `chain_source` string, required: explicit (you passed chain) or default (no chain was passed, so the answer is about Base).
  - `freshness` object[], nullable, required
    - `age_seconds` integer, nullable
    - `anchor` string, required
    - `budget_seconds` integer, required
    - `known` boolean, required
    - `last_refresh` string
    - `scope` string, required: chain: this anchor is about the answer's chain_id; global: the same for every chain (the OFAC list has no chain).
    - `within_slo` boolean, required: age_seconds is at most budget_seconds. Under budget is not on schedule: the budget of a weekly batch carries slack, so a last_refresh older than its latest scheduled run means that run did not land, even while this is true.
  - `latency` object[], nullable, required
    - `budget_ms` integer, required
    - `class` string, required
    - `observed_p95_ms` number, required
    - `samples` integer, required
    - `within_budget` boolean, required
  - `note` string, required
  - `signal_firing` object[], nullable, required
    - `as_of` string
    - `count` integer, required
    - `detector` string, required
    - `known` boolean, required
    - `scope` string, required: chain: the count is for the answer's chain_id.

## Other responses

- `400`: The one error envelope. Branch on `error.code`, not on the status.
- `429`: The per-IP token bucket (20 requests/second, burst 40) is empty — wait `Retry-After`.
- `500`: The one error envelope. Branch on `error.code`, not on the status.
- `503`: The one error envelope. Branch on `error.code`, not on the status.

---

[API](https://skmtc.dev/achivx/apis/stablecoin-scanner-rest-api.md) · [All operations](https://skmtc.dev/achivx/apis/stablecoin-scanner-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/achivx/apis/stablecoin-scanner-rest-api/revisions/cbd001c8925c?raw)
