API reference

Parameters, response shapes, rate limits, and errors for every 44B endpoint — with each example in curl, JavaScript, and Python. If you are deciding whether the API is for you, start at /developers, which explains what the corpus contains and walks a first call end to end.

Authentication

Two authenticated endpoints over every corpus 44B holds: search returns the same blend the website searches, and answer turns that blend into a cited answer.

Base URL

https://44b.nysgpt.com/api/v1

Responses are JSON. /search is a GET; /answer takes a POST body and also accepts GET ?q=. Nothing here writes to 44B.

Sending your key

Send your key as a bearer token. x-api-key is accepted as an alternative for clients that cannot set an authorization header.

Authorization: Bearer sk44b_…
x-api-key: sk44b_…

Keys are created at /account and come with the Pro and Power plans — see pricing. A key is shown once, at creation; 44B stores only its hash.

POST /api/v1/answer

Ask the corpora a question in prose. Every claim carries a citation, and every citation resolves to a real page.

How it works

The question is run through the same multi-corpus retrieval that backs /api/v1/search, and only the retrieved records are passed to the model. It never falls back on the model’s own knowledge.

When retrieval comes back thin for a question — few sources, or nothing that actually covers its subject — or when the question names an outside site or a URL, the model is also given a web search tool, capped at two searches. Anything it finds that way enters the same numbered sources list, with corpus: "web" and an absolute href. Nothing else about it differs: the citation carries the same weight, and a claim with no source behind it is still a defect. grounding on the response says which way an answer went.

Identical questions are cached for seven days. A cached answer costs no tokens and no quota, and returns cached: true. The cache key covers the question, corpus, and maxSources, so a scoped ask is never served an unscoped answer.

GET ?q=… is accepted as well, so the endpoint is curl-able without a JSON body. Answers are also available on the site itself, in the Ask 44B panel — and each one has a shareable permalink at /ask/<id>.

Example request

curl
curl -X POST "https://44b.nysgpt.com/api/v1/answer" \
  -H "Authorization: Bearer sk44b_…" \
  -H "Content-Type: application/json" \
  -d '{"question": "What does the incident record show about algorithmic decision systems used in benefits?"}'
JavaScript
const res = await fetch("https://44b.nysgpt.com/api/v1/answer", {
  method: "POST",
  headers: {
    Authorization: "Bearer sk44b_…",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    question: "What does the incident record show about algorithmic decision systems used in benefits?",
  }),
})

const { answer, sources, cached } = await res.json()
for (const s of sources) console.log(`[${s.n}] ${s.title} — ${s.href}`)
Python
import requests

res = requests.post(
    "https://44b.nysgpt.com/api/v1/answer",
    headers={"Authorization": "Bearer sk44b_…"},
    json={"question": "What does the incident record show about algorithmic decision systems used in benefits?"},
)
res.raise_for_status()

data = res.json()
print(data["answer"])
for s in data["sources"]:
    print(f'[{s["n"]}] {s["title"]} — {s["href"]}')

Parameters

NameTypeDescription
questionstringThe question, in plain English. Under 8 characters returns invalid_question (400). Sent in the JSON body on POST, or as ?q= on GET.
corpusstringGround the answer in one corpus only: library, models, benchmarks, incidents, or patents. Changes the cache key, so a scoped ask is never served a whole-corpus answer.
maxSourcesintegerHow many sources to ground on. Defaults to 8, capped at 12. Also part of the cache key.

200 OK

