curl --request POST \
--url https://api.aireserve.com/v1/gpu/clusters \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"nodes": 5,
"gpusPerNode": 8,
"name": "<string>",
"orchestrator": "none",
"image": "<string>",
"diskGbPerNode": 50,
"volumeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"volumeMountPath": "/workspace",
"registryCredentialId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sshKeyIds": [],
"sshPublicKey": "<string>",
"env": {},
"ports": [
{
"port": 32768
}
],
"dockerStartCmd": [],
"publicPortsAcknowledged": false,
"maxHourlyPrice": "<string>",
"quoteId": "<string>"
}
'import requests
url = "https://api.aireserve.com/v1/gpu/clusters"
payload = {
"nodes": 5,
"gpusPerNode": 8,
"name": "<string>",
"orchestrator": "none",
"image": "<string>",
"diskGbPerNode": 50,
"volumeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"volumeMountPath": "/workspace",
"registryCredentialId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sshKeyIds": [],
"sshPublicKey": "<string>",
"env": {},
"ports": [{ "port": 32768 }],
"dockerStartCmd": [],
"publicPortsAcknowledged": False,
"maxHourlyPrice": "<string>",
"quoteId": "<string>"
}
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({
nodes: 5,
gpusPerNode: 8,
name: '<string>',
orchestrator: 'none',
image: '<string>',
diskGbPerNode: 50,
volumeId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
volumeMountPath: '/workspace',
registryCredentialId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
sshKeyIds: [],
sshPublicKey: '<string>',
env: {},
ports: [{port: 32768}],
dockerStartCmd: [],
publicPortsAcknowledged: false,
maxHourlyPrice: '<string>',
quoteId: '<string>'
})
};
fetch('https://api.aireserve.com/v1/gpu/clusters', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"accepted": true,
"resourceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"resourceType": "pod",
"operationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "accepted"
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}Launch GPU cluster
Launch a cluster from a quoteId, or from the full request with accelerator, nodes and a maxHourlyPrice ceiling on the whole cluster. Every node gets the same image, env, ports and SSH keys, plus MASTER_ADDR, NODE_RANK and NCCL_SOCKET_IFNAME for the interconnect. orchestrator: slurm or ray provisions a managed controller/head and workers; none leaves bare nodes for your own launcher. Accepted with 202; poll the operation, then GET /v1/gpu/clusters/{clusterId}. If the provider cannot place every node together, the operation fails with no_capacity after a few retries and nothing is billed. A cluster cannot be stopped: it bills from the moment every node is verified running until you terminate it. Requires compute manage access.
curl --request POST \
--url https://api.aireserve.com/v1/gpu/clusters \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"nodes": 5,
"gpusPerNode": 8,
"name": "<string>",
"orchestrator": "none",
"image": "<string>",
"diskGbPerNode": 50,
"volumeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"volumeMountPath": "/workspace",
"registryCredentialId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sshKeyIds": [],
"sshPublicKey": "<string>",
"env": {},
"ports": [
{
"port": 32768
}
],
"dockerStartCmd": [],
"publicPortsAcknowledged": false,
"maxHourlyPrice": "<string>",
"quoteId": "<string>"
}
'import requests
url = "https://api.aireserve.com/v1/gpu/clusters"
payload = {
"nodes": 5,
"gpusPerNode": 8,
"name": "<string>",
"orchestrator": "none",
"image": "<string>",
"diskGbPerNode": 50,
"volumeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"volumeMountPath": "/workspace",
"registryCredentialId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sshKeyIds": [],
"sshPublicKey": "<string>",
"env": {},
"ports": [{ "port": 32768 }],
"dockerStartCmd": [],
"publicPortsAcknowledged": False,
"maxHourlyPrice": "<string>",
"quoteId": "<string>"
}
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({
nodes: 5,
gpusPerNode: 8,
name: '<string>',
orchestrator: 'none',
image: '<string>',
diskGbPerNode: 50,
volumeId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
volumeMountPath: '/workspace',
registryCredentialId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
sshKeyIds: [],
sshPublicKey: '<string>',
env: {},
ports: [{port: 32768}],
dockerStartCmd: [],
publicPortsAcknowledged: false,
maxHourlyPrice: '<string>',
quoteId: '<string>'
})
};
fetch('https://api.aireserve.com/v1/gpu/clusters', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"accepted": true,
"resourceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"resourceType": "pod",
"operationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "accepted"
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "<string>",
"details": {}
}
}Authorizations
Your AI Reserve API key (aireserve_api_…) from the API Keys page in the portal (https://portal.aireserve.com/keys).
Headers
Client-chosen key of 8–180 characters [A-Za-z0-9:_-]. Replaying the same key with the same body returns the original operation; a different body with the same key fails with 409 operation_conflict.
8 - 180^[A-Za-z0-9:_-]+$Body
A40_48GB, A100_80GB, H100_80GB, H100_NVL_94GB, H200_141GB, B200_180GB, B300_288GB, L40_48GB, L40S_48GB, RTX_2000_ADA_16GB, RTX_4000_ADA_20GB, RTX_6000_ADA_48GB, RTX_A5000_24GB, RTX_PRO_4000_24GB, RTX_PRO_4500_32GB, RTX_PRO_6000_96GB, RTX_PRO_6000_MIG_24GB, RTX_PRO_6000_MIG_48GB, MI300X_192GB 2 <= x <= 81 <= x <= 8north_america, united_states, canada, europe, asia_pacific, oceania 1 - 120none, slurm, ray 1 - 500^(?![A-Za-z][A-Za-z0-9+.-]*:\/\/)[A-Za-z0-9][A-Za-z0-9./_:@-]*$1 <= x <= 1024^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$120^\/[A-Za-z0-9_-]+(?:\/[A-Za-z0-9_-]+)*\/?$Show child attributes
Show child attributes
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$20^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$1 - 16384Show child attributes
Show child attributes
Show child attributes
Show child attributes
324096^\d{1,7}(?:\.\d{1,6})?$1 - 8192Response
Accepted. Poll operationId for completion.
Body of every 202 Accepted Compute mutation.
true ID of the resource created or mutated.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$pod, volume, cluster, template, registry, ssh_key Durable operation record. Poll GET /v1/gpu/operations/{id} until a terminal status.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$accepted