Litigation Check API | Party Name Screening India | CourtMesh
    Skip to main content
    Enterprise accounts today

    Screen a party name against Indian court records and get a confidence scored answer, not a list of hits

    POST one name, get back matched cases banded from confirmed down to possible, the evidence behind each band, and an honest statement of how complete the search was. One call, deterministic by default, with an optional LLM adjudication pass for the genuinely ambiguous cases.

    Availability: litigation check is enabled on Enterprise accounts today. Self serve access on this page, including the Free tier allowance described below, is rolling out and is not switchable on by signup yet. Ask us for access and we will tell you where you stand.

    Response shape

    What a screen returns

    POST /party/screen answers with a structured verdict, not a raw hit list. Every field below is read off the real response envelope.

    summary and matches

    summary carries a match count, a breakdown by band (confirmed, probable, possible, unlikely), the highest band reached, and a verdict of matches_found, no_matches_found or inconclusive. Each entry in matches carries the case fields you would expect (title, court, caseNumber, cnr, parties, dates, disposalNature), a confidence object with band, score and the engine that produced it, an evidence object naming the matched fields and strategies, a plain language rationale, and a casePageUrl you can open to read the source record yourself.

    coverage and meta

    relatedButUnverified holds weaker candidates that did not clear a reportable band, kept separate so they never inflate the match count. coverage states plainly whether the search was exhaustive, whether your filters clamped it, whether any retrieval strategy errored, and whether a restricted record was withheld. meta reports the credits charged, whether adjudication ran, and the date the corpus snapshot is current as of.

    Scoring

    How confidence is computed

    Name matching on Indian court data has specific failure modes. The engine is built around them rather than around a generic string similarity score.

    Name normalisation

    Case, spacing and punctuation differences are normalised before anything is compared, so "R. K. Sharma" and "RK Sharma" are treated as the same candidate string.

    Initials run together

    Initials that were typed apart, with a stop, or run together all resolve to the same token, which matters for the way Indian names are transliterated across court portals.

    Transliteration variants

    Common spelling variants of the same Indian name are matched, so a transliteration difference does not silently create a false negative.

    No stemming on name fields

    Name fields are never stemmed. Stemming a surname turns it into a different word, so the engine keeps names exact after normalisation rather than fuzzy in the way it fuzzes free text.

    Institutional party down weighting

    Banks, government departments and large companies are down weighted on name text alone, since a common institutional name appearing across thousands of unrelated cases is not meaningful signal by itself.

    Identifier and disambiguator signals

    PAN, GSTIN, CIN, LLPIN, an address, or a known associated person all raise confidence directly. These are the signals that move a candidate from possible to probable or confirmed.

    The bands, and the rule behind them

    Litigation check confidence bands
    BandScore thresholdWhat it means
    ConfirmedScore 0.90 or higherName evidence plus at least one disambiguator, or an identifier match on its own.
    ProbableScore 0.70 or higherStrong name match with weaker or partial corroborating signal.
    PossibleScore 0.45 or higherName match with no disambiguator, or a common name capped here regardless of text similarity.
    UnlikelyBelow 0.45Not returned as a match; may appear in relatedButUnverified.

    A person is never auto confirmed on name evidence alone: confirmation for a person requires a matched statutory identifier such as PAN, GSTIN, CIN or LLPIN. An address or a known associated person raises confidence but on its own caps the result at probable, it does not reach confirmed. A common name is capped at possible even when the text match is strong, because on a name shared by thousands of people, text similarity by itself is weak evidence. Low confidence is not the same thing as no match: a possible or unlikely band means the engine found a name that resembles yours and told you how little that is worth, rather than silently dropping it.

    Read this before you rely on a result

    Honest limits

    A match is a record, not an identity

    Every match this endpoint returns is a court record that bears the name you searched. It is not a verified identity, and it does not by itself tell you that the party in the record is the specific person or company you have in mind. Namesakes exist, and a shared name is exactly the situation this endpoint's confidence bands and disambiguator signals exist to help you reason about, not a situation the bands eliminate.

    The reverse also holds. An absence of a match is not a clean record: it means the corpus, filtered the way you asked, did not contain a case bearing that name at the time of the call. It says nothing about matters outside the corpus, matters filed after the corpus snapshot, or matters under a spelling variant the request did not cover. Read the coverage block on every response before treating a no match verdict as clearance, and see the coverage and freshness page for what the corpus does and does not contain.

    DPDP

    The purpose field is not optional

    Purpose is required, lawful basis is yours

    purpose is a required field on every call: kyc, bgv, due_diligence, litigation, research or compliance. A request without it is rejected before any search runs, because a name screen without a stated purpose is exactly the kind of processing the Digital Personal Data Protection Act asks a data fiduciary to be able to account for.

    CourtMesh's role differs by what is being processed. For the name, aliases, identifiers and other details you submit in the request, we act as a processor on your instructions: the lawful basis for running the check on a given name is yours as the caller, not ours, and you remain responsible for having it before you call this endpoint. For the underlying corpus we search against, CourtMesh is the fiduciary, since we independently decide how those public court records are organised, indexed and made searchable, under the same public records basis that governs the rest of the corpus.

    We retain request records for the period set out in your contract where you have one, and our published default of 90 days for request records otherwise. This is not indefinite storage: retention means a defined window tied to your account, after which the record is purged in the normal course.

    Takedown and de-indexing

    We honour restriction orders, on this endpoint too

    Laksh Vir Singh Yadav v. Union of India

    On 29 May 2026 the Delhi High Court, in Laksh Vir Singh Yadav v. Union of India (2026:DHC:4891), directed that name based search be restricted on a specified set of records. That order is currently in effect pending appeal. It is a case specific judicial direction covering the records it names, not a general right to erase public court records from the internet.

    CourtMesh honours every de-indexing and masking order that applies to us, and a record covered by such an order is withheld from POST /party/screen the same way it is withheld from keyword search and case detail: it will not surface as a match, and coverage.someRecordsWithheld is set to true on any response where a withheld record affected the result, so the withholding is visible rather than silent.

    Full detail on our removal, redaction and de-indexing process is on the case removal policy page. As at 18 September 2026, this order remains in effect pending appeal and this paragraph is current as of that date.

    Note: the paragraphs above describing the Delhi High Court's 29 May 2026 order are pending review by counsel and may be revised.

    Pricing

    What a litigation check costs

    Priced by outcome, not by a flat per call rate: a genuine no match did real retrieval work but produced no analysis, so it costs far less than a match.

    CourtMesh litigation check pricing
    OutcomeCreditsPrice, base rate
    Matches found100₹10.00
    No matches found20₹2.00
    Adjudicate = true, surcharge on top+80+₹8.00

    The adjudication surcharge is only charged when adjudicate: true actually triggers at least one LLM pass. If every candidate is already resolved deterministically, setting the flag costs nothing extra.

    Free tier

    10 litigation checks a month, deterministic matching only. Setting adjudicate: true on this tier returns HTTP 403.

    Enterprise

    Volume rates from ₹0.06 per credit, which prices a matched check at ₹6.00 instead of the ₹10.00 base rate price.

    Rate limits on this endpoint

    A litigation check does more retrieval and scoring work than a plain search call, so it carries its own per minute window and its own daily cap on distinct names, on top of your tier's general API rate limit.

    Litigation check rate limits by tier
    TierRequests per minuteDistinct names per day
    Free Developer225
    Pay As You Go10500
    Scale305,000
    EnterpriseCustom, up to 60Custom

    Competitor context, dated and sourced

    A structural comparison against published pricing for screening and verification products. Where a vendor has not published a rate we say so rather than guessing.

    Litigation check and screening competitor pricing
    VendorLine itemPriceSource
    eCourtsIndiaLegal Check subscription₹33View source
    eCourtsIndiaLegal Check pay as you go₹99View source
    DeepvuePer check, from₹2View source
    InstaFinancialsPer report₹1,250View source
    InstaFinancialsPer report, in packs₹350 to ₹400View source
    AuthBridgeCourt Record Check, pricingNot published, talk to salesView source
    IDfyVerification pricingNot published, routes to Book a DemoView source
    SignzyCriminal screening pricingNot published, contact salesView source
    SurePasseCourts API, pricingNot published, contact salesView source
    GridlinesCriminal Court Record Verification API, pricingNot published, /pricing 404sView source
    Karza (Perfios)Legal Search, pricingNot published, quote onlyView source

    Compiled on 2026-09-18 from publicly published pricing pages. Competitor terms change without notice; verify a vendor's current page before making a purchase decision.

    Reference

    Endpoint preview

    Authenticate with X-API-Key or Authorization: Bearer, same as every other endpoint on the API.

    POST/party/screen

    Litigation check

    Full case store, deterministic resolution plus optional LLM adjudication

    One name in, one scored answer out. query echoes what you sent, summary gives the headline verdict, and matches carries the full detail per case. verdict: "no_matches_found" is only ever returned when coverage.exhaustive is true; otherwise the endpoint answers "inconclusive" rather than overstating a partial search as a clean result. A since filter, or a restricted record withheld with nothing else left to report, also forces "inconclusive" even on an otherwise exhaustive run. Unlike the search endpoints, this endpoint's request body is strict: an unrecognised top-level field is rejected with HTTP 400 rather than being silently dropped.

    Body parameters

    FieldTypeRequiredNotes
    namestringYes2 to 200 characters. The party name to screen.
    entityType"person" | "company"YesSelects the name normalisation and disambiguation rules applied to the search.
    purposestringYesOne of kyc, bgv, due_diligence, litigation, research, compliance. Mandatory under our DPDP handling; the request is rejected without it.
    aliasesstring[]NoUp to 7 alternate spellings or names for the same party.
    identifiersobjectNoOptional pan, gstin, cin, llpin. The strongest disambiguator you can supply; never written to logs.
    addressobjectNoOptional city, state, stateCode. Used as a disambiguation signal, not a filter.
    knownPersonsstring[]NoNames of people known to be associated with the party, used as a disambiguator.
    courtstring | string[]NoRestrict the screen to one named court. A single-element array is accepted; an array with more than one entry is rejected with 400 (one court per request for now).
    sincestringNoYYYY-MM-DD lower bound on case activity. Must be a real calendar date; an invalid or malformed date is rejected with 400.
    limitnumberNo1 to 100, default 40. Candidates evaluated before scoring.
    adjudicatebooleanNoDefault false. Runs an LLM pass on ambiguous matches; adds the adjudication surcharge.
    displayThresholdnumberNo0 to 1. Hides matches scored below this threshold from the response; does not change what was evaluated.
    Bash
    curl -X POST https://research.courtmesh.ai/api/v1/prod/party/screen \
      -H "X-API-Key: cm-YOUR_KEY_HERE" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "Ramesh Kumar Sharma",
        "entityType": "person",
        "purpose": "bgv",
        "identifiers": { "pan": "ABCDE1234F" },
        "address": { "city": "Delhi", "state": "Delhi" },
        "limit": 40
      }'
    JSON
    {
      "success": true,
      "data": {
        "query": {
          "name": "Ramesh Kumar Sharma",
          "entityType": "person",
          "purpose": "bgv"
        },
        "summary": {
          "matchCount": 2,
          "byBand": { "confirmed": 1, "probable": 1, "possible": 0, "unlikely": 4 },
          "highestBand": "confirmed",
          "verdict": "matches_found"
        },
        "matches": [
          {
            "caseId": "664b19f2c8d4e5f6a7b80042",
            "title": "Ramesh Kumar Sharma vs State (NCT of Delhi)",
            "court": "Delhi High Court",
            "caseNumber": "CRL.A/842/2021",
            "cnr": "DLHC010084212021",
            "caseType": "CRL.A",
            "filingDate": "2021-03-11",
            "decisionDate": "2022-07-19",
            "disposalNature": "Dismissed",
            "petitioners": ["Ramesh Kumar Sharma"],
            "respondents": ["State (NCT of Delhi)"],
            "partyRole": "petitioner",
            "confidence": { "band": "confirmed", "score": 0.94, "calibrated": 0.94, "engine": "rules" },
            "evidence": {
              "entityMatch": true,
              "matchedFields": ["name", "pan"],
              "strategies": ["exact_name", "identifier_match"],
              "signals": [
                { "name": "pan_match", "status": "matched", "weight": 0.9, "evidence": "PAN supplied in the request matches the PAN recorded against this party" }
              ],
              "nameSimilarity": 1.0,
              "disambiguatorPresent": true
            },
            "rationale": "The PAN supplied in the request matches the PAN recorded against this party.",
            "casePageUrl": "https://courtmesh.ai/judgment/664b19f2c8d4e5f6a7b80042"
          }
        ],
        "relatedButUnverified": [],
        "coverage": {
          "exhaustive": true,
          "exhaustiveWithinFilters": true,
          "planClamped": false,
          "anyStrategyErrored": false,
          "strategiesRun": ["exact_name", "fuzzy_name", "identifier_match"],
          "someRecordsWithheld": false
        },
        "adjudicationsRun": 0,
        "notice": "A party can ask for a case to be withheld from search under CourtMesh's case removal policy (https://courtmesh.ai/case-removal-policy). A screen that reports no matches reflects what is currently searchable, not an exhaustive record of all litigation history."
      },
      "meta": {
        "creditsCharged": 100,
        "adjudicated": false,
        "corpusAsOf": "2026-09-17"
      }
    }

    Errors

    • 400 validation failed: name missing or out of the 2 to 200 character range, aliases over 7 entries, purpose missing or not one of the allowed values, court given as more than one entry (one court per request for now), since not a real calendar date, or an unrecognised top-level field in the request body
    • 401 unauthorised: no key supplied, malformed key, or a deactivated key
    • 402 insufficient credits: body carries required, balance, shortfall and topUpUrl, and the call is not executed
    • 403 forbidden: trial accounts, a tier without litigation check access, or adjudicate set to true on the Free tier (API_TIER_NOT_ALLOWED)
    • 403 limit reached: the Free tier's monthly litigation check cap already used (PARTY_SCREEN_LIMIT_REACHED)
    • 429 too many requests: per minute or per day distinct name cap exceeded for your tier (DISTINCT_NAMES_LIMIT_REACHED), body carries Retry-After
    • 502 search degraded: the underlying case search errored and returned no usable results, so no charge is made (PARTY_SCREEN_SEARCH_DEGRADED); the response carries a Retry-After header
    • 503 unavailable: account standing could not be verified with the identity service, the endpoint fails closed rather than serving an unauthorised result

    Security and compliance

    Where we stand today

    India hosted

    Infrastructure and data for this endpoint are hosted in India.

    Per account audit log

    Every call against your key is written to an audit log tied to your account, visible through the audit endpoint.

    Key hashing

    API keys are stored only as a hash. We cannot recover a lost key; you rotate it instead.

    Names never logged

    Name, aliases, knownPersons, identifiers and address are redacted before any request or response body is written to a log.

    No SOC 2, no ISO 27001, yet

    We do not hold either certification today. We are stating that plainly rather than implying a posture we have not earned.

    Restriction orders honoured

    De-indexing and masking orders that apply to CourtMesh are enforced on this endpoint, not only on search and case pages.

    FAQ

    Litigation check questions

    Read the full API pricing page, browse the API documentation, or contact our team with a volume question.