Zyra API

Check any agent from your product.

One record per call. Registration stays free for owners, and badge checks stay free for everyone.

Quickstart

  1. Sign in to your account with your email.
  2. Under API keys, create a Sandbox key. It returns sample records and never touches live data.
  3. Send it as Authorization: Bearer zyra_test_…. Switch to a Live key when you're ready.
curl https://zyra.wevesti.com/api/public/v1/agents/ZYR-11B6D1A972/status \
  -H "Authorization: Bearer zyra_test_…"

Register and manage an agent

The four parts of an agent's legal identity: registration, service endpoint, asset binding and principal. Create your API key with write access first.

Your API key

Says who is calling. Sent on every call as Authorization: Bearer.

The agent key

Proves you own that agent. Returned once at registration, then sent as X-Agent-Key to change its endpoint, binding or principal.

What's free: registering up to 25 agents a day per key, and every update to your own agent. These don't count toward your monthly calls. Bulk registration beyond that is on Growth and Platform.

  1. 1. Register the agent

    Send the agent's name, where it answers, who it acts for and what it may do. The reply carries its agent key once. Save it right away; Zyra only keeps a fingerprint and cannot show it again.

    curl -X POST https://zyra.wevesti.com/api/public/v1/agents \
      -H "Authorization: Bearer zyra_live_…" \
      -H "Content-Type: application/json" \
      -d '{"name":"Acme Billing Agent","service_endpoint":"https://api.acme.com/agent","principal_type":"organization","principal_name":"Acme Inc.","principal_contact":"ops@acme.com","spend_limit":5000,"can_sign_documents":false,"permissions":["send_invoices"]}'

    Reply

    { "data": { "zyr_id": "ZYR-4F2A9C10B7", "agent_key": "zyra_sk_…", "status": "good_standing",
      "notice": "Store agent_key securely. Zyra cannot show it again." } }
  2. 2. Change the service endpoint

    Zyra calls the new address before saving it. If it doesn't answer, nothing changes and you get endpoint_unreachable.

    curl -X PUT https://zyra.wevesti.com/api/public/v1/agents/ZYR-4F2A9C10B7/endpoint \
      -H "Authorization: Bearer zyra_live_…" \
      -H "Content-Type: application/json" \
      -H "X-Agent-Key: zyra_sk_…" \
      -d '{"service_endpoint":"https://api.acme.com/v2/agent"}'

    Reply

    { "data": { "zyr_id": "ZYR-4F2A9C10B7", "endpoint": { "url": "https://api.acme.com/v2/agent", "verified": true }, … } }
  3. 3. Bind an asset account

    Tie the agent to the wallet, bank, escrow, card or reserve it spends from. References are always shown masked. A spend limit above $10,000 goes to lawyer review, so the reply shows pending_review until it's approved.

    curl -X PUT https://zyra.wevesti.com/api/public/v1/agents/ZYR-4F2A9C10B7/binding \
      -H "Authorization: Bearer zyra_live_…" \
      -H "Content-Type: application/json" \
      -H "X-Agent-Key: zyra_sk_…" \
      -d '{"asset_type":"escrow","asset_ref":"ESC-88231904","spend_limit":20000}'

    Reply

    { "data": { "zyr_id": "ZYR-4F2A9C10B7", "status": "pending_review",
      "binding": { "type": "escrow", "ref": "••••1904", "spend_limit": 20000 } } }
  4. 4. Link a principal

    Ask to link the agent to the person or company responsible for it. The link stays pending until Zyra confirms it.

    curl -X POST https://zyra.wevesti.com/api/public/v1/agents/ZYR-4F2A9C10B7/principal \
      -H "Authorization: Bearer zyra_live_…" \
      -H "Content-Type: application/json" \
      -H "X-Agent-Key: zyra_sk_…" \
      -d '{"principal_type":"organization","principal_name":"Acme Inc.","principal_contact":"legal@acme.com"}'

    Reply

    { "data": { "zyr_id": "ZYR-4F2A9C10B7", "principal": { "name": "Acme Inc.", "type": "organization", "verified": false },
      "status": "pending_review" } }

Endpoints

Base URL: https://zyra.wevesti.com/api/public/v1

  • GET /agents/{zyr_id}Identity record: name, verified endpoint, principal, agent type, status.$0.10
  • GET /agents/lookup?q=Find by endpoint URL or name. Filters: category, form (blueprint, instance), type (agent, toolkit), status, platform. Returns at most 5 matches.$0.10
  • GET /agents/{zyr_id}/statusLight check: good_standing, suspended or revoked, with a timestamp.$0.02
  • POST /verifyFull verification: identity, principal, scoped authority, asset binding and standing, signed so you can keep it as evidence. depth: standard or deep (Platform).$0.50 / $2.00
  • GET /badge/{zyr_id}/resolveBadge resolution for counterparties. No key needed.Free
  • POST /agentsRegister one agent: name, service_endpoint, principal, authority and optional asset binding. Returns its agent key once. Up to 25 a day per key are free; bulk registration beyond that is on Growth and Platform.Free
  • PUT /agents/{zyr_id}/endpointChange the service endpoint. It must answer live. Send the agent's own key as X-Agent-Key.Free
  • PUT /agents/{zyr_id}/bindingBind an asset account: asset_type, asset_ref, spend_limit. References are always shown masked. Limits above $10,000 go to lawyer review. Needs X-Agent-Key.Free
  • POST /agents/{zyr_id}/principalRequest a link to a person or organization. Stays pending until Zyra confirms it. Needs X-Agent-Key.Free

Examples

JavaScript: verify

const res = await fetch("https://zyra.wevesti.com/api/public/v1/verify", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.ZYRA_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ zyr_id: "ZYR-11B6D1A972", depth: "standard" }),
});
const { verification, signature } = await res.json();

Python: lookup

import os, requests
r = requests.get("https://zyra.wevesti.com/api/public/v1/agents/lookup",
    params={"q": "https://api.example.com/agent", "form": "instance"},
    headers={"Authorization": f"Bearer {os.environ['ZYRA_API_KEY']}"})
print(r.json()["data"])

Verification responses carry an HMAC-SHA256 signature over the verification, depth, issued_at and issuer fields. Keep the whole response as your record of the check.

Errors

  • 400 bad input · 401 missing, unknown or revoked key · 403 endpoint not on your plan, key lacks write access, or agent key belongs to another agent
  • 401 agent_key_required missing X-Agent-Key on an update · 422 endpoint didn't answer or registration failed
  • 404 no such agent · 429 monthly calls used up, daily free registrations used up, or rate limited

Errors look like { "error": { "code", "message" } }. Failed calls are not charged.

Pricing

Free · $0/mo

Unlimited sandbox, 100 live calls a month.

Developer · $9/mo

1,000 live lookups a month. Badge checks free.

Growth · $49/mo

10,000 live lookups a month, standard verification, priority rate limits.

Platform · Custom

Bulk volume, deep verification with signed attestation, status webhooks, SLA, invoiced billing.

Choose Developer or Growth in Plans & billing. Your existing and new API keys use your paid plan after Stripe confirms payment. Free access stays available. Platform checkout uses an agreed price assigned to your account; contact us to agree terms.

Free stops at its included calls. On Developer and Growth, calls past the bundle keep working and are added to your next invoice. Per-call rates: status $0.02, identity $0.10, standard verification $0.50, deep verification $2.00.

Help