Skip to main content
POST
Region-constrained deploy loop

Authorizations

Authorization
string
header
required

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.

Body

application/json

Request body for creating a pod. Exactly one of gpu or cpu must be set — enforced at the handler layer. For CPU pods, memory is derived by the API from the selected flavor's RAM multiplier; clients provide only CPU flavor and vCPU count. CPU pods support container disk and network volumes only; mounts.persistent is invalid when cpu is set.

image is required unless templateId is set.

name
string
required
Minimum string length: 1
Example:

"my-training-pod"

args
string

Arguments passed to the container entrypoint

Example:

""

disk
integer

Container disk in GB (ephemeral, wiped on restart)

Required range: x >= 1
Example:

50

env
object

Environment variables as key-value pairs

Example:
image
string

Docker image reference

Example:

"runpod/pytorch:1.0.2-cu1281-torch280-ubuntu2404"

ports
string[]

Exposed ports, formatted as port/protocol

Example:
registry
string | null

Container registry credential ID (for private images)

Example:

null

cloud
enum<string>
default:SECURE

Cloud tier. Defaults to SECURE when omitted.

Available options:
SECURE,
COMMUNITY
cpu
object
dataCenterIds
string[]

Preferred data centers for placement. Omit or pass an empty array to let the scheduler choose.

Example:
globalNetworking
boolean
default:false

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.

Example:

false

gpu
object

GPU request for a pod create. Carries the CUDA host constraints, which live here rather than at the body's top level so they are unrepresentable on a CPU pod.

mounts
object

Storage mounts attached to a pod. At-most-one of persistent or network may be set today (mutually exclusive, enforced at the handler with 400 if both are present). The network field is an array for forward compatibility with eventual multi-network-volume support, but maxItems is 1 today.

PATCH semantics:

  • Omitting mounts or sending {} leaves the existing mount unchanged.
  • An explicit network: [] is rejected with 400 (clearing mounts is not supported).
  • Mount kind is fixed at create — a PATCH that introduces a kind not present at create (persistent on a network pod, network on a persistent pod, or any mount on a previously-mountless pod) is rejected with 400.
  • The volumeId of a network mount is immutable; a PATCH that names a different volumeId is rejected with 400.
  • Partial mounts are not supported — every mount entry must include the full schema (size + path for persistent, volumeId + path for network). Missing required fields → 422.
startJupyter
boolean
default:false

Create-time flag telling the provisioner to start JupyterLab: injects a generated JUPYTER_PASSWORD environment variable, unless the request already sets one. Only images that honor the convention start Jupyter from it (RunPod official images do); expose 8888/http in ports to reach it.

Not part of the pod's readable config — never returned by GET and not changeable by PATCH.

Example:

true

startSsh
boolean
default:false

Create-time flag telling the provisioner to set up SSH access: injects a PUBLIC_KEY environment variable carrying your account's registered SSH public keys, unless the request already sets one. Requires registered keys (PUT /v2/account/ssh-keys) — with none registered the flag does nothing and the pod has no SSH access. Only images that honor the convention start sshd from it (all RunPod official images do). Connect using the pod's ssh block; the ssh.direct variant additionally needs a 22/tcp entry in ports.

Not part of the pod's readable config — never returned by GET and not changeable by PATCH.

Example:

true

templateId
string

ID of a pod template to base this pod on. The template is resolved at create time into the same container settings you could otherwise spread into this body (image, args, disk, ports, env, registry, persistent mount, startSsh, startJupyter, allowedCudaVersions); explicit body fields override the template's, except env, which is merged per key with body values winning. Sending either CUDA field (gpu.allowedCudaVersions or gpu.minCudaVersion) replaces the template's CUDA constraint entirely, and CPU pods ignore it (like the persistent mount). The template is a one-time source of settings: later template edits do not affect the pod, and the created pod does not retain a link to the template (template stays null). The template may be one of your own or a public catalog template — see GET /v2/catalog/templates (unknown or inaccessible ID → 404) — and must not be a serverless template (→ 422). CPU pods do not inherit a template's persistent mount.

