Georgia Commons

API reference

Endpoints

Every route the API serves, grouped by collection, with its parameters. All of them are public reads except the two chat routes, which are the site's own.

Machine-readable https://georgiacommons.org/api/endpoints.md · https://georgiacommons.org/index.md · MCP https://mcp.georgiacommons.org/mcp

At a glance

Every collection answers the same eight routes below https://api.georgiacommons.org/api/{collection}, where the collection is code, bills, or opinions. Learn these and the rest is each collection's own document addresses.

RouteWhat it does
``The collection's root: its routes, and its coverage sentence with the qualifications.
/metaCoverage, counts, and corpus version, computed from the store at request time.
/searchFull-text search. Add in=headings to search only headings and titles.
/items?ids=Up to 20 documents in one request.
/verifyWhether a quotation appears verbatim in the stored text. POST.
/index/markdownThe collection's map: every unit at routing depth, one line each.
/about/markdownProvenance, coverage, license, and the independence statement.
/search/markdownThe same search as Markdown, about ten hits with snippets.
/sitemap-entriesDocument ids, for enumerating the collection. Bills and opinions give the whole list with dates; the Code pages it.

Reads need no key and no account. The full rules for identifiers, caching, and rate limits are on getting started.

Bills

Bills of the Georgia General Assembly, addressed by session and number. The doubled segment in /api/bills/bills/... is not a typo: the first is the collection, the second the resource.

GET/api/{slug}

A collection's root (/api/bills, /api/opinions, /api/code): its routes, and its coverage sentence with the qualifications.

GET/api/bills/meta

Coverage, counts, sessions, and corpus version.

GET/api/bills/recent

Bills with the newest activity first.

  • limit: 1 to 100, default 20
  • offset: 0 to 10000
GET/api/bills/filtered

The same slim list, narrowed.

  • session: a session slug such as 2025-2026
  • chamber: H or S
  • bill_type: B, R, CR, or JR
  • status: a LegiScan status code
  • q: at least two characters
  • limit, offset: as above
GET/api/bills/search

Full-text search over bill text, titles, and the labeled summaries. A bare bill number is a direct lookup.

  • q: required, 1 to 300 characters
  • in: headings to search only titles, tags, and subjects
  • session, chamber, bill_type, status: as above
  • limit: 1 to 100, default 20
GET/api/bills/sessions

Every session with its bill count.

GET/api/bills/sessions/{session}

One session: counts by kind, its caption subjects, and a window of bills.

  • kind: hb, sb, hr, or sr
  • start: 0 or more
  • limit: 1 to 500, default 500
GET/api/bills/resolve

Where a written bill reference leads. Accepts HB 136, H.B. 136, hb-136, House Bill 136, with or without a session.

  • q: 1 to 200 characters
GET/api/bills/bills/{session}/{number}

One bill: sponsors, status, history, and the labeled summaries. The bill text is not included.

GET/api/bills/bills/{session}/{number}/full-text

The stored bill text with minimal metadata, as JSON.

GET/api/bills/bills/{session}/{number}/text

The bill text alone as text/plain. The page and its twin are named in the Link header.

GET/api/bills/bills/{session}/{number}/markdown

The bill's Markdown twin: frontmatter, the text as filed, then the labeled summaries.

  • full=1: add history, votes, and amendments
GET/api/bills/items

Several bills at once, with their text. Up to 20 a call; the response names the rest in next_ids.

  • ids: a comma-separated list, 1 to 2000 characters
POST/api/bills/verify

Whether a quotation appears verbatim in the stored bill, after the same normalization the ingestion quote filter uses. in names the reading that matched: text (the words as printed), text_as_amended (struck passages left out), or text_before_amendment (added passages left out).

  • body: {"id": ..., "quote": ...}
  • quotes shorter than 12 characters are refused with a 422
GET/api/bills/index/markdown

The map: sessions with their counts, kinds, and caption subjects.

