Tenzro LabsPlatform

Platform API reference

Manage everything on the Platform over HTTPS with JSON. Catalogue endpoints need no key; account endpoints need a key with read or manage.

Base URLhttps://platform.tenzro.xyz/api
AuthAuthorization: Bearer tzl_…
FormatJSON request and response bodies. Lists are returned as { "data": [...] }.
OpenAPIhttps://platform.tenzro.xyz/api/openapi.json

Errors

Every error has the same shape and an HTTP status that matches it.

json
{ "error": { "code": "invalid_request", "message": "Choose an amount between $5 and $5000." } }
StatusCodeWhen
400invalid_request · invalid_json · invalid_codeThe request is malformed or a value is out of range
401unauthenticated · invalid_keyNo key, or a bad key
403forbiddenThe key lacks the needed permission
404not_foundNo such endpoint or object
405method_not_allowedWrong HTTP method for the path
409already_paid · machine_offlineThe object is not in a state that allows this
503unavailableA payment method or accounts are not available right now

Endpoints

Catalogue

List models

no key
GET /models

Every model in the catalogue with its pricing in Tenzro Labs credits (1 credit = 0.001 TNZO) and the machines that serve it. Pricing is free on testnet.

request
curl "https://platform.tenzro.xyz/api/models"
response
{
  "data": [
    {
      "id": "qwen3.5-4b",
      "name": "Qwen 3.5 4B",
      "family": "Qwen",
      "description": "Small, fast language model for chat, extraction and tool calls.",
      "modality": "text",
      "context_length": 131072,
      "pricing": {
        "input_credits_per_mtok": 0,
        "output_credits_per_mtok": 0,
        "credits_per_request": 0
      },
      "available": true,
      "machines": [
        "tenzro-partner-cluster"
      ]
    }
  ]
}

Get a model

no key
GET /models/{id}

One model, plus the current route order: the machines a request would go to, best first.

request
curl "https://platform.tenzro.xyz/api/models/{id}"
response
{
  "id": "qwen3.5-4b",
  "name": "Qwen 3.5 4B",
  "family": "Qwen",
  "description": "Small, fast language model for chat, extraction and tool calls.",
  "modality": "text",
  "context_length": 131072,
  "pricing": {
    "input_credits_per_mtok": 0,
    "output_credits_per_mtok": 0,
    "credits_per_request": 0
  },
  "available": true,
  "machines": [
    "tenzro-partner-cluster"
  ],
  "routes": [
    {
      "machine_id": "tenzro-partner-cluster",
      "health": "online",
      "region": "Europe",
      "score": 120
    }
  ]
}

List machines

no key
GET /machines

The machines Tenzro Labs runs, with hardware, live health, and what each offers. rent and subscribe are null where a machine offers neither.

QueryTypeDescription
serviceserverless | rent | subscribeOnly machines offering this.
regionstringExact region name, e.g. Europe.
gpubooleantrue for GPU machines, false for CPU-only.
operatorstringOperator id.
modelstringOnly machines set up to serve this model id.
request
curl "https://platform.tenzro.xyz/api/machines"
response
{
  "data": [
    {
      "id": "tenzro-partner-cluster",
      "name": "Tenzro Partner Cluster",
      "region": "Europe",
      "operator": {
        "id": "tenzro-partners",
        "name": "Tenzro Partners"
      },
      "health": "online",
      "hardware": {
        "gpus": [
          {
            "model": "NVIDIA DGX Spark (GB10)",
            "count": 1,
            "vram_gb": 128
          },
          {
            "model": "NVIDIA RTX 5070 Ti",
            "count": 1,
            "vram_gb": 16
          }
        ],
        "cpu_cores": 40,
        "memory_gb": 160,
        "storage_gb": 4000
      },
      "services": {
        "serverless": {
          "models": [
            "qwen3.8-27b",
            "qwen3.5-4b",
            "timesfm-2.5-200m",
            "qwen3-embedding-0.6b",
            "flux2-klein-4b"
          ],
          "serving_now": [
            "qwen3.8-27b",
            "qwen3.5-4b",
            "timesfm-2.5-200m",
            "qwen3-embedding-0.6b"
          ]
        },
        "rent": null,
        "subscribe": null
      },
      "network": {
        "status": "active",
        "reachability": "reachable"
      }
    }
  ]
}

