Skip to content

docs: Add REST API v1 to v2 migration guide - #733

Open
promptless[bot] wants to merge 1 commit into
mainfrom
promptless/rest-api-v1-to-v2-migration-guide
Open

docs: Add REST API v1 to v2 migration guide#733
promptless[bot] wants to merge 1 commit into
mainfrom
promptless/rest-api-v1-to-v2-migration-guide

Conversation

@promptless

@promptless promptless Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Open this suggestion in Promptless to view citations and reasoning process

Adds a new migration guide (api-reference-v2/migrate-from-v1.mdx) for developers moving an existing integration from the deprecated REST API v1 to the beta REST API v2, and links it in the API v2 navigation group.

The guide covers the two things requested: the differences between v1 and v2 for endpoints that exist in both, and the net-new v2 endpoints.

For shared endpoints it explains the base URL change (https://rest.runpod.io/v1https://api.runpod.io/v2), that authentication is unchanged, the resource path renames (/endpoints/serverless, /containerregistryauth/registries, /networkvolumes/network-volumes), the consolidation of Pod lifecycle operations into a single POST /v2/pods/{id}/action endpoint plus PATCH for in-place edits, and the request/response shape changes (nested create bodies, wrapped list responses, and RFC 9457 error objects). It calls out breaking specifics a v1 integrator will hit — the Serverless create body dropping templateId, the template and network-volume field renames, and a billing "false friend" where v1 /billing/endpoints (Serverless) maps to v2 /v2/billing/serverless while v2 /v2/billing/endpoints is a different resource (Public Endpoint billing).

For net-new capabilities it highlights the catalog, Pod log streaming, Serverless worker/release observability, registry ECR delegations, and expanded billing endpoints.

Files touched:

  • api-reference-v2/migrate-from-v1.mdx (new)
  • docs.json (one navigation entry added to the API v2 group)

Trigger Events


Tip: Planning a big docs refactor? Use Deep Analysis to get help with the heavy lifting.

Add a migration guide under the API v2 tab that maps v1 endpoints to their
v2 equivalents, explains request/response shape changes for shared resources,
and highlights the net-new v2 endpoints (catalog, log streaming, serverless
observability, registry delegations, expanded billing). Add the page to the
API v2 navigation group in docs.json.

## What changed at a glance

The base URL moves from `https://rest.runpod.io/v1` to `https://api.runpod.io/v2`. Update every request to the new host and version prefix. The OpenAPI schema also moves accordingly, from `https://rest.runpod.io/v1/openapi.json` to `https://api.runpod.io/v2/openapi.json` — regenerate any client or tooling against the v2 schema.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v1 spec server URL is https://rest.runpod.io/v1.

Source:

"url": "https://rest.runpod.io/v1"


## What changed at a glance

The base URL moves from `https://rest.runpod.io/v1` to `https://api.runpod.io/v2`. Update every request to the new host and version prefix. The OpenAPI schema also moves accordingly, from `https://rest.runpod.io/v1/openapi.json` to `https://api.runpod.io/v2/openapi.json` — regenerate any client or tooling against the v2 schema.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 spec server URL is https://api.runpod.io, with paths prefixed /v2, giving an effective base of https://api.runpod.io/v2.

Source:

"servers": [
{
"url": "https://api.runpod.io",
"description": "Runpod API v2 production server"
}

The Runpod REST API v2 reorganizes resource paths, consolidates Pod lifecycle actions, and standardizes request and response shapes. This guide maps the v1 surface you know to its v2 equivalent so you can update your integrations with confidence.

<Warning>
The REST API v2 is currently in beta. Endpoints and behavior may change before general availability.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 overview page confirms API v2 is currently in beta.

Source:

<Warning>
The REST API v2 is currently in beta. Endpoints and behavior may change before general availability.
</Warning>


The base URL moves from `https://rest.runpod.io/v1` to `https://api.runpod.io/v2`. Update every request to the new host and version prefix. The OpenAPI schema also moves accordingly, from `https://rest.runpod.io/v1/openapi.json` to `https://api.runpod.io/v2/openapi.json` — regenerate any client or tooling against the v2 schema.

Authentication is unchanged. Continue to pass your [Runpod API key](/get-started/api-keys) as an HTTP Bearer token in the `Authorization: Bearer RUNPOD_API_KEY` header. You don't need to change key management or scopes to call v2.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v1 security scheme ApiKey is type http, scheme bearer.

Source:

"securitySchemes": {
"ApiKey": {
"type": "http",
"scheme": "bearer",
"bearerFormat": "Bearer"
}


The base URL moves from `https://rest.runpod.io/v1` to `https://api.runpod.io/v2`. Update every request to the new host and version prefix. The OpenAPI schema also moves accordingly, from `https://rest.runpod.io/v1/openapi.json` to `https://api.runpod.io/v2/openapi.json` — regenerate any client or tooling against the v2 schema.

Authentication is unchanged. Continue to pass your [Runpod API key](/get-started/api-keys) as an HTTP Bearer token in the `Authorization: Bearer RUNPOD_API_KEY` header. You don't need to change key management or scopes to call v2.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 security scheme bearerAuth is type http, scheme bearer, confirming auth is unchanged (Bearer + Runpod API key) between v1 and v2.

Source:

"securitySchemes": {
"bearerAuth": {
"type": "http",
"scheme": "bearer",
"bearerFormat": "Runpod API Key",
"description": "Runpod API key authentication. Generate an API key in the Runpod console and send it in the `Authorization` header as `Bearer <api_key>`. Keys are scoped to the permissions granted when created; requests may return `403` when a valid key lacks access to the requested resource or action.\n"
}

| Serverless billing | `/billing/endpoints` | `/v2/billing/serverless` |
| Network volume billing | `/billing/networkvolumes` | `/v2/billing/networkvolumes` |

Multi-word resources use kebab-case in v2, so `/networkvolumes` becomes `/v2/network-volumes`. v2 also generalizes path parameters: where v1 used resource-specific names such as `{podId}`, `{endpointId}`, `{networkVolumeId}`, `{templateId}`, and `{containerRegistryAuthId}`, v2 uses a single generic `{id}` parameter across resources.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 pods path uses a generic {id} path parameter (example pod_abc123), vs. v1's resource-specific {podId}/{endpointId}/{networkVolumeId}/{templateId}/{containerRegistryAuthId}.

Source:

"/v2/pods/{id}": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Pod identifier",
"example": "pod_abc123"
}
],


## Consolidated Pod lifecycle

In v1, each Pod state change had its own endpoint: `POST /pods/{podId}/start`, `/stop`, `/reset`, and `/restart`. In v2, these collapse into a single [Pod state transition endpoint](/api-reference-v2/pods/trigger-a-pod-state-transition), `POST /v2/pods/{id}/action`, whose request body carries the desired action as `{"action":"start|stop|restart|terminate"}`. Deletion still uses [`DELETE /v2/pods/{id}`](/api-reference-v2/pods/terminate-a-pod).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 consolidated Pod lifecycle endpoint is POST /v2/pods/{id}/action with a PodActionRequest body carrying the action field.

Source:

"/v2/pods/{id}/action": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"example": "pod_abc123"
}
],
"post": {
"operationId": "podAction",
"summary": "Trigger a pod state transition",
"description": "Triggers a state transition on a pod. Send a JSON body with a single\n`action` field, e.g. `{ \"action\": \"stop\" }`.\n\nValid actions:\n- `start` — boot a stopped pod (`EXITED` or `ERROR`) back toward\n `RUNNING`.\n- `stop` — stop a running or provisioning pod, releasing GPU/CPU\n compute while keeping its disk. The pod moves to `EXITED`.\n- `restart` — restart a `RUNNING` pod's container in place.\n- `terminate` — permanently delete the pod and release its resources\n (equivalent to `deletePod`).\n\nWhich actions are valid depends on the pod's current status, and the\ncurrently permitted set is published in the pod's `actions` field:\n`RUNNING` allows `stop`/`restart`/`terminate`; `EXITED` and `ERROR`\nallow `start`/`terminate`; `PROVISIONING` and `STARTING` allow\n`stop`/`terminate`.\n\n`start`, `stop`, and `restart` return `200` with the updated pod.\n`terminate` returns `204` with no body. Requesting an action that is\nnot valid for the pod's current status returns `409`.\n",

In v1, each Pod state change had its own endpoint: `POST /pods/{podId}/start`, `/stop`, `/reset`, and `/restart`. In v2, these collapse into a single [Pod state transition endpoint](/api-reference-v2/pods/trigger-a-pod-state-transition), `POST /v2/pods/{id}/action`, whose request body carries the desired action as `{"action":"start|stop|restart|terminate"}`. Deletion still uses [`DELETE /v2/pods/{id}`](/api-reference-v2/pods/terminate-a-pod).

<Note>
The v1 `reset` operation has no v2 action equivalent. The v2 action enum is limited to `start`, `stop`, `restart`, and `terminate`.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 PodAction enum is exactly start, stop, restart, terminate — reset is not included.

Source:

"PodAction": {
"type": "string",
"description": "State transition to trigger on a pod.",
"enum": [
"start",
"stop",
"restart",
"terminate"
]
},

The v1 `reset` operation has no v2 action equivalent. The v2 action enum is limited to `start`, `stop`, `restart`, and `terminate`.
</Note>

For in-place changes to a Pod, v2 replaces v1's `POST /pods/{podId}/update` with a standard [PATCH request](/api-reference-v2/pods/update-a-pod) to `PATCH /v2/pods/{id}`. Serverless follows the same pattern: v2 drops v1's `POST /endpoints/{id}/update` in-place variant in favor of `PATCH /v2/serverless/{id}`.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v1 has a dedicated POST /pods/{podId}/update endpoint (synonym for PATCH), dropped in v2 in favor of a single PATCH /v2/pods/{id}.

Source:

"/pods/{podId}/update": {
"post": {
"tags": [
"pods"
],
"summary": "Update a Pod",
"description": "Update a Pod - synonym for PATCH /pods/{podId}. Review request parameters, response fields, and errors for this Runpod API operation.",
"operationId": "UpdatePod",
"requestBody": {
"description": "Form data to update a Pod.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PodUpdateInput"
}
}
},
"required": true
},
"parameters": [
{
"name": "podId",
"in": "path",
"description": "ID of Pod that needs to be updated.",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Pod successfully updated.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Pod"
}
}
}
},
"400": {
"description": "Invalid input."
}
}
}
},

