# 3pm-backend route `info`

Paths are relative to the backend's origin (https://fleet.edgecr4ft.net, or your own 3pm-backend), not to this site. Index: https://3pm.edgecr4ft.net/docs/backend/api.md

---

tokens:
  claude: 1431
  o200k: 824
# GET /api/v1/info (info)

Versions, the accepted link range, how the store is doing and what the link got wrong; no credentials needed.

- auth: none
- answer: Info (JSON)

## Types

```ts
interface Info {
  server_version: string;
  link_min: number;
  link_max: number;
  /** Whether the telemetry is persisted (`--metrics-url`, `--events-url`), and how that is going. */
  store: StoreStatus;
  /** Application events left off the buckets' live feeds (50 a second per bucket at most), since the backend started. */
  feed_app_events_dropped: number;
  /** What the link got wrong, since the backend started. */
  link: LinkInfo;
}

/** `Info.store`: the metrics/events store, counted since the backend started. */
interface StoreStatus {
  /** A metrics engine is configured. */
  metrics: boolean;
  /** An events engine is configured. */
  events: boolean;
  /** Stored resolution: one sample per series per interval. */
  interval_ms: number;
  /** Samples and events delivered. */
  sent: number;
  /** Samples and events lost: queue full, body given up on. */
  dropped: number;
  /** Bodies given up on after their retries. */
  errors: number;
  /** Attempts that failed and were retried. */
  retries: number;
  last_error_kind?: StoreErrorKind;
  last_flush_at?: EpochMs;
  /** The query cache, with `--metrics-url` and `--store-query-cache-mb` above 0. */
  cache?: CacheStatus;
  /** The logs nodes ship (`pushLogs`), with `--events-url`. */
  logs?: LogsStatus;
}

/** `Info.link`: agent frames this build accepted and could not act on, since the backend started. Both 0 when the fleet and this backend agree on the wire. */
interface LinkInfo {
  /** Frames whose tag this build knows and whose body it could not read: skipped, the session kept. A tag it does not know is not counted — that is a newer agent, not a disagreement. */
  frames_invalid: number;
  /** Sessions in which a full state section failed its checksum: accepted, and the checks turned off for the rest of that session. */
  crc_full_mismatch: number;
}

/** Why the store's last request to an engine failed. */
type StoreErrorKind = "connect" | "timeout" | "throttled" | "rejected" | "server";

/** Milliseconds since the Unix epoch. */
type EpochMs = number;

/** `StoreStatus.cache`: the engine's answers kept for a step, counted since the backend started. */
interface CacheStatus {
  entries: number;
  /** Estimated. */
  bytes: number;
  budget_bytes: number;
  /** Answered from an entry. */
  hits: number;
  /** Went to the engine. */
  misses: number;
  /** Waited for the identical request already in flight. */
  coalesced: number;
}

/** `StoreStatus.logs`: the log batches nodes pushed, counted since the backend started. */
interface LogsStatus {
  /** Batches stored. */
  batches: number;
  /** Batches that were retries of one already stored. */
  duplicates: number;
  records_accepted: number;
  records_skipped: number;
  /** Shipped lines written to the logs store (a line already stored is not). */
  lines_stored: number;
  /** Bytes inflated, every batch read included. */
  bytes_inflated: number;
  /** Batches refused: over budget, too large, not a batch. */
  refused: number;
  /** Batches the stores did not take: answered 503, retried by the node. */
  failed: number;
}
```