Get a machine

no key
GET /machines/{id}
request
curl "https://platform.tenzro.xyz/api/machines/{id}"
response
{
  "id": "tenzro-partner-cluster",
  "name": "Tenzro Partner Cluster",
  "region": "Europe",
  "operator": {
    "id": "tenzro-partners",
    "name": "Tenzro Partners"
  },
  "health": "online",
  "hardware": {
    "gpus": [
      {
        "model": "NVIDIA DGX Spark (GB10)",
        "count": 1,
        "vram_gb": 128
      },
      {
        "model": "NVIDIA RTX 5070 Ti",
        "count": 1,
        "vram_gb": 16
      }
    ],
    "cpu_cores": 40,
    "memory_gb": 160,
    "storage_gb": 4000
  },
  "services": {
    "serverless": {
      "models": [
        "qwen3.8-27b",
        "qwen3.5-4b",
        "timesfm-2.5-200m",
        "qwen3-embedding-0.6b",
        "flux2-klein-4b"
      ],
      "serving_now": [
        "qwen3.8-27b",
        "qwen3.5-4b",
        "timesfm-2.5-200m",
        "qwen3-embedding-0.6b"
      ]
    },
    "rent": null,
    "subscribe": null
  },
  "network": {
    "status": "active",
    "reachability": "reachable"
  }
}

List operators

no key
GET /operators

Who runs the machines, and which machines they run: operators on the Tenzro Network that partner with Tenzro Labs.

request
curl "https://platform.tenzro.xyz/api/operators"
response
{
  "data": [
    {
      "id": "tenzro-partners",
      "name": "Tenzro Partners",
      "description": "Operators on the Tenzro Network that partner with Tenzro Labs: they rent it capacity or serve its traffic on demand, and it serves its curated models from their machines.",
      "website": "https://tenzro.xyz",
      "featured": true,
      "certifications": [],
      "machines": [
        {
          "id": "tenzro-partner-cluster",
          "name": "Tenzro Partner Cluster",
          "health": "online"
        }
      ]
    }
  ]
}

Get an operator

no key
GET /operators/{id}
request
curl "https://platform.tenzro.xyz/api/operators/{id}"
response
{
  "id": "tenzro-partners",
  "name": "Tenzro Partners",
  "website": "https://tenzro.xyz",
  "featured": true,
  "certifications": []
}

Preview routing

no key
GET /route

Which machines an unscoped request for a model would be sent to right now, in order.

QueryTypeDescription
modelstring · requiredModel id.
regionstringPrefer machines in this region when otherwise equal.
request
curl "https://platform.tenzro.xyz/api/route?model=..."
response
{
  "model": "qwen3.5-4b",
  "routes": [
    {
      "machine_id": "tenzro-partner-cluster",
      "health": "online",
      "region": "Europe",
      "score": 120
    }
  ]
}

List credit packages and offers

no key
GET /packages
request
curl "https://platform.tenzro.xyz/api/packages"
response
{
  "data": []
}

List payment methods

no key
GET /payment-methods

Whether card and stablecoin payments are set up, and which chains and tokens are accepted. available is false for a method that is not set up.

request
curl "https://platform.tenzro.xyz/api/payment-methods"
response
{
  "card": {
    "available": false,
    "processor": "stripe"
  },
  "stablecoin": {
    "available": false,
    "processor": "bridge",
    "options": []
  }
}

Price an order

no key
POST /quotes

What an order would cost, without creating it. Accepts the same body as Create an order. amount_usd is the fiat price; details.credits is what it grants. Credit orders are refused until Tenzro Labs sets the credit price, as shown.

request
curl -X POST "https://platform.tenzro.xyz/api/quotes" \
  -H "Content-Type: application/json" \
  -d '{"type":"credits","amount_usd":25}'
