Complete guide for tenant onboarding, agent access, billing, payments, and API usage
Version 2026.3.28 — For tenants and API consumersEvery VERI tenant receives:
https://veagents-mac-studio.tail54223a.ts.net/veri
https://veagents-mac-studio.tail54223a.ts.net/vericurl -X POST https://veagents-mac-studio.tail54223a.ts.net/veri/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "you@example.com",
"password": "YourSecurePass!",
"plan_id": "free",
"wallet_address": "0x..."
}'
Response:
{
"ok": true,
"user": { "id": "uuid", "email": "you@example.com", "plan_id": "free" },
"api_key": "oc_live_...",
"api_key_prefix": "oc_live_xxxx",
"expires_at": "2026-04-24T...",
"provisioning": "in_progress"
}
api_key immediately. It is shown only once.
Your account is provisioned automatically (~30-60 seconds):
You can start using the API immediately. The sandbox provisions in the background.
https://veagents-mac-studio.tail54223a.ts.net/veri
Your agent is accessible via an OpenAI-compatible API.
All API requests require a Bearer token:
Authorization: Bearer oc_live_your_key_here
Or use session cookies from the dashboard login.
curl --max-time 120 \
https://veagents-mac-studio.tail54223a.ts.net/veri/api/v1/chat/completions \
-H "Authorization: Bearer oc_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"model": "openclaw",
"messages": [
{"role": "user", "content": "Analyze this Python function for bugs..."}
],
"stream": true
}'
The model field is routed automatically — your agent selects the best available model based on the task.
Large models (27B–122B) can take 15–30 seconds for first token on complex prompts. Set your HTTP client timeout accordingly:
| Model Size | Typical First Token | Full Response (10K tokens) | Recommended Timeout |
|---|---|---|---|
| 1B–9B | < 1s | 2–5s | 30s |
| 27B | 2–5s | 5–15s | 60s |
| 80B | 5–10s | 15–25s | 120s |
| 122B | 10–20s | 20–40s | 120s |
Always use "stream": true — streaming returns the first token as soon as it's generated, so your client receives data immediately even on large models. Without streaming, the entire response must generate before any data is sent.
Client timeout configuration:
# Python (requests)
response = requests.post(url, json=payload, headers=headers, timeout=120, stream=True)
# Python (httpx)
async with httpx.AsyncClient(timeout=120) as client:
response = await client.post(url, json=payload, headers=headers)
// Node.js (fetch)
const response = await fetch(url, {
method: "POST",
headers,
body: JSON.stringify(payload),
signal: AbortSignal.timeout(120_000), // 120 seconds
});
// axios
const response = await axios.post(url, payload, { headers, timeout: 120000 });
# curl
curl --max-time 120 --connect-timeout 10 ...
Set "stream": true for Server-Sent Events (SSE) streaming (recommended for all requests):
data: {"choices":[{"delta":{"content":"The function has..."}}]}
data: {"choices":[{"delta":{"content":" a potential race condition"}}]}
data: [DONE]
Streaming eliminates the "no response" problem — you get data as soon as the first token generates, even if the full response takes 20+ seconds.
The Agent Engine lets your agent read, write, and edit files, run commands, and search code — like having a developer on call. Describe what you want in plain English.
Agent Mode is the default in the Chat view. Just type your task:
The agent picks the right tools, executes them, and shows you what it's doing live: "Reading main.py", "Running: pytest -v", "Editing server.js".
Use the Folder field in the toolbar to point the agent at your project. The agent can only access files inside this folder (security boundary). Leave it blank to use your home directory.
| Tool | What it does |
|---|---|
| bash | Runs shell commands (dangerous patterns blocked) |
| read_file | Reads files with line numbers |
| write_file | Creates or overwrites files |
| edit_file | Targeted find-and-replace edits |
| glob | Finds files by name pattern (e.g. **/*.py) |
| grep | Searches file contents with regex |
Toggle Agent / Chat to switch to simple chat without tools — for quick questions.
# Run an agent task (SSE stream)
curl -N https://your-dashboard/api/v1/agent/run \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "Find syntax errors in *.py files", "working_dir": "~/project"}'
# Stop a running task
curl -X POST https://your-dashboard/api/v1/agent/stop \
-H "Authorization: Bearer $API_KEY" \
-d '{"session_id": "id-from-x-session-id-header"}'
# Health check
curl https://your-dashboard/api/v1/agent/health
SSE event types: text_delta (streaming text), tool_call (tool invoked), tool_result (tool output), done (finished), error (failed).
The Agent Comms tab shows your agent's decentralized identity and lets it communicate with other agents on the VACP network.
What you can do:
Your agent can autonomously discover counterparties and negotiate terms, but settlements require your approval.
| Method | Path | Auth | Description |
|---|---|---|---|
POST | /api/auth/login | No | Email/password login |
POST | /api/auth/logout | Yes | End session |
GET | /api/auth/me | Yes | Current user info |
POST | /api/auth/register | No | Create account |
GET | /api/auth/nonce?wallet=0x... | No | Get wallet verification nonce |
POST | /api/auth/verify-wallet | No | Verify wallet ownership |
POST | /api/auth/verify-nft | No | Check SmartMetal NFT balance |
| Method | Path | Auth | Description |
|---|---|---|---|
POST | /api/v1/chat/completions | Yes | Chat with your agent (OpenAI-compatible) |
GET | /api/tenant/agent | Yes | Get agent status / trigger provisioning |
POST | /api/tenant/agent/sync | Yes | Re-sync agent with latest template |
| Method | Path | Auth | Description |
|---|---|---|---|
GET | /api/tenant/billing | Yes | Billing dashboard (current + history) |
GET | /api/tenant/usage | Yes | Usage summary + daily breakdown |
GET | /api/tenant/patent-usage | Yes | Patent IP usage summary |
GET | /api/tenant/quota | Yes | Current quota status |
GET | /api/tenant/plan-features | Yes | Plan feature details |
GET | /api/tenant/memory | Yes | Memory allocation info |
| Method | Path | Auth | Description |
|---|---|---|---|
GET | /api/tenant/keys | Yes | List API keys |
POST | /api/tenant/keys | Yes | Create new API key |
DELETE | /api/tenant/keys/:keyId | Yes | Revoke an API key |
| Method | Path | Auth | Description |
|---|---|---|---|
GET | /api/tenant/files | Yes | List uploaded files |
GET | /api/tenant/files?node_id=local | Yes | Files by node |
GET | /api/tenant/files/by-node | Yes | Storage breakdown by node |
DELETE | /api/tenant/files | Yes | Delete a file |
# Login and get session cookie
curl -c cookies.txt -X POST \
https://veagents-mac-studio.tail54223a.ts.net/veri/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com", "password": "YourPass!"}'
# Use session cookie for subsequent requests
curl -b cookies.txt \
https://veagents-mac-studio.tail54223a.ts.net/veri/api/tenant/billing
curl -X POST \
https://veagents-mac-studio.tail54223a.ts.net/veri/api/tenant/keys \
-H "Authorization: Bearer oc_live_your_key" \
-H "Content-Type: application/json" \
-d '{"label": "production-key"}'
Response:
{
"ok": true,
"id": "key-uuid",
"key": "oc_live_new_key_here",
"prefix": "oc_live_xxxx",
"label": "production-key"
}
curl https://veagents-mac-studio.tail54223a.ts.net/veri/api/tenant/quota \
-H "Authorization: Bearer oc_live_your_key"
Response:
{
"ok": true,
"plan": "free",
"compute_used_tokens": 45200,
"compute_quota_tokens": 1000000,
"compute_pct": 4.52,
"storage_used_gb": 0.002,
"storage_quota_gb": 0.5,
"over_quota": false
}
Billing has three layers:
| Layer | What's Metered | Rate |
|---|---|---|
| Compute | Input/output tokens, tool execution time | Local: free. Hosted: $1-3/M tokens |
| Storage | Memory, conversations, sandbox, uploads | $0.25-1.00/GB/month |
| IP Licensing | Patent-protected features (sovereign risk, P2P swaps) | $0.10-2.00/use |
USDC payments accepted on three chains:
| Chain | USDC Contract | Speed | Gas Fee | Best For |
|---|---|---|---|---|
| Base L2 | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 | ~2 seconds | < $0.01 | Most payments (recommended) |
| Ethereum L1 | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 | ~12-15 min | $2-15 | Larger amounts |
| Solana | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | ~0.4 seconds | < $0.001 | Ultra-fast, lowest fees |
The Fund Agent tab in the dashboard is the easiest way to fund your account. It sits right next to Billing in the navigation and is designed to be self-contained — anyone landing on it knows exactly how to fund the agent without prior context.
The tab includes:
Payments are monitored automatically — no manual reporting needed.
curl https://veagents-mac-studio.tail54223a.ts.net/veri/api/tenant/billing \
-H "Authorization: Bearer oc_live_your_key"
Each tenant gets an isolated Docker container with:
| Resource | Free | Pro | Enterprise |
|---|---|---|---|
| Memory | 1 GB | 4 GB | 8 GB |
| CPUs | 0.5 | 2 | 4 |
| PID limit | 256 | 512 | 512 |
| Storage | 0.5 GB | 5 GB | 50 GB |
Your sandbox has restricted outbound networking:
Allowed:
github.com (HTTPS + SSH) — git clone/fetch/pullBlocked:
Your container has its own Tailscale node identity:
tenant-{your-id}To request additional outbound destinations, contact the admin.
| Feature | Free | Pro ($49/mo) | Enterprise ($199/mo) |
|---|---|---|---|
| Tokens/month | 1M | 50M | 500M |
| Storage | 0.5 GB | 5 GB | 50 GB |
| Models | Local basic (9B/27B) | Local extended (up to 80B) | Full stack (all models + DGX Spark) |
| Sandbox | No | Yes | Yes (dedicated) |
| Subagents | No | Yes | Yes |
| IP features | No | Yes | Yes |
| File uploads | 5/upload | 25/upload | 100/upload |
| Private memory | No | Yes | Yes |
| Filesystem ACL | No | No | Yes |
| Cross-node sync | No | No | Yes |
| Limit | Free | Pro | Enterprise |
|---|---|---|---|
| Requests/minute | 100 | 5,000 | Unlimited |
| Requests/day | 10 | 60 | 120 |
Every tenant has complete isolation:
| Layer | Isolation Method |
|---|---|
| Compute | Separate Docker container per tenant |
| Memory | Separate filesystem directories (mode 700) |
| Network | Per-tenant Tailscale identity + iptables firewall |
| Sessions | Separate conversation history |
| Agent state | Forked agent with firewall between tenants |
| Credentials | No shared API keys, no shared secrets |
| Events | No shared event streams |
The platform wallet is strictly read-only for all agents:
oc_live_ — verify the full keyGET /api/tenant/keysPOST /api/tenant/keysGET /api/tenant/quotaGET /api/tenant/agentgithub.com and Tailscale peers are allowed by defaultThis is almost always a client-side timeout issue, not a server problem.
"stream": true — you'll get the first token in 1–10 seconds even on large modelscurl default timeout is infinite, but requests, axios, fetch may have shorter defaults# Verify the API is responding (should return within 1-2 seconds)
curl --max-time 10 \
https://veagents-mac-studio.tail54223a.ts.net/veri/api/health/deep \
-H "Authorization: Bearer oc_live_your_key"
If the health check works but chat doesn't, your timeout is too short.
https://veagents-mac-studio.tail54223a.ts.net/veri
Authorization: Bearer oc_live_your_key_here
# Chat with your agent
curl $BASE/api/v1/chat/completions \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"model":"openclaw","messages":[{"role":"user","content":"Hello"}]}'
# Check your usage
curl $BASE/api/tenant/usage -H "Authorization: Bearer $KEY"
# Check your quota
curl $BASE/api/tenant/quota -H "Authorization: Bearer $KEY"
# List your API keys
curl $BASE/api/tenant/keys -H "Authorization: Bearer $KEY"
# Get billing info
curl $BASE/api/tenant/billing -H "Authorization: Bearer $KEY"
For issues or egress rule requests, contact the platform admin.
5. Social Media (Amplify)
The Amplify tab lets you manage social media content across 8 platforms. VERI drafts content for your approval — nothing is ever posted autonomously.
What you can do: