CASE Developer API · v1
Developer API
A read-only REST API over the entire decided public DOHA security-clearance record, more than 30,000 decisions since 1996. The same data the site shows, as JSON, for research pipelines, internal tools, and scripts. Descriptive record only: no predictions, and never any user data.
Search the record
Query decisions by concern (Guideline A–M), outcome, judge, hearing or appeal, and year, with true totals and paging.
Retrieve a full case
The aligned record for any decision: guidelines with rulings, mitigations the judge credited, the ¶ conditions, and the appeal outcome.
Query the statistics
Granted and denied counts by year or by guideline, the same population and numbers that drive the Insights page.
Quick start
Every endpoint lives under one base URL, requires a Bearer key, and returns JSON. Create a key on your Account page (Professional), then make your first request:
https://www.clearancesearchengine.com/api/v1
curl -H "Authorization: Bearer case_live_your_key_here" \ "https://www.clearancesearchengine.com/api/v1/cases?guideline=F&outcome=granted&year_from=2020&per_page=5"
import requests
r = requests.get(
"https://www.clearancesearchengine.com/api/v1/cases",
headers={"Authorization": "Bearer case_live_your_key_here"},
params={"guideline": "F", "outcome": "granted", "year_from": 2020, "per_page": 5},
)
for case in r.json()["data"]:
print(case["case_number"], case["outcome"], case["decision_date"])const res = await fetch(
"https://www.clearancesearchengine.com/api/v1/cases?guideline=F&outcome=granted&year_from=2020&per_page=5",
{ headers: { Authorization: "Bearer case_live_your_key_here" } },
);
const { data } = await res.json();
for (const c of data) console.log(c.case_number, c.outcome, c.decision_date);Authentication
Send your key as a Bearer token on the Authorization header. Keys look like case_live_ followed by 48 hex characters, and the full key is shown only once, at creation. You can hold up to two active keys per account, and revoke either at any time from your Account page.
Authorization: Bearer case_live_1a2b3c...
A missing, malformed, unknown, or revoked key returns 401 unauthorized. Keep keys secret; treat one like a password.
Rate limits
Each key is allowed 2,000 requests per day, counted per calendar day in UTC and reset at 00:00 UTC. Once the quota is exceeded, requests return 429 quota_exceeded until the reset. For steady jobs, spread requests across the day and cache what you have already pulled. For a higher ceiling or a bulk arrangement, contact us with a description of the project.
Pagination
List endpoints are paged. Pass page (1-based, default 1) and per_page (default 25, maximum 50). Every list response carries page, per_page, and total, the true count across all pages, so you can loop until page × per_page ≥ total.
{
"data": [ /* … */ ],
"page": 1,
"per_page": 25,
"total": 812
}Response format
- Successful responses wrap results in a
datafield. - Every response includes an
attributionstring. Display it on any published use of the data (see Terms). - Dates are ISO 8601. Names, summaries, and rulings are the public-record values shown on the site.
- Guideline letters are
A–M; outcomes are upper-case (GRANTED,DENIED,REVOKED); level isHEARINGorAPPEAL.
Errors
Errors use standard HTTP status codes and a consistent body.
| Status | code | When |
|---|---|---|
| 400 | bad_request | A parameter was malformed (for example, a non-integer case id). |
| 401 | unauthorized | Missing, malformed, unknown, or revoked key. |
| 404 | not_found | No case exists with that id. |
| 429 | quota_exceeded | The key’s daily quota is exhausted; it resets at 00:00 UTC. |
{
"error": {
"code": "quota_exceeded",
"message": "Daily quota of 2000 requests reached; resets at 00:00 UTC."
}
}Endpoints
GET /api/v1/casesSearch decided cases. Uses the same filter engine as the site’s search, so API results match the website exactly. Returns a paged list, newest decision first.
Parameters
| Parameter | Type | Description |
|---|---|---|
q | string | Full-text search across the decision text. |
guideline | string | A single guideline letter, A–M. |
outcome | string | granted or denied. |
level | string | hearing or appeal. |
year_from | integer | Earliest decision year (YYYY). |
year_to | integer | Latest decision year (YYYY). |
page | integer | 1-based page number. Default 1. |
per_page | integer | Results per page. Default 25, maximum 50. |
curl -H "Authorization: Bearer case_live_…" \ "https://www.clearancesearchengine.com/api/v1/cases?guideline=F&outcome=granted&year_from=2024&per_page=2"
{
"data": [
{
"id": 28471,
"case_number": "24-02030",
"decision_date": "2026-03-12",
"outcome": "GRANTED",
"level": "HEARING",
"guidelines": ["F"],
"judge": "Candace Le'i Garcia",
"summary": "The applicant mitigated financial considerations concerns related to 11 delinquent debts totaling $49,549…",
"url": "https://www.clearancesearchengine.com/case/28471"
}
],
"page": 1,
"per_page": 2,
"total": 812,
"attribution": "Data: CASE, Clearance Adjudication Search Engine and Knowledge Base (clearancesearchengine.com)…"
}GET /api/v1/cases/{id}One decision’s full aligned record: the standardized facts, each guideline with its ruling, the judge and representation, the mitigation ladder and the specific ¶ conditions, a concise synopsis, and the appeal outcome where one exists.
Path parameter
| Parameter | Type | Description |
|---|---|---|
id * | integer | The numeric case id (the id from a search result, or the number in a /case/… URL). |
curl -H "Authorization: Bearer case_live_…" \ "https://www.clearancesearchengine.com/api/v1/cases/28471"
{
"data": {
"id": 28471,
"case_number": "24-02030",
"year": 2026,
"decision_date": "2026-03-12",
"outcome": "GRANTED",
"level": "HEARING",
"case_type": "STANDARD_ISCR",
"judge": "Candace Le'i Garcia",
"representation": "Pro se",
"guidelines": [{ "code": "F", "outcome": "for_applicant" }],
"posture": "hearing",
"answers": { "admitted": 9, "denied": 2 },
"subtypes": [{ "guideline": "F", "subtype": "delinquent_consumer_debt", "findings": "…" }],
"ladder": { "claimed": 5, "documented": 4, "credited": 3 },
"credited": ["good-faith effort to resolve", "conditions largely beyond the person's control"],
"dq_conditions": ["¶ 19(a)", "¶ 19(c)"],
"mit_conditions": ["¶ 20(b)", "¶ 20(d)"],
"aggravators": [],
"synopsis": "Debts arose during a period of unemployment; applicant documented payment plans…",
"appeal": null,
"url": "https://www.clearancesearchengine.com/case/28471"
},
"attribution": "Data: CASE, Clearance Adjudication Search Engine and Knowledge Base (clearancesearchengine.com)…"
}Fields that were not established in a given decision come back as null or an empty list rather than being omitted.
GET /api/v1/statsGranted and denied counts over decided hearing-level ISCR decisions, grouped by year or by guideline. Same population and rules as the Insights page, so the numbers reconcile.
Parameters
| Parameter | Type | Description |
|---|---|---|
by | string | year (default) or guideline. |
guideline | string | Restrict to one guideline letter, A–M. |
year_from | integer | Earliest decision year (YYYY). |
year_to | integer | Latest decision year (YYYY). |
curl -H "Authorization: Bearer case_live_…" \ "https://www.clearancesearchengine.com/api/v1/stats?by=year&guideline=F&year_from=2019"
{
"data": [
{ "year": 2019, "granted": 402, "denied": 611 },
{ "year": 2020, "granted": 388, "denied": 590 }
],
"scope": {
"population": "decided hearing-level STANDARD_ISCR decisions",
"granted": "GRANTED",
"denied": "DENIED or REVOKED",
"by": "year",
"guideline": "F",
"year_from": 2019,
"year_to": null
},
"attribution": "Data: CASE, Clearance Adjudication Search Engine and Knowledge Base (clearancesearchengine.com)…"
}Counts are descriptive tallies of what was decided. They are not rates to predict any pending case, and small groups can vary widely from year to year.
GET /api/v1/recencyTime between the most recent conduct and the decision, for the incident-type concerns (drugs, alcohol, criminal conduct, sexual behavior, protected information, IT misuse). Median years before favorable vs unfavorable decisions, with counts. Same measured data as the Time since conduct page.
Parameters
| Parameter | Type | Description |
|---|---|---|
guideline | string | Optional single concern letter: H drugs, G alcohol, J criminal, D sexual behavior, K protected information, M IT misuse. |
curl -H "Authorization: Bearer case_live_…" \ "https://www.clearancesearchengine.com/api/v1/recency?guideline=H"
{
"data": [
{ "guideline": "H", "concern": "drug involvement",
"dated_cases": 2886, "ongoing_at_decision": 121,
"median_years_before_favorable": 2.5,
"median_years_before_unfavorable": 2.1 }
],
"scope": { "population": "decided hearing-level STANDARD_ISCR cases whose text dates the most recent conduct", "guideline": "H" },
"attribution": "Data: CASE, Clearance Adjudication Search Engine and Knowledge Base…"
}An association in decided history, never a prediction. Each date is verified against a quote in the decision; undated conduct is not counted.
GET /api/v1/candorHow cases with a candor allegation (falsification, omission, or lack of candor) were resolved: favorable rate with vs without such an allegation, deliberate vs rebutted, and corrected-before-confrontation. Same measured data as the Candor page.
No parameters.
curl -H "Authorization: Bearer case_live_…" \ "https://www.clearancesearchengine.com/api/v1/candor"
{
"data": {
"no_candor_allegation": { "cases": 20544, "favorable": 8005, "favorable_pct": 39 },
"candor_allegation_made": { "cases": 5838, "favorable": 1059, "favorable_pct": 18.1 },
"judge_found_deliberate": { "cases": 4149, "favorable": 132, "favorable_pct": 3.2 },
"applicant_rebutted_allegation": { "cases": 1209, "favorable": 749, "favorable_pct": 62 },
"corrected_record_before_confrontation": { "cases": 189, "favorable": 126, "favorable_pct": 66.7 }
},
"attribution": "Data: CASE, Clearance Adjudication Search Engine and Knowledge Base…"
}Descriptive of decided cases; an allegation is not a finding, and nothing here predicts any pending case.
Versioning and stability
- The API is versioned in the path; this documentation covers
v1. - Additive changes (new fields, new optional parameters) may appear without notice. Build clients that ignore fields they do not recognize.
- Breaking changes only ever arrive as a new version path. The prior version keeps running, with its retirement date posted on this page well in advance.
- The record itself grows as DOHA publishes new decisions (ingested nightly), and verified extraction corrections are applied corpus-wide, so responses can gain rows or improve over time.
AI connector (MCP)
CASE supports the Model Context Protocol, the standard AI assistants use to reach outside tools. Once connected, an assistant can search the decided record, open a case, find similar cases, compute statistics and timelines, and read the measured series on time since conduct and candor outcomes, citing CASE pages in its answers.
https://www.clearancesearchengine.com/api/mcp
- Claude (claude.ai or the desktop app): Settings → Connectors → Add custom connector, then paste the URL above.
- ChatGPT: Settings → Connectors (where custom MCP connectors are supported on your plan), then paste the URL.
- Cursor and other MCP clients: add a remote MCP server with the URL above (streamable HTTP transport).
- No key needed for a free allowance of 200 tool calls per day. Add your API key as an
Authorization: Bearer case_live_…header for the full API quota; Professional entitlements are attached to the key. - Tools exposed:
search_cases,get_case,similar_cases,get_statistics,get_timelines,get_conduct_recency,get_candor_outcomes. Read-only, public record only. - A plain-language walkthrough for non-developers is at the connector page.
Terms and fair use
- The data is the decided public record, descriptive only. Do not present it as a prediction, as legal advice, or as a rating or score of any judge, attorney, or applicant.
- Attribute published uses: “Data: CASE (clearancesearchengine.com)”. The
attributionfield in every response carries the full line. - Build on the record; do not bulk-mirror or resell the corpus as a dataset, and do not re-host it as a competing copy.
- The API is read-only and returns only the public record. It never exposes user data, uploads, or accounts, yours or anyone else’s.
- Access is included with an active Professional plan and follows the same Terms of Service.
For questions, a higher quota, or a bulk arrangement, contact us. Not affiliated with DOHA, DCSA, DoD, DoE, or the U.S. Government.