> For the complete documentation index, see [llms.txt](https://docs.cedana.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cedana.ai/references/api/dynamo.md).

# Dynamo

Cedana API for Dynamo deployments

## List Dynamo checkpoints (the checkpoint library)

> Returns checkpoints in the given cluster, optionally filtered by\
> CEDANA\_CHECKPOINT name. Each entry is a reusable warm-state asset that any\
> deployment with a matching CEDANA\_CHECKPOINT env restores from.

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"DynamoCheckpointEntry":{"description":"One CEDANA_CHECKPOINT \"slot\" in the library. A name can have many individual\ncheckpoints over time (you can checkpoint the same env value repeatedly); this\naggregates them into a single slot row.","properties":{"checkpoint_count":{"description":"Number of (non-deprecated) checkpoints captured under this name","format":"int64","type":"integer"},"created_at":{"description":"Timestamp of the most recent checkpoint under this name","format":"date-time","type":["string","null"]},"deployment_name":{"description":"Deployment whose CEDANA_CHECKPOINT env equals this checkpoint's name, if any.","type":["string","null"]},"model":{"description":"Model served by that deployment (drives the model logo + \"deploy from\").","type":["string","null"]},"name":{"description":"CEDANA_CHECKPOINT name (the stable restore key)","type":"string"},"restorable":{"description":"True if at least one checkpoint under this name is ready + restorable","type":"boolean"}},"required":["name","checkpoint_count","restorable"],"type":"object"},"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/checkpoints":{"get":{"description":"Returns checkpoints in the given cluster, optionally filtered by\nCEDANA_CHECKPOINT name. Each entry is a reusable warm-state asset that any\ndeployment with a matching CEDANA_CHECKPOINT env restores from.","operationId":"list_checkpoints","parameters":[{"description":"Cluster to scope checkpoints to.","in":"query","name":"cluster_id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Optional CEDANA_CHECKPOINT name to filter by","in":"query","name":"name","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DynamoCheckpointEntry"},"type":"array"}}},"description":"Checkpoint library"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"List Dynamo checkpoints (the checkpoint library)","tags":["Dynamo"]}}}}
```

## Submit Dynamo deployment

> Publishes a DynamoGraphDeployment manifest to the cluster's RabbitMQ queue.\
> The controller applies it via the dynamic Kubernetes client.

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"DynamoDeployRequest":{"description":"Request body for submitting a DynamoGraphDeployment to a cluster.","properties":{"cluster_id":{"description":"ID of the target cluster","type":"string"},"enable_checkpointing":{"description":"If true, inject runtimeClassName: cedana and CEDANA_CHECKPOINT into worker pod specs","type":"boolean"},"manifest":{"description":"Full DynamoGraphDeployment manifest (nvidia.com/v1alpha1)"}},"required":["cluster_id","manifest"],"type":"object"},"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/deploy":{"post":{"description":"Publishes a DynamoGraphDeployment manifest to the cluster's RabbitMQ queue.\nThe controller applies it via the dynamic Kubernetes client.","operationId":"deploy","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DynamoDeployRequest"}}},"required":true},"responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Deployment queued"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Bad request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"Submit Dynamo deployment","tags":["Dynamo"]}}}}
```

## List Dynamo deployments

