---
title: "List the live polling subscriptions for this key"
method: GET
path: "/api/v1/data/subscriptions"
tags: ["Customer civic data"]
---

# List the live polling subscriptions for this key

`GET /api/v1/data/subscriptions`

## Request

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

Limited, machine-only release. Returns the live feeds bound to the authenticated customer and the exact API key making the request. A feed is live only while it is unrevoked and its bound key is unrevoked and unexpired, so a feed whose key has expired or been revoked stops being listed, and its account cap slot is free, without any row being deleted and without a background sweep. Revoked feeds are never listed: there is no include-revoked mode and no unbounded history. The response also reports the account-wide live count and the current per-account cap, because the cap counts every key's feeds on the account, not only this key's.

## Response `200`

The live feeds bound to this account and key, with the account-wide live count and cap.

- FeedSubscriptionCollectionEnvelope
  - `data` object, required
    - `items` object[], required
      - `id` string, uuid, required: Server-assigned subscription id. Stable for the feed's life.
      - `name` string, required: The caller-chosen name, unique per account and key among live feeds.
      - `resource` 'jurisdictions' | 'public_bodies' | 'source_endpoints' | 'topics' | 'meetings' | 'documents' | 'agenda_items' | 'topic_matches' | 'classification_evidence' | 'civic_events' | 'aliases', nullable, required: The pinned resource filter, which the poll request cannot override. One of the civic resource names the `CivicResource` component lists, or null for every resource.
      - `keyId` string, uuid, required: The credential this feed is bound to, fixed for the feed's life. Only this exact credential can poll it: a replacement key must register a new feed, and may carry a retained cursor position from the old feed onto it while that position is still replayable.
      - `startCursor` string, required: The change-feed position captured when the feed was created. Polling without a cursor starts here, and it is subject to the same replay retention as every other position: once it is older than the retained floor, a poll is refused with 410 and the feed must be reconciled from a fresh snapshot boundary.
      - `createdAt` string, date-time, required: UTC timestamp ending in Z.
    - `activeCount` integer, required: Live subscriptions on the whole account, across every key, because the cap is per account.
    - `maxActiveSubscriptions` integer, required: The account's current cap from its frozen paid tier: Pro 10, Ultra 100.

## Other responses

- `400`: The request carries a query key this operation does not accept. The collection takes no parameters.
- `401`: The API key is missing, malformed, unknown, revoked, expired, or belongs to a customer that is not active.
- `403`: The key lacks the required grant, the account has no billing channel while billing enforcement is on, is not paid through, or is not on a current Pro or Ultra paid tier.
- `413`: The serialized response exceeds the response size allowance on your account.
- `429`: Either a per-account 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 failure. No private database detail is returned.
- `503`: The identity lookup, a limit or abuse-ceiling store, or an audit write failed. The request is refused rather than allowed through.

---

[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)
