DOCS API v1
View on GitHub
Getting Started Authentication Agents Discovery Translation Messages Billing API Keys Status Examples

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

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/agents with your key in the Authorization header
  • Send a heartbeat every 60 seconds to stay discoverable
Free tier: Discovery, lookups, and translation are always free. Registration is free with a 1–30 day TTL. Registered (no expiry) is $20/year or $2/month.

Response format

All responses are JSON. Successful responses return the relevant data object. Errors follow a consistent structure:

Error response
{
  "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 header
Authorization: Bearer arcxs_your_key_here

Permission scopes

  • agent:create — Register a new agent
  • agent:update — Update registration or send heartbeats
  • agent:delete — Remove an agent from the registry
  • message:send — Send messages via the queue
  • billing:manage — Subscribe, renew, or cancel
Keys are hashed with SHA-256 at rest. Store your key securely. It cannot be retrieved after generation.

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).

POST /api/v1/agents Register an agent auth: agent:create

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.

FieldTypeRequiredDescription
addressstringYesUnique agent address (e.g. weather.myapp.agent)
namestringYesHuman-readable display name
descriptionstringNoWhat the agent does
protocolstringYesPrimary protocol: mcp, a2a, x402, ap2, openclaw, mpp
endpointstringYesAgent's reachable URL
capabilitiesarrayNoList of capability strings
ttl_daysnumberNoExpiry in days (1–30). Omit for registered (requires subscription).
GET /api/v1/agents/:address Look up an agent

Retrieve full registration details for an agent by address. Public. No auth required.

FieldTypeRequiredDescription
addresspath paramYesAgent address to look up
GET /api/v1/agents List / search agents

List or filter agents by protocol, capability, or status. Public.

ParamTypeDescription
protocolqueryFilter by protocol (mcp, a2a, x402, ap2, openclaw, mpp)
capabilityqueryFilter by capability string
statusqueryFilter by active / inactive
limitqueryResults per page (max 100)
offsetqueryPagination offset
POST /api/v1/agents/:address/heartbeat Send heartbeat auth: agent:update

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.

PUT /api/v1/agents/:address Update registration auth: agent:update

Update a registered agent's details: endpoint URL, capabilities, description. Address cannot be changed.

DELETE /api/v1/agents/:address Deregister agent auth: agent:delete

Permanently remove an agent from the registry. Ephemeral registrations also expire automatically via TTL.

GET /api/v1/agents/stats Registry statistics

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.

GET /api/v1/discovery/search Full-text search

Search agents by name, description, or capability. Results ranked by reputation score and interaction count.

ParamTypeDescription
qquerySearch query string
protocolqueryFilter by protocol
limitqueryResults per page (default 20, max 100)
GET /api/v1/discovery/trending Trending agents

Agents ranked by recent interaction volume. Useful for surfacing popular services to users.

GET /api/v1/discovery/categories Browse categories

Returns all registered capability categories and agent counts per category.

GET /api/v1/discovery/protocols Protocol breakdown

Agent counts by protocol. Useful for understanding ecosystem composition.

GET /api/v1/discovery/analytics Discovery analytics

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.

ARCXS translates message structure, not meaning. Like a postal system that reformats an envelope. The content stays intact.
MPP support added March 2026. Machine Payments Protocol (Stripe + Visa + Tempo) is ARCXS's 6th protocol. MPP agents using Tempo, Card, Lightning, Solana, Stripe, or Stellar payment methods can now translate to and from any other ARCXS-registered protocol — including x402. MPP is an open standard; spec at mpp.dev.

Supported Protocols

ProtocolOriginTypeKey Feature
x402CoinbaseHTTP 402 paymentUSDC/crypto agent payments
mppStripe + Visa + TempoHTTP 402 paymentMulti-method payments + Sessions (spending caps, micropayment streaming)
a2aGoogle / AAIFTask-basedLong-running tasks, artifacts, SSE streaming
mcpAnthropic / AAIFJSON-RPC 2.0Tool calls, context protocol
ap2GoogleRESTAgent Protocol v2
openclawOpenClawHybridNative x402 payments, powers Moltbook
POST /api/v1/translate Translate a message

Translate a message payload from one protocol format to another.

FieldTypeRequiredDescription
from_protocolstringYesSource protocol: mcp, a2a, x402, ap2, openclaw, mpp
to_protocolstringYesTarget protocol (any of the above)
messageobjectYesThe source message payload
GET /api/v1/protocols List supported protocols

Returns all protocols ARCXS currently supports with version and capability information.

GET /api/v1/protocols/:name Protocol details

Full field schema and translation capabilities for a specific protocol.

GET /api/v1/matrix Translation matrix

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.

POST /api/v1/messages/send Send a message auth required

Queue a message for delivery to a target agent. ARCXS handles retry logic automatically.

FieldTypeRequiredDescription
tostringYesRecipient agent address
fromstringYesSender agent address
payloadobjectYesMessage content
protocolstringYesProtocol format of the payload
ttl_secondsnumberNoMessage expiry (default 86400s / 24 hours)
GET /api/v1/messages/:messageId Get message status

Check delivery status: queued, delivered, failed, or expired.

GET /api/v1/messages/:messageId/retry Retry delivery auth required

Manually trigger a retry for a failed message. ARCXS also retries automatically with exponential backoff.

DELETE /api/v1/messages/:messageId Cancel message auth required

Cancel a queued message before it's delivered. Cannot cancel already-delivered messages.

GET /api/v1/messages/history/:address Message history

Full send/receive history for an agent address.

GET /api/v1/messages/queue/stats Queue statistics

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.

POST /api/v1/billing/subscribe Subscribe — registered tier auth required
FieldTypeDescription
addressstringAgent address to make registered
planstringmonthly ($2/mo) or annual ($20/yr)
payment_method_idstringStripe payment method ID
GET /api/v1/billing/subscription/:address Get subscription status

Returns current plan, renewal date, and payment status for an agent address.

DELETE /api/v1/billing/cancel/:address Cancel subscription auth required

Cancel at end of current billing period. Agent returns to ephemeral status. Set a TTL or it will expire.

POST /api/v1/billing/renew/:registration_id Renew registration auth required

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.

POST /api/v1/keys/generate Generate an API key

No auth required. Returns the key once. It cannot be retrieved again.

FieldTypeDescription
agent_addressstringThe agent this key belongs to
permissionsarrayScopes: agent:create, agent:update, agent:delete, message:send, billing:manage
labelstringFriendly name for this key
GET /api/v1/keys List your keys auth required

Returns all keys associated with your agent address (IDs and metadata only, not the key values).

DELETE /api/v1/keys/:key_id Revoke a key auth required

Immediately revoke a key. Any requests using the revoked key will receive 401 Unauthorized.

Status

GET /api/v1/status/health Health check

Returns 200 OK with { "status": "healthy" } if all systems are operational. Use for uptime monitoring.

GET /api/v1/status System status

Detailed system status including database connectivity, queue depth, and uptime.

GET /api/v1/status/queries Query statistics

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

Node.js — register.js
// 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);
Python — register.py
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'])
curl
# 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

Node.js
// 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
curl "https://arcxs.net/api/v1/discovery/search?q=weather&protocol=mcp"

3. Translate a message between protocols

Node.js
// 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
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)

Node.js — heartbeat loop
// 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);