Body schema
json schema
{
  "oneOf": [
    {
      "title": "Credits",
      "type": "object",
      "required": [
        "type",
        "amount_usd"
      ],
      "properties": {
        "type": {
          "const": "credits"
        },
        "amount_usd": {
          "type": "integer",
          "minimum": 5,
          "maximum": 5000,
          "description": "The fiat price to pay, in whole US dollars. The credits it buys are set by Tenzro Labs; until that price is set, credit orders are refused."
        },
        "machine_id": {
          "type": "string",
          "description": "Pin the credit to one machine. Omit for credit usable anywhere."
        },
        "gift": {
          "type": "boolean",
          "description": "Issue a redeemable ticket code instead of crediting this account."
        }
      }
    },
    {
      "title": "Package",
      "type": "object",
      "required": [
        "type",
        "package_id"
      ],
      "properties": {
        "type": {
          "const": "package"
        },
        "package_id": {
          "type": "string"
        },
        "gift": {
          "type": "boolean"
        }
      }
    },
    {
      "title": "Rental",
      "type": "object",
      "required": [
        "type",
        "machine_id",
        "cpu_cores",
        "memory_gb",
        "hours"
      ],
      "properties": {
        "type": {
          "const": "rental"
        },
        "machine_id": {
          "type": "string"
        },
        "gpu": {
          "type": "integer",
          "minimum": 0
        },
        "cpu_cores": {
          "type": "integer",
          "minimum": 1
        },
        "memory_gb": {
          "type": "integer",
          "minimum": 1
        },
        "storage_gb": {
          "type": "integer",
          "minimum": 0
        },
        "hours": {
          "type": "integer",
          "minimum": 1
        }
      }
    },
    {
      "title": "Subscription",
      "type": "object",
      "required": [
        "type",
        "machine_id",
        "plan_id"
      ],
      "properties": {
        "type": {
          "const": "subscription"
        },
        "machine_id": {
          "type": "string"
        },
        "plan_id": {
          "type": "string"
        },
        "renew_subscription_id": {
          "type": "string",
          "description": "Renew an existing stablecoin plan for another 30 days."
        }
      }
    }
  ]
}
response
{
  "error": {
    "code": "invalid_request",
    "message": "Credit top-ups open when pricing is set; usage is free on testnet."
  }
}

Account

Get the account and key

read
GET /me

The account the key belongs to, and the key's own permissions and scope.

request
curl "https://platform.tenzro.xyz/api/me" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "email": "dev@example.com",
  "created_at": "2026-09-01T00:00:00.000Z",
  "key": {
    "id": "key_Zb81Qm0sP4aT",
    "name": "ci",
    "prefix": "tzl_3kQ9aZ1x",
    "permissions": [
      "inference",
      "read"
    ],
    "scope": null,
    "subscription_id": null,
    "rental_id": null,
    "created_at": "2026-09-26T08:00:00.000Z",
    "last_used_at": null,
    "revoked_at": null
  }
}

Credits

Get the credit balance

read
GET /credits

Total balance and its split between credit usable anywhere (machine_id null) and credit pinned to machines.

request
curl "https://platform.tenzro.xyz/api/credits" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "total_credits": 25000,
  "by_scope": [
    {
      "machine_id": null,
      "credits": 25000
    }
  ]
}

List credit activity

read
GET /credits/activity

Credit added, plan credit granted, and usage charged, newest first.

QueryTypeDescription
limitinteger1–500, default 50.
request
curl "https://platform.tenzro.xyz/api/credits/activity" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "data": [
    {
      "id": "812",
      "type": "usage",
      "credits": 0,
      "machine_id": "tenzro-partner-cluster",
      "at": "2026-09-26T08:01:12.000Z"
    }
  ]
}

Redeem a ticket

manage
POST /credits/redeem
request
curl -X POST "https://platform.tenzro.xyz/api/credits/redeem" \
  -H "Authorization: Bearer $TENZRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"code":"TZ-7K2M-9QXA-4BVN-P0RD"}'
Body schema
json schema
{
  "type": "object",
  "required": [
    "code"
  ],
  "properties": {
    "code": {
      "type": "string",
      "example": "TZ-7K2M-9QXA-4BVN-P0RD"
    }
  }
}
response
{
  "redeemed": true,
  "credits": 25000,
  "machine_id": null
}