> Returns all DynamoGraphDeployments synced from the specified cluster.

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"DynamoDeploymentView":{"allOf":[{"$ref":"#/components/schemas/DynamoDeployment"},{"properties":{"checkpoint_name":{"description":"CEDANA_CHECKPOINT name of the first worker service, if checkpointing is\nenabled. This is the stable key a worker restores from. None if unset.","type":["string","null"]},"frontend_endpoint":{"description":"Resolved frontend endpoint: external_ip:port or cluster_ip:port","type":["string","null"]}},"type":"object"}],"description":"Combined view returned by the list endpoint"},"DynamoDeployment":{"properties":{"backend":{"type":["string","null"]},"cedana_managed":{"type":"boolean"},"cluster_id":{"format":"uuid","type":"string"},"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"model":{"type":["string","null"]},"name":{"type":"string"},"namespace":{"type":"string"},"spec":{},"status":{"type":"string"},"updated_at":{"format":"date-time","type":"string"},"worker_replicas":{"format":"int32","type":["integer","null"]},"worker_replicas_ready":{"format":"int32","type":["integer","null"]}},"required":["id","cluster_id","name","namespace","status","cedana_managed","created_at","updated_at"],"type":"object"},"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/deployments":{"get":{"description":"Returns all DynamoGraphDeployments synced from the specified cluster.","operationId":"list_deployments","parameters":[{"description":"UUID of the cluster to filter by","in":"query","name":"cluster_id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Kubernetes namespace","in":"query","name":"namespace","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DynamoDeploymentView"},"type":"array"}}},"description":"List of Dynamo deployments"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"List Dynamo deployments","tags":["Dynamo"]}}}}
```

## Get Dynamo deployment

> Returns a single DynamoGraphDeployment by name.

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"DynamoDeploymentView":{"allOf":[{"$ref":"#/components/schemas/DynamoDeployment"},{"properties":{"checkpoint_name":{"description":"CEDANA_CHECKPOINT name of the first worker service, if checkpointing is\nenabled. This is the stable key a worker restores from. None if unset.","type":["string","null"]},"frontend_endpoint":{"description":"Resolved frontend endpoint: external_ip:port or cluster_ip:port","type":["string","null"]}},"type":"object"}],"description":"Combined view returned by the list endpoint"},"DynamoDeployment":{"properties":{"backend":{"type":["string","null"]},"cedana_managed":{"type":"boolean"},"cluster_id":{"format":"uuid","type":"string"},"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"model":{"type":["string","null"]},"name":{"type":"string"},"namespace":{"type":"string"},"spec":{},"status":{"type":"string"},"updated_at":{"format":"date-time","type":"string"},"worker_replicas":{"format":"int32","type":["integer","null"]},"worker_replicas_ready":{"format":"int32","type":["integer","null"]}},"required":["id","cluster_id","name","namespace","status","cedana_managed","created_at","updated_at"],"type":"object"},"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/deployments/{name}":{"get":{"description":"Returns a single DynamoGraphDeployment by name.","operationId":"get_deployment","parameters":[{"description":"DGD name","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"UUID of the cluster to filter by","in":"query","name":"cluster_id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Kubernetes namespace","in":"query","name":"namespace","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DynamoDeploymentView"}}},"description":"Dynamo deployment"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"Get Dynamo deployment","tags":["Dynamo"]}}}}
```

## Delete Dynamo deployment

> Publishes a delete event for the DynamoGraphDeployment and removes the DB record.

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/deployments/{name}":{"delete":{"description":"Publishes a delete event for the DynamoGraphDeployment and removes the DB record.","operationId":"delete_deployment","parameters":[{"description":"DGD name","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"UUID of the cluster to filter by","in":"query","name":"cluster_id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Kubernetes namespace","in":"query","name":"namespace","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Deletion queued"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"cluster_id required"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"Delete Dynamo deployment","tags":["Dynamo"]}}}}
```

## Checkpoint every live worker pod of a DynamoGraphDeployment.

> Worker pods resolved by exact Dynamo label match, not \`pod\_name.startsWith\` —\
> the prefix heuristic could hit a different DGD sharing a name prefix in the\
> same namespace (e.g. \`vllm-agg\` vs \`vllm-agg-cedana\`).

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"DynamoCheckpointResult":{"description":"Result of checkpointing a DGD: the workers a checkpoint was issued for.","properties":{"workers":{"items":{"$ref":"#/components/schemas/DynamoCheckpointedWorker"},"type":"array"}},"required":["workers"],"type":"object"},"DynamoCheckpointedWorker":{"description":"One worker pod that a checkpoint was issued for.","properties":{"action_id":{"type":"string"},"pod_name":{"type":"string"}},"required":["pod_name","action_id"],"type":"object"},"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/deployments/{name}/checkpoint":{"post":{"description":"Worker pods resolved by exact Dynamo label match, not `pod_name.startsWith` —\nthe prefix heuristic could hit a different DGD sharing a name prefix in the\nsame namespace (e.g. `vllm-agg` vs `vllm-agg-cedana`).","operationId":"checkpoint_deployment","parameters":[{"description":"DGD name","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"UUID of the cluster to filter by","in":"query","name":"cluster_id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Kubernetes namespace","in":"query","name":"namespace","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DynamoCheckpointResult"}}},"description":"Checkpoints issued"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"No live worker pods found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"Checkpoint every live worker pod of a DynamoGraphDeployment.","tags":["Dynamo"]}}}}
```

## Get checkpoint summary for a Dynamo deployment

