curl --request POST \
--url https://compute.x402layer.cc/pods \
--header 'Content-Type: application/json' \
--data '
{
"agent_id": "openclaw",
"plan": "<string>",
"region": "<string>",
"tier": "starter",
"model": "<string>",
"plan_ram_mb": 123,
"use_credits": true,
"prepaid_hours": 25,
"llm_api_key": "<string>",
"llm_base_url": "<string>",
"llm_api": "<string>",
"channels": {},
"memory": {
"api_key": "<string>",
"lcm": true
},
"ssh_public_key": "<string>"
}
'import requests
url = "https://compute.x402layer.cc/pods"
payload = {
"agent_id": "openclaw",
"plan": "<string>",
"region": "<string>",
"tier": "starter",
"model": "<string>",
"plan_ram_mb": 123,
"use_credits": True,
"prepaid_hours": 25,
"llm_api_key": "<string>",
"llm_base_url": "<string>",
"llm_api": "<string>",
"channels": {},
"memory": {
"api_key": "<string>",
"lcm": True
},
"ssh_public_key": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
agent_id: 'openclaw',
plan: '<string>',
region: '<string>',
tier: 'starter',
model: '<string>',
plan_ram_mb: 123,
use_credits: true,
prepaid_hours: 25,
llm_api_key: '<string>',
llm_base_url: '<string>',
llm_api: '<string>',
channels: {},
memory: {api_key: '<string>', lcm: true},
ssh_public_key: '<string>'
})
};
fetch('https://compute.x402layer.cc/pods', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://compute.x402layer.cc/pods",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'agent_id' => 'openclaw',
'plan' => '<string>',
'region' => '<string>',
'tier' => 'starter',
'model' => '<string>',
'plan_ram_mb' => 123,
'use_credits' => true,
'prepaid_hours' => 25,
'llm_api_key' => '<string>',
'llm_base_url' => '<string>',
'llm_api' => '<string>',
'channels' => [
],
'memory' => [
'api_key' => '<string>',
'lcm' => true
],
'ssh_public_key' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://compute.x402layer.cc/pods"
payload := strings.NewReader("{\n \"agent_id\": \"openclaw\",\n \"plan\": \"<string>\",\n \"region\": \"<string>\",\n \"tier\": \"starter\",\n \"model\": \"<string>\",\n \"plan_ram_mb\": 123,\n \"use_credits\": true,\n \"prepaid_hours\": 25,\n \"llm_api_key\": \"<string>\",\n \"llm_base_url\": \"<string>\",\n \"llm_api\": \"<string>\",\n \"channels\": {},\n \"memory\": {\n \"api_key\": \"<string>\",\n \"lcm\": true\n },\n \"ssh_public_key\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://compute.x402layer.cc/pods")
.header("Content-Type", "application/json")
.body("{\n \"agent_id\": \"openclaw\",\n \"plan\": \"<string>\",\n \"region\": \"<string>\",\n \"tier\": \"starter\",\n \"model\": \"<string>\",\n \"plan_ram_mb\": 123,\n \"use_credits\": true,\n \"prepaid_hours\": 25,\n \"llm_api_key\": \"<string>\",\n \"llm_base_url\": \"<string>\",\n \"llm_api\": \"<string>\",\n \"channels\": {},\n \"memory\": {\n \"api_key\": \"<string>\",\n \"lcm\": true\n },\n \"ssh_public_key\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://compute.x402layer.cc/pods")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"agent_id\": \"openclaw\",\n \"plan\": \"<string>\",\n \"region\": \"<string>\",\n \"tier\": \"starter\",\n \"model\": \"<string>\",\n \"plan_ram_mb\": 123,\n \"use_credits\": true,\n \"prepaid_hours\": 25,\n \"llm_api_key\": \"<string>\",\n \"llm_base_url\": \"<string>\",\n \"llm_api\": \"<string>\",\n \"channels\": {},\n \"memory\": {\n \"api_key\": \"<string>\",\n \"lcm\": true\n },\n \"ssh_public_key\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"order": {},
"pod": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"agent_id": "<string>",
"display_name": "<string>",
"ai_mode": "managed",
"tier": "<string>",
"model": "<string>",
"channels": [
"<string>"
],
"managed_ai_key": "<string>",
"managed_ai_key_note": "<string>"
}
}{
"x402Version": 123,
"accepts": [
{
"scheme": "<string>",
"network": "<string>",
"maxAmountRequired": "<string>",
"resource": "<string>",
"description": "<string>",
"payTo": "<string>",
"asset": "<string>"
}
],
"api_schema": {
"version": 1,
"baseUrl": "<string>",
"routes": [
{
"path": "/users/{id}",
"method": "GET",
"summary": "<string>",
"parameters": [
{
"name": "<string>",
"in": "query",
"type": "string",
"required": true,
"description": "<string>",
"example": "<string>"
}
],
"requestBody": {
"contentType": "application/json",
"fields": [
{
"name": "<string>",
"in": "query",
"type": "string",
"required": true,
"description": "<string>",
"example": "<string>"
}
],
"example": "<string>"
},
"responseExample": "<string>"
}
]
}
}Deploy an Agent Pod
Deploys a hosted agent. The paid deploy rides the audited /compute/provision money path, so payment works exactly like provisioning a machine: pay from prepaid credits (use_credits: true) or complete an x402/MPP payment (a 402 challenge is returned when no payment credential is supplied). All /compute/provision fields (plan, region, prepaid_hours, network, ssh_public_key, …) are accepted alongside the pod-specific fields below; os_id is ignored (pods always run Ubuntu 24.04). Authenticate with the same compute auth as /compute/* (API key, session bearer, or wallet signature).
curl --request POST \
--url https://compute.x402layer.cc/pods \
--header 'Content-Type: application/json' \
--data '
{
"agent_id": "openclaw",
"plan": "<string>",
"region": "<string>",
"tier": "starter",
"model": "<string>",
"plan_ram_mb": 123,
"use_credits": true,
"prepaid_hours": 25,
"llm_api_key": "<string>",
"llm_base_url": "<string>",
"llm_api": "<string>",
"channels": {},
"memory": {
"api_key": "<string>",
"lcm": true
},
"ssh_public_key": "<string>"
}
'import requests
url = "https://compute.x402layer.cc/pods"
payload = {
"agent_id": "openclaw",
"plan": "<string>",
"region": "<string>",
"tier": "starter",
"model": "<string>",
"plan_ram_mb": 123,
"use_credits": True,
"prepaid_hours": 25,
"llm_api_key": "<string>",
"llm_base_url": "<string>",
"llm_api": "<string>",
"channels": {},
"memory": {
"api_key": "<string>",
"lcm": True
},
"ssh_public_key": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
agent_id: 'openclaw',
plan: '<string>',
region: '<string>',
tier: 'starter',
model: '<string>',
plan_ram_mb: 123,
use_credits: true,
prepaid_hours: 25,
llm_api_key: '<string>',
llm_base_url: '<string>',
llm_api: '<string>',
channels: {},
memory: {api_key: '<string>', lcm: true},
ssh_public_key: '<string>'
})
};
fetch('https://compute.x402layer.cc/pods', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://compute.x402layer.cc/pods",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'agent_id' => 'openclaw',
'plan' => '<string>',
'region' => '<string>',
'tier' => 'starter',
'model' => '<string>',
'plan_ram_mb' => 123,
'use_credits' => true,
'prepaid_hours' => 25,
'llm_api_key' => '<string>',
'llm_base_url' => '<string>',
'llm_api' => '<string>',
'channels' => [
],
'memory' => [
'api_key' => '<string>',
'lcm' => true
],
'ssh_public_key' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://compute.x402layer.cc/pods"
payload := strings.NewReader("{\n \"agent_id\": \"openclaw\",\n \"plan\": \"<string>\",\n \"region\": \"<string>\",\n \"tier\": \"starter\",\n \"model\": \"<string>\",\n \"plan_ram_mb\": 123,\n \"use_credits\": true,\n \"prepaid_hours\": 25,\n \"llm_api_key\": \"<string>\",\n \"llm_base_url\": \"<string>\",\n \"llm_api\": \"<string>\",\n \"channels\": {},\n \"memory\": {\n \"api_key\": \"<string>\",\n \"lcm\": true\n },\n \"ssh_public_key\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://compute.x402layer.cc/pods")
.header("Content-Type", "application/json")
.body("{\n \"agent_id\": \"openclaw\",\n \"plan\": \"<string>\",\n \"region\": \"<string>\",\n \"tier\": \"starter\",\n \"model\": \"<string>\",\n \"plan_ram_mb\": 123,\n \"use_credits\": true,\n \"prepaid_hours\": 25,\n \"llm_api_key\": \"<string>\",\n \"llm_base_url\": \"<string>\",\n \"llm_api\": \"<string>\",\n \"channels\": {},\n \"memory\": {\n \"api_key\": \"<string>\",\n \"lcm\": true\n },\n \"ssh_public_key\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://compute.x402layer.cc/pods")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"agent_id\": \"openclaw\",\n \"plan\": \"<string>\",\n \"region\": \"<string>\",\n \"tier\": \"starter\",\n \"model\": \"<string>\",\n \"plan_ram_mb\": 123,\n \"use_credits\": true,\n \"prepaid_hours\": 25,\n \"llm_api_key\": \"<string>\",\n \"llm_base_url\": \"<string>\",\n \"llm_api\": \"<string>\",\n \"channels\": {},\n \"memory\": {\n \"api_key\": \"<string>\",\n \"lcm\": true\n },\n \"ssh_public_key\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"order": {},
"pod": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"agent_id": "<string>",
"display_name": "<string>",
"ai_mode": "managed",
"tier": "<string>",
"model": "<string>",
"channels": [
"<string>"
],
"managed_ai_key": "<string>",
"managed_ai_key_note": "<string>"
}
}{
"x402Version": 123,
"accepts": [
{
"scheme": "<string>",
"network": "<string>",
"maxAmountRequired": "<string>",
"resource": "<string>",
"description": "<string>",
"payTo": "<string>",
"asset": "<string>"
}
],
"api_schema": {
"version": 1,
"baseUrl": "<string>",
"routes": [
{
"path": "/users/{id}",
"method": "GET",
"summary": "<string>",
"parameters": [
{
"name": "<string>",
"in": "query",
"type": "string",
"required": true,
"description": "<string>",
"example": "<string>"
}
],
"requestBody": {
"contentType": "application/json",
"fields": [
{
"name": "<string>",
"in": "query",
"type": "string",
"required": true,
"description": "<string>",
"example": "<string>"
}
],
"example": "<string>"
},
"responseExample": "<string>"
}
]
}
}Headers
Compute API key. Alternatively use a session bearer or wallet-signature headers.
"x402c_..."
Body
Agent to deploy (see GET /pods/catalog).
"openclaw"
managed = we run the LLM (metered, tier-driven). byok = the agent uses your own OpenAI-compatible endpoint.
managed, byok Compute plan id from GET /compute/plans. DigitalOcean plans use the do: prefix.
Region id from GET /compute/regions.
Required when ai_mode is managed. A tier id from GET /pods/catalog (drives the model + machine floor).
"starter"
Optional model slug. Managed: honored only if it is in the chosen tier's list, else the tier default. BYOK: any slug.
Optional. Validated against the agent's (and tier's) RAM floor.
Pay from prepaid USD credits instead of an x402 wallet payment.
x402 payment network. Arc (USDC, chainId 5042) works here and on /extend; direct Arc payments carry a $5 minimum (gas is USDC) — smaller prepayments use credits. MPP clients use Authorization: Payment and omit this.
base, solana, megaeth, robinhood, arc Prepaid runtime in hours (minimum 24).
x >= 24Required when ai_mode is byok. Your provider API key (stored encrypted).
BYOK only. Your OpenAI-compatible base URL. Defaults to https://openrouter.ai/api/v1.
BYOK only. Provider API type (e.g. openai-completions).
Optional channel tokens, keyed by channel id (e.g. { "telegram": "<bot-token>" }). Must be supported by the agent.
Show child attributes
Show child attributes
BYOK memory options.
Show child attributes
Show child attributes
Optional. Rarely needed — pods are headless.
Was this page helpful?
