High Court Cases API | All 25 High Courts and Benches | CourtMesh
    Skip to main content
    25 High Courts

    High Court case data for every state, bench and spelling

    India has 25 High Courts, several of which sit at more than one place, and their portals do not agree on how to write their own names. This page is about that mess and what to do about it: the variant map you need before your first query, where bench level filtering is and is not available, and how writ and appeal case types expand across every court at once.

    See the unified API
    25
    High Courts, principal seats and benches included
    47
    distinct court strings those 25 institutions produce
    3,590
    High Court judge names in the lookup index
    669
    case type codes catalogued across the High Courts

    Read this before your first query

    The court filter matches verbatim against the strings stored in the index, and those strings came from the courts themselves. Rajasthan publishes under three spellings. Telangana appears as High Court for State of Telangana and as Telangana High Court. Delhi, Gujarat, Kerala, Karnataka, Jharkhand and most of the rest each carry a formal variant and a colloquial one. Twenty five institutions, forty seven strings.

    So the filter takes an array, and the array should hold every variant of the institution you mean. Get this wrong and nothing breaks loudly: you simply receive a fraction of the matters and a total that looks plausible. It is the single most consequential detail on this page, which is why it comes before the endpoint list rather than after it.

    Court name variants stored in the index
    InstitutionValues to pass in the court array
    RajasthanHigh Court of Rajasthan, High Court Of Rajasthan, Rajasthan High Court
    TelanganaHigh Court for State of Telangana, Telangana High Court
    ChhattisgarhHigh Court of Chhattisgarh, High Court Of Chhattisgarh, Chhattisgarh High Court
    Jammu and Kashmir and LadakhHigh Court of Jammu & Kashmir and Ladakh, High Court of Jammu and Kashmir
    Andhra PradeshHigh Court of Andhra Pradesh, Andhra Pradesh High Court
    Bombay, Calcutta, Madras, Allahabad, Patna, GauhatiSingle canonical string each, no variants needed

    First request

    Base URL https://research.courtmesh.ai/api/v1/prod. Keys carry a cm- prefix and travel either as Authorization: Bearer or in an X-API-Key header, whichever your HTTP client prefers. Only query is mandatory.

    Writ matters in one High Court, two years
    curl -X POST "https://research.courtmesh.ai/api/v1/prod/search/cases" \
      -H "Authorization: Bearer cm-YOUR_KEY_HERE" \
      -H "Content-Type: application/json" \
      -d '{
        "query": "quashing of FIR inherent powers abuse of process",
        "court": ["Bombay High Court"],
        "caseType": "Writ",
        "year": ["2022", "2023"],
        "limit": 25
      }'
    court

    Array of verbatim index spellings. Omit it and the search spans every court layer including the Supreme Court, district courts and tribunals.

    caseType

    Either a raw code such as CWP or LPA, or a primary type such as Writ or Appeal which the service expands into the underlying codes.

    year, fromDate, toDate

    Four digit years from 1947 to the current year, or an explicit YYYY-MM-DD range. Both forms may be combined with a court array.

    One parameter deserves a warning. The body will accept caseNumber without complaint, but the keyword route does not apply it as a filter. If you are looking for a specific number, put it in query, where the parser recognises number and year patterns and normalises separators before searching.

    Principal seats, circuit benches and where they live

    A High Court is not always one building. Bombay hears matters at Nagpur, Aurangabad, Kolhapur and Goa besides its Original and Appellate Sides in the city. Calcutta runs circuit benches at Port Blair and Jalpaiguri. Gauhati sits at Kohima, Aizawl and Itanagar as well as its principal seat. Karnataka has benches at Dharwad and Kalaburagi, Madras at Madurai, Allahabad at Lucknow. Which seat heard a matter is often a jurisdictional fact rather than an administrative one.

    In the index the seat sits one level below the court. The keyword route does not expose that level, so bench scoping there is done through the query text. The semantic route does expose it, through filters.courtName inside the nested filters object, alongside filters.courtType and filters.court. The bench names below are the strings the index actually holds.

    High CourtSeats recorded in the index
    Bombay High CourtOriginal Side and Appellate Side at Bombay, Bench at Nagpur, Bench at Aurangabad, Bench at Kolhapur, High Court of Bombay at Goa
    Calcutta High CourtOriginal Side and Appellate Side at Calcutta, Circuit Bench at Port Blair, Circuit Bench at Jalpaiguri
    Gauhati High CourtPrincipal Seat at Guwahati, Kohima Bench, Aizawl Bench, Itanagar Bench
    High Court of KarnatakaPrincipal Bench at Bengaluru, Bench at Dharwad, Bench at Kalaburagi
    Madras High CourtPrincipal Bench at Madras, Madurai Bench
    Allahabad High CourtAllahabad, Lucknow Bench

    Sweeping an issue across institutions

    Comparative High Court research is mostly bookkeeping: the same proposition, asked of each institution, with each institution named correctly. Build the variant map once and the rest is a loop.

    Python: institution by institution
    import requests
    
    BASE = "https://research.courtmesh.ai/api/v1/prod"
    HEADERS = {"Authorization": "Bearer cm-YOUR_KEY_HERE", "Content-Type": "application/json"}
    
    # The index stores each High Court under the spellings its portal published.
    # Pass every variant of an institution together or you will silently lose rows.
    COURT_VARIANTS = {
        "Rajasthan": ["High Court of Rajasthan", "High Court Of Rajasthan", "Rajasthan High Court"],
        "Telangana": ["High Court for State of Telangana", "Telangana High Court"],
        "Chhattisgarh": ["High Court of Chhattisgarh", "High Court Of Chhattisgarh", "Chhattisgarh High Court"],
        "Jammu Kashmir Ladakh": [
            "High Court of Jammu & Kashmir and Ladakh",
            "High Court of Jammu and Kashmir",
        ],
        "Delhi": ["High Court of Delhi", "Delhi High Court"],
    }
    
    def survey(issue: str, institution: str, page: int = 1):
        body = {
            "query": issue,
            "court": COURT_VARIANTS[institution],   # array, not a single string
            "page": page,
            "limit": 100,
        }
        r = requests.post(f"{BASE}/search/cases", json=body, headers=HEADERS, timeout=120)
        r.raise_for_status()
        return r.json()
    
    for institution in COURT_VARIANTS:
        out = survey("adverse possession hostile animus", institution)
        print(institution, out["pagination"]["total"], "matches")

    Persuasive precedent from elsewhere

    A judgment of one High Court binds no other. It persuades, which is why the useful question is rarely whether a court has already decided your point and usually whether any court has decided something close enough to argue from. That is a meaning problem rather than a keyword problem, and it is what the semantic route exists for.

    Two things to hold in mind while using it. Court scoping moves inside the nested filters object on this route, and the vector index covers the analysed subset of the corpus, roughly two million judgments, rather than all 310 million records. Results below 0.30 similarity are dropped, and pagination totals are estimates except on the final page. It finds reasoning you could not have phrased. It does not enumerate a field.

    Node: ask the other High Courts
    const BASE = "https://research.courtmesh.ai/api/v1/prod";
    
    // Cross High Court persuasive research runs on the semantic route.
    // Note the shape: court scoping goes INSIDE the nested filters object here,
    // unlike /search/cases where court is a top level key.
    async function persuasiveElsewhere(proposition, excludeCourt) {
      const everyOtherCourt = [
        "Allahabad High Court",
        "Calcutta High Court",
        "High Court of Karnataka",
        "High Court of Kerala",
        "Madras High Court",
        "Patna High Court",
      ].filter((name) => name !== excludeCourt);
    
      const res = await fetch(`${BASE}/search/cases/semantic`, {
        method: "POST",
        headers: {
          "Authorization": `Bearer ${process.env.COURTMESH_API_KEY}`,
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          query: proposition,
          limit: 40,
          filters: { court: everyOtherCourt },
        }),
      });
    
      const { data, meta } = await res.json();
      // meta.searchType is "semantic"; if the query reduced to filters only it
      // comes back as meta.fallbackMode "opensearch" instead.
      return data.map((row) => ({
        court: row.court,
        caseNumber: row.caseNumber,
        similarity: row.similarity,
        title: row.title,
      }));
    }

    Where the High Court layer earns its keep

    Writ practice monitoring

    Expand caseType to Writ, leave court unset, and watch how a statutory challenge is being received across all 25 institutions rather than only the one you appear before.

    Jurisdiction mapping

    Every record returns its court string, so grouping results by institution gives you an immediate picture of where a line of litigation is concentrated.

    Vernacular aware retrieval

    Run keyword search in the language of the judgment and semantic search in English, then merge. Neither route alone covers a multilingual corpus honestly.

    Appeal readiness checks

    Pull the Letters Patent Appeal and writ appeal codes for a court, filter by date, and see how a single judge order of that court has fared before Division Benches.

    High Court API questions

    Why does one High Court appear under several court values?

    Because the source portals spell it several ways and we index what they published rather than rewriting it. Rajasthan alone arrives as High Court of Rajasthan, High Court Of Rajasthan and Rajasthan High Court. Across the 25 institutions there are 47 distinct court strings. The court filter matches verbatim, so pass an array holding every variant for the institution you want. Filtering on a single pretty spelling is the most common way to lose rows without noticing.

    Can I filter down to a specific bench such as Nagpur or Madurai?

    On the keyword route, no. POST /search/cases accepts query, court, year, caseType, caseNumber, judgeName, fromDate, toDate, page, limit, sortBy and searchAfter, and bench sits one level below court in the index. Put the bench name in the query text there. On POST /search/cases/semantic the nested filters object does reach that level, so filters.courtName with a value such as Bench at Nagpur or Madurai Bench of Madras High Court will scope a vector search to a seat.

    How do I search writ jurisdiction matters across every High Court at once?

    Send caseType as the word Writ. The service expands a primary type into the underlying court specific codes, and Writ currently resolves to 73 distinct codes across the catalogue, from CWP in Punjab and Haryana to WP in Bombay and WP(C) in Kerala and Sikkim. Leave court unset and the expansion runs across every High Court together. The same trick works for Appeal, which expands to 182 codes and sweeps up Letters Patent Appeals alongside first appeals and second appeals.

    Is there a parameter for Article 226 versus Article 227?

    No. Supervisory jurisdiction under Article 227 and writ jurisdiction under Article 226 are frequently invoked in the same petition, and the case type codes do not separate them. Search the article numbers as phrases in the query string. For documents that carry analysis, the analysis object exposes constitutionalProvisions, which is where the distinction is usually recorded once a judgment has been read.

    What happens to judgments delivered in a regional language?

    They are stored and retrievable, but the two search routes treat them very differently. Keyword search matches the characters actually in the document, so a Marathi or Hindi judgment answers to a query in that language. Semantic search runs over embeddings built from analysed English text, so an English proposition will not surface a vernacular judgment that has never been analysed. If your practice depends on vernacular material, lead with keyword search and treat semantic results as a supplement.

    Does the related endpoint find similar judgments in other High Courts?

    It does not, and it is worth being blunt about that. GET /cases/:id/related groups documents that share the same case number, up to 50 of them, and returns a timeline of that one matter. It is lineage, not similarity. For persuasive authority from a different High Court, use POST /search/cases/semantic with filters.court set to the courts you want to hear from.

    How does consolidated analysis behave for a High Court matter?

    Differently from the Supreme Court, deliberately. For a High Court case, POST /cases/:id/analyze-consolidated reads the case document together with the five most recent orders recorded against it and analyses that bundle. For a Supreme Court matter the same route instead gathers up to 20 documents sharing the case number. The route is synchronous, it consumes AI credits, and passing force true re-runs an analysis that already exists.

    Are High Court judge names in the same index as Supreme Court judges?

    Yes, and they are merged. GET /judges/search reads 3,590 High Court names alongside 1,069 Supreme Court names, deduplicates to 4,561 unique entries, matches your term as a case insensitive substring and returns at most 50. Elevation means many judges appear on both lists under one entry. Resolve the name there before you pass judgeName to a search, because the filter expects the spelling the index holds.

    Which citation formats can I look up?

    None as a structured field. High Court reporting conventions vary by region and the API returns no citations array, so a reporter citation is only findable as text inside a judgment. Search it as a quoted phrase in query, then confirm against the stored document through GET /cases/:id/pdf, which returns an encrypted link that expires after 3,600 seconds.

    What limits should I design around?

    An API key is capped at 10 requests per minute, responses carry X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, and exceeding the cap returns 429 with retryAfter in seconds. Page size maxes at 100. When you sweep an institution across many pages, use the searchAfter cursor from the previous response rather than incrementing page, and expect keyword pagination totals to be exact while semantic totals are estimates until the last page.