> Returns a summary of checkpoints taken for all worker pods belonging to the deployment.\
> Matches pods whose name starts with the deployment name.

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"DynamoCheckpointSummary":{"description":"A lightweight summary of checkpoints taken for a Dynamo deployment's workers.","properties":{"has_cache":{"description":"True if at least one checkpoint with status='ready' exists","type":"boolean"},"latest":{"description":"Timestamp of the most recent checkpoint","format":"date-time","type":["string","null"]},"pods":{"additionalProperties":{"format":"int64","type":"integer"},"description":"Per-pod breakdown: pod_name → checkpoint count","propertyNames":{"type":"string"},"type":"object"},"total":{"description":"Total number of ready checkpoints across all worker pods","format":"int64","type":"integer"}},"required":["total","has_cache","pods"],"type":"object"},"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/deployments/{name}/checkpoints":{"get":{"description":"Returns a summary of checkpoints taken for all worker pods belonging to the deployment.\nMatches pods whose name starts with the deployment name.","operationId":"deployment_checkpoints","parameters":[{"description":"DGD name","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"UUID of the cluster to filter by","in":"query","name":"cluster_id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Kubernetes namespace","in":"query","name":"namespace","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DynamoCheckpointSummary"}}},"description":"Checkpoint summary"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"Get checkpoint summary for a Dynamo deployment","tags":["Dynamo"]}}}}
```

## GET /v1/dynamo/deployments/{name}/metrics

> Query Dynamo inference metrics for a deployment.

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"DynamoMetricPoint":{"description":"A single metric time-series point returned to the UI.","properties":{"metric_name":{"type":"string"},"timestamp_ms":{"description":"Unix timestamp in milliseconds","format":"int64","type":"integer"},"value":{"format":"double","type":"number"}},"required":["metric_name","value","timestamp_ms"],"type":"object"},"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/deployments/{name}/metrics":{"get":{"operationId":"get_deployment_metrics","parameters":[{"description":"DGD name","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"in":"query","name":"cluster_id","required":false,"schema":{"type":["string","null"]}},{"in":"query","name":"namespace","required":false,"schema":{"type":["string","null"]}},{"description":"Relative window in hours (default 1, max 720 = metrics TTL). Ignored when\n`from_ms`/`to_ms` are set. Anchored to the LATEST datapoint (not now()) so\na deleted deployment still returns its historical data.","in":"query","name":"hours","required":false,"schema":{"format":"int32","minimum":0,"type":["integer","null"]}},{"description":"Optional absolute range start (Unix ms). If set with `to_ms`, overrides `hours`.","in":"query","name":"from_ms","required":false,"schema":{"format":"int64","type":["integer","null"]}},{"description":"Optional absolute range end (Unix ms). If set with `from_ms`, overrides `hours`.","in":"query","name":"to_ms","required":false,"schema":{"format":"int64","type":["integer","null"]}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DynamoMetricPoint"},"type":"array"}}},"description":"Time series per metric"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"Query Dynamo inference metrics for a deployment.","tags":["Dynamo"]}}}}
```

## POST /v1/dynamo/deployments/{name}/metrics

> Ingest a batch of Dynamo inference metrics from the watcher.

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"DynamoMetricsIngestRequest":{"description":"Batch of metric samples posted by the watcher after scraping /metrics.","properties":{"cluster_id":{"type":"string"},"model":{"type":"string"},"namespace":{"type":"string"},"samples":{"items":{"$ref":"#/components/schemas/DynamoMetricSample"},"type":"array"}},"required":["cluster_id","namespace","samples"],"type":"object"},"DynamoMetricSample":{"description":"A single metric sample sent by the watcher.","properties":{"metric_name":{"type":"string"},"timestamp_ms":{"description":"Unix timestamp in milliseconds","format":"int64","type":"integer"},"value":{"format":"double","type":"number"}},"required":["metric_name","value","timestamp_ms"],"type":"object"},"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/deployments/{name}/metrics":{"post":{"operationId":"ingest_deployment_metrics","parameters":[{"description":"DGD name","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DynamoMetricsIngestRequest"}}},"required":true},"responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Metrics stored"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"Ingest a batch of Dynamo inference metrics from the watcher.","tags":["Dynamo"]}}}}
```

## Get per-pod startup times for a Dynamo deployment's workers.

> Returns one row per worker pod with the time it took to reach Ready, and whether\
> Cedana restored it from a checkpoint (cedana\_restore=true) or it cold-started.

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"PodStartupTime":{"description":"Startup time for a single worker pod.","properties":{"cedana_restore":{"description":"Whether this pod was started via a Cedana restore (true) or cold-started (false)","type":"boolean"},"pod_name":{"description":"Pod name","type":"string"},"start_time_ms":{"description":"Time from PodScheduled → Ready in milliseconds","format":"int64","type":"integer"}},"required":["pod_name","start_time_ms","cedana_restore"],"type":"object"},"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/deployments/{name}/pod-startup-times":{"get":{"description":"Returns one row per worker pod with the time it took to reach Ready, and whether\nCedana restored it from a checkpoint (cedana_restore=true) or it cold-started.","operationId":"pod_startup_times","parameters":[{"description":"DGD name","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"UUID of the cluster to filter by","in":"query","name":"cluster_id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Kubernetes namespace","in":"query","name":"namespace","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PodStartupTime"},"type":"array"}}},"description":"Per-pod startup times"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"Get per-pod startup times for a Dynamo deployment's workers.","tags":["Dynamo"]}}}}
```