{
  "question": "What does the incident record show about algorithmic decision systems used in employment or benefits?",
  "answer": "The incident record here contains one relevant entry, and it concerns benefits rather than employment: a French welfare fraud detection algorithm that a coalition of 15 human rights groups alleged discriminates against single mothers and disabled people by assigning risk scores that trigger investigations [7]. That entry is an allegation on the record … [1] … [2]",
  "sources": [
    {
      "n": 1,
      "corpus": "library",
      "title": "Fairness vs Performance: Characterizing the Pareto Frontier of Algorithmic Decision Systems",
      "href": "/library/2605.10604",
      "date": "2026-05-11"
    },
    {
      "n": 2,
      "corpus": "library",
      "title": "Examining the Nature and Dimensions of Artificial Intelligence Incidents: A Machine Learning Text Analytics Approach",
      "href": "/library/paper-284678599",
      "date": "2026-01-01"
    },
    {
      "n": 3,
      "corpus": "library",
      "title": "A Comprehensive Review of Explainable Generative AI for Healthcare …",
      "href": "/library/paper-289238467",
      "date": "2026-01-01"
    }
  ],
  "cached": false,
  "grounding": "corpus",
  "usage": {
    "inputTokens": 1145,
    "outputTokens": 427,
    "cachedTokens": 1227
  },
  "id": "h8qHgLOX7Vg"
}

Fields

question
Echoes the question the answer was generated from.
answer
The answer. Every claim carries a bracketed citation — [1], [2] — indexing into sources.
sources[].n
The citation number. [3] in the answer is the source with n: 3.
sources[].corpus
Where the source came from: library, models, benchmarks, incidents, patents — or web, for a page 44B does not hold. A web source is an ordinary numbered entry in the same list.
sources[].title
The record title.
sources[].href
Path to the record on 44B, or an absolute URL when the source is a page 44B does not hold. Every citation resolves to a real page either way.
sources[].date
ISO YYYY-MM-DD, or a bare year. May be absent.
cached
True when the answer was served from the 7-day cache. A cached answer costs no tokens and no quota.
grounding
corpus when every citation is a 44B page, web when none is, mixed when both. Derived from the finished source list.
usage
inputTokens, outputTokens, and cachedTokens for the generation. All zero on a cache hit.
id
The answer’s permalink id — readable at /ask/<id>. Stable across cache refreshes.

MCP server

Connect your own model to the whole corpus. You bring the model; 44B serves the data.

Connect

44B speaks the Model Context Protocol over Streamable HTTP at the URL below, authenticated with the same sk44b_ key as the REST API — no separate signup, no separate quota.

https://44b.nysgpt.com/api/mcp
Authorization: Bearer sk44b_…

In Claude Code, one line adds it:

shell
claude mcp add --transport http 44b https://44b.nysgpt.com/api/mcp \
  --header "Authorization: Bearer sk44b_…"

Claude Desktop and Cursor take the same URL and header in their MCP settings. In claude.ai on the web, a fixed header is entered once by an organisation admin through the static-headers connector option; individual sign-in with an account rather than a key is the next phase of this work.

What it costs you

Each tool call is one request against the same counters as /api/v1/search: 10,000 a month on Pro (1,000 a day), 100,000 a month on Power (10,000 a day). A question usually costs one to three calls, so the monthly figure goes considerably further here than the number suggests. Exhausting a window returns the same rate_limited body documented below.

corpus_status is free and never metered — a model should never be discouraged from checking how current the data is. The server is strictly read-only: nothing in it writes, files, or submits. Filings that Article 44-B makes confidential are never returned, in whole or in part.

Tools

search_corpus
The entry point — one ranked search across the document corpus, models, benchmarks, and incidents.
query_models
Released models by intelligence, price, speed, licence, lab, or year.
query_providers
Who serves a model, at what price and throughput. The one no training corpus contains.
query_incidents
The incident record with severity, category, and date filters, plus aggregate counts.
query_benchmarks
The benchmark catalogue — what each measures, model coverage, citations.
get_document
One document or paper in depth: metadata, abstract, and a bounded body excerpt.
query_filings
The public Art. 44-B docket and the registered-developer list. Confidential filings are never returned.
query_labs
The curated lab layer and each lab’s own publications — absent from search_corpus by design.
corpus_status
Live row counts and the newest record in every corpus. Free: it never counts against your quota.

