Google APIscholar.google.com ↗
Search and retrieve legal case law from Google Scholar. Filter by court, date range, and keyword. Get full case opinions, citations, and cited-by counts.
What is the Google API?
The Google Scholar Case Law API exposes 2 endpoints for searching and retrieving U.S. legal opinions. Use search_cases to query case law by keyword across all courts or federal courts only, getting back titles, citations, courts, years, snippets, and cited-by counts. Use get_case_details to fetch the full opinion text, argued and decided dates, and citation for any specific case by its ID.
curl -X GET 'https://api.parse.bot/scraper/0121d112-4c66-4336-9640-bded6b74faad/search_cases?page=1&court=all&query=fourth+amendment+search+and+seizure&year_to=2024&year_from=2000' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace scholar-google-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Google Scholar Case Law — search cases and retrieve full opinions."""
from parse_apis.google_scholar_case_law_api import GoogleScholar, Court, CaseNotFound
client = GoogleScholar()
# Search for landmark Fourth Amendment cases in federal courts
for case in client.casesummaries.search(query="fourth amendment search and seizure", court=Court.FEDERAL, limit=5):
print(case.title, case.year, f"cited_by={case.cited_by}")
# Drill into the first result for the full opinion
summary = client.casesummaries.search(query="patent infringement", year_from="2015", limit=1).first()
if summary:
full = summary.details()
print(full.title, full.court, full.opinion_length)
# Fetch a case directly by ID
try:
detail = client.cases.get(case_id="9210492700696416594")
print(detail.title, detail.citation, detail.dates)
except CaseNotFound as exc:
print(f"Case not found: {exc.case_id}")
print("exercised: casesummaries.search / CaseSummary.details / cases.get / CaseNotFound")
Search Google Scholar case law by subject matter keywords. Returns case listings with title, citation, court, year, snippet, and cited-by count. Results are paginated with 10 cases per page. The court filter restricts to federal courts or all courts. Year filters narrow results to a specific date range.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (1-based) |
| court | string | Court filter: 'all' for all courts, 'federal' for federal courts only |
| queryrequired | string | Search query for case law (e.g., 'fourth amendment search and seizure', 'patent infringement') |
| year_to | string | Filter cases up to this year (e.g., '2024'). Omitting returns cases up to present. |
| year_from | string | Filter cases from this year onward (e.g., '2020'). Omitting returns cases from all years. |
{
"type": "object",
"fields": {
"page": "integer, current page number",
"court": "string, court filter applied",
"query": "string, the search query used",
"results": "array of case objects with title, url, case_id, citation, court, year, snippet, cited_by",
"year_to": "string or null, end year filter",
"year_from": "string or null, start year filter",
"result_count": "integer, number of results on this page",
"has_next_page": "boolean, whether more results are available"
},
"sample": {
"data": {
"page": 1,
"court": "all",
"query": "fourth amendment search and seizure",
"results": [
{
"url": "https://scholar.google.com/scholar_case?case=9210492700696416594&q=fourth+amendment+search+and+seizure&hl=en&as_sdt=2006",
"year": "1967",
"court": "Supreme Court",
"title": "Katz v. United States",
"case_id": "9210492700696416594",
"snippet": "does not justify construing the search and seizure...",
"citation": "389 US 347, 88 S. Ct. 507, 19 L. Ed. 2d 576",
"cited_by": 33884
}
],
"year_to": null,
"year_from": null,
"result_count": 10,
"has_next_page": true
},
"status": "success"
}
}About the Google API
Searching Case Law
The search_cases endpoint accepts a query string — such as 'fourth amendment search and seizure' or 'patent infringement' — and returns up to 10 case objects per page. Each result includes title, citation, court, year, snippet, cited_by count, url, and a numeric case_id used to fetch full details. The court parameter accepts 'all' or 'federal' to restrict results to federal courts only. The year_from and year_to parameters accept four-digit year strings to narrow results to a specific time window. Pagination is controlled with the page parameter (1-based), and the has_next_page boolean tells you whether additional pages exist.
Retrieving Full Case Opinions
The get_case_details endpoint takes a case_id (the numeric string from any search_cases result) and returns the full case record: title, citation, court, dates (argued and decided), url, and opinion_text. Opinion text is truncated to the first 10,000 characters; the opinion_length field gives the total character count of the untruncated opinion so you can assess completeness. This is useful when a case's full legal reasoning is needed, not just the snippet surfaced by search.
Coverage and Filtering
The court filter currently distinguishes between all courts and federal courts only — it does not target specific circuits, districts, or state court systems individually. Date filtering via year_from and year_to works at the year level, not by specific date. The cited-by count returned by search_cases reflects how many other cases or articles reference the case, which is useful for gauging precedential weight without fetching individual citing documents.
The Google API is a managed, monitored endpoint for scholar.google.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when scholar.google.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official scholar.google.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Building a legal research tool that surfaces relevant case law by keyword with cited-by counts for precedential ranking
- Automating retrieval of full case opinions for contract review or litigation support workflows
- Filtering federal court decisions within a date range to track evolving interpretations of a statute
- Extracting citations and court metadata to populate a legal citation database
- Monitoring recent case law on a specific subject by querying with
year_fromset to the current year - Comparing opinion lengths and snippets across cases to prioritize which full texts to review
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Google Scholar have an official developer API for case law?+
What does `get_case_details` return, and is the full opinion text included?+
title, citation, court, dates (argued and decided), url, case_id, and opinion_text. The opinion text is the first 10,000 characters of the full opinion. The opinion_length field gives the total character count, so you can tell how much was truncated.Can I filter `search_cases` results to a specific circuit court or state court system?+
court parameter supports 'all' or 'federal' only — there is no parameter for targeting a specific circuit, district, or individual state court. You can fork this API on Parse and revise it to add a more granular court filter if that level of scoping is required.Does the API return the list of cases that cite a given case?+
cited_by field in search_cases results gives the count of citing documents, but the API does not return the actual list of citing cases. You can fork this API on Parse and revise it to add an endpoint that retrieves the citing-case list for a given case ID.How is pagination handled in `search_cases` results?+
page parameter (1-based integer) to navigate pages. The response includes a has_next_page boolean and a result_count integer reflecting results on the current page. There is no total result count field in the response.