Create a pod
Creates a new pod. name is always required; supply exactly one of
gpu or cpu to select compute (a GPU or a CPU pod). Container
settings come from the body, from a template referenced by
templateId (body fields override the template’s), or both; image
is required unless templateId is set. See CreatePodRequest for
the full body.
Returns 201 with the created pod. Provisioning is asynchronous: the
pod starts in PROVISIONING, transitions through STARTING, and
reaches RUNNING once its container is healthy. Poll getPod (or
watch the pod’s status) to observe readiness rather than assuming
the pod is running when this call returns.
Authorizations
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
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.
1"my-training-pod"
Docker image reference
"runpod/pytorch:2.8.0-py3.11-cuda12.8.1"
Arguments passed to the container entrypoint
""
Container disk in GB (ephemeral, wiped on restart)
x >= 150
Exposed ports, formatted as port/protocol
Environment variables as key-value pairs
Container registry credential ID (for private images)
null
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
(allowedCudaVersions or 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.
1"30zmvf89kd"
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
mountsor 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
volumeIdof a network mount is immutable; a PATCH that names a differentvolumeIdis rejected with 400. - Partial mounts are not supported — every mount entry must
include the full schema (
size+pathfor persistent,volumeId+pathfor network). Missing required fields → 422.
Cloud tier. Defaults to SECURE when omitted.
SECURE, COMMUNITY Preferred data centers for placement. Omit or pass an empty array to let the scheduler choose.
Acceptable CUDA versions for the host machine, as major.minor.
Omit to accept any version. Matching is exact, so a version no
machine reports yields a capacity error rather than a fallback —
discover valid values per GPU type via
GET /v2/catalog/gpus?include=AVAILABILITY (cudaVersions).
GPU pods only; rejected with 400 when cpu is set. Mutually
exclusive with minCudaVersion (400 if both are sent).
^\d+\.\d+$Lowest acceptable CUDA version for the host machine, compared numerically. Format: integer major or major.minor, e.g. 12 or 12.1 — a bare major means any release of that major. Use this for an open-ended floor and allowedCudaVersions for an exact set.
GPU pods only; rejected with 400 when cpu is set. Mutually
exclusive with allowedCudaVersions (400 if both are sent).
^\d+(\.\d+)?$"12.1"
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.
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.
true
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.
true
Response
Created
Reusable container configuration shared across templates, pods, and serverless endpoints. Adding a field here automatically propagates to all three resources.
Docker image reference
"runpod/pytorch:2.8.0-py3.11-cuda12.8.1"
Arguments passed to the container entrypoint
""
Container disk in GB (ephemeral, wiped on restart)
x >= 150
Exposed ports, formatted as port/protocol
Environment variables as key-value pairs
Container registry credential ID (for private images)
null
"pod_abc123"
"my-training-pod"
Lifecycle status of a pod.
PROVISIONING— pod is being allocatedSTARTING— container is startingRUNNING— container is healthyEXITED— container exited (stopped)ERROR— container is in an unrecoverable error stateTERMINATED— pod has been permanently deleted
PROVISIONING, STARTING, RUNNING, EXITED, ERROR, TERMINATED Valid state transitions for the current status.
State transition to trigger on a pod.
start, stop, restart, terminate 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
mountsor 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
volumeIdof a network mount is immutable; a PATCH that names a differentvolumeIdis rejected with 400. - Partial mounts are not supported — every mount entry must
include the full schema (
size+pathfor persistent,volumeId+pathfor network). Missing required fields → 422.
Cloud tier.
SECURE— Runpod-owned datacenter hardwareCOMMUNITY— community-hosted hardware
SECURE, COMMUNITY Data center where the pod is running (assigned by scheduler)
"US-TX-3"
SSH connection details, via the Runpod proxy or directly to the pod's published 22/tcp port.
ID of the template this pod was created from
null
Current cost in USD per hour (0.0 when EXITED or TERMINATED)
0.35
Whether the pod is locked (prevents stopping or resetting)
false
Live utilization metrics. Null when the pod is not RUNNING.
"2026-03-13T20:00:00Z"
"2026-03-13T20:00:00Z"
Present for GPU pods; omitted from CPU pods.
Present for CPU pods; omitted from GPU pods.
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.
"12.8"
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.