The v1 `reset` operation has no v2 action equivalent. The v2 action enum is limited to `start`, `stop`, `restart`, and `terminate`.
</Note>

For in-place changes to a Pod, v2 replaces v1's `POST /pods/{podId}/update` with a standard [PATCH request](/api-reference-v2/pods/update-a-pod) to `PATCH /v2/pods/{id}`. Serverless follows the same pattern: v2 drops v1's `POST /endpoints/{id}/update` in-place variant in favor of `PATCH /v2/serverless/{id}`.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v1 has a dedicated POST /endpoints/{endpointId}/update endpoint (synonym for PATCH); v2 drops this in-place-update path variant in favor of PATCH /v2/serverless/{id}.

Source:

"/endpoints/{endpointId}/update": {
"post": {
"tags": [
"endpoints"
],
"summary": "Update an endpoint",
"description": "Update an endpoint - synonym for PATCH /endpoints/{endpointId}. Review request parameters, response fields, and errors for this Runpod API operation.",
"operationId": "UpdateEndpoint",
"requestBody": {
"description": "Update an endpoint.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EndpointUpdateInput"
}
}
},
"required": true
},
"parameters": [


### Nested create bodies

In v1, create bodies are flat, with top-level fields such as `gpuCount`, `gpuTypeIds`, `imageName`, `containerDiskInGb`, `volumeInGb`, `env`, and `ports`. The v2 `CreatePodRequest` is nested: `name` and `image` are required, GPU settings live under `gpu: {id, count}`, CPU settings under `cpu`, and storage under `mounts`. The `cloud` field defaults to `SECURE`, and you must set exactly one of `gpu` or `cpu`. See [Create a Pod](/api-reference-v2/pods/create-a-pod) for the full request schema.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v1 PodCreateInput is a flat object with top-level gpuCount, gpuTypeIds, imageName, containerDiskInGb, volumeInGb, env, and ports fields.

Source:

"PodCreateInput": {
"type": "object",
"properties": {
"allowedCudaVersions": {
"type": "array",
"description": "If the created Pod is a GPU Pod, a list of acceptable CUDA versions on the [Pod](#/components/schemas/Pod). If not set, any CUDA version is acceptable.",
"items": {
"type": "string",
"enum": [
"13.0",
"12.9",
"12.8",
"12.7",
"12.6",
"12.5",
"12.4",
"12.3",
"12.2",
"12.1",
"12.0",
"11.8"
]
}
},
"cloudType": {
"type": "string",
"default": "SECURE",
"enum": [
"SECURE",
"COMMUNITY"
],
"description": "Set to SECURE to create the Pod in Secure Cloud. Set to COMMUNITY to create the Pod in Community Cloud. To determine which one suits your needs, see https://docs.runpod.io/pods/overview#pod-types."
},
"computeType": {
"type": "string",
"default": "GPU",
"enum": [
"GPU",
"CPU"
],
"description": "Set to GPU to create a GPU Pod. Set to CPU to create a CPU Pod. If set to CPU, the Pod will not have a GPU attached and properties related to GPUs such as gpuTypeIds will be ignored. If set to GPU, the Pod will have a GPU attached and properties related to CPUs such as cpuFlavorIds will be ignored."
},
"containerDiskInGb": {
"type": "integer",
"default": 50,
"nullable": true,
"description": "The amount of disk space, in gigabytes (GB), to allocate on the container disk for the created Pod. The data on the container disk is wiped when the Pod restarts. To persist data across Pod restarts, set volumeInGb to configure the Pod network volume."
},
"containerRegistryAuthId": {
"type": "string",
"description": "Registry credentials ID.",
"example": "clzdaifot0001l90809257ynb"
},
"countryCodes": {
"type": "array",
"items": {
"type": "string"
},
"description": "A list of country codes where the created Pod can be located. If not set, the Pod can be located in any country."
},
"cpuFlavorIds": {
"type": "array",
"items": {
"type": "string",
"enum": [
"cpu3c",
"cpu3g",
"cpu3m",
"cpu5c",
"cpu5g",
"cpu5m"
]
},
"description": "If the created Pod is a CPU Pod, a list of Runpod CPU flavors which can be attached to the Pod. The order of the list determines the order to rent CPU flavors. See cpuFlavorPriority for how the order of the list affects Pod creation."
},
"cpuFlavorPriority": {
"type": "string",
"default": "availability",
"enum": [
"availability",
"custom"
],
"description": "If the created Pod is a CPU Pod, set to availability to respond to current CPU flavor availability. Set to custom to always try to rent CPU flavors in the order specified in cpuFlavorIds."
},
"dataCenterIds": {
"type": "array",
"example": [
"EU-RO-1",
"CA-MTL-1"
],
"default": [
"EU-RO-1",
"CA-MTL-1",
"EU-SE-1",
"US-IL-1",
"EUR-IS-1",
"EU-CZ-1",
"US-TX-3",
"EUR-IS-2",
"US-KS-2",
"US-GA-2",
"US-WA-1",
"US-TX-1",
"CA-MTL-3",
"EU-NL-1",
"US-TX-4",
"US-CA-2",
"US-NC-1",
"OC-AU-1",
"US-DE-1",
"EUR-IS-3",
"CA-MTL-2",
"AP-JP-1",
"EUR-NO-1",
"EU-FR-1",
"US-KS-3",
"US-GA-1"
],
"items": {
"type": "string",
"enum": [
"EU-RO-1",
"CA-MTL-1",
"EU-SE-1",
"US-IL-1",
"EUR-IS-1",
"EU-CZ-1",
"US-TX-3",
"EUR-IS-2",
"US-KS-2",
"US-GA-2",
"US-WA-1",
"US-TX-1",
"CA-MTL-3",
"EU-NL-1",
"US-TX-4",
"US-CA-2",
"US-NC-1",
"OC-AU-1",
"US-DE-1",
"EUR-IS-3",
"CA-MTL-2",
"AP-JP-1",
"EUR-NO-1",
"EU-FR-1",
"US-KS-3",
"US-GA-1"
]
},
"description": "A list of Runpod data center IDs where the created Pod can be located. See `dataCenterPriority` for information on how the order of the list affects Pod creation."
},
"dataCenterPriority": {
"type": "string",
"default": "availability",
"enum": [
"availability",
"custom"
],
"description": "Set to availability to respond to current machine availability. Set to custom to always try to rent machines from data centers in the order specified in dataCenterIds."
},
"dockerEntrypoint": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "If specified, overrides the ENTRYPOINT for the Docker image run on the created Pod. If [], uses the ENTRYPOINT defined in the image."
},
"dockerStartCmd": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "If specified, overrides the start CMD for the Docker image run on the created Pod. If [], uses the start CMD defined in the image."
},
"env": {
"type": "object",
"items": {
"type": "string"
},
"example": {
"ENV_VAR": "value"
},
"default": {}
},
"globalNetworking": {
"type": "boolean",
"default": false,
"example": true,
"description": "Set to true to enable global networking for the created Pod. Currently only available for On-Demand GPU Pods on some Secure Cloud data centers."
},
"gpuCount": {
"type": "integer",
"default": 1,
"description": "If the created Pod is a GPU Pod, the number of GPUs attached to the created Pod.",
"minimum": 1
},
"gpuTypeIds": {
"type": "array",
"items": {
"type": "string",
"enum": [
"NVIDIA GeForce RTX 4090",
"NVIDIA A40",
"NVIDIA RTX A5000",
"NVIDIA GeForce RTX 5090",
"NVIDIA H100 80GB HBM3",
"NVIDIA GeForce RTX 3090",
"NVIDIA RTX A4500",
"NVIDIA L40S",
"NVIDIA H200",
"NVIDIA L4",
"NVIDIA RTX 6000 Ada Generation",
"NVIDIA A100-SXM4-80GB",
"NVIDIA RTX 4000 Ada Generation",
"NVIDIA RTX A6000",
"NVIDIA A100 80GB PCIe",
"NVIDIA RTX 2000 Ada Generation",
"NVIDIA RTX A4000",
"NVIDIA RTX PRO 6000 Blackwell Server Edition",
"NVIDIA H100 PCIe",
"NVIDIA H100 NVL",
"NVIDIA L40",
"NVIDIA B200",
"NVIDIA GeForce RTX 3080 Ti",
"NVIDIA RTX PRO 6000 Blackwell Workstation Edition",
"NVIDIA GeForce RTX 3080",
"NVIDIA GeForce RTX 3070",
"AMD Instinct MI300X OAM",
"NVIDIA GeForce RTX 4080 SUPER",
"Tesla V100-PCIE-16GB",
"Tesla V100-SXM2-32GB",
"NVIDIA RTX 5000 Ada Generation",
"NVIDIA GeForce RTX 4070 Ti",
"NVIDIA RTX 4000 SFF Ada Generation",
"NVIDIA GeForce RTX 3090 Ti",
"NVIDIA RTX A2000",
"NVIDIA GeForce RTX 4080",
"NVIDIA A30",
"NVIDIA GeForce RTX 5080",
"Tesla V100-FHHL-16GB",
"NVIDIA H200 NVL",
"Tesla V100-SXM2-16GB",
"NVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition",
"NVIDIA A5000 Ada",
"Tesla V100-PCIE-32GB",
"NVIDIA RTX A4500",
"NVIDIA A30",
"NVIDIA GeForce RTX 3080TI",
"Tesla T4",
"NVIDIA RTX A30"
]
},
"description": "If the created Pod is a GPU Pod, a list of Runpod GPU types which can be attached to the created Pod. The order of the list determines the order to rent GPU types. See `gpuTypePriority` for information on how the order of the list affects Pod creation."
},
"gpuTypePriority": {
"type": "string",
"default": "availability",
"enum": [
"availability",
"custom"
],
"description": "If the created Pod is a GPU Pod, set to availability to respond to current GPU type availability. Set to custom to always try to rent GPU types in the order specified in gpuTypeIds."
},
"imageName": {
"type": "string",
"example": "runpod/pytorch:2.1.0-py3.10-cuda11.8.0-devel-ubuntu22.04",
"description": "The image tag for the container run on the created Pod."
},
"interruptible": {
"type": "boolean",
"default": false,
"description": "Set to true to create an interruptible or spot Pod. An interruptible Pod can be rented at a lower cost but can be stopped at any time to free up resources for another Pod. A reserved Pod is rented at a higher cost but runs until it exits or is manually stopped."
},
"locked": {
"type": "boolean",
"default": false,
"description": "Set to true to lock a Pod. Locking a Pod disables stopping or resetting the Pod."
},
"minDiskBandwidthMBps": {
"type": "number",
"description": "The minimum disk bandwidth, in megabytes per second (MBps), for the created Pod."
},
"minDownloadMbps": {
"type": "number",
"description": "The minimum download speed, in megabits per second (Mbps), for the created Pod."
},
"minRAMPerGPU": {
"type": "integer",
"default": 8,
"description": "If the created Pod is a GPU Pod, the minimum amount of RAM, in gigabytes (GB), allocated to the created Pod for each GPU attached to the Pod."
},
"minUploadMbps": {
"type": "number",
"description": "The minimum upload speed, in megabits per second (Mbps), for the created Pod."
},
"minVCPUPerGPU": {
"type": "integer",
"default": 2,
"description": "If the created Pod is a GPU Pod, the minimum number of virtual CPUs allocated to the created Pod for each GPU attached to the Pod."
},
"name": {
"type": "string",
"default": "my pod",
"description": "A user-defined name for the created Pod. The name does not need to be unique.",
"maxLength": 191
},
"networkVolumeId": {
"type": "string",
"description": "The unique string identifying the network volume to attach to the created Pod. If attached, a network volume replaces the Pod network volume."
},
"ports": {
"type": "array",
"items": {
"type": "string"
},
"example": [
"8888/http",
"22/tcp"
],
"default": "8888/http,22/tcp",
"description": "A list of ports exposed on the created Pod. Each port is formatted as [port number]/[protocol]. Protocol can be either http or tcp."
},
"supportPublicIp": {
"type": "boolean",
"example": true,
"description": "If the created Pod is on Community Cloud, set to true if you need the Pod to expose a public IP address. If null, the Pod might not have a public IP address. On Secure Cloud, the Pod will always have a public IP address."
},
"templateId": {
"type": "string",
"example": null,
"description": "If the Pod is created with a template, the unique string identifying that template."
},
"vcpuCount": {
"type": "integer",
"default": 2,
"description": "If the created Pod is a CPU Pod, the number of vCPUs allocated to the Pod."
},
"volumeInGb": {
"type": "integer",
"default": 20,
"nullable": true,
"description": "The amount of disk space, in gigabytes (GB), to allocate on the Pod volume for the created Pod. The data on the Pod volume is persisted across Pod restarts. To persist data so that future Pods can access it, create a network volume and set networkVolumeId to attach it to the Pod."
},
"volumeMountPath": {
"type": "string",
"default": "/workspace",
"description": "If either a Pod volume or a network volume is attached to a Pod, the absolute path where the network volume will be mounted in the filesystem."
}
}
},
"NetworkVolumes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"example": "agv6w2qcg7",
"description": "A unique string identifying a network volume."
},
"name": {
"type": "string",
"example": "my network volume",
"description": "A user-defined name for a network volume. The name does not need to be unique."
},
"size": {
"type": "integer",
"example": 50,
"description": "The amount of disk space, in gigabytes (GB), allocated to a network volume."
},
"dataCenterId": {
"type": "string",
"example": "EU-RO-1",
"description": "The Runpod data center ID where a network volume is located."
}
}
}
},
"NetworkVolume": {
"type": "object",
"properties": {
"dataCenterId": {
"type": "string",
"example": "EU-RO-1",
"description": "The Runpod data center ID where a network volume is located."
},
"id": {
"type": "string",
"example": "agv6w2qcg7",
"description": "A unique string identifying a network volume."
},
"name": {
"type": "string",
"example": "my network volume",
"description": "A user-defined name for a network volume. The name does not need to be unique."
},
"size": {
"type": "integer",
"example": 50,
"description": "The amount of disk space, in gigabytes (GB), allocated to a network volume."
}
}
},
"NetworkVolumeCreateInput": {
"type": "object",
"required": [
"name",
"size",
"dataCenterId"
],
"properties": {
"dataCenterId": {
"type": "string",
"example": "EU-RO-1",
"description": "The Runpod data center ID where the created network volume is located."
},
"name": {
"type": "string",
"example": "my network volume",
"description": "A user-defined name for the created network volume. The name does not need to be unique."
},
"size": {
"type": "integer",
"example": 50,
"description": "The amount of disk space, in gigabytes (GB), allocated to the created network volume.",
"minimum": 0,
"maximum": 4000
}
}
},
"NetworkVolumeUpdateInput": {
"type": "object",
"properties": {
"name": {
"type": "string",
"example": "my network volume",
"description": "A user-defined name for the network volume. The name does not need to be unique."
},
"size": {
"type": "integer",
"example": 50,
"description": "The amount of disk space, in gigabytes (GB), which will be allocated to the network volume after the update. Must be greater than the current size of the network volume.",


### Nested create bodies

In v1, create bodies are flat, with top-level fields such as `gpuCount`, `gpuTypeIds`, `imageName`, `containerDiskInGb`, `volumeInGb`, `env`, and `ports`. The v2 `CreatePodRequest` is nested: `name` and `image` are required, GPU settings live under `gpu: {id, count}`, CPU settings under `cpu`, and storage under `mounts`. The `cloud` field defaults to `SECURE`, and you must set exactly one of `gpu` or `cpu`. See [Create a Pod](/api-reference-v2/pods/create-a-pod) for the full request schema.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 CreatePodRequest requires name and image, nests gpu ({id,count}) and cpu configs, uses mounts for storage, and defaults cloud to SECURE; description states exactly one of gpu or cpu must be set.

Source:

"CreatePodRequest": {
"allOf": [
{
"$ref": "#/components/schemas/ContainerConfig"
},
{
"type": "object",
"required": [
"name",
"image"
],
"description": "Request body for creating a pod. Exactly one of `gpu` or `cpu`\nmust be set — enforced at the handler layer. For CPU pods, memory\nis derived by the API from the selected flavor's RAM multiplier;\nclients provide only CPU flavor and vCPU count. CPU pods support\ncontainer disk and network volumes only; `mounts.persistent` is\ninvalid when `cpu` is set.\n",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"examples": [
"my-training-pod"
]
},
"mounts": {
"$ref": "#/components/schemas/Mounts"
},
"gpu": {
"allOf": [
{
"$ref": "#/components/schemas/GpuConfig"
}
],
"unevaluatedProperties": false
},
"cpu": {
"$ref": "#/components/schemas/CreateCpuConfig"
},
"cloud": {
"allOf": [
{
"$ref": "#/components/schemas/Cloud"
}
],
"default": "SECURE",
"description": "Cloud tier. Defaults to `SECURE` when omitted."
},
"dataCenterIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Preferred data centers for placement. Omit or pass an empty\narray to let the scheduler choose.\n",
"examples": [
[
"US-TX-3"
]
]
},
"globalNetworking": {
"type": "boolean",
"default": false,
"description": "Enable global networking, giving the pod a private IP reachable across data centers. Requires an NVIDIA GPU and a global-networking-enabled data center (both enforced upstream). See `GET /v2/catalog/datacenters` (`globalNetwork`) for eligible data centers.",
"examples": [
false
]
}
}
}
],
"unevaluatedProperties": false
},