GET/api/bills/about/markdown

Provenance, coverage, license, and the independence statement.

GET/api/bills/search/markdown

The same search as Markdown: about ten hits with an id, a title, a status, a snippet, and a URL.

  • q: required
  • session, in: as above
  • limit: 1 to 40, default 10
GET/api/bills/sessions/{session}/markdown

One session as Markdown, 500 bills a page.

  • type: hb, sb, hr, or sr
  • start: where the page begins
GET/api/bills/sitemap-entries

Every bill id with its date. No ETag on this one.

POST/api/bills/bills/{bill_id}/askSite only

The grounded question answering behind the chat panel on a bill page, streamed. This one route holds a server-side key and is not part of the public API.

Opinions

Opinions of the Supreme Court of Georgia, addressed by docket number. A CourtListener id or a lower-case docket redirects to the docket address.

GET/api/opinions/meta

Coverage, counts, years, and corpus version.

GET/api/opinions/recent

Opinions with the newest filing date first.

  • limit: 1 to 100, default 20
  • offset: 0 to 10000
GET/api/opinions/filtered

The same slim list, narrowed.

  • year: a comma-separated list
  • case_type: a comma-separated list
  • q: at least two characters
  • limit, offset: as above
GET/api/opinions/search

Full-text search over opinion text, case names, and the labeled summaries. A bare docket or reporter citation is a direct lookup.

  • q: required, 1 to 300 characters
  • in: headings to search only names, legal areas, and case type
  • year: 1900 to 2100
  • case_type
  • limit: 1 to 100, default 20
GET/api/opinions/search-by-name

Search case names alone. Prefix matches rank first.

  • q: at least two characters
  • limit: 1 to 100, default 20
GET/api/opinions/years

Every year with its opinion count.

GET/api/opinions/years/{year}

One year: counts by case type and a window of opinions.

  • case_type
  • start: 0 or more
  • limit: 1 to 400, default 400
GET/api/opinions/resolve

Where a written reference leads. Accepts a docket in any case, a reporter citation in 883 S.E.2d 746, 883 SE2d 746, or 308 Ga. 283 form, a CourtListener id, or a case name.

  • q: 1 to 200 characters
GET/api/opinions/cases/{ref}

One opinion by docket, citation, id, or case name. The opinion text is not included.

GET/api/opinions/cases/{docket}/{cluster_id}

One opinion at its stable address, for the 77 dockets that carry more than one row.

  • full: add the summarized reasoning and the checked quotes
GET/api/opinions/cases/{docket}/{cluster_id}/text

The opinion text alone as text/plain.

GET/api/opinions/cases/{docket}/{cluster_id}/markdown

The opinion's Markdown twin: frontmatter, the court's text, then the labeled summaries.

  • full=1: add the reasoning, the checked quotes, and the CourtListener records
GET/api/opinions/cases/{docket}/{cluster_id}/full-text

The stored opinion text with its metadata, as JSON.

GET/api/opinions/items

Several opinions at once, with their text. Up to 20 a call.

  • ids: a comma-separated list, 1 to 2000 characters
POST/api/opinions/verify

Whether a quotation appears verbatim in the stored opinion.

  • body: {"id": ..., "quote": ...}
  • quotes shorter than 12 characters are refused with a 422
GET/api/opinions/index/markdown

The map: years with their counts and case types.

GET/api/opinions/about/markdown

Provenance, coverage, license, and the independence statement.

GET/api/opinions/search/markdown

The same search as Markdown, about ten hits with snippets.

  • q: required
  • year, case_type, in: as above
  • limit: 1 to 40, default 10
GET/api/opinions/years/{year}/markdown

One year as Markdown, 400 opinions a page.

  • case_type
  • start: where the page begins
GET/api/opinions/sitemap-entries

Every opinion id with its date. No ETag on this one.

POST/api/opinions/clusters/{cluster_id}/askSite only