List tickets you bought

read
GET /tickets

Gift tickets and credit tickets this account bought, including codes not yet redeemed.

request
curl "https://platform.tenzro.xyz/api/tickets" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "data": [
    {
      "code": "TZ-7K2M-9QXA-4BVN-P0RD",
      "credits": 25000,
      "machine_id": null,
      "redeemed": false,
      "redeemed_by_you": false
    }
  ]
}

Orders

Create an order

manage
POST /orders

Creates an unpaid order for credits, a package, a rental, or a plan. Pay it with Pay an order, or send a person to pay_url. Nothing is charged until payment completes.

request
curl -X POST "https://platform.tenzro.xyz/api/orders" \
  -H "Authorization: Bearer $TENZRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"credits","amount_usd":25}'
Body schema
json schema
{
  "oneOf": [
    {
      "title": "Credits",
      "type": "object",
      "required": [
        "type",
        "amount_usd"
      ],
      "properties": {
        "type": {
          "const": "credits"
        },
        "amount_usd": {
          "type": "integer",
          "minimum": 5,
          "maximum": 5000,
          "description": "The fiat price to pay, in whole US dollars. The credits it buys are set by Tenzro Labs; until that price is set, credit orders are refused."
        },
        "machine_id": {
          "type": "string",
          "description": "Pin the credit to one machine. Omit for credit usable anywhere."
        },
        "gift": {
          "type": "boolean",
          "description": "Issue a redeemable ticket code instead of crediting this account."
        }
      }
    },
    {
      "title": "Package",
      "type": "object",
      "required": [
        "type",
        "package_id"
      ],
      "properties": {
        "type": {
          "const": "package"
        },
        "package_id": {
          "type": "string"
        },
        "gift": {
          "type": "boolean"
        }
      }
    },
    {
      "title": "Rental",
      "type": "object",
      "required": [
        "type",
        "machine_id",
        "cpu_cores",
        "memory_gb",
        "hours"
      ],
      "properties": {
        "type": {
          "const": "rental"
        },
        "machine_id": {
          "type": "string"
        },
        "gpu": {
          "type": "integer",
          "minimum": 0
        },
        "cpu_cores": {
          "type": "integer",
          "minimum": 1
        },
        "memory_gb": {
          "type": "integer",
          "minimum": 1
        },
        "storage_gb": {
          "type": "integer",
          "minimum": 0
        },
        "hours": {
          "type": "integer",
          "minimum": 1
        }
      }
    },
    {
      "title": "Subscription",
      "type": "object",
      "required": [
        "type",
        "machine_id",
        "plan_id"
      ],
      "properties": {
        "type": {
          "const": "subscription"
        },
        "machine_id": {
          "type": "string"
        },
        "plan_id": {
          "type": "string"
        },
        "renew_subscription_id": {
          "type": "string",
          "description": "Renew an existing stablecoin plan for another 30 days."
        }
      }
    }
  ]
}
response
{
  "id": "ord_4hYt2K9qLmN0pXr8",
  "type": "credits",
  "title": "Credit top-up · any machine",
  "amount_usd": 25,
  "currency": "usd",
  "status": "pending",
  "machine_id": null,
  "payment": {
    "method": null
  },
  "pay_url": "https://platform.tenzro.xyz/checkout/ord_4hYt2K9qLmN0pXr8",
  "created_at": "2026-09-26T08:00:00.000Z",
  "paid_at": null
}

Pay an order

manage
POST /orders/{id}/pay

card returns a Stripe Checkout URL for a person to open. stablecoin returns a deposit address, token, chain and exact amount; the order is fulfilled when the deposit is received.

request
curl -X POST "https://platform.tenzro.xyz/api/orders/{id}/pay" \
  -H "Authorization: Bearer $TENZRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"method":"stablecoin","chain":"base","token":"usdc"}'
