---
title: "Service endpoints — API reference | Data Tactical Group"
route: "/docs/api/reference/service"
updated: "2026-10-23"
---

# Service

2 endpoints, generated from the API's own OpenAPI document. Liveness and this document.

## GET `/healthz`

**Liveness and vintage probe**

Credentials: none. Operation id `dataGetHealth`.

Anonymous. Reports that the process is up, which credential mode it serves, the vintage it reads (and /v1-compat's), and the state of the admission gate, the sandbox gate and the scheduled jobs. It runs one probe query against the current vintage file on every call. Not rate limited, not metered. Takes no parameters; query parameters are ignored.

### Responses

#### `200` success

The process is up and its current vintage answered.

As `application/json`.

**`status` "ok" always present**

Always `ok` on a 200: the process is up and could open its current vintage.

**`serves` "live" | "sandbox" | "both" always present**

Which credential mode this process serves (TAIGAN\_SERVES). A key of the other mode is refused 403 [`wrong_instance`](/docs/api/errors#code-wrong-instance) (`base_url` names the address that serves the key).

**`vintage` string always present**

The current vintage id of the scope this process probes: the live current vintage, or the sandbox one on a sandbox-only process.

**`compat_vintage` string always present**

The vintage the /v1-compat surface reads: `vintage`, unless a compat pin is configured.

**`compat_pinned` true**

Present, and true, only when /v1-compat is pinned to a vintage (COMPAT\_PIN\_VINTAGE).

**`sandbox` true**

Present, and true, only on a sandbox-only process.

**`saluki` "ok" | "bad" always present**

Result of a one-row probe query against the current vintage file: `ok` when it answered as expected.

**`sandbox_load` object**

Absent on a live-only process. The sandbox's concurrent-query gate.

**`sandbox_load.in_flight` integer always present**

Sandbox queries running now. (at least 0)

**`sandbox_load.max` integer always present**

The sandbox's concurrent-query maximum; past it, 429 [`sandbox_busy`](/docs/api/errors#code-sandbox-busy). (at least 0)

**`admission` object always present**

The global admission gate on data requests.

**`admission.in_flight` integer always present**

Data requests running now. (at least 0)

**`admission.queued` integer always present**

Data requests waiting for a slot. (at least 0)

**`admission.max` integer always present**

Concurrent data requests allowed (ADMISSION\_MAX\_CONCURRENT; 0 turns the gate off). (at least 0)

**`admission.queue` integer always present**

Queue places (ADMISSION\_QUEUE). (at least 0)

**`admission.refused_total` integer always present**

Requests refused 429 [`server_busy`](/docs/api/errors#code-server-busy) since the process started. (at least 0)

**`jobs` object always present**

The scheduled jobs' last run (POL-8). A stale `last_ok_at` beside a fresh `last_run_at`, or a non-empty `failed`, is a job that keeps failing.

**`jobs.last_run_at` string (date-time) or null always present**

When the jobs last ran; null before the first run since start.

**`jobs.last_ok_at` string (date-time) or null always present**

When a run last finished with no job failed; null if none has.

**`jobs.failed` array of string always present**

Names of the jobs that failed in the last run.

#### `400` error

Bad request. Codes: [`bad_request`](/docs/api/errors#code-bad-request) (more than 50 query parameters).

As `application/problem+json`.

#### `414` error

URI too long. Codes: [`uri_too_long`](/docs/api/errors#code-uri-too-long) (the request URL is longer than the configured maximum, 8,192 bytes by default).

As `application/problem+json`.

#### `500` error

The process is up but cannot serve. Codes: [`internal_error`](/docs/api/errors#code-internal-error) (the current vintage file could not be opened or queried, or the configured compat pin is not in the store).

As `application/problem+json`.

Problem codes: [`bad_request`](/docs/api/errors#code-bad-request) (400), [`uri_too_long`](/docs/api/errors#code-uri-too-long) (414), [`internal_error`](/docs/api/errors#code-internal-error) (500). Every problem is a [problem document](/docs/api/errors).

## GET `/v2/openapi.json`

**This document as JSON**

Credentials: none. Operation id `dataGetOpenapi`.

Anonymous. The OpenAPI 3.1 contract, parsed once at start-up from taigan/openapi.yaml and served as JSON. Not rate limited, not metered. Takes no parameters; query parameters are ignored.

### Responses

#### `200` success

The OpenAPI document.

As `application/json`.

#### `400` error

Bad request. Codes: [`bad_request`](/docs/api/errors#code-bad-request) (more than 50 query parameters).

As `application/problem+json`.

#### `414` error

URI too long. Codes: [`uri_too_long`](/docs/api/errors#code-uri-too-long) (the request URL is longer than the configured maximum, 8,192 bytes by default).

As `application/problem+json`.

Problem codes: [`bad_request`](/docs/api/errors#code-bad-request) (400), [`uri_too_long`](/docs/api/errors#code-uri-too-long) (414). Every problem is a [problem document](/docs/api/errors).

Generated from `taigan/openapi.yaml` at catahoula `77925fab712f`(API document version 2.0).
