CourtListener API endpoint
Searches CourtListener's opinion-search index by text and returns opinion-result metadata with a cursor for the next page. The endpoint does not return opinion detail, dockets, judges, alerts, or account data.
/courtlistener/searchSearches CourtListener's public opinion-search index and returns opinion-result metadata. It covers public search data only; authenticated opinion detail, dockets, judges, alerts, and account data are not included.
Query parameters:
q (required) — opinion search text.cursor (optional) — cursor from a prior response's next_cursor field to request the next page.Notable response behavior: an empty results list is a valid no-results response. Use next_cursor when supplied to continue pagination.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| case_name | 20 | |
| court | 20 | |
| court_id | 20 | |
| date_filed | 20 | 2010-08-18 to 2026-01-29 |
| docket_number | 16 | |
| url | 20 | courtlistener.com |
| citation | 13 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | Yes | Opinion search text | "qualified immunity" | |
| cursor | string | No | Cursor from a prior response's next_cursor field | cD0yMDI2LTA4LTI3KzAwJTNBMDAlM0EwMC4wMDAwMDAlMkIwMCUzQTAw | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/courtlistener/search?q=%22qualified+immunity%22" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"query": "qualified immunity",
"results": [
{
"case_name": "Example v. Example",
"court": "Supreme Court of the United States",
"url": "https://www.courtlistener.com/opinion/12345/example-v-example/"
}
],
"next_cursor": "cD0yMDI2LTA4LTI3"
}
}Request schema
No body schema
Response schema
#/definitions/courtlistener.searchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | courtlistener.SearchResponse | No | ||||
| data.next_cursor | string | No | ||||
| data.query | string | No | ||||
| data.results | array | No | ||||
| data.results[].case_name | string | No | ||||
| data.results[].citation | string | No | ||||
| data.results[].court | string | No | ||||
| data.results[].court_id | string | No | ||||
| data.results[].date_filed | string | No | ||||
| data.results[].docket_number | string | No | ||||
| data.results[].snippet | string | No | ||||
| data.results[].url | string | No | ||||
| data.total | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/courtlistener/search?q=%22qualified+immunity%22" \
-H "x-api-key: $CRAWLORA_API_KEY"