Body schema
json schema
{
  "type": "object",
  "required": [
    "method"
  ],
  "properties": {
    "method": {
      "enum": [
        "card",
        "stablecoin"
      ]
    },
    "chain": {
      "type": "string",
      "description": "Stablecoin only. See List payment methods."
    },
    "token": {
      "type": "string",
      "description": "Stablecoin only, e.g. usdc."
    }
  }
}
response
{
  "id": "ord_4hYt2K9qLmN0pXr8",
  "type": "credits",
  "title": "Credit top-up · any machine",
  "amount_usd": 25,
  "currency": "usd",
  "status": "pending",
  "machine_id": null,
  "payment": {
    "method": "stablecoin",
    "deposit": {
      "chain": "base",
      "token": "usdc",
      "amount": "25.00",
      "address": "0x9f…c21",
      "memo": null
    }
  },
  "pay_url": "https://platform.tenzro.xyz/checkout/ord_4hYt2K9qLmN0pXr8",
  "created_at": "2026-09-26T08:00:00.000Z",
  "paid_at": null
}

Get an order

read
GET /orders/{id}

Current status. For a paid credit order, includes the ticket: its code, the credits it grants, and whether you redeemed it. Poll this after paying.

request
curl "https://platform.tenzro.xyz/api/orders/{id}" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "id": "ord_4hYt2K9qLmN0pXr8",
  "type": "credits",
  "title": "Credit top-up · any machine",
  "amount_usd": 25,
  "currency": "usd",
  "status": "paid",
  "machine_id": null,
  "payment": {
    "method": null
  },
  "pay_url": "https://platform.tenzro.xyz/checkout/ord_4hYt2K9qLmN0pXr8",
  "created_at": "2026-09-26T08:00:00.000Z",
  "paid_at": "2026-09-26T08:03:00.000Z",
  "ticket": null
}

List orders

read
GET /orders
QueryTypeDescription
limitinteger1–200, default 50.
request
curl "https://platform.tenzro.xyz/api/orders" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "data": [
    {
      "id": "ord_4hYt2K9qLmN0pXr8",
      "type": "credits",
      "title": "Credit top-up · any machine",
      "amount_usd": 25,
      "currency": "usd",
      "status": "pending",
      "machine_id": null,
      "payment": {
        "method": null
      },
      "pay_url": "https://platform.tenzro.xyz/checkout/ord_4hYt2K9qLmN0pXr8",
      "created_at": "2026-09-26T08:00:00.000Z",
      "paid_at": null
    }
  ]
}

API keys

List API keys

read
GET /keys
request
curl "https://platform.tenzro.xyz/api/keys" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "data": [
    {
      "id": "key_Zb81Qm0sP4aT",
      "name": "ci",
      "prefix": "tzl_3kQ9aZ1x",
      "permissions": [
        "inference",
        "read"
      ],
      "scope": null,
      "subscription_id": null,
      "rental_id": null,
      "created_at": "2026-09-26T08:00:00.000Z",
      "last_used_at": null,
      "revoked_at": null
    }
  ]
}

Create an API key

manage
POST /keys

The secret is returned once. A key can only grant permissions it holds. Scope with machine_id, subscription_id or rental_id; otherwise the key reaches every machine.

request
curl -X POST "https://platform.tenzro.xyz/api/keys" \
  -H "Authorization: Bearer $TENZRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"ci","permissions":["inference","read"]}'
Body schema
json schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "permissions": {
      "type": "array",
      "items": {
        "enum": [
          "inference",
          "read",
          "manage"
        ]
      },
      "default": [
        "inference"
      ]
    },
    "machine_id": {
      "type": "string"
    },
    "subscription_id": {
      "type": "string"
    },
    "rental_id": {
      "type": "string"
    }
  }
}
response
{
  "id": "key_Zb81Qm0sP4aT",
  "name": "ci",
  "prefix": "tzl_3kQ9aZ1x",
  "permissions": [
    "inference",
    "read"
  ],
  "scope": null,
  "subscription_id": null,
  "rental_id": null,
  "created_at": "2026-09-26T08:00:00.000Z",
  "last_used_at": null,
  "revoked_at": null,
  "secret": "tzl_3kQ9aZ1x…"
}

Revoke an API key

manage
DELETE /keys/{id}
request
curl -X DELETE "https://platform.tenzro.xyz/api/keys/{id}" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "id": "key_Zb81Qm0sP4aT",
  "revoked": true
}

