Health and status
GET /v1/health
Section titled “GET /v1/health”No authentication. It never calls an OCR provider: it reports the snapshot that a check every 5 minutes records, cached for 60 seconds, so it can be up to about 6 minutes old.
{ "status": "ok", "version": "0.1.0", "ocr_provider": "ok", "ocr_providers": { "image": "novita", "pdf": "openparser" }, "ocr_models": { "available": ["novita/deepseek-ocr-2", "novita/paddleocr-vl", "openparser/paddleocr-vl-1.6", "…"], "auto": { "image": ["novita/deepseek-ocr-2", "openparser/paddleocr-vl-1.6"], "pdf": ["openparser/paddleocr-vl-1.6"] } }, "checked_at": "2026-10-09T10:05:00.000Z", "ocr_provider_checks": { "novita": { "status": "operational", "latency_ms": 640 }, "openparser": { "status": "operational", "latency_ms": 340 } }}| Field | Meaning |
|---|---|
ocr_provider |
ok when every configured provider is operational; degraded when one is not (conversions still run, OCR failures become warnings) or none is configured; unknown when there is no recent check. |
ocr_providers |
Provider tried first for pictures and for PDF pages with ocr_model=auto. |
ocr_models.available |
The ocr_model values this server accepts. |
ocr_models.auto |
The auto fallback chains for pictures and PDF pages. |
checked_at |
When the last check ran; null before the first one. |
ocr_provider_checks |
Per provider: operational, degraded, major_outage or unknown, and the last latency. |
The response has Cache-Control: public, max-age=60 and is not rate limited, so monitoring can poll it.
Status page
Section titled “Status page”status.md.tlelabs.com shows the API and each OCR provider over the last hour, 24 hours and 30 days. The same data is JSON at https://status.md.tlelabs.com/api/status (CORS allowed).
A provider is degraded after one failed check or a check slower than 10 seconds, and major_outage after two failures in a row.