### Wrapped list responses

In v1, list endpoints return a bare JSON array. In v2, list responses wrap the array in an object keyed by the resource name.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v1 Pods schema (list response) is a bare array of Pod objects, not wrapped in an object.

Source:

"Pods": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Pod"
}
},


</CodeGroup>

The v2 wrapper key matches the resource: `GET /v2/pods` returns `{"pods":[...]}`, Serverless returns `{"endpoints":[...]}`, templates return `{"templates":[...]}`, network volumes return `{"networkVolumes":[...]}`, and registries return `{"registries":[...]}`. See [List Pods](/api-reference-v2/pods/list-pods) for a complete example.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 ListPodsResponse wraps the pod array under the "pods" key.

Source:

"ListPodsResponse": {
"type": "object",
"required": [
"pods"
],
"properties": {
"pods": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Pod"
}
}
}
},


</CodeGroup>

The v2 wrapper key matches the resource: `GET /v2/pods` returns `{"pods":[...]}`, Serverless returns `{"endpoints":[...]}`, templates return `{"templates":[...]}`, network volumes return `{"networkVolumes":[...]}`, and registries return `{"registries":[...]}`. See [List Pods](/api-reference-v2/pods/list-pods) for a complete example.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 ListEndpointsResponse wraps the array under the "endpoints" key.

Source:

"ListEndpointsResponse": {
"type": "object",
"required": [
"endpoints"
],
"properties": {
"endpoints": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Endpoint"
}
}
}
},