Plans & rentals

List plans

read
GET /subscriptions

No machine offers plans on testnet, so this list is empty.

request
curl "https://platform.tenzro.xyz/api/subscriptions" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "data": []
}

Cancel at period end

manage
POST /subscriptions/{id}/cancel

Card plans only. The plan stays active until current_period_end.

request
curl -X POST "https://platform.tenzro.xyz/api/subscriptions/{id}/cancel" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "id": "subs_Qp0r…",
  "status": "active",
  "auto_renews": false,
  "cancel_at_period_end": true
}

Resume auto-renewal

manage
POST /subscriptions/{id}/resume
request
curl -X POST "https://platform.tenzro.xyz/api/subscriptions/{id}/resume" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "id": "subs_Qp0r…",
  "status": "active",
  "auto_renews": true,
  "cancel_at_period_end": false
}

List rentals

read
GET /rentals

No machine offers rentals on testnet, so this list is empty.

request
curl "https://platform.tenzro.xyz/api/rentals" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "data": []
}

Identity & agents

Get your Tenzro identity

read
GET /identity

Your did:tenzro:human identity and wallet, rooted in your passkeys. manage_url is where passkeys and devices are managed.

request
curl "https://platform.tenzro.xyz/api/identity" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "state": "ready",
  "did": "did:tenzro:human:e0b27720-3043-84d5-9b66-49eba92b1a8d",
  "wallet_address": "0xd8aa2ca0a3b56be2b58d6c883c7b3ed31d749428",
  "error": null,
  "passkeys": 2,
  "can_send": true,
  "manage_url": "https://accounts.tenzro.xyz/wallet?return_to=…"
}

List agents

read
GET /agents

Each agent's status and the limits its owner approved. An outstanding approval is collected first, so a list read after the owner approves shows the result.

request
curl "https://platform.tenzro.xyz/api/agents" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "data": [
    {
      "id": "agt_Zp3kQ9x1RmW4sT",
      "name": "research-bot",
      "status": "active",
      "approval": null,
      "capabilities": [
        "inference"
      ],
      "limits": {
        "max_transaction_tnzo": null,
        "max_daily_tnzo": null,
        "daily_limit_credits": 20000,
        "total_limit_credits": 500000,
        "expires_in_days": 90
      },
      "proposed": null,
      "did": "did:tenzro:machine:e0b27720-3043-84d5-9b66-49eba92b1a8d:7c1d…",
      "wallet_address": "0x4b1f…",
      "serving": {
        "nodes": 3,
        "operators": 2
      },
      "network_key_held": true,
      "error": null,
      "created_at": "2026-09-26T09:05:00.000Z",
      "approved_at": "2026-09-26T09:12:00.000Z",
      "activated_at": "2026-09-26T09:12:00.000Z",
      "expires_at": "2026-12-25T09:12:00.000Z",
      "revoked_at": null
    }
  ]
}

Create an agent

manage
POST /agents

Proposes an agent under your identity and returns approve_url. The account owner opens it, may adjust the settings, and approves with their passkey on the account site; a passkey cannot be pressed from code, so relay the link to a person. The agent becomes active once the approval is collected: reading the agent collects it. The settings the owner approved are the ones that apply. Refused with no_serving_nodes while the network has none.

request
curl -X POST "https://platform.tenzro.xyz/api/agents" \
  -H "Authorization: Bearer $TENZRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"research-bot","capabilities":["inference"],"daily_limit_credits":20000,"total_limit_credits":500000,"expires_in_days":90}'
