GoodLegal is an AI-powered legal research API built by Zacharie Laik, focused on French and EU law. Where Legal Data Hunter indexes global sources, GoodLegal provides a developer-ready API with sub-second response times for French court decisions, legal codes, and EU texts. OAuth and API key authentication.
French Legal Search API - LLM Integration Guide
Quick Start
Base URL: https://api.goodlegal.fr
Authentication: API Key required (Bearer token or query parameter)
Content-Type: application/json
Getting an API Key
- Visit:
https://api.goodlegal.fr/dashboard - Create account or login
- Copy your API key from the dashboard
- Use in requests:
Authorization: Bearer YOUR_API_KEY
Core Endpoints
1. Intelligent Search (Recommended)
POST /v0/search
- Purpose: Automatically routes to the best endpoint based on query
- Use for: Any French legal query
- Body:
{"query": "your search terms"}
2. AI Legal Research Agent
POST /v0/agent
- Purpose: Complete legal research with citations
- Use for: Complex legal questions requiring comprehensive analysis
- Body:
{"query": "your legal question"}
3. Case Law Search
POST /v0/case-search
- Purpose: Search French jurisprudence across 6 court databases using hybrid semantic + keyword search
- Use for: Finding court decisions and case law
- Body:
{"query": "legal concept"} - Parameters:
query(required): The legal concept, keywords, or legal question to search forstart_date(optional): Filter results from this date onwards (YYYY-MM-DD). Omit or leave null if not needed.end_date(optional): Filter results up to this date (YYYY-MM-DD). Omit or leave null if not needed.top_k(optional): Number of results to return (default: 10, max recommended: 50)jurisdictions(optional): List of jurisdiction names to filter by. Omit or leave null for all courts.locations(optional): List of city names to filter by court location (case-insensitive).
Examples: "Paris", "Lyon", "Bordeaux", "Marseille".
Does not apply to national courts (Cour de cassation, Conseil d'État). Omit for all locations.detail_level(optional): Level of detail in results. Options:"snippet"(default, ~800 chars): Concise accroche/portée/classification — ideal for scanning many results"summary"(~2000-5000 chars): Full structured case summary — ideal for reading 5-10 cases"full_text": Raw court decision text (up to 20K chars) — for deep reading
- Databases searched (6 total):
- Cour de cassation & Conseil d'État (
high_court_decisions— 578K decisions) - Tribunaux administratifs (
ta_decisions— 730K decisions) - Cours administratives d'appel (
caa_decisions— 106K decisions) - Tribunaux judiciaires (
tj_decisions— 352K decisions) - Cours d'appel (
cour_appel_metadata_v2— 461K decisions) - Tribunaux de commerce (
tcom_decisions— 32K decisions)
- Cour de cassation & Conseil d'État (
- Accepted jurisdiction values:
- High courts:
"Cour de cassation","Conseil d'État","Conseil Constitutionnel" "Tribunal judiciaire""Cour d'appel""Tribunal de commerce"- Administrative: individual TA/CAA names (e.g.,
"Tribunal administratif de Paris")
- High courts:
- Minimal example:
{"query": "force majeure"} - With filters:
{"query": "licenciement faute grave", "start_date": "2020-01-01", "jurisdictions": ["Cour de cassation"]} - With detail level:
{"query": "force majeure", "detail_level": "summary"}or{"query": "force majeure", "detail_level": "full_text"}
4. Legislation Search
POST /v0/legislation-search
- Purpose: Search French legal codes and laws (Code civil, Code pénal, Code du travail, etc.)
- Use for: Finding legal articles and regulations
- Body:
{"query": "legal topic", "top_k": 5} - Parameters:
query(required): The legal topic, keywords, or legal question to search fortop_k(optional): Number of results to return. Default: 5. Max recommended: 20
5. Specific Case Retrieval
POST /v0/case-retrieve
- Purpose: Get specific court decisions by reference number
- Use for: Retrieving exact cases when you have jurisprudence numbers
- Body:
{"query": "24-86.834"}or{"query": "Cass. civ., 12 avril 2012, n° 11-15.000"} - Parameters:
query(required): The jurisprudence reference number or citationinclude_full_text(optional, boolean): Whentrue, returns the raw court decision text instead of the structured CaseSummary. Default:false
- Default response: Structured CaseSummary with sections (Visa, Faits, Procédure, Arguments, Motifs, Portée)
- With
include_full_text: true: Returns the original full court decision text as published
6. Specific Legislation Retrieval
POST /v0/legislation-retrieve
- Purpose: Get specific legal articles by reference
- Use for: Retrieving exact articles when you have precise references
- Body:
{"query": "article 1240 du code civil"}or{"query": "L313-3 CESEDA"}
7. EU Law Retrieval
POST /v0/eu-retrieve
- Purpose: Get EU legal texts by CELEX reference
- Use for: Retrieving EU directives, regulations, court decisions
- Body:
{"query": "directive 2016/97/UE"}or{"query": "C-131/12"}
8. EU Caselaw Semantic Search
POST /v0/eu-search
- Purpose: Semantic search through EU court decisions (CJEU and General Court)
- Use for: Finding relevant EU case law by legal concepts, questions, or topics
- Body:
{"query": "state aid competition law", "top_k": 10} - Returns: Object with
query,highlights(frequently cited articles),cases(matching decisions with similarity scores),total_results - Note: For full EU caselaw details with highlights and similarity scores. The intelligent
/v0/searchendpoint also routes EU queries here but returns a summarized result.
9. Batch Legal Reference Extraction
POST /v0/batch-legislation
- Purpose: Extract and retrieve all legal references from multiple texts
- Use for: Processing documents with many legal citations
- Body:
{"sources": ["text with legal refs", "another text"], "comprehensive": true}
9. Single Text Legal Extraction
POST /v0/single-text-legislation
- Purpose: Extract all legal references from one text
- Use for: Processing emails, documents, contracts for legal citations
- Body:
{"text": "your text with legal references"}
10. Case-Legislation Organization
POST /v0/case-legislation
- Purpose: Most powerful raw search tool here. Will retrieve 35 cases and laws organized by code and article
- Use for: Initial search to find all relevant articles and holdings in similar cases. Gets comprehensive legal analysis with case law and legislation together
- Body:
{"query": "your legal topic"} - Returns: Organized structure showing:
- Codes sorted by citation frequency
- Articles within each code sorted by citation frequency
- Full article content from legislation database
- Legal principles (Portées) from cases citing each article
- Automatic merging of top 25 all-time cases + top 10 recent cases (past 10 years)
- Example: Query "force majeure" returns all relevant articles from Civil Code, Commercial Code, etc., with case law showing how courts interpret each article in relation to the query.
11. Article Citation Search
POST /v0/article-citation-search
- Purpose: Find all court decisions citing a specific Legifrance article
- Use for: Understanding how courts interpret a specific legal article, tracking citation patterns across jurisdictions and time periods
- Body:
{"article_id": "LEGIARTI000032041008"}or{"article_id": "article 1240 code civil"} - Parameters:
article_id(required): A Legifrance article ID (e.g.,LEGIARTI000032041008,JORFTEXT...,CONSTEXT...,KALI...) or a human-readable reference (e.g.,"article 1240 code civil"). Raw IDs are faster; references are auto-resolved via legislation-retrieve.query(optional): Search query to re-rank results by semantic relevance. If omitted, results are ordered by decision date (most recent first)top_k(optional): Number of results to return (default: 10)start_date(optional): Filter results from this date onwards (YYYY-MM-DD). Omit or leave null if not needed.end_date(optional): Filter results up to this date (YYYY-MM-DD). Omit or leave null if not needed.jurisdictions(optional): List of jurisdiction names to filter by. Same values as case-search.locations(optional): List of city names to filter by court location (case-insensitive).detail_level(optional): Level of detail in results —"snippet"(default),"summary", or"full_text".
- Databases searched: Same 6 court databases as case-search (2.2M+ decisions)
- Minimal example:
{"article_id": "LEGIARTI000032041008"} - With query re-ranking:
{"article_id": "LEGIARTI000032041008", "query": "responsabilité contractuelle"} - With filters:
{"article_id": "LEGIARTI000032041008", "jurisdictions": ["Cour d'appel"], "start_date": "2023-01-01"}
12. Service Public Doctrine Search
POST /v0/doctrine-search
- Purpose: Search Service Public administrative guidance documents
- Use for: Finding practical French government guidance for citizens and businesses
- Body:
{"query": "contrat de professionnalisation"} - Returns: Array of search results with Pinecone IDs for retrieval
13. Service Public Doctrine Retrieval
POST /v0/doctrine-retrieve
- Purpose: Get complete Service Public document by ID from search results
- Use for: Retrieving full text and URL of specific guidance documents
- Body:
{"id": "F15478-vosdroits-entreprises"} - Note: Use the full Pinecone ID from
/v0/doctrine-searchresults (format:{document_id}-vosdroits-{corpus})
14. Web Search (NEW)
POST /v0/web-search
- Purpose: Search the web using Perplexity Sonar AI for current information
- Use for: Finding real-time news, recent developments, current events not in legal databases
- Body:
{"query": "your search query"} - Returns: Object with
snippet(synthesized answer with sources) anduri("web-search")
Response Format
All endpoints return JSON arrays with this structure:
[
{
"snippet": "Legal text content with context",
"uri": "https://legifrance.gouv.fr/link-to-source"
}
]
Authentication Examples
Method 1 - Bearer Token (Recommended):
curl -X POST "https://api.goodlegal.fr/v0/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "responsabilité contractuelle"}'
Method 2 - Query Parameter:
curl -X POST "https://api.goodlegal.fr/v0/search?key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "responsabilité contractuelle"}'
Common Use Cases for LLMs
Legal Research
POST /v0/agent
{"query": "What are the conditions for acquiring French nationality by naturalization?"}
Finding Relevant Case Law
POST /v0/case-search
{"query": "force majeure covid-19"}
Case Law with Date and Jurisdiction Filters
POST /v0/case-search
{"query": "licenciement abusif", "start_date": "2022-01-01", "jurisdictions": ["Cour de cassation"], "top_k": 15}
Case Law with Location Filter
POST /v0/case-search
{"query": "bail commercial", "locations": ["Paris"], "jurisdictions": ["Tribunal judiciaire"]}
Case Law with Full Summaries (for reading 5-10 cases in detail)
POST /v0/case-search
{"query": "force majeure covid-19", "detail_level": "summary", "top_k": 5}
Case Law with Full Text (raw court decision)
POST /v0/case-search
{"query": "force majeure", "detail_level": "full_text", "top_k": 3}
Retrieving a Specific Case (Structured Summary)
POST /v0/case-retrieve
{"query": "24-86.834"}
Retrieving a Specific Case (Raw Full Text)
POST /v0/case-retrieve
{"query": "24-86.834", "include_full_text": true}
Getting Specific Legal Articles
POST /v0/legislation-retrieve
{"query": "article 1240 code civil"}
Processing Legal Documents
POST /v0/single-text-legislation
{"text": "Selon l'article 1240 du code civil et l'arrêt de la Cour de cassation du 12 avril 2012, pourvoi n° 11-15.000..."}
EU Law Research
POST /v0/eu-retrieve
{"query": "directive 2016/679 RGPD"}
Service Public Administrative Guidance
POST /v0/doctrine-search
{"query": "allocation familiales conditions"}
Retrieving Full Service Public Documents
POST /v0/doctrine-retrieve
{"id": "F15478-vosdroits-particuliers"}
Web Search for Current Information
POST /v0/web-search
{"query": "latest RGPD sanctions France 2026"}
Comprehensive Legal Analysis (Case Law + Legislation)
POST /v0/case-legislation
{"query": "responsabilité contractuelle"}
Returns organized structure by code (Civil Code, Commercial Code, etc.) and article, with full article text and all case law citing each article.
Finding Cases Citing a Specific Article (by ID — faster)
POST /v0/article-citation-search
{"article_id": "LEGIARTI000032041008"}
Returns court decisions citing this article, ordered by date (most recent first).
Finding Cases Citing a Specific Article (by reference — auto-resolved)
POST /v0/article-citation-search
{"article_id": "article 1240 code civil"}
The reference is auto-resolved to its LEGIARTI ID, then citation search runs as usual.
Finding Cases Citing an Article with Filters
POST /v0/article-citation-search
{"article_id": "LEGIARTI000032041008", "query": "responsabilité contractuelle", "jurisdictions": ["Cour de cassation"], "start_date": "2023-01-01", "detail_level": "summary"}
Returns Cour de cassation decisions from 2023+ citing this article, re-ranked by relevance to the query, with full summaries.
Error Handling
- 401: Invalid or missing API key
- 400: Invalid request format
- 500: Server error
- Empty array []: No results found
Rate Limits
- Each API key has a request limit (default: 1000 requests)
- Check your usage in the dashboard
- Contact admin for limit increases
Best Practices for LLMs
- Start with
/v0/search- it automatically chooses the best endpoint - Use
/v0/agentfor complex research requiring multiple sources - Be specific - include article numbers, case references, dates when known
- Handle empty results - not all queries will return results
- Always include authentication - all endpoints require API keys
- Check URIs - use the provided links for source verification
Language Support
- Input: French legal terms work best, but English is accepted
- Output: Results are in French (original legal language)
- Scope: French law, EU law affecting France, some comparative law
System Capabilities
- Real-time access to Legifrance database
- Hybrid search combining semantic (vector) and keyword (full-text) search with Reciprocal Rank Fusion
- 2.2M+ court decisions across 6 databases (Cour de cassation, Conseil d'État, cours d'appel, tribunaux judiciaires, tribunaux administratifs, tribunaux de commerce)
- Exact reference matching for precise citations
- Historical article versions when available
- Comprehensive case summaries with structured metadata
- Automatic legal reference extraction from text
Quick Implementation Template
import requests
def query_french_law(query, endpoint="search", api_key="YOUR_API_KEY"):
url = f"https://api.goodlegal.fr/v0/{endpoint}"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
data = {"query": query}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
return response.json()
else:
return {"error": response.status_code, "message": response.text}
# Example usage
results = query_french_law("article 1240 code civil")
for result in results:
print(f"Content: {result['snippet']}")
print(f"Source: {result['uri']}")
Gemini 2.5 Flash Integration
This API is specifically designed for Gemini grounding. Configure as external API tool:
{
"tools": [{
"retrieval": {
"externalApi": {
"api_spec": "SIMPLE_SEARCH",
"endpoint": "https://api.goodlegal.fr/v0/search",
"apiAuth": {
"apiKeyConfig": {
"apiKeyString": "YOUR_API_KEY"
}
}
}
}
}]
}
Support
- Dashboard:
https://api.goodlegal.fr/dashboard - API Docs:
https://api.goodlegal.fr/docs - Health Check:
https://api.goodlegal.fr/health
Ready to use: Get your API key from the dashboard at https://api.goodlegal.fr/dashboard to start making requests immediately.
