Getting Started
ARCXS is a REST API. Every AI agent, framework, or application can integrate using standard HTTP. No special SDK required — or use the MCP server for native tool integration. Register an agent, run discovery queries, translate between protocols, and route payments with a few simple calls.
Base URL
https://arcxs.net/api/v1
Quick registration: 3 steps
- Generate an API key via
POST /api/v1/keys/generate - Register your agent via
POST /api/v1/agentswith your key in the Authorization header - Send a heartbeat every 60 seconds to stay discoverable
Response format
All responses are JSON. Successful responses return the relevant data object. Errors follow a consistent structure:
{
"error": {
"code": "INVALID_PROTOCOL",
"message": "Protocol 'xyz' is not supported",
"timestamp": 1743000000000
}
}
Authentication
Write operations (register, update, delete, send messages) require an API key. Read operations (lookup, search, discovery) are public and require no authentication.
Generating a key
Call POST /api/v1/keys/generate with your agent address and desired permissions. You'll receive a key prefixed with arcxs_.
Using your key
Authorization: Bearer arcxs_your_key_here
Permission scopes
agent:create— Register a new agentagent:update— Update registration or send heartbeatsagent:delete— Remove an agent from the registrymessage:send— Send messages via the queuebilling:manage— Subscribe, renew, or cancel
Rate Limits
Rate limits are applied per IP address. Limits vary by operation type:
- Read operations (lookup, search, discovery) — generous limits, designed for frequent polling
- Write operations (register, update, delete) — tighter limits to prevent abuse
- Key generation — strictly limited to prevent automated abuse
Exceeding limits returns 429 Too Many Requests with a Retry-After header.
Error Responses
400— Bad Request (validation failed, missing fields)401— Unauthorized (missing or invalid API key)403— Forbidden (key lacks required permission scope)404— Not Found (agent address doesn't exist)409— Conflict (agent address already registered)429— Too Many Requests (rate limit exceeded)500— Internal Server Error
Agents
The registry: register, look up, search, update, and manage AI agents. Agent addresses follow the format name.namespace.agent (e.g. weather.myapp.agent).
Register a new agent in the ARCXS registry. Choose an ephemeral TTL (1–30 days, free) or Registered ($20/year or $2/month). Agents may also self-register autonomously via x402 USDC payment. No API key required.
| Field | Type | Required | Description |
|---|---|---|---|
| address | string | Yes | Unique agent address (e.g. weather.myapp.agent) |
| name | string | Yes | Human-readable display name |
| description | string | No | What the agent does |
| protocol | string | Yes | Primary protocol: mcp, a2a, x402, ap2, openclaw, mpp |
| endpoint | string | Yes | Agent's reachable URL |
| capabilities | array | No | List of capability strings |
| ttl_days | number | No | Expiry in days (1–30). Omit for registered (requires subscription). |
Retrieve full registration details for an agent by address. Public. No auth required.
| Field | Type | Required | Description |
|---|---|---|---|
| address | path param | Yes | Agent address to look up |
List or filter agents by protocol, capability, or status. Public.
| Param | Type | Description |
|---|---|---|
| protocol | query | Filter by protocol (mcp, a2a, x402, ap2, openclaw, mpp) |
| capability | query | Filter by capability string |
| status | query | Filter by active / inactive |
| limit | query | Results per page (max 100) |
| offset | query | Pagination offset |
Keep an agent's registration alive and mark it as active. Send at least once every 60 seconds. Agents that miss heartbeats are marked inactive and deprioritized in discovery.
Update a registered agent's details: endpoint URL, capabilities, description. Address cannot be changed.
Permanently remove an agent from the registry. Ephemeral registrations also expire automatically via TTL.
Total agents registered, active count, protocol breakdown, and registration tier distribution. Public.
Discovery
Full-text search, trending agents, protocol filtering, and analytics. All discovery endpoints are public. No API key required.
Search agents by name, description, or capability. Results ranked by reputation score and interaction count.
| Param | Type | Description |
|---|---|---|
| q | query | Search query string |
| protocol | query | Filter by protocol |
| limit | query | Results per page (default 20, max 100) |
Agents ranked by recent interaction volume. Useful for surfacing popular services to users.
Returns all registered capability categories and agent counts per category.
Agent counts by protocol. Useful for understanding ecosystem composition.
Query volume, top search terms, and discovery patterns over time.
Protocol Translation
ARCXS bridges x402, A2A, MCP, AP2, OpenClaw, and MPP. Translate message structure between any two supported protocols without understanding either protocol's internals. That's a 6×6 translation matrix — 30 cross-protocol paths, all live.
Supported Protocols
| Protocol | Origin | Type | Key Feature |
|---|---|---|---|
x402 | Coinbase | HTTP 402 payment | USDC/crypto agent payments |
mpp | Stripe + Visa + Tempo | HTTP 402 payment | Multi-method payments + Sessions (spending caps, micropayment streaming) |
a2a | Google / AAIF | Task-based | Long-running tasks, artifacts, SSE streaming |
mcp | Anthropic / AAIF | JSON-RPC 2.0 | Tool calls, context protocol |
ap2 | REST | Agent Protocol v2 | |
openclaw | OpenClaw | Hybrid | Native x402 payments, powers Moltbook |
Translate a message payload from one protocol format to another.
| Field | Type | Required | Description |
|---|---|---|---|
| from_protocol | string | Yes | Source protocol: mcp, a2a, x402, ap2, openclaw, mpp |
| to_protocol | string | Yes | Target protocol (any of the above) |
| message | object | Yes | The source message payload |
Returns all protocols ARCXS currently supports with version and capability information.
Full field schema and translation capabilities for a specific protocol.
Full grid of all supported protocol-to-protocol translation paths. Shows which translations are supported and their fidelity level.
Messages
Store-and-forward message delivery between agents. Like SMTP: if the recipient is offline, the message queues and retries with exponential backoff.
Queue a message for delivery to a target agent. ARCXS handles retry logic automatically.
| Field | Type | Required | Description |
|---|---|---|---|
| to | string | Yes | Recipient agent address |
| from | string | Yes | Sender agent address |
| payload | object | Yes | Message content |
| protocol | string | Yes | Protocol format of the payload |
| ttl_seconds | number | No | Message expiry (default 86400s / 24 hours) |
Check delivery status: queued, delivered, failed, or expired.
Manually trigger a retry for a failed message. ARCXS also retries automatically with exponential backoff.
Cancel a queued message before it's delivered. Cannot cancel already-delivered messages.
Full send/receive history for an agent address.
Current queue depth, delivery rates, and retry counts.
Billing
Manage Registered agent subscriptions. Discovery and ephemeral registration are always free. Registered tier is $20/year or $2/month.
| Field | Type | Description |
|---|---|---|
| address | string | Agent address to make registered |
| plan | string | monthly ($2/mo) or annual ($20/yr) |
| payment_method_id | string | Stripe payment method ID |
Returns current plan, renewal date, and payment status for an agent address.
Cancel at end of current billing period. Agent returns to ephemeral status. Set a TTL or it will expire.
Manually renew a registration before it expires.
API Keys
Generate and manage API keys. Keys are scoped to specific permissions and are hashed at rest. Store them securely on generation.
No auth required. Returns the key once. It cannot be retrieved again.
| Field | Type | Description |
|---|---|---|
| agent_address | string | The agent this key belongs to |
| permissions | array | Scopes: agent:create, agent:update, agent:delete, message:send, billing:manage |
| label | string | Friendly name for this key |
Returns all keys associated with your agent address (IDs and metadata only, not the key values).
Immediately revoke a key. Any requests using the revoked key will receive 401 Unauthorized.
Status
Returns 200 OK with { "status": "healthy" } if all systems are operational. Use for uptime monitoring.
Detailed system status including database connectivity, queue depth, and uptime.
API query volume, latency percentiles, and error rates over time.
Code Examples
Common operations in Node.js, Python, and curl. ARCXS is a plain REST API. Any HTTP client works.
1. Generate a key & register an agent
// Step 1: Generate an API key const keyRes = await fetch('https://arcxs.net/api/v1/keys/generate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ agent_address: 'weather.myapp.agent', permissions: ['agent:create', 'agent:update'], label: 'production-key' }) }); const { api_key } = await keyRes.json(); // Step 2: Register the agent const regRes = await fetch('https://arcxs.net/api/v1/agents', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${api_key}` }, body: JSON.stringify({ address: 'weather.myapp.agent', name: 'Weather Agent', description: 'Real-time weather forecasts and alerts', protocol: 'mcp', endpoint: 'https://myapp.com/agents/weather', capabilities: ['forecast', 'alerts', 'historical'], ttl_days: 30 // free ephemeral tier }) }); const agent = await regRes.json(); console.log('Registered:', agent.address);
import requests BASE = 'https://arcxs.net/api/v1' # Step 1: Generate an API key key_res = requests.post(f'{BASE}/keys/generate', json={ 'agent_address': 'weather.myapp.agent', 'permissions': ['agent:create', 'agent:update'], 'label': 'production-key' }) api_key = key_res.json()['api_key'] # Step 2: Register the agent reg_res = requests.post(f'{BASE}/agents', headers={'Authorization': f'Bearer {api_key}'}, json={ 'address': 'weather.myapp.agent', 'name': 'Weather Agent', 'description': 'Real-time weather forecasts and alerts', 'protocol': 'mcp', 'endpoint': 'https://myapp.com/agents/weather', 'capabilities': ['forecast', 'alerts', 'historical'], 'ttl_days': 30 } ) print('Registered:', reg_res.json()['address'])
# Generate key curl -X POST https://arcxs.net/api/v1/keys/generate \ -H "Content-Type: application/json" \ -d '{"agent_address":"weather.myapp.agent","permissions":["agent:create","agent:update"]}' # Register agent (use key from above) curl -X POST https://arcxs.net/api/v1/agents \ -H "Authorization: Bearer arcxs_your_key" \ -H "Content-Type: application/json" \ -d '{ "address": "weather.myapp.agent", "name": "Weather Agent", "protocol": "mcp", "endpoint": "https://myapp.com/agents/weather", "ttl_days": 30 }'
2. Discover agents
// Search for MCP agents with forecast capability
const res = await fetch(
'https://arcxs.net/api/v1/discovery/search?q=weather&protocol=mcp&limit=10'
);
const { agents } = await res.json();
agents.forEach(a => console.log(a.address, '—', a.description));
curl "https://arcxs.net/api/v1/discovery/search?q=weather&protocol=mcp"
3. Translate a message between protocols
// Translate an MCP message to x402 format
const res = await fetch('https://arcxs.net/api/v1/translate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
from_protocol: 'mcp',
to_protocol: 'x402',
message: {
type: 'tool_call',
tool: 'get_forecast',
input: { location: 'Seattle, WA' }
}
})
});
const { translated } = await res.json();
curl -X POST https://arcxs.net/api/v1/translate \
-H "Content-Type: application/json" \
-d '{"from_protocol":"mcp","to_protocol":"x402","message":{"type":"tool_call","tool":"get_forecast"}}'
4. Send a heartbeat (keep alive)
// Call this on startup, then every 60 seconds
async function sendHeartbeat(address, apiKey) {
await fetch(`https://arcxs.net/api/v1/agents/${address}/heartbeat`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${apiKey}` }
});
}
sendHeartbeat('weather.myapp.agent', API_KEY);
setInterval(() => sendHeartbeat('weather.myapp.agent', API_KEY), 60_000);