# Health and status

> GET /v1/health reports the API and OCR provider status without authentication; status.md.tlelabs.com shows the last hour, day and month.

## 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.

```json
{
  "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

[status.md.tlelabs.com](https://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.
