CASE Developer API · v1
The clearance record, as an 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 clean 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.
Pull 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"
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 a key goes over, requests return 429 quota_exceeded until the reset. For steady jobs, spread requests across the day and cache what you have already pulled. Need a higher ceiling or a bulk arrangement? Write to us and describe 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 used up; 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 (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 plain 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 (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 (clearancesearchengine.com)…"
}Counts are descriptive tallies of what was decided. They are not rates to predict any pending case, and small groups can move a lot year to year.
Terms & 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.
Questions, a higher quota, or a bulk arrangement? Contact us. Read-only. Not affiliated with DOHA, DCSA, DoD, or the U.S. Government.