Inference
Cedana inference control plane
Activations joined with profiles
Client error
Server error
GET /v1/inference/activations HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"activation_started_at": null,
"compatibility_key": "text",
"desired_state": "text",
"endpoint": null,
"estimated_cold_start_ms": 1,
"exact_model": "text",
"hosting_mode": "text",
"logical_model": "text",
"observed_generation": 1,
"phase": "text",
"profile_id": "text",
"profile_revision": "text",
"ready": true,
"ready_at": null,
"updated_at": "2026-01-01T00:00:00.000Z"
}
]Activation recorded
No content
Client error
Server error
POST /v1/inference/activations/report HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 112
{
"desired_state": "text",
"endpoint": null,
"observed_generation": 1,
"phase": "text",
"profile_id": "text",
"ready": true
}No content
Startup/storage/serving aggregate
Bad request
Client error
Server error
GET /v1/inference/analytics HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"evidence": "text",
"experiment_id": null,
"profile_id": null,
"sample_count": 1,
"serving": {
"average_ttft_ms": null,
"completion_tokens": 1,
"deadline_misses": 1,
"fallbacks": 1,
"prompt_tokens": 1,
"requests": 1,
"tokens_per_second": null
},
"startup": {
"cold": null,
"restore": null,
"saved_p50_ms": null,
"speedup_p50": null,
"warm": null
},
"storage": {
"dedup_ratio": null,
"incremental_ratio": null,
"logical_bytes": 1,
"physical_bytes": 1,
"reused_bytes": 1,
"transferred_bytes": 1,
"written_bytes": 1
},
"window_hours": 1
}Checkpoint artefacts
When a worker last became ready from this artefact.
Worker pods started from this artefact, ready or not. The gap against observed_restores is the interesting part.
Worker pods started from this artefact that went on to serve. Counted from the pods that ran, so it answers how many times the checkpoint was actually used.
Unmaintained; do not display. Only restore_count_increment on the artifact PATCH writes it, and no caller sends that. Use observed_restores.
Bad request
Client error
Server error
GET /v1/inference/artifacts HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"artifact_id": "text",
"checkpoint_mode": "text",
"checksum": null,
"compatibility_key": "text",
"created_at": "2026-01-01T00:00:00.000Z",
"exact_model": "text",
"hosting_mode": "text",
"last_restored_at": null,
"logical_bytes": null,
"logical_model": "text",
"metadata": null,
"observed_restore_attempts": null,
"observed_restores": null,
"parent_artifact_id": null,
"physical_bytes": null,
"profile_id": "text",
"residency": null,
"restore_count": 1,
"reused_bytes": null,
"source": "text",
"status": "text",
"storage_tier": "text",
"updated_at": "2026-01-01T00:00:00.000Z",
"uri": "text",
"written_bytes": null
}
]Existing artefact (idempotent)
When a worker last became ready from this artefact.
Worker pods started from this artefact, ready or not. The gap against observed_restores is the interesting part.
Worker pods started from this artefact that went on to serve. Counted from the pods that ran, so it answers how many times the checkpoint was actually used.
Unmaintained; do not display. Only restore_count_increment on the artifact PATCH writes it, and no caller sends that. Use observed_restores.
Artefact registered
Bad request
Client error
Server error
POST /v1/inference/artifacts HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 283
{
"artifact_id": "text",
"checkpoint_mode": "text",
"checksum": null,
"compatibility_key": "text",
"logical_bytes": null,
"metadata": null,
"parent_artifact_id": null,
"physical_bytes": null,
"profile_id": "text",
"reused_bytes": null,
"source": null,
"storage_tier": null,
"uri": "text",
"written_bytes": null
}{
"artifact_id": "text",
"checkpoint_mode": "text",
"checksum": null,
"compatibility_key": "text",
"created_at": "2026-01-01T00:00:00.000Z",
"exact_model": "text",
"hosting_mode": "text",
"last_restored_at": null,
"logical_bytes": null,
"logical_model": "text",
"metadata": null,
"observed_restore_attempts": null,
"observed_restores": null,
"parent_artifact_id": null,
"physical_bytes": null,
"profile_id": "text",
"residency": null,
"restore_count": 1,
"reused_bytes": null,
"source": "text",
"status": "text",
"storage_tier": "text",
"updated_at": "2026-01-01T00:00:00.000Z",
"uri": "text",
"written_bytes": null
}Artefact detail
When a worker last became ready from this artefact.
Worker pods started from this artefact, ready or not. The gap against observed_restores is the interesting part.
Worker pods started from this artefact that went on to serve. Counted from the pods that ran, so it answers how many times the checkpoint was actually used.
Unmaintained; do not display. Only restore_count_increment on the artifact PATCH writes it, and no caller sends that. Use observed_restores.
Not found
Client error
Server error
GET /v1/inference/artifacts/{artifact_id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"artifact_id": "text",
"checkpoint_mode": "text",
"checksum": null,
"compatibility_key": "text",
"created_at": "2026-01-01T00:00:00.000Z",
"exact_model": "text",
"hosting_mode": "text",
"last_restored_at": null,
"logical_bytes": null,
"logical_model": "text",
"metadata": null,
"observed_restore_attempts": null,
"observed_restores": null,
"parent_artifact_id": null,
"physical_bytes": null,
"profile_id": "text",
"residency": null,
"restore_count": 1,
"reused_bytes": null,
"source": "text",
"status": "text",
"storage_tier": "text",
"updated_at": "2026-01-01T00:00:00.000Z",
"uri": "text",
"written_bytes": null
}Artefact soft-deleted
Not found
Golden artefact requires force
Client error
Server error
DELETE /v1/inference/artifacts/{artifact_id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
No content
Bumps the stored restore_count. Kept for compatibility; do not build on it. No caller sends it, and observed_restores replaces it.
Artefact updated
When a worker last became ready from this artefact.
Worker pods started from this artefact, ready or not. The gap against observed_restores is the interesting part.
Worker pods started from this artefact that went on to serve. Counted from the pods that ran, so it answers how many times the checkpoint was actually used.
Unmaintained; do not display. Only restore_count_increment on the artifact PATCH writes it, and no caller sends that. Use observed_restores.
Bad request
Not found
Client error
Server error
PATCH /v1/inference/artifacts/{artifact_id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 46
{
"restore_count_increment": null,
"status": null
}{
"artifact_id": "text",
"checkpoint_mode": "text",
"checksum": null,
"compatibility_key": "text",
"created_at": "2026-01-01T00:00:00.000Z",
"exact_model": "text",
"hosting_mode": "text",
"last_restored_at": null,
"logical_bytes": null,
"logical_model": "text",
"metadata": null,
"observed_restore_attempts": null,
"observed_restores": null,
"parent_artifact_id": null,
"physical_bytes": null,
"profile_id": "text",
"residency": null,
"restore_count": 1,
"reused_bytes": null,
"source": "text",
"status": "text",
"storage_tier": "text",
"updated_at": "2026-01-01T00:00:00.000Z",
"uri": "text",
"written_bytes": null
}Parent chain oldest-first
When a worker last became ready from this artefact.
Worker pods started from this artefact, ready or not. The gap against observed_restores is the interesting part.
Worker pods started from this artefact that went on to serve. Counted from the pods that ran, so it answers how many times the checkpoint was actually used.
Unmaintained; do not display. Only restore_count_increment on the artifact PATCH writes it, and no caller sends that. Use observed_restores.
Not found
Client error
Server error
GET /v1/inference/artifacts/{artifact_id}/ancestry HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"artifact_id": "text",
"checkpoint_mode": "text",
"checksum": null,
"compatibility_key": "text",
"created_at": "2026-01-01T00:00:00.000Z",
"exact_model": "text",
"hosting_mode": "text",
"last_restored_at": null,
"logical_bytes": null,
"logical_model": "text",
"metadata": null,
"observed_restore_attempts": null,
"observed_restores": null,
"parent_artifact_id": null,
"physical_bytes": null,
"profile_id": "text",
"residency": null,
"restore_count": 1,
"reused_bytes": null,
"source": "text",
"status": "text",
"storage_tier": "text",
"updated_at": "2026-01-01T00:00:00.000Z",
"uri": "text",
"written_bytes": null
}
]Artefact promoted
When a worker last became ready from this artefact.
Worker pods started from this artefact, ready or not. The gap against observed_restores is the interesting part.
Worker pods started from this artefact that went on to serve. Counted from the pods that ran, so it answers how many times the checkpoint was actually used.
Unmaintained; do not display. Only restore_count_increment on the artifact PATCH writes it, and no caller sends that. Use observed_restores.
Bad request
Not found
Client error
Server error
POST /v1/inference/artifacts/{artifact_id}/promote HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 34
{
"deadline_ms": null,
"tier": "text"
}{
"artifact_id": "text",
"checkpoint_mode": "text",
"checksum": null,
"compatibility_key": "text",
"created_at": "2026-01-01T00:00:00.000Z",
"exact_model": "text",
"hosting_mode": "text",
"last_restored_at": null,
"logical_bytes": null,
"logical_model": "text",
"metadata": null,
"observed_restore_attempts": null,
"observed_restores": null,
"parent_artifact_id": null,
"physical_bytes": null,
"profile_id": "text",
"residency": null,
"restore_count": 1,
"reused_bytes": null,
"source": "text",
"status": "text",
"storage_tier": "text",
"updated_at": "2026-01-01T00:00:00.000Z",
"uri": "text",
"written_bytes": null
}List the latest capacity intent per profile. One per profile, newest first by update, whatever its status, so a caller can show what was last asked for.
Latest capacity intent per profile
When this intent row was first created. Not when the request it currently describes was made: the row is reused for a repeated ask. Use requested_at for that.
When a caller last asked for this exact state and replica count, so it orders requests as they were made rather than as the row happened to change.
When this row last changed for any reason, including the expiry sweep. Not an ordering key for what a caller asked for.
Client error
Server error
GET /v1/inference/capacity-intents HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"created_at": "2026-01-01T00:00:00.000Z",
"deadline": null,
"desired_replicas": 1,
"desired_state": "text",
"generation": 1,
"id": "123e4567-e89b-12d3-a456-426614174000",
"profile_id": "text",
"requested_at": "2026-01-01T00:00:00.000Z",
"status": "text",
"updated_at": "2026-01-01T00:00:00.000Z"
}
]OpenAI-compatible chat with routing. Switchyard owns the external surface and does its own selection, so this is a simpler duplicate kept for existing callers.
Chat completion (streaming or not)
Invalid API key
Model not allowed
Unknown model alias
Rate limit or budget
No profile can meet deadline
Client error
Server error
POST /v1/inference/chat/completions HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
No content
Experiment correlation
Experiment not found
Client error
Server error
GET /v1/inference/correlation?experiment_id=123e4567-e89b-12d3-a456-426614174000 HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"activations": [
{
"count": 1,
"name": "text"
}
],
"artifacts": [
{
"artifact_id": "text",
"checkpoint_mode": "text",
"status": "text"
}
],
"experiment_id": "123e4567-e89b-12d3-a456-426614174000",
"intents": [
{
"count": 1,
"name": "text"
}
],
"name": "text",
"observations": [
{
"count": 1,
"name": "text"
}
],
"policy_decisions": [
{
"count": 1,
"name": "text"
}
],
"scenario": "text",
"status": "text",
"usage": {
"cold_start_avoided_ms": 1,
"fallbacks": 1,
"requests": 1,
"successful_requests": 1
}
}Per-profile cost breakdown
Bad request
Client error
Server error
GET /v1/inference/costs/breakdown HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"activation_count": 1,
"active_duration_s": 1,
"compute_usd": 1,
"fallback_usd": 1,
"idle_time_s": 1,
"node_seconds": 1,
"profile_id": "text",
"release_latency_ms": null,
"storage_usd": 1,
"tokens_served": 1,
"transfer_usd": 1
}
]Cost rates
Client error
Server error
GET /v1/inference/costs/config HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"node_hourly_usd": 1,
"profile_id": "text",
"storage_gb_hour_usd": 1,
"transfer_gb_usd": 1
}
]Cost rates saved
Bad request
Profile not found
Client error
Server error
POST /v1/inference/costs/config HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 85
{
"node_hourly_usd": 1,
"profile_id": "text",
"storage_gb_hour_usd": 1,
"transfer_gb_usd": 1
}{
"node_hourly_usd": 1,
"profile_id": "text",
"storage_gb_hour_usd": 1,
"transfer_gb_usd": 1
}Baseline vs treatment report
Bad request
Client error
Server error
GET /v1/inference/costs/report HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"baseline": {
"cost_usd": 1,
"heavy_activation_count": 1,
"heavy_active_duration_s": 1,
"node_seconds": 1
},
"hours": 1,
"node_seconds_saved": 1,
"savings_pct": 1,
"savings_usd": 1,
"treatment": {
"cost_usd": 1,
"heavy_activation_count": 1,
"heavy_active_duration_s": 1,
"node_seconds": 1
},
"treatment_escalation_rate": 1,
"treatment_idle_time_s": 1,
"treatment_quality": {
"avg_ttft_ms": null,
"refusal_rate": 1
},
"treatment_release_latency_ms": null,
"variance": null
}Experiments with observation counts
Client error
Server error
GET /v1/inference/experiments HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"completed_at": null,
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"observations": 1,
"parameters": null,
"profile_id": null,
"scenario": "text",
"started_at": "2026-01-01T00:00:00.000Z",
"status": "text"
}
]Experiment created
Bad request
Client error
Server error
POST /v1/inference/experiments HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 69
{
"name": "text",
"parameters": null,
"profile_id": null,
"scenario": "text"
}{
"completed_at": null,
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"parameters": null,
"profile_id": null,
"scenario": "text",
"started_at": "2026-01-01T00:00:00.000Z",
"status": "text"
}Get an experiment's desired lifecycle state. Controllers use this after an outbox wake-up rather than trusting a replayed event payload.
Experiment ID
Experiment
Experiment not found
Client error
Server error
GET /v1/inference/experiments/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"completed_at": null,
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"parameters": null,
"profile_id": null,
"scenario": "text",
"started_at": "2026-01-01T00:00:00.000Z",
"status": "text"
}Experiment updated
Running experiment not found
Client error
Server error
POST /v1/inference/experiments/{id}/complete HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 17
{
"status": "text"
}{
"completed_at": null,
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "text",
"parameters": null,
"profile_id": null,
"scenario": "text",
"started_at": "2026-01-01T00:00:00.000Z",
"status": "text"
}Fleets
Client error
Server error
GET /v1/inference/fleets HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"availability": null,
"budgets": null,
"created_at": "2026-01-01T00:00:00.000Z",
"fleet_id": "text",
"logical_model": "text",
"name": "text",
"profile_ids": null,
"residency": null
}
]Fleet saved
Bad request
Client error
Server error
POST /v1/inference/fleets HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 129
{
"availability": null,
"budgets": null,
"fleet_id": null,
"logical_model": "text",
"name": "text",
"profile_ids": [
"text"
],
"residency": null
}{
"availability": null,
"budgets": null,
"created_at": "2026-01-01T00:00:00.000Z",
"fleet_id": "text",
"logical_model": "text",
"name": "text",
"profile_ids": null,
"residency": null
}Fleet detail
Not found
Client error
Server error
GET /v1/inference/fleets/{fleet_id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"availability": null,
"budgets": null,
"created_at": "2026-01-01T00:00:00.000Z",
"fleet_id": "text",
"logical_model": "text",
"name": "text",
"profile_ids": null,
"residency": null
}Fleet deleted
No content
Not found
Profile still routed
Client error
Server error
DELETE /v1/inference/fleets/{fleet_id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
No content
Issued keys
Client error
Server error
GET /v1/inference/keys HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"budget_usd": null,
"created_at": "2026-01-01T00:00:00.000Z",
"key_id": "text",
"models": null,
"name": "text",
"rate_limit_rps": null,
"revoked_at": null,
"tenant_id": null
}
]Key issued (raw shown once)
The raw key, shown exactly once at creation.
Bad request
Client error
Server error
POST /v1/inference/keys HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 90
{
"budget_usd": null,
"models": [
"text"
],
"name": "text",
"rate_limit_rps": null,
"tenant_id": null
}{
"budget_usd": null,
"created_at": "2026-01-01T00:00:00.000Z",
"key_id": "text",
"models": null,
"name": "text",
"rate_limit_rps": null,
"revoked_at": null,
"tenant_id": null,
"raw_key": "text"
}Key revoked
No content
Not found
Client error
Server error
DELETE /v1/inference/keys/{key_id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
No content
The cluster's recent lifecycle events across all profiles, time-ascending, so a UI can replay how the routing topology changed over time.
Only events at or after this instant, so a poller can page forward.
Lifecycle events across all profiles
One durably-persisted lifecycle event, across every profile in the cluster.
Lifecycle kind, e.g. model.ready, route.published, route.withdrawn.
The profile the event belongs to, when known. Null for cluster-wide events and for rows written before the column existed.
Bad request
Client error
Server error
GET /v1/inference/lifecycle-events HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"event_id": "123e4567-e89b-12d3-a456-426614174000",
"generation": null,
"kind": "text",
"occurred_at": "2026-01-01T00:00:00.000Z",
"payload": null,
"profile_id": null,
"sequence": null
}
]Ingest one trusted lifecycle envelope over HTTP. Same event_id dedupe and transactional ingestion as the RabbitMQ path.
Shared envelope for trusted lifecycle events.
Checkpoint/restore action UUID when the event belongs to one.
Model activation row UUID when applicable.
Checkpoint artifact UUID for checkpoint events.
Nebius cluster (clusters.id UUID).
Idempotency key: generated once per logical event and reused across transport retries (RabbitMQ redelivery, HTTP retry).
Activation observed generation.
One of SUPPORTED_LIFECYCLE_KINDS.
Node the event came from (checkpoint tmpfs artifacts are boot-tied).
When the event happened at the source (RFC3339 UTC).
Free-form JSON; required fields vary per kind.
Deployment profile id (e.g. qwen3-30b-a3b-l40s-fp8).
MUST be 1; anything else is dead-lettered on ingestion.
Per-(cluster_id, activation_id) monotonic counter; 0 when not applicable.
k8s pod/DGD UID when relevant.
Lifecycle event accepted
No content
Invalid envelope (schema version or kind)
Unauthorized
Duplicate event_id
Client error
Server error
POST /v1/inference/lifecycle/events HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 348
{
"action_id": null,
"activation_id": null,
"artifact_id": null,
"boot_id": null,
"cluster_id": "123e4567-e89b-12d3-a456-426614174000",
"event_id": "123e4567-e89b-12d3-a456-426614174000",
"generation": 1,
"kind": "text",
"node_uid": null,
"occurred_at": "2026-01-01T00:00:00.000Z",
"payload": null,
"profile_id": "text",
"schema_version": 1,
"sequence": 1,
"workload_uid": null
}No content
Routing metrics summary
Invalid API key
Client error
Server error
GET /v1/inference/metrics HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"average_backend_latency_ms": 1,
"average_routing_latency_ms": 1,
"estimated_cold_start_avoided_ms": 1,
"fallbacks": 1,
"requests": 1,
"successful_requests": 1
}OpenAI models list
Invalid API key
Client error
Server error
GET /v1/inference/models HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
No content
Recent observations
Bad request
Client error
Server error
GET /v1/inference/observations HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"completion_tokens": null,
"deadline_missed": null,
"duration_ms": null,
"event_type": "text",
"evidence": "text",
"experiment_id": null,
"fallback_used": null,
"id": "123e4567-e89b-12d3-a456-426614174000",
"logical_bytes": null,
"observation_key": "text",
"physical_bytes": null,
"profile_id": null,
"prompt_tokens": null,
"source": "text",
"started_at": "2026-01-01T00:00:00.000Z",
"success": null,
"ttft_ms": null
}
]Observation recorded
Bad request
Client error
Server error
POST /v1/inference/observations HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 613
{
"action_id": null,
"checkpoint_id": null,
"checkpoint_mode": null,
"cluster_id": null,
"completed_at": null,
"completion_tokens": null,
"deadline_missed": null,
"deployment_id": null,
"dimensions": null,
"duration_ms": null,
"event_type": "text",
"evidence": "text",
"experiment_id": null,
"fallback_used": null,
"logical_bytes": null,
"metrics": null,
"node_id": null,
"observation_key": "text",
"physical_bytes": null,
"profile_id": null,
"prompt_tokens": null,
"request_id": null,
"reused_bytes": null,
"source": "text",
"started_at": "2026-01-01T00:00:00.000Z",
"storage_tier": null,
"success": null,
"transferred_bytes": null,
"ttft_ms": null,
"written_bytes": null
}{
"duration_ms": null,
"event_type": "text",
"evidence": "text",
"experiment_id": null,
"id": "123e4567-e89b-12d3-a456-426614174000",
"observation_key": "text",
"profile_id": null,
"source": "text",
"started_at": "2026-01-01T00:00:00.000Z"
}Outbox events after cursor
Bad request
Client error
Server error
GET /v1/inference/outbox?consumer_id=text HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"aggregate_id": "text",
"aggregate_type": "text",
"created_at": "2026-01-01T00:00:00.000Z",
"event_type": "text",
"id": 1,
"payload": null
}
]Cursor advanced
No content
Client error
Server error
POST /v1/inference/outbox/ack HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 35
{
"consumer_id": "text",
"event_id": 1
}No content
List of deployment profiles
Client error
Server error
GET /v1/inference/profiles HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"backend_url": "text",
"compatibility_key": "text",
"dynamo_template": null,
"estimated_cold_start_ms": 1,
"exact_model": "text",
"hosting_mode": "text",
"logical_model": "text",
"max_queue_depth": 1,
"max_replicas": 1,
"min_replicas": 1,
"profile_id": "text",
"profile_revision": "text",
"scale_down_idle_seconds": 1,
"spec": null,
"target_concurrency": 1
}
]Profile created
Bad request
Checkpoint ownership conflict
Client error
Server error
POST /v1/inference/profiles HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 297
{
"backend_url": "text",
"compatibility": null,
"dynamo_template": null,
"estimated_cold_start_ms": 1,
"exact_model": "text",
"hosting_mode": "text",
"logical_model": "text",
"max_queue_depth": 1,
"max_replicas": 1,
"min_replicas": 1,
"profile_id": "text",
"scale_down_idle_seconds": 1,
"spec": null,
"target_concurrency": 1
}{
"backend_url": "text",
"compatibility_key": "text",
"dynamo_template": null,
"estimated_cold_start_ms": 1,
"exact_model": "text",
"hosting_mode": "text",
"logical_model": "text",
"max_queue_depth": 1,
"max_replicas": 1,
"min_replicas": 1,
"profile_id": "text",
"profile_revision": "text",
"scale_down_idle_seconds": 1,
"spec": null,
"target_concurrency": 1
}Latest checkpoint request
An on-demand checkpoint request and how far it has got.
The artifact the checkpoint produced, once it succeeded.
Why it failed, in the controller's words.
checkpoint or restart. One row per profile, so asking twice returns the open one.
Identifies this attempt. A caller polling with the id it was given cannot be shown a later request's outcome as though it were its own.
pending → running → succeeded | failed
No checkpoint has been requested
Client error
Server error
GET /v1/inference/profiles/{profile_id}/checkpoint HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"artifact_id": null,
"completed_at": null,
"error": null,
"kind": "text",
"profile_id": "text",
"reason": null,
"replace_existing": true,
"request_id": "123e4567-e89b-12d3-a456-426614174000",
"requested_at": "2026-01-01T00:00:00.000Z",
"started_at": null,
"status": "text"
}Ask for a checkpoint of this profile's worker now. Covers the two cases the automatic path refuses: a restored worker, and replacing an existing checkpoint.
What a caller asks for when it wants a checkpoint taken now.
What this checkpoint is for, carried onto the artifact so a tier holding several has something to tell them apart by.
Whether the previous checkpoint may be deleted to make room. On by default, because the tier holds barely more than one dump.
Checkpoint requested
An on-demand checkpoint request and how far it has got.
The artifact the checkpoint produced, once it succeeded.
Why it failed, in the controller's words.
checkpoint or restart. One row per profile, so asking twice returns the open one.
Identifies this attempt. A caller polling with the id it was given cannot be shown a later request's outcome as though it were its own.
pending → running → succeeded | failed
Profile not found
Profile does not checkpoint
Client error
Server error
POST /v1/inference/profiles/{profile_id}/checkpoint HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 39
{
"reason": null,
"replace_existing": true
}{
"artifact_id": null,
"completed_at": null,
"error": null,
"kind": "text",
"profile_id": "text",
"reason": null,
"replace_existing": true,
"request_id": "123e4567-e89b-12d3-a456-426614174000",
"requested_at": "2026-01-01T00:00:00.000Z",
"started_at": null,
"status": "text"
}What the controller reports back about a request it picked up.
Correlates this report to the request it describes, so a late report from a superseded attempt cannot overwrite the current outcome.
running when the dump starts, then succeeded or failed.
Updated
An on-demand checkpoint request and how far it has got.
The artifact the checkpoint produced, once it succeeded.
Why it failed, in the controller's words.
checkpoint or restart. One row per profile, so asking twice returns the open one.
Identifies this attempt. A caller polling with the id it was given cannot be shown a later request's outcome as though it were its own.
pending → running → succeeded | failed
Unknown status
No checkpoint has been requested
Client error
Server error
PATCH /v1/inference/profiles/{profile_id}/checkpoint HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 101
{
"artifact_id": null,
"error": null,
"request_id": "123e4567-e89b-12d3-a456-426614174000",
"status": "text"
}{
"artifact_id": null,
"completed_at": null,
"error": null,
"kind": "text",
"profile_id": "text",
"reason": null,
"replace_existing": true,
"request_id": "123e4567-e89b-12d3-a456-426614174000",
"requested_at": "2026-01-01T00:00:00.000Z",
"started_at": null,
"status": "text"
}Hosting plan
Profile not found
Client error
Server error
GET /v1/inference/profiles/{profile_id}/hosting HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"checkpoint_owner": "text",
"checkpoint_request": null,
"compatibility_key": "text",
"cpu_fixture": true,
"dynamo_template": null,
"hosting_mode": "text",
"profile_id": "text",
"profile_revision": "text"
}Live prefix-cache counters, read from the worker. The 30s scrape series is too coarse to attribute to one chat turn.
Live cache counters
What a profile's engine is currently reusing.
Tokens per KV block. Reuse happens in whole blocks, so a prompt shorter than two of them reports no hits however often it repeats.
Which worker answered, so a caller can tell a restart apart from a counter that merely moved.
Prompt tokens the engine has looked up, cumulatively.
Of those, how many skipped prefill because they were already resident.
No worker endpoint known
Worker did not answer
Client error
Server error
GET /v1/inference/profiles/{profile_id}/kv-cache HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"block_size": null,
"gpu_blocks": null,
"pod_name": null,
"prefix_caching": null,
"profile_id": "text",
"queried_tokens": 1,
"reused_tokens": 1
}Deployment progress
How far a profile has got, and how long each stage took.
Measured activation-start-to-ready, absent until the profile is ready. A time-to-ready, and only a cold start when start_kind is not restore.
The checkpoint the worker was told to restore from, when it was.
How the worker behind this activation started: restore, cold, or null when no live worker pod is known.
Unknown profile
Client error
Server error
GET /v1/inference/profiles/{profile_id}/progress HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"activation_started_at": null,
"cold_start_ms": null,
"phase": null,
"profile_id": "text",
"ready": true,
"ready_at": null,
"restore_checkpoint_path": null,
"start_kind": null,
"steps": [
{
"elapsed_ms": null,
"kind": "text",
"occurred_at": "2026-01-01T00:00:00.000Z",
"payload": null
}
]
}Replace this profile's worker so it restores from its last checkpoint, coming back with the KV cache it had in about a minute rather than eleven.
Restart requested
An on-demand checkpoint request and how far it has got.
The artifact the checkpoint produced, once it succeeded.
Why it failed, in the controller's words.
checkpoint or restart. One row per profile, so asking twice returns the open one.
Identifies this attempt. A caller polling with the id it was given cannot be shown a later request's outcome as though it were its own.
pending → running → succeeded | failed
Profile not found
Nothing to restore from
Client error
Server error
POST /v1/inference/profiles/{profile_id}/restart HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"artifact_id": null,
"completed_at": null,
"error": null,
"kind": "text",
"profile_id": "text",
"reason": null,
"replace_existing": true,
"request_id": "123e4567-e89b-12d3-a456-426614174000",
"requested_at": "2026-01-01T00:00:00.000Z",
"started_at": null,
"status": "text"
}Capacity intent accepted
When this intent row was first created. Not when the request it currently describes was made: the row is reused for a repeated ask. Use requested_at for that.
When a caller last asked for this exact state and replica count, so it orders requests as they were made rather than as the row happened to change.
When this row last changed for any reason, including the expiry sweep. Not an ordering key for what a caller asked for.
Bad request
Client error
Server error
POST /v1/inference/profiles/{profile_id}/state HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 67
{
"deadline_ms": null,
"desired_replicas": null,
"desired_state": "text"
}{
"created_at": "2026-01-01T00:00:00.000Z",
"deadline": null,
"desired_replicas": 1,
"desired_state": "text",
"generation": 1,
"id": "123e4567-e89b-12d3-a456-426614174000",
"profile_id": "text",
"requested_at": "2026-01-01T00:00:00.000Z",
"status": "text",
"updated_at": "2026-01-01T00:00:00.000Z"
}Record where a profile's worker publishes its metrics (controller only). The propagator can reach the port but cannot find the pod IP itself.
Where a profile's worker publishes engine metrics (controller only).
Recorded
No content
Client error
Server error
PUT /v1/inference/profiles/{profile_id}/worker-endpoint HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 38
{
"metrics_url": "text",
"pod_name": null
}No content
Retention policies
Client error
Server error
GET /v1/inference/retention-policies HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"enabled": true,
"max_age_days": null,
"max_count": null,
"min_tier": null,
"name": "text",
"policy_id": "text",
"profile_id": null
}
]Policy saved
Bad request
Client error
Server error
POST /v1/inference/retention-policies HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 118
{
"enabled": true,
"max_age_days": null,
"max_count": null,
"min_tier": null,
"name": "text",
"policy_id": null,
"profile_id": null
}{
"enabled": true,
"max_age_days": null,
"max_count": null,
"min_tier": null,
"name": "text",
"policy_id": "text",
"profile_id": null
}Policy deleted
No content
Not found
Client error
Server error
DELETE /v1/inference/retention-policies/{policy_id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
No content
List of route policies
Client error
Server error
GET /v1/inference/routes HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"classifier_profile_id": null,
"classifier_prompt": null,
"classifier_response_schema": null,
"generation": 1,
"logical_model": "text",
"mode": "text",
"queue_timeout_ms": 1,
"targets": [
{
"priority": 1,
"profile_id": "text",
"tier": "text"
}
]
}
]Route policy saved
Client error
Server error
POST /v1/inference/routes HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 208
{
"classifier_profile_id": null,
"classifier_prompt": null,
"classifier_response_schema": null,
"logical_model": "text",
"mode": "text",
"queue_timeout_ms": 1,
"targets": [
{
"priority": 1,
"profile_id": "text",
"tier": "text"
}
]
}{
"classifier_profile_id": null,
"classifier_prompt": null,
"classifier_response_schema": null,
"generation": 1,
"logical_model": "text",
"mode": "text",
"queue_timeout_ms": 1,
"targets": [
{
"priority": 1,
"profile_id": "text",
"tier": "text"
}
]
}Project routing outcomes for a traffic mix. A step function on p50, and a profile with nothing measured yet falls back to estimates rather than measurements.
Projected outcomes
Bad request
Unknown logical model
Client error
Server error
POST /v1/inference/routes/simulate HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 95
{
"cold_share": 1,
"deadline_ms": 1,
"logical_model": "text",
"requests_per_hour": 1,
"restore_share": 1
}{
"cold_share": 1,
"evidence": "text",
"logical_model": "text",
"projected_cold_p50_ms": null,
"projected_deadline_miss_rate": 1,
"projected_fallback_rate": 1,
"projected_p50_ms": 1,
"projected_restore_p50_ms": null,
"requests_per_hour": 1,
"restore_share": 1
}Route-state snapshot
A Pending intent asks for this profile to be Active on at least one replica, so something is trying to bring it up.
Any capacity intent for the primary is still Pending, either direction. Rarely the field you want; prefer pending_activation or pending_release.
A Pending intent asks for this profile to stop holding an accelerator (Suspended, or Active at zero replicas).
The checkpoint the live worker was told to restore from, when it was.
How the worker now on this profile started, read from the pod spec: restore when it was given a checkpoint, cold otherwise.
Client error
Server error
GET /v1/inference/routes/status HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"endpoint": null,
"fallback_profile_id": null,
"fallback_ready": true,
"logical_model": "text",
"pending_activation": true,
"pending_intent": true,
"pending_release": true,
"primary_phase": null,
"primary_profile_id": "text",
"primary_ready": true,
"queue_timeout_ms": 1,
"restore_checkpoint_path": null,
"start_kind": null,
"state": "text"
}
]Cold versus restore worker startup, per profile
Cold starts against restores, for one profile.
Milliseconds a restore saves at the median.
Cold median divided by restore median. Above 1 means restoring is faster.
Client error
Server error
GET /v1/inference/startup-comparison HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"cold": null,
"logical_model": "text",
"profile_id": "text",
"restored": null,
"saved_ms": null,
"speedup": null,
"starts": [
{
"checkpoint_path": null,
"pod_name": "text",
"ready_at": null,
"restored": true,
"start_time_ms": 1
}
]
}
]Per-tier storage totals
Client error
Server error
GET /v1/inference/storage/summary HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"tiers": [
{
"artifacts": 1,
"bytes": 1,
"residency_hours": 1,
"tier": "text",
"transfers": 1
}
],
"total_artifacts": 1,
"total_bytes": 1
}Bucketed usage
Bad request
Client error
Server error
GET /v1/inference/usage/series HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
[
{
"avg_backend_ms": null,
"avg_routing_ms": null,
"avg_ttft_ms": null,
"bucket": "2026-01-01T00:00:00.000Z",
"cold_start_avoided_ms": 1,
"completion_tokens": 1,
"deadline_misses": 1,
"fallbacks": 1,
"prompt_tokens": 1,
"requests": 1,
"successes": 1
}
]Last updated
Was this helpful?