Skip to main content
POST
Create a pod

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"

image
string

Docker image reference

Example:

"runpod/pytorch:2.8.0-py3.11-cuda12.8.1"

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

ports
string[]

Exposed ports, formatted as port/protocol

Example:
env
object

Environment variables as key-value pairs

Example:
registry
string | null

Container registry credential ID (for private images)

Example:

null

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 (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.

Minimum string length: 1
Example:

"30zmvf89kd"

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.
gpu
object
cpu
object
cloud
enum<string>
default:SECURE

Cloud tier. Defaults to SECURE when omitted.

Available options:
SECURE,
COMMUNITY
dataCenterIds
string[]

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

Example:
allowedCudaVersions
string[]

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).

Pattern: ^\d+\.\d+$
Example:
minCudaVersion
string

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).

Pattern: ^\d+(\.\d+)?$
Example:

"12.1"

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

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

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

Response

Created

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

image
string
required

Docker image reference

Example:

"runpod/pytorch:2.8.0-py3.11-cuda12.8.1"

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

ports
string[]
required

Exposed ports, formatted as port/protocol

Example:
env
object
required

Environment variables as key-value pairs

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"

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.

cudaVersion
string | null

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"

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 14, 2026