</CodeGroup>

The v2 wrapper key matches the resource: `GET /v2/pods` returns `{"pods":[...]}`, Serverless returns `{"endpoints":[...]}`, templates return `{"templates":[...]}`, network volumes return `{"networkVolumes":[...]}`, and registries return `{"registries":[...]}`. See [List Pods](/api-reference-v2/pods/list-pods) for a complete example.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 ListTemplatesResponse wraps the array under the "templates" key.

Source:

"ListTemplatesResponse": {
"type": "object",
"required": [
"templates"
],
"properties": {
"templates": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Template"
}
}
}
},


</CodeGroup>

The v2 wrapper key matches the resource: `GET /v2/pods` returns `{"pods":[...]}`, Serverless returns `{"endpoints":[...]}`, templates return `{"templates":[...]}`, network volumes return `{"networkVolumes":[...]}`, and registries return `{"registries":[...]}`. See [List Pods](/api-reference-v2/pods/list-pods) for a complete example.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 ListNetworkVolumesResponse wraps the array under the "networkVolumes" key.

Source:

"ListNetworkVolumesResponse": {
"type": "object",
"required": [
"networkVolumes"
],
"properties": {
"networkVolumes": {
"type": "array",
"items": {
"$ref": "#/components/schemas/NetworkVolume"
}
}
}
},


</CodeGroup>

The v2 wrapper key matches the resource: `GET /v2/pods` returns `{"pods":[...]}`, Serverless returns `{"endpoints":[...]}`, templates return `{"templates":[...]}`, network volumes return `{"networkVolumes":[...]}`, and registries return `{"registries":[...]}`. See [List Pods](/api-reference-v2/pods/list-pods) for a complete example.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 ListRegistriesResponse wraps the array under the "registries" key.

Source:

"ListRegistriesResponse": {
"type": "object",
"required": [
"registries"
],
"properties": {
"registries": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Registry"
}
}
}
},


### RFC 9457 error objects

In v1, errors return a simple `{"message":"..."}` object. In v2, errors follow the RFC 9457 problem format with required `title`, `status`, and `detail` fields, plus an optional `errors` array of validation strings.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v1 UnauthorizedError schema is a simple object with only a message string field, representative of v1's error shape.

Source:

"UnauthorizedError": {
"type": "object",
"properties": {
"message": {
"type": "string"
}
}
},


### RFC 9457 error objects

In v1, errors return a simple `{"message":"..."}` object. In v2, errors follow the RFC 9457 problem format with required `title`, `status`, and `detail` fields, plus an optional `errors` array of validation strings.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 ErrorResponse (RFC 9457 problem object) requires title, status, and detail, plus an optional errors array of validation-failure strings.

Source:

"ErrorResponse": {
"type": "object",
"required": [
"title",
"status",
"detail"
],
"properties": {
"title": {
"type": "string",
"description": "Short human-readable summary",
"examples": [
"Not Found"
]
},
"status": {
"type": "integer",
"description": "HTTP status code",
"examples": [
404
]
},
"detail": {
"type": "string",
"description": "Human-readable explanation",
"examples": [
"pod not found"
]
},
"errors": {
"type": "array",
"description": "Individual request-validation failures.",
"items": {
"type": "string"
},
"examples": [
[
"$: additional properties 'bogus' not allowed"
]
]
}
}
}


In v1, errors return a simple `{"message":"..."}` object. In v2, errors follow the RFC 9457 problem format with required `title`, `status`, and `detail` fields, plus an optional `errors` array of validation strings.

As in v1, Runpod returns a `403` when a valid API key lacks access to the requested resource—but in v2 that response now uses the problem format shown here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 ForbiddenError response documents a 403 when the bearer token is valid but lacks access to the requested resource or action.

Source:

"ForbiddenError": {
"description": "The bearer token is valid, but it does not grant access to the requested resource or action.",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
},
"examples": {
"insufficientAccess": {
"summary": "Insufficient access",
"value": {
"title": "Forbidden",
"status": 403,
"detail": "access denied"
}
}
}
}
}
},


The v2 API adds capabilities that have no v1 equivalent.

Catalog endpoints let you browse available compute without provisioning it: `GET /v2/catalog/gpus` and `/gpus/{id}`, `/cpus` and `/cpus/{id}`, and `/datacenters` and `/datacenters/{id}`. See [List GPU types](/api-reference-v2/catalog/list-gpu-types).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 catalog paths exist for /v2/catalog/gpus, /gpus/{id}, /cpus, /cpus/{id}, /datacenters (no hyphen), and /datacenters/{id} — net-new vs. v1.

Source:

