Skip to help content
AICD API
Start here

Getting started

Learn what AICD API does, what is public, and how to check a source before you use a result.

Try the public data

No account or API key needed. Load upcoming zoning agenda hits and follow their government sources.

Featured meeting sources report their own health and check time in the interactive demo. The research catalog of 238 municipalities across 16 counties is separate; it does not prove live ingestion for every place.

For authenticated API use, create an account, choose a paid plan, then create an API key and run the authenticated feed-health request in API and data help. There is no general free tier or trial.

Save as public-demo.mjs; run node public-demo.mjs with Node 18+javascript
// Save as public-demo.mjs and run: node public-demo.mjs (Node 18+).
const origin = 'https://aicdapi.com';
async function read(path) {
  const response = await fetch(origin + path);
  if (!response.ok) throw new Error('HTTP ' + response.status);
  return (await response.json()).data;
}
const { hits } = await read('/api/v1/public/upcoming-agenda-hits?topicSlug=zoning');
if (!hits.length) console.log('No upcoming zoning hits in this response.');
for (const hit of hits.slice(0, 3)) {
  console.log(hit.title, hit.sourceUrl);
}
if (hits.length) {
  const detail = await read('/api/v1/public/agenda-hits/' + encodeURIComponent(hits[0].matchId));
  console.log(JSON.stringify(detail, null, 2));
}

What AICD API does

AICD API collects public local-government records, keeps the source link, and returns structured data that software and AI agents can use.

AICD covers Dallas City Council, Dallas City Plan Commission, Fort Worth City Council, and the Dallas, Ellis, Parker and Wise County Commissioners Courts. The public catalog is research evidence, not proof that every listed record is in the live feed.

What is available

  • The public coverage catalog can be read without an API key.
  • The catalog records a research pass for 238 active municipalities and 16 counties in the DFW region.
  • No-key MCP access is closed.
  • A civic call on the authenticated MCP route needs a key on an account with a confirmed paid period. Without a paid channel the call returns beta_unavailable, and a client must not retry it automatically. The two report tools need the account's current paid access and no report permission: a report takes no payment and does not use the plan allowance.
  • Permits and other record families appear in the research catalog. The live feed carries the civic resources listed in the API reference.

Your first useful query

Start with coverage. It tells you where evidence exists and where a gap remains. Then follow the returned source URL before you rely on a record.

  1. Read the catalog researchDate and catalogVersion.
  2. Check the evidence code and limits for the record subtype you need.
  3. Follow sourceUrl to the publishing government page.
  4. If the publisher is in the featured meeting-source list, check its source status. Otherwise follow the government source and treat missing or stale data as unknown.
Read the public coverage catalogbash
curl --fail --silent --show-error \
  'https://aicdapi.com/api/v1/public/coverage?limit=10'

Check Dallas zoning agenda evidence

These public routes do not require a key. The agenda result includes meetingAt and sourceUrl. Read meetingTimePrecision when supplied: date means the clock is not supplied, time means a verified source clock, and unknown means unverified. Absent or null is legacy precision and does not certify a clock. A date-only meetingAt is a civil-day sorting anchor, not a midnight start. Open sourceUrl for the publishing government page.

A response with an empty data array does not prove that no government action occurred. Check coverage, the topic, source freshness, and the government page before you reach a conclusion.

Check Dallas zoning agenda evidencebash
curl --fail --silent --show-error \
  'https://aicdapi.com/api/v1/public/agenda-hits?jurisdictionSlug=dallas&topicSlug=zoning'

curl --fail --silent --show-error \
  'https://aicdapi.com/api/v1/public/source-status?jurisdictionSlug=dallas&bodySlug=city-council'

The six public no-key routes

Six public routes answer without a key, an account, or a payment. They share one envelope: a data payload, and an error object carrying code and message when a request is refused.

Coverage is a dated research baseline. The other five routes read live rows: classified agenda hits, featured source status, and per-body meeting cadence. The cadence route accepts the pairs in the published DFW agenda coverage set, and the examples below use two readable pairs from it: Dallas City Council and Dallas County Commissioners Court. Dallas City Plan Commission coverage is limited to agendas with classified items. Coverage reviewed 2026-10-18 against source release a5f05f4. A supported pair is accepted input, not proof that the feed carries that body's meetings live or currently. Other pairs are not supported inputs, and a request for one may answer 404. Either date is null when the live rows do not carry that body's last or next meeting.

The one chain to know: GET /api/v1/public/upcoming-agenda-hits returns upcoming classified hits for one allowlisted topicSlug, and every item in data.hits carries a matchId. GET /api/v1/public/agenda-hits/{matchId} reads one hit by that id. No public route publishes an id list, so a matchId comes only from a hit that was returned: an empty upcoming result does not prove that a hit exists or that any particular id resolves.

Each route also has an operation page in the API reference: listDfwResearchCoverage, listRecentAgendaHits, getAgendaHit, listUpcomingAgendaHits, listPublicSourceStatuses, and getPublicBodyCadence. Each one is a Markdown file at /api-reference/<operationId>.md and an agent file at /api-reference/<operationId>/llms.txt.

Rate limit: each public route allows 120 requests per 60 seconds per client IP, counted separately per endpoint, and a refusal is 429 with Retry-After. A response served from cache does not reach the limiter, and a limiter-store failure lets the request through. The API reference states the limits in full.

  • GET /api/v1/public/coverage — the dated DFW research catalog: catalogVersion, researchDate, scope, per-family evidence codes, and known gaps. It is research evidence, not a live count of sources or records.
  • GET /api/v1/public/agenda-hits — up to three recent classified DFW hits, filterable by an allowlisted jurisdictionSlug and topicSlug, each with meetingAt and sourceUrl.
  • GET /api/v1/public/agenda-hits/{matchId} — one agenda hit by a matchId from the upcoming route. A malformed id is 400 invalid_parameter; an unknown id is 404 not_found.
  • GET /api/v1/public/upcoming-agenda-hits — upcoming classified hits for one allowlisted topicSlug from the coverage set, paged by cursor or the legacy page parameter, and the only public route that returns matchId.
  • GET /api/v1/public/source-status — live health for the featured DFW meeting sources. It does not cover every catalog entry.
  • GET /api/v1/public/jurisdictions/{slug}/bodies/{bodySlug}/cadence — when one public body last met and when it is next scheduled, read from the live meeting rows for a published coverage pair.
List upcoming hits, then read two meeting cadencesbash
curl --fail --silent --show-error \
  'https://aicdapi.com/api/v1/public/upcoming-agenda-hits?topicSlug=zoning'

curl --fail --silent --show-error \
  'https://aicdapi.com/api/v1/public/jurisdictions/dallas/bodies/city-council/cadence'

curl --fail --silent --show-error \
  'https://aicdapi.com/api/v1/public/jurisdictions/dallas-county/bodies/commissioners-court/cadence'

Read the evidence codes

  • M means a public machine-readable query, sample, or count succeeded.
  • D means a public record or document was opened and read.
  • P means an official source or portal was found, but record extraction was not proved.
  • R means access, terms, account, payment, or reuse restrictions need resolution.
  • U means no source was proved in this pass. It does not mean unavailable.
  • N means the family or named subtype is explicitly not applicable.