---
title: "Read current source and pipeline health"
method: GET
path: "/api/v1/data/health"
tags: ["Customer civic data"]
---

# Read current source and pipeline health

`GET /api/v1/data/health`

## Request

- Base URL: `https://aicdapi.com`
- URL: `https://aicdapi.com/api/v1/data/health`
- Auth: HTTP bearer

Includes safe source checks, pending work and failures. Raw errors, connector configuration and archive credentials are excluded. A degraded response can still be HTTP200 and must be evaluated by the caller.

## Response `200`

Source and pipeline health.

- object
  - `data` CivicHealth, required
    - `status` 'healthy' | 'degraded' | 'unavailable', required
    - `checkedAt` string, date-time, required
    - `sources` object[], required
      - `id` string, uuid, required
      - `publicBodyId` string, uuid, required
      - `sourceSystem` 'legistar' | 'civicplus_agenda_center' | 'civicweb' | 'civicclerk' | 'granicus' | 'municode' | 'onbase_agenda_online' | 'pdf_directory' | 'arcgis_feature_service' | 'docspublished' | 'novusagenda' | 'agendaquick', required
      - `recordKind` 'agenda' | 'record_stream', required
      - `officialSourceUrl` string, required
      - `pollIntervalMinutes` integer, required
      - `lastSuccessAt` string, date-time, nullable, required
      - `lastErrorAt` string, date-time, nullable, required
      - `errorCategory` 'timeout' | 'dns' | 'authorization' | 'not_found' | 'size_limit' | 'invalid_document' | 'upstream_failure', nullable, required
      - `active` boolean, required
      - `createdAt` string, date-time, required
      - `updatedAt` string, date-time, required
    - `pipeline` object, required
      - `meetings` integer, required
      - `documents` integer, required
      - `agendaItems` integer, required
      - `topicMatches` integer, required
      - `civicEvents` integer, required
      - `documentDeadLetters` integer, required
      - `actionableDocumentDeadLetters` integer, required
      - `extractionDeadLetters` integer, required
      - `classificationDeadLetters` integer, required
      - `staleSources` integer, required

## Other responses

- `400`: Invalid parameter, duplicate query field or malformed JSON.
- `401`: Missing, invalid, expired or revoked credential.
- `403`: Customer lacks the required grant.
- `404`: Snapshot does not exist, belongs to another customer, or expired.
- `410`: Cursor is older than the retained replay floor; start a new snapshot.
- `413`: Request or response exceeds its size cap; reduce the page limit.
- `429`: A per-account request, burst or export allowance was exhausted, or the account-wide abuse ceiling was reached. The abuse ceiling is account-wide, is not charged against the paid quota, and is charged after the identity lookup and before a revoked, expired, unpaid, or scope-denied rejection is decided.
- `500`: Unexpected operation failure; the response contains no private database details.
- `503`: Authentication, limit store or feed state is unavailable.
- `504`: Database statement or request deadline exceeded.

---

[API](https://skmtc.dev/aicdapi/apis/aicd-api.md) · [All operations](https://skmtc.dev/aicdapi/apis/aicd-api/llms.txt) · [OpenAPI document](https://skmtc.dev/aicdapi/apis/aicd-api/revisions/0f3752fae465?raw)
