curl --request POST \
--url https://api.aireserve.com/v1/gpu/pods \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"name": "dev-box",
"gpuTypeId": "NVIDIA_A40",
"gpuCount": 1,
"dataCenterId": "EU-RO-1",
"templateId": "<curated-template-id>",
"containerDiskGb": 20,
"networkVolumeId": "<volume-id>",
"sshKeyIds": [
"<key-id>"
],
"quoteId": "<quote-id>",
"ephemeralDiskAcknowledged": true
}
'import requests
url = "https://api.aireserve.com/v1/gpu/pods"
payload = {
"name": "dev-box",
"gpuTypeId": "NVIDIA_A40",
"gpuCount": 1,
"dataCenterId": "EU-RO-1",
"templateId": "<curated-template-id>",
"containerDiskGb": 20,
"networkVolumeId": "<volume-id>",
"sshKeyIds": ["<key-id>"],
"quoteId": "<quote-id>",
"ephemeralDiskAcknowledged": True
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'dev-box',
gpuTypeId: 'NVIDIA_A40',
gpuCount: 1,
dataCenterId: 'EU-RO-1',
templateId: '<curated-template-id>',
containerDiskGb: 20,
networkVolumeId: '<volume-id>',
sshKeyIds: ['<key-id>'],
quoteId: '<quote-id>',
ephemeralDiskAcknowledged: true
})
};
fetch('https://api.aireserve.com/v1/gpu/pods', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"accepted": true,
"resourceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"operationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "accepted",
"resourceType": "pod"
}Create pod
Launch a new GPU pod. Requires a signed quoteId from POST /v1/gpu/quotes to lock the price. Validates the spec, confirms live capacity, and authorizes the first compute hour from your wallet before dispatching to RunPod. Returns 202 Accepted with a resourceId and operationId to poll for terminal status. Requires compute manage access. Idempotency-Key header is required.
curl --request POST \
--url https://api.aireserve.com/v1/gpu/pods \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"name": "dev-box",
"gpuTypeId": "NVIDIA_A40",
"gpuCount": 1,
"dataCenterId": "EU-RO-1",
"templateId": "<curated-template-id>",
"containerDiskGb": 20,
"networkVolumeId": "<volume-id>",
"sshKeyIds": [
"<key-id>"
],
"quoteId": "<quote-id>",
"ephemeralDiskAcknowledged": true
}
'import requests
url = "https://api.aireserve.com/v1/gpu/pods"
payload = {
"name": "dev-box",
"gpuTypeId": "NVIDIA_A40",
"gpuCount": 1,
"dataCenterId": "EU-RO-1",
"templateId": "<curated-template-id>",
"containerDiskGb": 20,
"networkVolumeId": "<volume-id>",
"sshKeyIds": ["<key-id>"],
"quoteId": "<quote-id>",
"ephemeralDiskAcknowledged": True
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'dev-box',
gpuTypeId: 'NVIDIA_A40',
gpuCount: 1,
dataCenterId: 'EU-RO-1',
templateId: '<curated-template-id>',
containerDiskGb: 20,
networkVolumeId: '<volume-id>',
sshKeyIds: ['<key-id>'],
quoteId: '<quote-id>',
ephemeralDiskAcknowledged: true
})
};
fetch('https://api.aireserve.com/v1/gpu/pods', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"accepted": true,
"resourceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"operationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "accepted",
"resourceType": "pod"
}Authorizations
Your AI Reserve API key (aireserve_api_…) from the API Keys page in the portal (https://portal.aireserve.com/keys).
Headers
Client-generated key (8–180 chars, [A-Za-z0-9:_-]). Identical keys with the same normalized payload return the original accepted response without re-launching.
Body
Specification for creating a new GPU pod. A signed quote (quoteId) from POST /v1/gpu/quotes is required to lock the price before creation.
120GPU type ID from GET /v1/gpu/catalog/gpus.
1 <= x <= 16Data center ID from GET /v1/gpu/catalog/datacenters.
Ephemeral container disk in GiB. Contents are lost on stop or termination. Acknowledge via ephemeralDiskAcknowledged: true.
1 <= x <= 1024Signed quote token from POST /v1/gpu/quotes. Binds the hardware spec and locks the price. Expires after 2 minutes.
Must be true. Confirms you understand that the container disk is ephemeral and its contents are lost on stop or termination.
true Docker image reference for a custom image. Mutually exclusive with templateId.
Template ID to use. Mutually exclusive with imageName.
Persistent network volume to attach. Must be ready, unattached, and in the same data center.
Mount path for the network volume inside the container.
Registry credential ID to use when pulling a private image.
SSH public key IDs to inject via the PUBLIC_KEY environment variable.
20Environment variables injected into the container. Values are encrypted at rest and never echoed back.
Show child attributes
Show child attributes
Ports to expose. HTTP ports create public proxy URLs not protected by AI Reserve authentication.
20Show child attributes
Show child attributes
Response
Pod creation accepted. Poll GET /v1/gpu/operations/{operationId} for terminal status.
Response to a 202 Accepted Compute mutation. All fields are camelCase. Use operationId to poll GET /v1/gpu/operations/{id} for terminal status.
true ID of the resource created or mutated.
ID for the durable operation record. Poll GET /v1/gpu/operations/{id} for terminal status.
accepted, pending pod, volume, template, registry, ssh_key