Skip to main content

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.

Read-onlyJSON over HTTPSBearer key2,000 requests/key/dayIncluded with Professional

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:

Base URL
https://www.clearancesearchengine.com/api/v1
curl
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"
Python
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"])
JavaScript
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.

Header
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.

Envelope
{
  "data": [ /* … */ ],
  "page": 1,
  "per_page": 25,
  "total": 812
}

Response format

  • Successful responses wrap results in a data field.
  • Every response includes an attribution string. 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 AM; outcomes are upper-case (GRANTED, DENIED, REVOKED); level is HEARING or APPEAL.

Errors

Errors use standard HTTP status codes and a consistent body.

StatuscodeWhen
400bad_requestA parameter was malformed (for example, a non-integer case id).
401unauthorizedMissing, malformed, unknown, or revoked key.
404not_foundNo case exists with that id.
429quota_exceededThe key’s daily quota is exhausted; it resets at 00:00 UTC.
Error body
{
  "error": {
    "code": "quota_exceeded",
    "message": "Daily quota of 2000 requests reached; resets at 00:00 UTC."
  }
}

Endpoints

GETGET /api/v1/cases

Search 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

ParameterTypeDescription
qstringFull-text search across the decision text.
guidelinestringA single guideline letter, AM.
outcomestringgranted or denied.
levelstringhearing or appeal.
year_fromintegerEarliest decision year (YYYY).
year_tointegerLatest decision year (YYYY).
pageinteger1-based page number. Default 1.
per_pageintegerResults per page. Default 25, maximum 50.
Request
curl -H "Authorization: Bearer case_live_…" \
  "https://www.clearancesearchengine.com/api/v1/cases?guideline=F&outcome=granted&year_from=2024&per_page=2"
Response
{
  "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)…"
}
GETGET /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

ParameterTypeDescription
id *integerThe numeric case id (the id from a search result, or the number in a /case/… URL).
Request
curl -H "Authorization: Bearer case_live_…" \
  "https://www.clearancesearchengine.com/api/v1/cases/28471"
Response (abbreviated)
{
  "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.

GETGET /api/v1/stats

Granted 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

ParameterTypeDescription
bystringyear (default) or guideline.
guidelinestringRestrict to one guideline letter, AM.
year_fromintegerEarliest decision year (YYYY).
year_tointegerLatest decision year (YYYY).
Request
curl -H "Authorization: Bearer case_live_…" \
  "https://www.clearancesearchengine.com/api/v1/stats?by=year&guideline=F&year_from=2019"
Response
{
  "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.

GETGET /api/v1/recency

Time 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

ParameterTypeDescription
guidelinestringOptional single concern letter: H drugs, G alcohol, J criminal, D sexual behavior, K protected information, M IT misuse.
Request
curl -H "Authorization: Bearer case_live_…" \
  "https://www.clearancesearchengine.com/api/v1/recency?guideline=H"
Response
{
  "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.

GETGET /api/v1/candor

How 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.

Request
curl -H "Authorization: Bearer case_live_…" \
  "https://www.clearancesearchengine.com/api/v1/candor"
Response
{
  "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 attribution field 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.