ZL
Zacharie Laïk
/

goodlegal

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.

532 views

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

  1. Visit: https://api.goodlegal.fr/dashboard
  2. Create account or login
  3. Copy your API key from the dashboard
  4. 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 for
    • 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.
    • 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)
  • 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")
  • 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 for
    • top_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 citation
    • include_full_text (optional, boolean): When true, 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/search endpoint 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-search results (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) and uri ("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

  1. Start with /v0/search - it automatically chooses the best endpoint
  2. Use /v0/agent for complex research requiring multiple sources
  3. Be specific - include article numbers, case references, dates when known
  4. Handle empty results - not all queries will return results
  5. Always include authentication - all endpoints require API keys
  6. 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.