Body schema
json schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "description": "1 to 64 lowercase letters, digits, dots, dashes or underscores."
    },
    "capabilities": {
      "type": "array",
      "items": {
        "enum": [
          "inference",
          "payments"
        ]
      },
      "default": [
        "inference"
      ]
    },
    "max_transaction_tnzo": {
      "type": "string",
      "description": "Network cap on any one payment the agent makes, in TNZO (e.g. \"1.5\")."
    },
    "max_daily_tnzo": {
      "type": "string",
      "description": "Network cap on what the agent pays per day, in TNZO."
    },
    "daily_limit_credits": {
      "type": "number",
      "description": "Tenzro Labs credits this agent may spend per UTC day."
    },
    "total_limit_credits": {
      "type": "number",
      "description": "Tenzro Labs credits this agent may spend in total."
    },
    "expires_in_days": {
      "type": "integer",
      "minimum": 1,
      "maximum": 3650,
      "description": "The delegation ends after this many days."
    }
  }
}
response
{
  "approve_url": "https://accounts.tenzro.xyz/agents/approve/apr_3xQk…",
  "agent": {
    "id": "agt_Zp3kQ9x1RmW4sT",
    "name": "research-bot",
    "status": "awaiting_approval",
    "approval": {
      "kind": "create",
      "state": "pending",
      "approve_url": "https://accounts.tenzro.xyz/agents/approve/apr_3xQk…"
    },
    "capabilities": [
      "inference"
    ],
    "limits": null,
    "proposed": {
      "agent_name": "research-bot",
      "capabilities": [
        "inference"
      ],
      "max_transaction_tnzo": "",
      "max_daily_tnzo": "",
      "daily_limit_credits": 20000,
      "total_limit_credits": 500000,
      "expires_in_days": 90
    },
    "did": null,
    "wallet_address": null,
    "serving": {
      "nodes": 3,
      "operators": 2
    },
    "network_key_held": false,
    "error": null,
    "created_at": "2026-09-26T09:05:00.000Z",
    "approved_at": null,
    "activated_at": null,
    "expires_at": null,
    "revoked_at": null
  }
}

Get an agent

read
GET /agents/{id}

Includes what it has spent today and in total. Collects an outstanding approval first.

request
curl "https://platform.tenzro.xyz/api/agents/{id}" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "id": "agt_Zp3kQ9x1RmW4sT",
  "name": "research-bot",
  "status": "active",
  "approval": null,
  "capabilities": [
    "inference"
  ],
  "limits": {
    "max_transaction_tnzo": null,
    "max_daily_tnzo": null,
    "daily_limit_credits": 20000,
    "total_limit_credits": 500000,
    "expires_in_days": 90
  },
  "proposed": null,
  "did": "did:tenzro:machine:e0b27720-3043-84d5-9b66-49eba92b1a8d:7c1d…",
  "wallet_address": "0x4b1f…",
  "serving": {
    "nodes": 3,
    "operators": 2
  },
  "network_key_held": true,
  "error": null,
  "created_at": "2026-09-26T09:05:00.000Z",
  "approved_at": "2026-09-26T09:12:00.000Z",
  "activated_at": "2026-09-26T09:12:00.000Z",
  "expires_at": "2026-12-25T09:12:00.000Z",
  "revoked_at": null,
  "spend": {
    "today_credits": 0,
    "total_credits": 0
  }
}

Change an agent's limits

manage
POST /agents/{id}/settings

Proposes new settings for an active agent, starting from the ones its owner approved last; fields you leave out stay as they are. Nothing changes until the owner approves at approve_url with their passkey. The agent's name cannot be changed.

request
curl -X POST "https://platform.tenzro.xyz/api/agents/{id}/settings" \
  -H "Authorization: Bearer $TENZRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"daily_limit_credits":50000}'