The grounded question answering behind the chat panel on an opinion page, streamed. This one route holds a server-side key and is not part of the public API.

The Code

The Official Code of Georgia Annotated, addressed by citation. Source text only: there is no chat route here, and no model anywhere in this path.

GET/api/code/meta

Coverage sentence and its qualifications, counts, corpus version, release date, and the bulk download addresses.

GET/api/code/tree

Every title with its headings and counts, plus both constitutions.

GET/api/code/sections/{ref}

One section by citation, written any of the ways people write it. Returns every version, whether it is in force now, and the neighboring sections. A range or a list redirects to /items?ids=.

  • version: one stored version rather than the current one
GET/api/code/sections/{ref}/text

The statute text alone as text/plain.

  • version
GET/api/code/sections/{ref}/markdown

The section's Markdown twin.

  • version
  • notes=all: lift the 12,000-character cap on annotations
  • subsection: one subsection, such as a-1
GET/api/code/titles/{title}

One title's chapters, with its articles, parts, and subparts.

GET/api/code/titles/{title}/markdown

The title's map as Markdown.

GET/api/code/titles/{title}/chapters/{chapter}

One chapter's sections, slim.

GET/api/code/titles/{title}/chapters/{chapter}/markdown

The chapter as Markdown.

  • full=1: inline the section text, under a 200,000-character cap
  • start: where the page begins
GET/api/code/search

Full-text search of the Code. A bare citation is a direct lookup; an act's short title returns the section that states it.

  • q: required, 1 to 300 characters
  • in: headings to search only catchlines and headings
  • title: 1 to 99
  • chapter
  • status: active (the default), repealed, reserved, redesignated, superseded, note_only, or all
  • scheme: ocga (the default), ga, or us
  • limit: 1 to 100, default 20
GET/api/code/acts

The short-title index: every name a statute gives itself, with the section that states it.

  • q
  • limit: 1 to 100, default 25
GET/api/code/items

Several sections at once. Up to 20 ids, or a range of up to 40 sections, under a 300,000-character budget.

  • ids: a comma-separated list; 44-7-30..44-7-35 for a range
POST/api/code/verify

Whether a quotation appears verbatim in the stored text.

  • body: {"id": ..., "quote": ...}
  • id is a citation, or ga-const:{slug} or us-const:{slug}
GET/api/code/index/markdown

The map: 53 titles with their chapters, about 50 KB.

GET/api/code/about/markdown

Provenance, coverage, license, and the independence statement.

GET/api/code/acts/markdown

Every short title, alphabetically, as Markdown.

GET/api/code/search/markdown

The same search as Markdown, about ten hits with snippets.

  • q: required
  • title, chapter, status, scheme, in: as above
  • limit: 1 to 40, default 10
GET/api/code/bulk

A JSON listing of the download bundle: the release page, the checksum file, and each asset with its address. Always a listing, never a redirect.

GET/api/code/bulk/{filename}

One asset of the bundle.

GET/api/code/sitemap-entries

Section ids, a page at a time.

  • page: 0 or more; omit it for the list of pages

The constitutions

The Georgia and United States constitutions as printed in the Code, under the same collection. {scheme} is ga or us.

GET/api/code/constitution/{scheme}

The articles and sections, plus any standalone provisions.

GET/api/code/constitution/{scheme}/index/markdown

Every provision, one line each.

GET/api/code/constitution/{scheme}/{citation}

One provision, by slug (art-i-sec-i-para-i) or by citation.

GET/api/code/constitution/{scheme}/{citation}/markdown

The provision's Markdown twin.

  • notes=all
  • subsection
GET/api/code/constitution/{scheme}/{citation}/text

The provision's text alone as text/plain.

The API itself

Two routes that describe the service rather than a document.

GET/

The API's own index: its version, the collections it serves, and where the MCP server is mounted.

GET/health

Whether the process is up and which collections are loaded, with each one's count and corpus version.