## Update model/backend from live scrape

> Called by the dynamo-watcher after querying /v1/models on the deployment's\
> frontend endpoint. Overwrites model and backend with ground-truth values.

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"DynamoScrapeRequest":{"description":"Body sent by the dynamo-watcher after scraping /v1/models from the live frontend.","properties":{"backend":{"type":["string","null"]},"cluster_id":{"format":"uuid","type":"string"},"model":{"type":["string","null"]},"namespace":{"type":"string"}},"required":["cluster_id","namespace"],"type":"object"},"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/deployments/{name}/scrape":{"post":{"description":"Called by the dynamo-watcher after querying /v1/models on the deployment's\nfrontend endpoint. Overwrites model and backend with ground-truth values.","operationId":"scrape_deployment","parameters":[{"description":"DGD name","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DynamoScrapeRequest"}}},"required":true},"responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Updated"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"Update model/backend from live scrape","tags":["Dynamo"]}}}}
```

## GET /v1/dynamo/deployments/{name}/startup-comparison

> Compare recent cold-start and Cedana-restore startup latency.

```json
{"openapi":"3.1.0","info":{"title":"Cedana API","version":"0.0.0-dev"},"tags":[{"description":"Cedana API for Dynamo deployments","name":"Dynamo"}],"security":[{"Token":[]}],"components":{"securitySchemes":{"Token":{"scheme":"bearer","type":"http"}},"schemas":{"StartupComparison":{"description":"Cold-start versus Cedana-restore startup latency for a deployment.","properties":{"cold":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/StartupLatencySummary"}]},"p50_saved_ms":{"description":"Milliseconds saved by restore at p50.","format":"int64","type":["integer","null"]},"p50_speedup":{"description":"Cold p50 divided by restore p50. Values above 1 mean restore is faster.","format":"double","type":["number","null"]},"restore":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/StartupLatencySummary"}]}},"type":"object"},"StartupLatencySummary":{"description":"Startup latency distribution for one boot path.","properties":{"max_ms":{"format":"int64","type":"integer"},"mean_ms":{"format":"int64","type":"integer"},"min_ms":{"format":"int64","type":"integer"},"p50_ms":{"format":"int64","type":"integer"},"p95_ms":{"format":"int64","type":"integer"},"samples":{"minimum":0,"type":"integer"}},"required":["samples","min_ms","mean_ms","p50_ms","p95_ms","max_ms"],"type":"object"},"HttpError":{"description":"Standard JSON error body for all 4xx/5xx responses.\n\nHandlers return plain-text errors internally; [`normalize_error_response`]\nconverts anything the stack produces (handlers, extractors, the auth layer)\nto this shape, so generated SDK clients can rely on a single error schema.","properties":{"message":{"description":"Human-readable description of what went wrong","type":"string"}},"required":["message"],"type":"object"}}},"paths":{"/v1/dynamo/deployments/{name}/startup-comparison":{"get":{"operationId":"startup_comparison","parameters":[{"description":"DGD name","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"description":"UUID of the cluster to filter by","in":"query","name":"cluster_id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Kubernetes namespace","in":"query","name":"namespace","required":false,"schema":{"type":["string","null"]}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartupComparison"}}},"description":"Cold versus restore latency distribution"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"},"4XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Client error"},"5XX":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HttpError"}}},"description":"Server error"}},"summary":"Compare recent cold-start and Cedana-restore startup latency.","tags":["Dynamo"]}}}}
```