Minimum string length: 1
Example:

"30zmvf89kd"

Response

Created

Reusable container configuration shared across templates, pods, and serverless endpoints. Adding a field here automatically propagates to all three resources.

args
string
required

Arguments passed to the container entrypoint

Example:

""

disk
integer
required

Container disk in GB (ephemeral, wiped on restart)

Required range: x >= 1
Example:

50

env
object
required

Environment variables as key-value pairs

Example:
image
string
required

Docker image reference

Example:

"runpod/pytorch:1.0.2-cu1281-torch280-ubuntu2404"

ports
string[]
required

Exposed ports, formatted as port/protocol

Example:
registry
string | null
required

Container registry credential ID (for private images)

Example:

null

id
string
required
Example:

"pod_abc123"

name
string
required
Example:

"my-training-pod"

status
enum<string>
required

Lifecycle status of a pod.

  • PROVISIONING — pod is being allocated
  • STARTING — container is starting
  • RUNNING — container is healthy
  • EXITED — container exited (stopped)
  • ERROR — container is in an unrecoverable error state
  • TERMINATED — pod has been permanently deleted
Available options:
PROVISIONING,
STARTING,
RUNNING,
EXITED,
ERROR,
TERMINATED
actions
enum<string>[]
required

Valid state transitions for the current status.

State transition to trigger on a pod.

Available options:
start,
stop,
restart,
terminate
mounts
object
required

Storage mounts attached to a pod. At-most-one of persistent or network may be set today (mutually exclusive, enforced at the handler with 400 if both are present). The network field is an array for forward compatibility with eventual multi-network-volume support, but maxItems is 1 today.

PATCH semantics:

  • Omitting mounts or sending {} leaves the existing mount unchanged.
  • An explicit network: [] is rejected with 400 (clearing mounts is not supported).
  • Mount kind is fixed at create — a PATCH that introduces a kind not present at create (persistent on a network pod, network on a persistent pod, or any mount on a previously-mountless pod) is rejected with 400.
  • The volumeId of a network mount is immutable; a PATCH that names a different volumeId is rejected with 400.
  • Partial mounts are not supported — every mount entry must include the full schema (size + path for persistent, volumeId + path for network). Missing required fields → 422.
cloud
enum<string>
required

Cloud tier.

  • SECURE — Runpod-owned datacenter hardware
  • COMMUNITY — community-hosted hardware
Available options:
SECURE,
COMMUNITY
dataCenterId
string | null
required

Data center where the pod is running (assigned by scheduler)

Example:

"US-TX-3"

cudaVersion
string | null
required

CUDA version reported by the host machine. Retained while the pod is stopped — a stopped pod keeps its machine assignment and resumes onto the same host. Null means unknown or not applicable (CPU pods, or a host that has not reported one), not that CUDA is absent.

Example:

"12.8"

ssh
object
required

SSH connection details, via the Runpod proxy or directly to the pod's published 22/tcp port.

template
string | null
required

ID of the template this pod was created from

Example:

null

cost
number<float>
required

Current cost in USD per hour (0.0 when EXITED or TERMINATED)

Example:

0.35

locked
boolean
required

Whether the pod is locked (prevents stopping or resetting)

Example:

false

globalNetworking
object
required
runtime
object | null
required

Live utilization metrics. Null when the pod is not RUNNING.

createdAt
string<date-time>
required
Example:

"2026-03-13T20:00:00Z"

startedAt
string<date-time> | null
required
Example:

"2026-03-13T20:00:00Z"

gpu
object

Present for GPU pods; omitted from CPU pods.

cpu
object

Present for CPU pods; omitted from GPU pods.

cluster
object

Cluster membership; omitted from a standalone pod. Member pods are managed through /v2/clusters/{id} — they are excluded from GET /v2/pods by default (pass includeClusterPods=true to include them) and cannot be modified or deleted via the pod endpoints.

Last modified on August 19, 2026