The 44B agent — /chat

/chat is a signed-in conversational surface where an agent answers by querying the live database directly — nine tools over the live database, covering full-text search across every corpus, model metrics, provider pricing, the incident record, the benchmark catalogue, the public Art. 44-B docket, the lab layer, and live corpus counts. Each tool call is shown as it runs, and every claim links the page it came from, so an answer can be checked against the record rather than trusted. It is not an API endpoint and has no key: turns are metered per account against the same monthly allowance as answers (200 on Pro, 2,000 on Power), tallied separately so heavy use of one does not consume the other.

Rate limits & plans

Search is metered on two UTC windows — a monthly quota and a daily burst ceiling one tenth its size. Answers are metered on their own monthly quota, shared with the on-site Ask 44B panel; cached answers count against neither.

By plan

PlanSearches / moPer dayAnswers / moKeys
Free0
Pro10,0001,0002003
Power100,00010,0002,0003

Free has no API access — the website itself is the free product, and on-site search is unlimited.

Response headers

X-RateLimit-Limit
The ceiling for whichever window you are closest to exhausting.
X-RateLimit-Remaining
Calls left in that window.
X-RateLimit-Window
day or month — which window the two headers above describe.

The headers describe whichever window you will hit first, so a client watching one number still sees the real wall. A Pro key that has made 50 calls today reports the 1,000/day ceiling; late in a heavy month it switches to the 10,000/month quota.

Errors

Every failure is a JSON body with a stable error code. The last column is what to actually do about it.

All endpoints

StatusResponse bodyWhen it happensWhat to do
401invalid_api_key
{ "error": "invalid_api_key",
  "message": "That key is unknown or revoked." }
No key was presented, or the key is unknown or has been revoked. A missing key returns the same code with a message pointing at the header format.Check the header is exactly Authorization: Bearer sk44b_… — a bare key with no Bearer prefix is the usual cause. Create or replace a key at /account.
403plan_required
{ "error": "plan_required",
  "message": "API access comes with Pro. Upgrade at /pricing." }
The key is valid but its owner is on a plan without API access — usually a lapsed subscription. The key survives; access does not.Subscribe or resubscribe at /pricing. The same key starts working again — you do not need to issue a new one.
429rate_limited
{ "error": "rate_limited",
  "limit": 1000,
  "window": "day",
  "retry_at": "2026-07-26T00:00:00.000Z" }
window: "day" means the daily burst ceiling; window: "month" means the monthly quota.Read window to see which ceiling you hit, and wait until retry_at — the next UTC midnight for a day window, the first of the next UTC month for a month window. Watch X-RateLimit-Remaining to avoid it.

/api/v1/answer only

StatusResponse bodyWhen it happensWhat to do
400invalid_question
{ "error": "invalid_question",
  "message": "Ask a real question — at least 8 characters." }
The question was missing or shorter than eight characters.Send at least eight characters in question. On /search a too-short q is not an error — it returns an empty result set.
404no_sources
{ "error": "no_sources",
  "message": "Nothing I hold matched that." }
Retrieval found nothing to ground an answer on. No model call was made and no quota was consumed.Broaden the question, or drop the corpus filter if you set one. Running the same words through /api/v1/search first shows you what 44B actually holds.
422declined
{ "error": "declined",
  "message": "That question could not be answered from what I can cite." }
The question fell outside what the model will answer — the corpus holds a great deal of AI-security and bio/cyber evaluation material, so this is a live case. Nothing is fabricated in its place.Rephrase toward what the record documents rather than how to reproduce it. No quota was consumed, so a retry costs nothing.

OpenAPI

For client generation, Postman, or anything that reads a spec.

Specification

The full OpenAPI 3.1 description of this API is served at /openapi.yaml. Point a generator at it and you have a typed client in any language this page does not show an example in.

shell
curl -O https://44b.nysgpt.com/openapi.yaml