Body schema
json schema
{
  "type": "object",
  "properties": {
    "capabilities": {
      "type": "array",
      "items": {
        "enum": [
          "inference",
          "payments"
        ]
      },
      "default": [
        "inference"
      ]
    },
    "max_transaction_tnzo": {
      "type": "string",
      "description": "Network cap on any one payment the agent makes, in TNZO (e.g. \"1.5\")."
    },
    "max_daily_tnzo": {
      "type": "string",
      "description": "Network cap on what the agent pays per day, in TNZO."
    },
    "daily_limit_credits": {
      "type": "number",
      "description": "Tenzro Labs credits this agent may spend per UTC day."
    },
    "total_limit_credits": {
      "type": "number",
      "description": "Tenzro Labs credits this agent may spend in total."
    },
    "expires_in_days": {
      "type": "integer",
      "minimum": 1,
      "maximum": 3650,
      "description": "The delegation ends after this many days."
    }
  }
}
response
{
  "approve_url": "https://accounts.tenzro.xyz/agents/approve/apr_3xQk…",
  "agent": {
    "id": "agt_Zp3kQ9x1RmW4sT",
    "name": "research-bot",
    "status": "active",
    "approval": {
      "kind": "update",
      "state": "pending",
      "approve_url": "https://accounts.tenzro.xyz/agents/approve/apr_3xQk…"
    },
    "capabilities": [
      "inference"
    ],
    "limits": {
      "max_transaction_tnzo": null,
      "max_daily_tnzo": null,
      "daily_limit_credits": 20000,
      "total_limit_credits": 500000,
      "expires_in_days": 90
    },
    "proposed": null,
    "did": "did:tenzro:machine:e0b27720-3043-84d5-9b66-49eba92b1a8d:7c1d…",
    "wallet_address": "0x4b1f…",
    "serving": {
      "nodes": 3,
      "operators": 2
    },
    "network_key_held": true,
    "error": null,
    "created_at": "2026-09-26T09:05:00.000Z",
    "approved_at": "2026-09-26T09:12:00.000Z",
    "activated_at": "2026-09-26T09:12:00.000Z",
    "expires_at": "2026-12-25T09:12:00.000Z",
    "revoked_at": null
  }
}

Create an API key for an agent

manage
POST /agents/{id}/keys

An inference key that identifies this agent. Its usage counts against the limits its owner approved. Active agents only. The secret is returned once.

request
curl -X POST "https://platform.tenzro.xyz/api/agents/{id}/keys" \
  -H "Authorization: Bearer $TENZRO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"research-bot prod"}'
Body schema
json schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "machine_id": {
      "type": "string",
      "description": "Pin the key to one machine."
    }
  }
}
response
{
  "id": "key_Zb81Qm0sP4aT",
  "name": "ci",
  "prefix": "tzl_3kQ9aZ1x",
  "permissions": [
    "inference"
  ],
  "scope": null,
  "subscription_id": null,
  "rental_id": null,
  "created_at": "2026-09-26T08:00:00.000Z",
  "last_used_at": null,
  "revoked_at": null,
  "agent_id": "agt_Zp3kQ9x1RmW4sT",
  "secret": "tzl_…"
}

Revoke an agent

manage
POST /agents/{id}/revoke

Proposes revoking the agent. Once the owner approves at approve_url with their passkey, its identity is revoked on the network and every Platform API key it holds stops working.

request
curl -X POST "https://platform.tenzro.xyz/api/agents/{id}/revoke" \
  -H "Authorization: Bearer $TENZRO_API_KEY"
response
{
  "approve_url": "https://accounts.tenzro.xyz/agents/approve/apr_3xQk…",
  "agent": {
    "id": "agt_Zp3kQ9x1RmW4sT",
    "name": "research-bot",
    "status": "active",
    "approval": {
      "kind": "revoke",
      "state": "pending",
      "approve_url": "https://accounts.tenzro.xyz/agents/approve/apr_3xQk…"
    },
    "capabilities": [
      "inference"
    ],
    "limits": {
      "max_transaction_tnzo": null,
      "max_daily_tnzo": null,
      "daily_limit_credits": 20000,
      "total_limit_credits": 500000,
      "expires_in_days": 90
    },
    "proposed": null,
    "did": "did:tenzro:machine:e0b27720-3043-84d5-9b66-49eba92b1a8d:7c1d…",
    "wallet_address": "0x4b1f…",
    "serving": {
      "nodes": 3,
      "operators": 2
    },
    "network_key_held": true,
    "error": null,
    "created_at": "2026-09-26T09:05:00.000Z",
    "approved_at": "2026-09-26T09:12:00.000Z",
    "activated_at": "2026-09-26T09:12:00.000Z",
    "expires_at": "2026-12-25T09:12:00.000Z",
    "revoked_at": null
  }
}
The OpenAPI document can generate typed clients: npx @openapitools/openapi-generator-cli generate -i https://platform.tenzro.xyz/api/openapi.json -g typescript-fetch -o ./tenzro