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.
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.
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.
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.
Search the document corpus, models, benchmarks, and incidents in one call.
| Name | Type | Description |
|---|---|---|
| q | string | The query. Fewer than two characters returns an empty result set rather than an error. |
| page | integer | Page number, 1-based. Defaults to 1. Fifteen results per page. |
| corpus | string | Scope the results to one corpus: library, models, benchmarks, incidents, or patents. totals still reports the full breakdown. research is accepted as an alias for library — the research index merged into it on 2026-07-26 — and no longer appears in totals. |
| facets | flag | Pass facets=1 to skip the search entirely and get per-corpus counts plus the subject topic list. |
curl -H "Authorization: Bearer sk44b_…" \ "https://44b.nysgpt.com/api/v1/search?q=frontier%20model"
const res = await fetch(
"https://44b.nysgpt.com/api/v1/search?q=" + encodeURIComponent("frontier model"),
{ headers: { Authorization: "Bearer sk44b_…" } },
)
if (!res.ok) throw new Error((await res.json()).error)
const data = await res.json()
console.log(data.total, data.results[0].title)import requests
res = requests.get(
"https://44b.nysgpt.com/api/v1/search",
params={"q": "frontier model"},
headers={"Authorization": "Bearer sk44b_…"},
)
res.raise_for_status()
data = res.json()
print(data["total"], data["results"][0]["title"]){
"query": "frontier model",
"page": 1,
"pageSize": 15,
"total": 73,
"totals": {
"library": 2081,
"models": 0,
"benchmarks": 2,
"incidents": 11
},
"corpus": null,
"results": [
{
"id": "2607.08700",
"corpus": "library",
"title": "Do You Need a Frontier Model as a Citation Verifier? …",
"href": "/library/2607.08700",
"ref": "Paper",
"date": "2026-07-09",
"desc": "Reinforcement learning increasingly relies on an LLM judge to score each rubric criterion, and that judge acts as the reward model during training…",
"url": "44b.nysgpt.com/library/2607.08700",
"score": 600
},
{
"id": "how-did-the-government-decide-openai-s-frontier-model-was-safe-to-release-10zxkv",
"corpus": "incidents",
"title": "How did the government decide OpenAI's frontier model was safe to release?",
"href": "/incidents/how-did-the-government-decide-openai-s-frontier-model-…",
"ref": "Moderate",
"date": "2026-07-09",
"desc": "CSET's Mina Narayanan shared her expert insight in an article published by TechCrunch. The article explores the lack of transparency surrounding…",
"url": "44b.nysgpt.com/incidents/how-did-the-government-decide-openai-s-frontier-…",
"score": 600
},
{
"id": "2604.18487",
"corpus": "library",
"title": "Adversarial Humanities Benchmark: Results on Stylistic Robustness in Frontier Model Safety",
"href": "/library/2604.18487",
"ref": "Paper",
"date": "2026-04-20",
"desc": "The Adversarial Humanities Benchmark (AHB) evaluates whether model safety refusals survive a shift away from familiar harmful prompt forms…",
"url": "44b.nysgpt.com/library/2604.18487",
"score": 600
}
]
}pageSize is always 15.corpus filter.corpus, so filter chips can show real counts.null./library/2607.08700.YYYY-MM-DD, or a bare year when that is all the source records. May be absent.Ask the corpora a question in prose. Every claim carries a citation, and every citation resolves to a real page.
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>.
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?"}'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}`)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"]}')| Name | Type | Description |
|---|---|---|
| question | string | The question, in plain English. Under 8 characters returns invalid_question (400). Sent in the JSON body on POST, or as ?q= on GET. |
| corpus | string | Ground 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. |
| maxSources | integer | How many sources to ground on. Defaults to 8, capped at 12. Also part of the cache key. |
{
"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"
}[1], [2] — indexing into sources.[3] in the answer is the source with n: 3.web, for a page 44B does not hold. A web source is an ordinary numbered entry in the same list.YYYY-MM-DD, or a bare year. May be absent.corpus when every citation is a 44B page, web when none is, mixed when both. Derived from the finished source list.inputTokens, outputTokens, and cachedTokens for the generation. All zero on a cache hit./ask/<id>. Stable across cache refreshes.Connect your own model to the whole corpus. You bring the model; 44B serves the data.
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:
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.
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.
/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.
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.
| Plan | Searches / mo | Per day | Answers / mo | Keys |
|---|---|---|---|---|
| Free | — | — | — | 0 |
| Pro | 10,000 | 1,000 | 200 | 3 |
| Power | 100,000 | 10,000 | 2,000 | 3 |
Free has no API access — the website itself is the free product, and on-site search is unlimited.
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.
Every failure is a JSON body with a stable error code. The last column is what to actually do about it.
| Status | Response body | When it happens | What 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. |
| Status | Response body | When it happens | What 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. |
For client generation, Postman, or anything that reads a spec.
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.
curl -O https://44b.nysgpt.com/openapi.yaml
This panel sticks with you. Pick anything below and it opens right beside it, so you can dig through 60,000-plus records without ever losing your spot here.
Travel 44B
LibraryPapers, policy, standards, statuteLabsEvery organization building AIModelsIntelligence, price, and speedBenchmarksThe evaluation catalogIncidentsAI failures and harmsSearchOne field across everythingDashboardThe state of AI accountability in NY44B RegistryThe Art. 44-B compliance portal