"/v2/catalog/gpus": {
"get": {
"operationId": "listGpuTypes",
"summary": "List GPU types",
"description": "Returns available GPU types with pricing. Availability is included only when requested with include=AVAILABILITY.",
"tags": [
"Catalog"
],
"parameters": [
{
"$ref": "#/components/parameters/CatalogIncludeParam"
},
{
"$ref": "#/components/parameters/GpuProductFilter"
},
{
"$ref": "#/components/parameters/GpuCountFilter"
},
{
"$ref": "#/components/parameters/GpuCloudFilter"
},
{
"$ref": "#/components/parameters/MinCudaVersionFilter"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListGpuTypesResponse"
},
"examples": {
"gpus": {
"summary": "Successful response",
"value": {
"gpus": [
{
"id": "NVIDIA GeForce RTX 4090",
"name": "RTX 4090",
"pool": "ADA_24",
"manufacturer": "NVIDIA",
"memory": 24,
"secure": true,
"community": true,
"price": {
"secure": 0.44,
"community": 0.31
},
"maxCount": {
"secure": 8,
"community": 4
},
"availability": "HIGH",
"dataCenters": [
{
"id": "US-KS-2",
"name": "US Kansas 2",
"availability": "HIGH"
}
]
}
]
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/v2/catalog/gpus/{id}": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"example": "NVIDIA GeForce RTX 4090"
}
],
"get": {
"operationId": "getGpuType",
"summary": "Get a GPU type",
"description": "Returns a single GPU type with pricing. Availability details are included only when requested with include=AVAILABILITY.",
"tags": [
"Catalog"
],
"parameters": [
{
"$ref": "#/components/parameters/CatalogIncludeParam"
},
{
"$ref": "#/components/parameters/GpuProductFilter"
},
{
"$ref": "#/components/parameters/GpuCountFilter"
},
{
"$ref": "#/components/parameters/GpuCloudFilter"
},
{
"$ref": "#/components/parameters/MinCudaVersionFilter"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GpuType"
},
"examples": {
"gpu": {
"summary": "Successful response",
"value": {
"id": "NVIDIA GeForce RTX 4090",
"name": "RTX 4090",
"pool": "ADA_24",
"manufacturer": "NVIDIA",
"memory": 24,
"secure": true,
"community": true,
"price": {
"secure": 0.44,
"community": 0.31
},
"maxCount": {
"secure": 8,
"community": 4
},
"availability": "HIGH",
"dataCenters": [
{
"id": "US-KS-2",
"name": "US Kansas 2",
"availability": "HIGH"
}
]
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"404": {
"$ref": "#/components/responses/NotFoundError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/v2/catalog/cpus": {
"get": {
"operationId": "listCpuTypes",
"summary": "List CPU types",
"description": "Returns available CPU flavors. Availability is included only when requested with include=AVAILABILITY.",
"tags": [
"Catalog"
],
"parameters": [
{
"$ref": "#/components/parameters/CatalogIncludeParam"
},
{
"$ref": "#/components/parameters/CpuProductFilter"
},
{
"$ref": "#/components/parameters/CpuVCPUCountFilter"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListCpuTypesResponse"
},
"examples": {
"cpus": {
"summary": "Successful response",
"value": {
"cpus": [
{
"id": "cpu3c-2-4",
"name": "Compute-Optimized",
"group": "Gen 3",
"vcpu": {
"min": 2,
"max": 32
},
"ramGbPerVcpu": 2.5,
"price": {
"securePerVcpu": 0.04,
"serverlessPerVcpu": 0.03
},
"availability": "MEDIUM",
"dataCenters": [
{
"id": "US-KS-2",
"name": "US Kansas 2",
"availability": "MEDIUM"
}
]
}
]
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/v2/catalog/cpus/{id}": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"example": "cpu5c"
}
],
"get": {
"operationId": "getCpuType",
"summary": "Get a CPU type",
"description": "Returns a single CPU type with pricing. Availability details are included only when requested with include=AVAILABILITY.",
"tags": [
"Catalog"
],
"parameters": [
{
"$ref": "#/components/parameters/CatalogIncludeParam"
},
{
"$ref": "#/components/parameters/CpuProductFilter"
},
{
"$ref": "#/components/parameters/CpuVCPUCountFilter"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CpuType"
},
"examples": {
"cpu": {
"summary": "Successful response",
"value": {
"id": "cpu3c-2-4",
"name": "Compute-Optimized",
"group": "Gen 3",
"vcpu": {
"min": 2,
"max": 32
},
"ramGbPerVcpu": 2.5,
"price": {
"securePerVcpu": 0.04,
"serverlessPerVcpu": 0.03
},
"availability": "MEDIUM",
"dataCenters": [
{
"id": "US-KS-2",
"name": "US Kansas 2",
"availability": "MEDIUM"
}
]
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"404": {
"$ref": "#/components/responses/NotFoundError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/v2/catalog/datacenters": {
"get": {
"operationId": "listDataCenters",
"summary": "List data centers",
"description": "Returns available data center locations with region, compliance, supported network volume tiers, and global networking support. Use include=GPU_AVAILABILITY or include=CPU_AVAILABILITY to add per-resource availability arrays to each data center. The regions, networkVolumeTypes, compliance, and globalNetwork query parameters filter the list before it is returned.\n",
"tags": [
"Catalog"
],
"parameters": [
{
"name": "include",
"in": "query",
"required": false,
"description": "Comma-separated optional expansions. Supported value: GPU_AVAILABILITY, CPU_AVAILABILITY.",
"style": "form",
"explode": false,
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataCenterInclude"
},
"example": [
"GPU_AVAILABILITY"
]
}
},
{
"name": "regions",
"in": "query",
"required": false,
"description": "Comma-separated DataCenterRegion enum values. Values within this filter use OR semantics. Different filter families combine with AND.",
"style": "form",
"explode": false,
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataCenterRegion"
},
"example": [
"EUROPE",
"ASIA"
]
}
},
{
"name": "networkVolumeTypes",
"in": "query",
"required": false,
"description": "Comma-separated volume types. Supported values: STANDARD, HIGH_PERFORMANCE. Values within this filter use AND semantics; volumes=STANDARD,HIGH_PERFORMANCE requires both storage types. Different filter families combine with AND.",
"style": "form",
"explode": false,
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/VolumeType"
},
"example": [
"STANDARD",
"HIGH_PERFORMANCE"
]
}
},
{
"name": "compliance",
"in": "query",
"required": false,
"description": "Comma-separated Compliance enum values. Values within this filter use AND semantics; compliance=GDPR,SOC_2_TYPE_2 requires both certifications. Different filter families combine with AND.",
"style": "form",
"explode": false,
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Compliance"
},
"example": [
"GDPR",
"SOC_2_TYPE_2"
]
}
},
{
"name": "globalNetwork",
"in": "query",
"required": false,
"description": "Filter by global networking support. true returns only data centers that support global networking; false only those that do not. Different filter families combine with AND.",
"schema": {
"type": "boolean"
},
"example": true
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListDataCentersResponse"
},
"examples": {
"dataCenters": {
"summary": "Successful response",
"value": {
"dataCenters": [
{
"id": "US-KS-2",
"name": "US Kansas 2",
"region": "NORTH_AMERICA",
"globalNetwork": true,
"networkVolumeTypes": [
"STANDARD",
"HIGH_PERFORMANCE"
],
"compliance": [
"SOC_2_TYPE_2",
"ISO_IEC_27001"
],
"gpuAvailability": [
{
"id": "NVIDIA GeForce RTX 4090",
"name": "RTX 4090",
"availability": "HIGH"
}
],
"cpuAvailability": [
{
"id": "cpu3c-2-4",
"name": "Compute-Optimized",
"availability": "MEDIUM"
}
]
}
]
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/v2/catalog/datacenters/{id}": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"example": "US-CA-2"
}
],
"get": {
"operationId": "getDataCenter",
"summary": "Get a data center",
"description": "Returns a single data center. Availability is included only when requested with include=GPU_AVAILABILITY or include=CPU_AVAILABILITY.",
"tags": [
"Catalog"
],
"parameters": [
{
"name": "include",
"in": "query",
"required": false,
"description": "Comma-separated optional expansions. Supported value: GPU_AVAILABILITY, CPU_AVAILABILITY.",
"style": "form",
"explode": false,
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DataCenterInclude"
},
"example": [
"GPU_AVAILABILITY"
]
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DataCenter"
},
"examples": {
"dataCenter": {
"summary": "Successful response",
"value": {
"id": "US-KS-2",
"name": "US Kansas 2",
"region": "NORTH_AMERICA",
"globalNetwork": true,
"networkVolumeTypes": [
"STANDARD",
"HIGH_PERFORMANCE"
],
"compliance": [
"SOC_2_TYPE_2",
"ISO_IEC_27001"
],
"gpuAvailability": [
{
"id": "NVIDIA GeForce RTX 4090",
"name": "RTX 4090",
"availability": "HIGH"
}
],
"cpuAvailability": [
{
"id": "cpu3c-2-4",
"name": "Compute-Optimized",
"availability": "MEDIUM"
}
]
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"404": {
"$ref": "#/components/responses/NotFoundError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},


Catalog endpoints let you browse available compute without provisioning it: `GET /v2/catalog/gpus` and `/gpus/{id}`, `/cpus` and `/cpus/{id}`, and `/datacenters` and `/datacenters/{id}`. See [List GPU types](/api-reference-v2/catalog/list-gpu-types).

Pod log streaming exposes `GET /v2/pods/{id}/logs` so you can follow a Pod's output over the API. See [Stream Pod logs](/api-reference-v2/pods/stream-pod-logs).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 GET /v2/pods/{id}/logs is a net-new pod log streaming endpoint with no v1 equivalent.

Source:

"/v2/pods/{id}/logs": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Pod identifier",
"example": "pod_abc123"
}
],


Pod log streaming exposes `GET /v2/pods/{id}/logs` so you can follow a Pod's output over the API. See [Stream Pod logs](/api-reference-v2/pods/stream-pod-logs).

Serverless observability adds worker and release visibility through `GET /v2/serverless/{id}/workers`, `/workers/{workerId}/logs`, and `/releases`. See [List Serverless endpoint workers](/api-reference-v2/serverless/list-serverless-endpoint-workers), [Stream Serverless worker logs](/api-reference-v2/serverless/stream-serverless-worker-logs), and [List Serverless endpoint releases](/api-reference-v2/serverless/list-serverless-endpoint-releases).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 adds net-new Serverless observability paths: /v2/serverless/{id}/workers, /workers/{workerId}/logs, and /releases.

Source:

"/v2/serverless/{id}/workers": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Serverless endpoint identifier",
"example": "ep_abc123"
}
],
"get": {
"operationId": "listEndpointWorkers",
"summary": "List serverless endpoint workers",
"description": "Lists the active workers for a serverless endpoint.\n\n**Returns.** A `200` with a `ListEndpointWorkersResponse`: a\n`workers` array (one entry per active worker, each carrying its `id`,\n`status`, and runtime details) plus a `summary` of worker counts\ngrouped by status. Only currently active workers are included;\nscaled-down workers are not returned.\n\n**How `status` is determined.** Each worker's `status` is derived by\nreconciling the worker pod's lifecycle status with the endpoint's\nlive job-queue view (which workers are actively serving requests).\nWhen the job-queue view is unavailable, the response degrades\ngracefully: the shape is unchanged, but each `status` and the summary\ncounts fall back to pod lifecycle alone.\n",
"tags": [
"Serverless"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListEndpointWorkersResponse"
},
"examples": {
"workers": {
"summary": "Successful response",
"value": {
"endpointVersion": 4,
"summary": {
"running": 1,
"idle": 1,
"initializing": 0,
"throttled": 0,
"unhealthy": 0,
"total": 2
},
"workers": [
{
"id": "8g3n5t6r",
"status": "RUNNING",
"isStale": false,
"version": 4,
"gpuCount": 1,
"image": "runpod/pytorch:2.8.0-py3.11-cuda12.8.1",
"uptimeSeconds": 3600,
"gpuTypeId": "NVIDIA GeForce RTX 4090",
"dataCenterId": "US-KS-2",
"startedAt": "2026-06-01T12:05:00Z"
}
]
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"404": {
"$ref": "#/components/responses/NotFoundError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/v2/serverless/{id}/releases": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Serverless endpoint identifier",
"example": "ep_abc123"
}
],
"get": {
"operationId": "listEndpointReleases",
"summary": "List serverless endpoint releases",
"description": "Returns the endpoint's release history (newest first) plus a rollout\nsummary of how many workers are running the current version. Each\nrelease is a versioned configuration snapshot with a `diff` of what\nchanged; build-driven releases carry a `buildId` (fetch build detail via\nthe builds sub-routes).\n",
"tags": [
"Serverless"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListEndpointReleasesResponse"
},
"examples": {
"releases": {
"summary": "Successful response",
"value": {
"endpointVersion": 4,
"rollout": {
"inProgress": true,
"workersOnLatest": 1,
"workersTotal": 2,
"percentOnLatest": 50
},
"releases": [
{
"id": "5r9x2m7q",
"version": 4,
"source": "MANUAL",
"buildId": null,
"createdByUserId": null,
"workerCount": 2,
"createdAt": "2026-06-01T12:10:00Z",
"diff": [
{
"field": "workers.max",
"old": 5,
"new": 10
}
]
}
]
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"404": {
"$ref": "#/components/responses/NotFoundError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/v2/serverless/{id}/workers/{workerId}/logs": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Serverless endpoint identifier",
"example": "ep_abc123"
},
{
"name": "workerId",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Worker identifier (from GET /v2/serverless/{id}/workers)",
"example": "worker_abc"
}
],
"get": {
"operationId": "getWorkerLogs",
"summary": "Stream serverless worker logs",
"description": "Streams a serverless worker's logs as Server-Sent Events. The `source`\nquery parameter selects which log source to include.\n\nThe SSE `data` payload shape is:\n`{ \"source\": \"container\", \"line\": \"...\", \"ts\": \"...\" }`.\nLog-event `id` values are the event `ts` timestamp so browser/EventSource\nreconnects can resume with `Last-Event-ID`.\n",
"tags": [
"Serverless"
],
"parameters": [
{
"$ref": "#/components/parameters/LogSourceParam"
},
{
"$ref": "#/components/parameters/LogTail"
},
{
"$ref": "#/components/parameters/LogSince"
},
{
"$ref": "#/components/parameters/LogLastEventID"
}
],
"responses": {
"200": {
"description": "Worker log event stream",
"headers": {
"Cache-Control": {
"schema": {
"type": "string"
},
"description": "Always `no-cache` for SSE responses."
},
"Connection": {
"schema": {
"type": "string"
},
"description": "Always `keep-alive` to hold the SSE stream open."
},
"X-Accel-Buffering": {
"schema": {
"type": "string"
},
"description": "Always `no` to disable proxy buffering of the SSE stream."
}
},
"content": {
"text/event-stream": {
"schema": {
"type": "string",
"description": "Server-Sent Events stream. Each event includes an `id:` line and a JSON `data:` payload with `source`, `line`, and `ts` fields."
},
"examples": {
"logLine": {
"summary": "Successful response",
"value": "id: 2026-06-01T12:05:04Z/000000000042\ndata: {\"ts\":\"2026-06-01T12:05:04Z\",\"source\":\"container\",\"line\":\"Worker ready.\"}\n"
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"404": {
"$ref": "#/components/responses/NotFoundError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},


Serverless observability adds worker and release visibility through `GET /v2/serverless/{id}/workers`, `/workers/{workerId}/logs`, and `/releases`. See [List Serverless endpoint workers](/api-reference-v2/serverless/list-serverless-endpoint-workers), [Stream Serverless worker logs](/api-reference-v2/serverless/stream-serverless-worker-logs), and [List Serverless endpoint releases](/api-reference-v2/serverless/list-serverless-endpoint-releases).

Registry ECR delegations manage delegated registry access with `GET` and `POST /v2/registries/delegations` and `DELETE /v2/registries/delegations/{id}`. These endpoints aren't yet covered by a dedicated reference page during beta; consult the [v2 OpenAPI schema](/api-reference-v2/overview) for their request and response formats.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 adds net-new ECR delegation paths: GET/POST /v2/registries/delegations and DELETE /v2/registries/delegations/{id}.

Source:

"/v2/registries/delegations": {
"get": {
"operationId": "listDelegations",
"summary": "List all ECR delegations",
"tags": [
"Registries"
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListDelegationsResponse"
}
}
}
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
},
"post": {
"operationId": "createDelegation",
"summary": "Register an ECR delegation",
"tags": [
"Registries"
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreateDelegationRequest"
}
}
}
},
"responses": {
"201": {
"description": "Delegation created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/EcrDelegation"
}
}
}
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/v2/registries/delegations/{id}": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"example": "deleg_abc"
}
],
"delete": {
"operationId": "revokeDelegation",
"summary": "Revoke an ECR delegation",
"tags": [
"Registries"
],
"responses": {
"204": {
"description": "Delegation revoked"
},
"404": {
"description": "Delegation not found",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},


Registry ECR delegations manage delegated registry access with `GET` and `POST /v2/registries/delegations` and `DELETE /v2/registries/delegations/{id}`. These endpoints aren't yet covered by a dedicated reference page during beta; consult the [v2 OpenAPI schema](/api-reference-v2/overview) for their request and response formats.

Expanded billing adds an aggregated history at `GET /v2/billing` alongside Serverless, Public Endpoint, and Instant Clusters histories, going beyond v1's Pods, endpoints, and network volume breakdowns. See [Get aggregated billing history](/api-reference-v2/billing/get-aggregated-billing-history).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 adds a net-new aggregated billing history endpoint at GET /v2/billing.

Source:

"/v2/billing": {
"get": {
"operationId": "listBilling",
"summary": "Get aggregated billing history",
"description": "Returns time-bucketed total spend across all billable Runpod resources for the authenticated user. Use startTime/endTime with bucketSize for an explicit range, or lastN with bucketSize for the most recent buckets. Each record reports one bucket's total plus pod, serverless, storage, public endpoint, and Instant Cluster cost components. The metadata block echoes the resolved query window, record count, and totals across all returned buckets.\n",
"tags": [
"Billing"
],
"parameters": [
{
"$ref": "#/components/parameters/BillingStartTime"
},
{
"$ref": "#/components/parameters/BillingEndTime"
},
{
"$ref": "#/components/parameters/BillingBucketSize"
},
{
"$ref": "#/components/parameters/BillingLastN"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListBillingResponse"
},
"examples": {
"billing": {
"summary": "Successful response",
"value": {
"records": [
{
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"totalAmount": 42.34,
"podGpuAmount": 18.2,
"podCpuAmount": 0,
"podDiskAmount": 1.1,
"serverlessGpuAmount": 12.6,
"serverlessCpuAmount": 0,
"serverlessDiskAmount": 0.44,
"serverlessFeeAmount": 1.25,
"storageStandardAmount": 0,
"storageHighPerformanceAmount": 2.5,
"endpointAmount": 3.21,
"clusterGpuAmount": 2.5,
"clusterDiskAmount": 0.3,
"clusterNetworkingAmount": 0.24
}
],
"metadata": {
"query": {
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"bucketSize": "day"
},
"recordCount": 1,
"totals": {
"totalAmount": 42.34,
"podGpuAmount": 18.2,
"podCpuAmount": 0,
"podDiskAmount": 1.1,
"serverlessGpuAmount": 12.6,
"serverlessCpuAmount": 0,
"serverlessDiskAmount": 0.44,
"serverlessFeeAmount": 1.25,
"storageStandardAmount": 0,
"storageHighPerformanceAmount": 2.5,
"endpointAmount": 3.21,
"clusterGpuAmount": 2.5,
"clusterDiskAmount": 0.3,
"clusterNetworkingAmount": 0.24
}
}
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},


Registry ECR delegations manage delegated registry access with `GET` and `POST /v2/registries/delegations` and `DELETE /v2/registries/delegations/{id}`. These endpoints aren't yet covered by a dedicated reference page during beta; consult the [v2 OpenAPI schema](/api-reference-v2/overview) for their request and response formats.

Expanded billing adds an aggregated history at `GET /v2/billing` alongside Serverless, Public Endpoint, and Instant Clusters histories, going beyond v1's Pods, endpoints, and network volume breakdowns. See [Get aggregated billing history](/api-reference-v2/billing/get-aggregated-billing-history).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v1 billing breakdown is limited to /billing/pods, /billing/endpoints (Serverless billing), and /billing/networkvolumes.

Source:

"/billing/pods": {
"get": {
"tags": [
"billing"
],
"summary": "Pod billing history",
"description": "Retrieve billing information about your Pods. Review authentication, request parameters, response fields, and errors for this Runpod API operation.",
"operationId": "PodBilling",
"parameters": [
{
"name": "bucketSize",
"in": "query",
"schema": {
"type": "string",
"enum": [
"hour",
"day",
"week",
"month",
"year"
],
"default": "day",
"description": "The length of each billing time bucket. The billing time bucket is the time range over which each billing record is aggregated."
}
},
{
"name": "endTime",
"in": "query",
"schema": {
"type": "string",
"format": "date-time",
"example": "2023-01-31T23:59:59Z",
"description": "The end date of the billing period to retrieve."
}
},
{
"name": "gpuTypeId",
"in": "query",
"schema": {
"type": "string",
"enum": [
"NVIDIA GeForce RTX 4090",
"NVIDIA A40",
"NVIDIA RTX A5000",
"NVIDIA GeForce RTX 5090",
"NVIDIA H100 80GB HBM3",
"NVIDIA GeForce RTX 3090",
"NVIDIA RTX A4500",
"NVIDIA L40S",
"NVIDIA H200",
"NVIDIA L4",
"NVIDIA RTX 6000 Ada Generation",
"NVIDIA A100-SXM4-80GB",
"NVIDIA RTX 4000 Ada Generation",
"NVIDIA RTX A6000",
"NVIDIA A100 80GB PCIe",
"NVIDIA RTX 2000 Ada Generation",
"NVIDIA RTX A4000",
"NVIDIA RTX PRO 6000 Blackwell Server Edition",
"NVIDIA H100 PCIe",
"NVIDIA H100 NVL",
"NVIDIA L40",
"NVIDIA B200",
"NVIDIA GeForce RTX 3080 Ti",
"NVIDIA RTX PRO 6000 Blackwell Workstation Edition",
"NVIDIA GeForce RTX 3080",
"NVIDIA GeForce RTX 3070",
"AMD Instinct MI300X OAM",
"NVIDIA GeForce RTX 4080 SUPER",
"Tesla V100-PCIE-16GB",
"Tesla V100-SXM2-32GB",
"NVIDIA RTX 5000 Ada Generation",
"NVIDIA GeForce RTX 4070 Ti",
"NVIDIA RTX 4000 SFF Ada Generation",
"NVIDIA GeForce RTX 3090 Ti",
"NVIDIA RTX A2000",
"NVIDIA GeForce RTX 4080",
"NVIDIA A30",
"NVIDIA GeForce RTX 5080",
"Tesla V100-FHHL-16GB",
"NVIDIA H200 NVL",
"Tesla V100-SXM2-16GB",
"NVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition",
"NVIDIA A5000 Ada",
"Tesla V100-PCIE-32GB",
"NVIDIA RTX A4500",
"NVIDIA A30",
"NVIDIA GeForce RTX 3080TI",
"Tesla T4",
"NVIDIA RTX A30"
],
"example": "NVIDIA GeForce RTX 4090",
"description": "Filter to Pods with the provided GPU type attached."
}
},
{
"name": "grouping",
"in": "query",
"schema": {
"type": "string",
"enum": [
"podId",
"gpuTypeId"
],
"default": "gpuTypeId",
"description": "Group the billing records by the provided field."
}
},
{
"name": "podId",
"in": "query",
"schema": {
"type": "string",
"example": "xedezhzb9la3ye",
"description": "Filter to a specific Pod."
}
},
{
"name": "startTime",
"in": "query",
"schema": {
"type": "string",
"format": "date-time",
"example": "2023-01-01T00:00:00Z",
"description": "The start date of the billing period to retrieve."
}
}
],
"responses": {
"200": {
"description": "Successful operation.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BillingRecords"
}
}
}
}
}
}
},


Registry ECR delegations manage delegated registry access with `GET` and `POST /v2/registries/delegations` and `DELETE /v2/registries/delegations/{id}`. These endpoints aren't yet covered by a dedicated reference page during beta; consult the [v2 OpenAPI schema](/api-reference-v2/overview) for their request and response formats.

Expanded billing adds an aggregated history at `GET /v2/billing` alongside Serverless, Public Endpoint, and Instant Clusters histories, going beyond v1's Pods, endpoints, and network volume breakdowns. See [Get aggregated billing history](/api-reference-v2/billing/get-aggregated-billing-history).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 adds Serverless (/v2/billing/serverless), Public Endpoint (/v2/billing/endpoints), and Instant Cluster (/v2/billing/clusters) billing histories beyond the v1 breakdown.

Source:

"/v2/billing/serverless": {
"get": {
"operationId": "listServerlessBilling",
"summary": "Get serverless billing history",
"description": "Returns serverless endpoint billing detail for the authenticated user, split into time buckets by startTime/endTime with bucketSize or by lastN recent buckets. Use serverlessId to filter to one endpoint; without it, records are emitted per serverless endpoint per bucket. Each record reports endpoint-level GPU, CPU, disk, platform fee, and total amounts. This is distinct from pod billing, which covers standalone GPU and CPU pod costs rather than serverless endpoint workloads.\n",
"tags": [
"Billing"
],
"parameters": [
{
"$ref": "#/components/parameters/BillingStartTime"
},
{
"$ref": "#/components/parameters/BillingEndTime"
},
{
"$ref": "#/components/parameters/BillingBucketSize"
},
{
"$ref": "#/components/parameters/BillingLastN"
},
{
"name": "serverlessId",
"in": "query",
"required": false,
"description": "Filter to a specific serverless endpoint.",
"schema": {
"type": "string"
},
"example": "jpnw0v75y3qoql"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListServerlessBillingResponse"
},
"examples": {
"serverlessBilling": {
"summary": "Successful response",
"value": {
"records": [
{
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"serverlessId": "4m7x2k9q",
"totalAmount": 8.9,
"gpuAmount": 7.5,
"cpuAmount": 0,
"diskAmount": 0.4,
"feeAmount": 1
}
],
"metadata": {
"query": {
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"bucketSize": "day",
"serverlessId": "4m7x2k9q"
},
"recordCount": 1,
"totals": {
"totalAmount": 8.9,
"gpuAmount": 7.5,
"cpuAmount": 0,
"diskAmount": 0.4,
"feeAmount": 1
},
"uniqueServerlessCount": 1
}
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/v2/billing/endpoints": {
"get": {
"operationId": "listEndpointBilling",
"summary": "Get public endpoint billing history",
"description": "Returns Runpod public endpoint billing history for the authenticated user, split into time buckets by startTime/endTime with bucketSize or by lastN recent buckets. Each record reports the endpoint total for one bucket, and metadata echoes the resolved query window, record count, and total endpoint amount across all returned records.\n",
"tags": [
"Billing"
],
"parameters": [
{
"$ref": "#/components/parameters/BillingStartTime"
},
{
"$ref": "#/components/parameters/BillingEndTime"
},
{
"$ref": "#/components/parameters/BillingBucketSize"
},
{
"$ref": "#/components/parameters/BillingLastN"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListEndpointBillingResponse"
},
"examples": {
"endpointBilling": {
"summary": "Successful response",
"value": {
"records": [
{
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"totalAmount": 3.21
}
],
"metadata": {
"query": {
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"bucketSize": "day"
},
"recordCount": 1,
"totals": {
"totalAmount": 3.21
}
}
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/v2/billing/networkvolumes": {
"get": {
"operationId": "listNetworkVolumeBilling",
"summary": "Get network volume billing history",
"description": "Returns network volume billing history for the authenticated user, split into time buckets by startTime/endTime with bucketSize or by lastN recent buckets. Use networkVolumeId to filter to one volume; without it, records are emitted per volume per bucket. Each record includes standard storage, high-performance storage, and total amounts, while metadata reports the resolved query, distinct volume count, and totals across the returned records.\n",
"tags": [
"Billing"
],
"parameters": [
{
"$ref": "#/components/parameters/BillingStartTime"
},
{
"$ref": "#/components/parameters/BillingEndTime"
},
{
"$ref": "#/components/parameters/BillingBucketSize"
},
{
"$ref": "#/components/parameters/BillingLastN"
},
{
"name": "networkVolumeId",
"in": "query",
"required": false,
"description": "Filter to a specific network volume.",
"schema": {
"type": "string"
},
"example": "vol_abc123"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListNetworkVolumeBillingResponse"
},
"examples": {
"networkVolumeBilling": {
"summary": "Successful response",
"value": {
"records": [
{
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"networkVolumeId": "2q9m7x4c",
"totalAmount": 5.79,
"standardAmount": 0,
"highPerformanceAmount": 5.79
}
],
"metadata": {
"query": {
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"bucketSize": "day",
"networkVolumeId": "2q9m7x4c"
},
"recordCount": 1,
"totals": {
"totalAmount": 5.79,
"standardAmount": 0,
"highPerformanceAmount": 5.79
},
"uniqueNetworkVolumeCount": 1
}
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/v2/billing/clusters": {


| Resource | v1 path | v2 path |
| --- | --- | --- |
| Pods | `/pods` | `/v2/pods` |

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 pods collection path is /v2/pods (v1 equivalent /pods confirmed at api-reference/openapi.json line 103).

Source:

"/v2/pods": {

| Resource | v1 path | v2 path |
| --- | --- | --- |
| Pods | `/pods` | `/v2/pods` |
| Serverless | `/endpoints` | `/v2/serverless` |

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 serverless collection path is /v2/serverless (v1 equivalent /endpoints confirmed at api-reference/openapi.json line 683).

Source:

"/v2/serverless": {

| --- | --- | --- |
| Pods | `/pods` | `/v2/pods` |
| Serverless | `/endpoints` | `/v2/serverless` |
| Templates | `/templates` | `/v2/templates` |

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 templates collection path is /v2/templates (v1 equivalent /templates confirmed at api-reference/openapi.json line 948).

Source:

"/v2/templates": {

| Pods | `/pods` | `/v2/pods` |
| Serverless | `/endpoints` | `/v2/serverless` |
| Templates | `/templates` | `/v2/templates` |
| Network volumes | `/networkvolumes` | `/v2/network-volumes` |

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 network volumes collection path is /v2/network-volumes (kebab-case; v1 equivalent /networkvolumes confirmed at api-reference/openapi.json line 1233).

Source:

"/v2/network-volumes": {

| Serverless | `/endpoints` | `/v2/serverless` |
| Templates | `/templates` | `/v2/templates` |
| Network volumes | `/networkvolumes` | `/v2/network-volumes` |
| Registries | `/containerregistryauth` | `/v2/registries` |

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 registries collection path is /v2/registries (v1 equivalent /containerregistryauth confirmed at api-reference/openapi.json line 1456).

Source:

"/v2/registries": {

| Templates | `/templates` | `/v2/templates` |
| Network volumes | `/networkvolumes` | `/v2/network-volumes` |
| Registries | `/containerregistryauth` | `/v2/registries` |
| Pod billing | `/billing/pods` | `/v2/billing/pods` |

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 pod billing path is /v2/billing/pods (v1 equivalent /billing/pods confirmed at api-reference/openapi.json line 1587).

Source:

"/v2/billing/pods": {
"get": {
"operationId": "listPodBilling",
"summary": "Get pod billing history",
"description": "Returns pod-only billing detail for the authenticated user, split into time buckets by startTime/endTime with bucketSize or by lastN recent buckets. Use podId to narrow the response to one GPU or CPU pod; without it, records are emitted per pod per bucket. Each record includes podId, GPU, CPU, disk, and total amounts, while metadata echoes the resolved query and totals across the pod records. Use listBilling when you need aggregate spend across every billable resource family.\n",
"tags": [
"Billing"
],
"parameters": [
{
"$ref": "#/components/parameters/BillingStartTime"
},
{
"$ref": "#/components/parameters/BillingEndTime"
},
{
"$ref": "#/components/parameters/BillingBucketSize"
},
{
"$ref": "#/components/parameters/BillingLastN"
},
{
"name": "podId",
"in": "query",
"required": false,
"description": "Filter to a specific pod (GPU or CPU).",
"schema": {
"type": "string"
},
"example": "pod_abc123"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListPodBillingResponse"
},
"examples": {
"podBilling": {
"summary": "Successful response",
"value": {
"records": [
{
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"podId": "7h9k2m4n6p",
"totalAmount": 12.34,
"gpuAmount": 11.1,
"cpuAmount": 0,
"diskAmount": 1.24
}
],
"metadata": {
"query": {
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"bucketSize": "day",
"podId": "7h9k2m4n6p"
},
"recordCount": 1,
"totals": {
"totalAmount": 12.34,
"gpuAmount": 11.1,
"cpuAmount": 0,
"diskAmount": 1.24
},
"uniquePodCount": 1
}
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},

| Network volumes | `/networkvolumes` | `/v2/network-volumes` |
| Registries | `/containerregistryauth` | `/v2/registries` |
| Pod billing | `/billing/pods` | `/v2/billing/pods` |
| Serverless billing | `/billing/endpoints` | `/v2/billing/serverless` |

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 serverless billing path is /v2/billing/serverless, summary "Get serverless billing history" (v1 equivalent /billing/endpoints confirmed at api-reference/openapi.json line 1729).

Source:

"/v2/billing/serverless": {
"get": {
"operationId": "listServerlessBilling",
"summary": "Get serverless billing history",
"description": "Returns serverless endpoint billing detail for the authenticated user, split into time buckets by startTime/endTime with bucketSize or by lastN recent buckets. Use serverlessId to filter to one endpoint; without it, records are emitted per serverless endpoint per bucket. Each record reports endpoint-level GPU, CPU, disk, platform fee, and total amounts. This is distinct from pod billing, which covers standalone GPU and CPU pod costs rather than serverless endpoint workloads.\n",
"tags": [
"Billing"
],
"parameters": [
{
"$ref": "#/components/parameters/BillingStartTime"
},
{
"$ref": "#/components/parameters/BillingEndTime"
},
{
"$ref": "#/components/parameters/BillingBucketSize"
},
{
"$ref": "#/components/parameters/BillingLastN"
},
{
"name": "serverlessId",
"in": "query",
"required": false,
"description": "Filter to a specific serverless endpoint.",
"schema": {
"type": "string"
},
"example": "jpnw0v75y3qoql"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListServerlessBillingResponse"
},
"examples": {
"serverlessBilling": {
"summary": "Successful response",
"value": {
"records": [
{
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"serverlessId": "4m7x2k9q",
"totalAmount": 8.9,
"gpuAmount": 7.5,
"cpuAmount": 0,
"diskAmount": 0.4,
"feeAmount": 1
}
],
"metadata": {
"query": {
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"bucketSize": "day",
"serverlessId": "4m7x2k9q"
},
"recordCount": 1,
"totals": {
"totalAmount": 8.9,
"gpuAmount": 7.5,
"cpuAmount": 0,
"diskAmount": 0.4,
"feeAmount": 1
},
"uniqueServerlessCount": 1
}
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},

| Registries | `/containerregistryauth` | `/v2/registries` |
| Pod billing | `/billing/pods` | `/v2/billing/pods` |
| Serverless billing | `/billing/endpoints` | `/v2/billing/serverless` |
| Network volume billing | `/billing/networkvolumes` | `/v2/billing/networkvolumes` |

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 network volume billing path is /v2/billing/networkvolumes (v1 equivalent /billing/networkvolumes confirmed at api-reference/openapi.json line 1964).

Source:

"/v2/billing/networkvolumes": {
"get": {
"operationId": "listNetworkVolumeBilling",
"summary": "Get network volume billing history",
"description": "Returns network volume billing history for the authenticated user, split into time buckets by startTime/endTime with bucketSize or by lastN recent buckets. Use networkVolumeId to filter to one volume; without it, records are emitted per volume per bucket. Each record includes standard storage, high-performance storage, and total amounts, while metadata reports the resolved query, distinct volume count, and totals across the returned records.\n",
"tags": [
"Billing"
],
"parameters": [
{
"$ref": "#/components/parameters/BillingStartTime"
},
{
"$ref": "#/components/parameters/BillingEndTime"
},
{
"$ref": "#/components/parameters/BillingBucketSize"
},
{
"$ref": "#/components/parameters/BillingLastN"
},
{
"name": "networkVolumeId",
"in": "query",
"required": false,
"description": "Filter to a specific network volume.",
"schema": {
"type": "string"
},
"example": "vol_abc123"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListNetworkVolumeBillingResponse"
},
"examples": {
"networkVolumeBilling": {
"summary": "Successful response",
"value": {
"records": [
{
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"networkVolumeId": "2q9m7x4c",
"totalAmount": 5.79,
"standardAmount": 0,
"highPerformanceAmount": 5.79
}
],
"metadata": {
"query": {
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"bucketSize": "day",
"networkVolumeId": "2q9m7x4c"
},
"recordCount": 1,
"totals": {
"totalAmount": 5.79,
"standardAmount": 0,
"highPerformanceAmount": 5.79
},
"uniqueNetworkVolumeCount": 1
}
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},

Multi-word resources use kebab-case in v2, so `/networkvolumes` becomes `/v2/network-volumes`. v2 also generalizes path parameters: where v1 used resource-specific names such as `{podId}`, `{endpointId}`, `{networkVolumeId}`, `{templateId}`, and `{containerRegistryAuthId}`, v2 uses a single generic `{id}` parameter across resources.

<Warning>
Billing paths don't map by name. In v1, `/billing/endpoints` returns Serverless billing history; in v2, Serverless billing moves to `/v2/billing/serverless`. The v2 path `/v2/billing/endpoints` is a different, new resource — Public Endpoint billing history — so update your Serverless billing calls to the new path rather than assuming the old one carries over.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v1 /billing/endpoints page is titled "Serverless billing history"; its OpenAPI summary is "Serverless billing history" (api-reference/openapi.json line 1729).

Source:

title: "Serverless billing history"

Multi-word resources use kebab-case in v2, so `/networkvolumes` becomes `/v2/network-volumes`. v2 also generalizes path parameters: where v1 used resource-specific names such as `{podId}`, `{endpointId}`, `{networkVolumeId}`, `{templateId}`, and `{containerRegistryAuthId}`, v2 uses a single generic `{id}` parameter across resources.

<Warning>
Billing paths don't map by name. In v1, `/billing/endpoints` returns Serverless billing history; in v2, Serverless billing moves to `/v2/billing/serverless`. The v2 path `/v2/billing/endpoints` is a different, new resource — Public Endpoint billing history — so update your Serverless billing calls to the new path rather than assuming the old one carries over.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 /v2/billing/serverless summary is "Get serverless billing history" — confirms Serverless billing moves to this path in v2.

Source:

"/v2/billing/serverless": {
"get": {
"operationId": "listServerlessBilling",
"summary": "Get serverless billing history",
"description": "Returns serverless endpoint billing detail for the authenticated user, split into time buckets by startTime/endTime with bucketSize or by lastN recent buckets. Use serverlessId to filter to one endpoint; without it, records are emitted per serverless endpoint per bucket. Each record reports endpoint-level GPU, CPU, disk, platform fee, and total amounts. This is distinct from pod billing, which covers standalone GPU and CPU pod costs rather than serverless endpoint workloads.\n",
"tags": [
"Billing"
],
"parameters": [
{
"$ref": "#/components/parameters/BillingStartTime"
},
{
"$ref": "#/components/parameters/BillingEndTime"
},
{
"$ref": "#/components/parameters/BillingBucketSize"
},
{
"$ref": "#/components/parameters/BillingLastN"
},
{
"name": "serverlessId",
"in": "query",
"required": false,
"description": "Filter to a specific serverless endpoint.",
"schema": {
"type": "string"
},
"example": "jpnw0v75y3qoql"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListServerlessBillingResponse"
},
"examples": {
"serverlessBilling": {
"summary": "Successful response",
"value": {
"records": [
{
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"serverlessId": "4m7x2k9q",
"totalAmount": 8.9,
"gpuAmount": 7.5,
"cpuAmount": 0,
"diskAmount": 0.4,
"feeAmount": 1
}
],
"metadata": {
"query": {
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"bucketSize": "day",
"serverlessId": "4m7x2k9q"
},
"recordCount": 1,
"totals": {
"totalAmount": 8.9,
"gpuAmount": 7.5,
"cpuAmount": 0,
"diskAmount": 0.4,
"feeAmount": 1
},
"uniqueServerlessCount": 1
}
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},

Multi-word resources use kebab-case in v2, so `/networkvolumes` becomes `/v2/network-volumes`. v2 also generalizes path parameters: where v1 used resource-specific names such as `{podId}`, `{endpointId}`, `{networkVolumeId}`, `{templateId}`, and `{containerRegistryAuthId}`, v2 uses a single generic `{id}` parameter across resources.

<Warning>
Billing paths don't map by name. In v1, `/billing/endpoints` returns Serverless billing history; in v2, Serverless billing moves to `/v2/billing/serverless`. The v2 path `/v2/billing/endpoints` is a different, new resource — Public Endpoint billing history — so update your Serverless billing calls to the new path rather than assuming the old one carries over.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v2 /v2/billing/endpoints summary is "Get public endpoint billing history" — a different resource than v1's /billing/endpoints (Serverless), confirming the two paths don't map by name.

Source:

"/v2/billing/endpoints": {
"get": {
"operationId": "listEndpointBilling",
"summary": "Get public endpoint billing history",
"description": "Returns Runpod public endpoint billing history for the authenticated user, split into time buckets by startTime/endTime with bucketSize or by lastN recent buckets. Each record reports the endpoint total for one bucket, and metadata echoes the resolved query window, record count, and total endpoint amount across all returned records.\n",
"tags": [
"Billing"
],
"parameters": [
{
"$ref": "#/components/parameters/BillingStartTime"
},
{
"$ref": "#/components/parameters/BillingEndTime"
},
{
"$ref": "#/components/parameters/BillingBucketSize"
},
{
"$ref": "#/components/parameters/BillingLastN"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListEndpointBillingResponse"
},
"examples": {
"endpointBilling": {
"summary": "Successful response",
"value": {
"records": [
{
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"totalAmount": 3.21
}
],
"metadata": {
"query": {
"startTime": "2026-06-01T00:00:00Z",
"endTime": "2026-06-02T00:00:00Z",
"bucketSize": "day"
},
"recordCount": 1,
"totals": {
"totalAmount": 3.21
}
}
}
}
}
}
}
},
"401": {
"$ref": "#/components/responses/UnauthorizedError"
},
"403": {
"$ref": "#/components/responses/ForbiddenError"
},
"429": {
"$ref": "#/components/responses/TooManyRequestsError"
},
"default": {
"description": "Error",
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},


## What changed at a glance

The base URL moves from `https://rest.runpod.io/v1` to `https://api.runpod.io/v2`. Update every request to the new host and version prefix. The OpenAPI schema also moves accordingly, from `https://rest.runpod.io/v1/openapi.json` to `https://api.runpod.io/v2/openapi.json` — regenerate any client or tooling against the v2 schema.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v1 overview documents the OpenAPI schema URL as https://rest.runpod.io/v1/openapi.json.

Source:

--url https://rest.runpod.io/v1/openapi.json \

@mintlify

mintlify Bot commented Jul 27, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
runpod-docs 🟢 Ready View Preview Jul 27, 2026, 5:33 PM

💡 Tip: Enable Workflows to automatically generate PRs for you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants