Public, no key endpoints: corpus coverage and freshness, court and case type reference data, and service health.
A liveness probe. No authentication and no rate limit tied to your account, so you can point your own monitoring at it. Note that it does not use the standard envelope.
# No API key required. This is the only unauthenticated endpoint.
curl https://research.courtmesh.ai/api/v1/prod/health?deep=1: an actual dependency checkThe plain form above never touches Mongo, OpenSearch, Qdrant, Redis or IAM: it answers the moment the process is up. Add ?deep=1 to actually check each of those five, bounded to 1 second each, and get back version, commit and a checks object naming each dependency. Mongo and OpenSearch are hard dependencies: either one failing flips the top level status to unhealthy and the response to HTTP 503. Qdrant, Redis and IAM are soft: their own check can report ok: false without changing the HTTP status, since search and case reads keep working without them (semantic search and live standing checks degrade instead). Use the plain form for a load balancer's frequent health check and the deep form for an occasional real readiness probe, not the other way round: it is slower by design.
curl "https://research.courtmesh.ai/api/v1/prod/health?deep=1"The court hierarchy the search endpoints accept for their court filter, read from the same JSON files that back the in-app search filter sidebar, so this endpoint can never drift from what the keyed search endpoints actually accept. Public: no key, protected by a shared IP keyed rate limit rather than an account limit. Cached for an hour with an ETag; send If-None-Match to get a 304 instead of the body.
# No API key required
curl https://research.courtmesh.ai/api/v1/prod/reference/courtsThe case type taxonomy the search endpoints accept for their caseType filter. Same public, cached, ETag'd shape as GET /reference/courts above: read this before you build a filter UI against case type, rather than hard coding a guessed list of codes.
# No API key required
curl https://research.courtmesh.ai/api/v1/prod/reference/case-typesCorpus coverage and freshness, by court and by year, refreshed from the search index every few hours and cached at the edge. This is the "check our numbers before you buy" endpoint: no API key, no rate limit tied to your account, so a prospective buyer or a monitoring job can call it cold. The same data backs the public coverage page.
documentBearing and statusOnly are optional fields, omitted from the response by default. When published, documentBearing counts records where we hold the order or judgment document, never a claim that its text is indexed or full text searchable; the rest are statusOnly, registry metadata with no document on file yet. total always equals documentBearing plus statusOnly whenever the split is published.districtCourts is one rolled up row, not one row per district: the index carries no state field to group on yet.businessDaysBehind can be null when a court has no recent activity to measure freshness against.meta.cacheTtlSeconds (21,600 seconds, 6 hours) and served with Cache-Control: public, max-age=300, plus CORS for courtmesh.ai and the marketing site, so you can call it straight from a browser.meta.snapshotAgeSeconds is how long ago the underlying count was computed; meta.cacheAgeSeconds is how long ago this particular cached response was served. They differ whenever a stale cache entry is still being served while a fresh snapshot computes behind it. meta.stale is true only when the snapshot is old enough that a refresh is overdue; treat it as a hint to retry shortly, not an error. meta.corpusNote is a one line, human readable restatement of the documentBearing/statusOnly definition above, safe to surface directly in a UI. The response never includes an internal job field or other operational diagnostics; treat any field outside this documented shape as not part of the contract, even if you see one in a raw response, and do not build against it.# No API key required.
curl https://research.courtmesh.ai/api/v1/prod/coverage// HTTP 503, the OpenSearch coverage source is cold and unreachable and no
// cached snapshot survives to serve stale.
{
"success": false,
"error": "Coverage data is temporarily unavailable. Please try again shortly."
}