curl-only quickstart

Four curl calls: read, quote, see the 402, verify.

Nothing here needs a wallet, an operator token, or a particular shell. Every command is plain curl with a JSON body and runs the same way from bash, zsh, PowerShell 7, or a CI step. Step 1 reads a public xytara summary, step 2 asks for a quote without paying, step 3 shows the exact 402 challenge an unpaid execution returns and the two ways to fund it, and step 4 builds and verifies a proof bundle on xoonya. The live line is 3.1.8.

Step 1 · GET

1. Read a public xytara summary

The provider summary is public and unauthenticated. It tells you how many provider-runtime profiles are callable and whether a live execution anchor is configured on this deployment. Counts come from the deployment you call, not from marketing copy.

command
curl -s https://xytara.onrender.com/v1/providers/summary
trimmed response
{
  "ok": true,
  "product": "xytara",
  "category": "machine-commerce-provider-lane-pack-summary",
  "lane_state": "first_party_provider_family_present",
  "provider_profile_count": 2,
  "first_party_callable_profile_count": 2,
  "provider_live_anchor_profile_count": 0,
  "revenue_ready_profile_count": 1,
  "proof_followthrough_profile_count": 2,
  "linked_surfaces": {
    "providers_summary_ref": "/v1/providers/summary",
    "provider_runtime_journeys_summary_ref": "/v1/providers/journeys/summary",
    "x402_ref": "/v1/x402",
    "mcp_lane_ref": "/v1/mcp"
  }
}
  • provider_live_anchor_profile_count and revenue_ready_profile_count depend on operator-configured execution targets; without them the honest values are 0 and 1.
  • Any other public summary under the same host works the same way, for example /v1/providers/journeys/summary or /v1/deliveries/summary.

Live providers summary · Live journeys summary

Step 2 · POST, quote-only

2. Ask for a quote without paying

A quote is free and secretless. The minimal body names one task and one command; account_id is optional and only labels the quote. Nothing is executed and nothing is charged.

command
curl -s -X POST https://xytara.onrender.com/v1/payment-quotes \
  -H "content-type: application/json" \
  -d '{"account_id":"acct_demo","task_ref":"adapter.mcp.invoke","command":"mcp.invoke:summarize"}'
trimmed response
{
  "ok": true,
  "quote": {
    "quote_id": "quote_ad6239b0c7ae",
    "account_id": "acct_demo",
    "status": "quoted",
    "amount_minor": 40,
    "currency": "USD_CENTS",
    "capabilities": ["adapter.mcp.invoke"],
    "adapters": ["mcp"],
    "integration_ids": ["builtin.protocol.mcp", "builtin.settlement.chain"],
    "settlement_mode": "bsv_teranode",
    "payment_scheme": "exact",
    "payment": { "scheme": "exact", "protocol": null, "status": "quoted" },
    "intent": "mcp.invoke:summarize",
    "created_at_iso": "2026-10-02T16:45:03.528Z",
    "expires_at_iso": "2026-10-02T16:50:03.537Z"
  }
}
  • On PowerShell 5.1 call curl.exe explicitly so the single-quoted JSON body is passed through unchanged; the built-in curl alias is a different cmdlet.
  • A quote expires after five minutes by default; ask again rather than reusing an old quote_id.

First-run JSON · Money-in

Step 3 · POST, unpaid execute

3. The 402 challenge and the two funding routes

Executing the same task without payment returns HTTP 402 Payment Required with the quote embedded in the body. Asking for credits first on an unfunded account also returns 402 with an insufficient_credits block that names the next surfaces. These are the real responses, not illustrations.

command (unpaid, direct)
curl -s -i -X POST https://xytara.onrender.com/v1/commands/execute \
  -H "content-type: application/json" \
  -d '{"account_id":"acct_demo","task_ref":"adapter.mcp.invoke","command":"mcp.invoke:summarize","body":{"tool_name":"summarize","arguments":{"text":"Summarize the naxytra first-run path in one sentence."}}}'
trimmed response
HTTP/1.1 402 Payment Required
content-type: application/json; charset=utf-8

{
  "ok": false,
  "quote": {
    "quote_id": "quote_7504da375f1b",
    "account_id": "acct_demo",
    "status": "quoted",
    "amount_minor": 40,
    "currency": "USD_CENTS",
    "payment_scheme": "exact",
    "payment": { "scheme": "exact", "protocol": null, "status": "quoted" },
    "settlement": { "mode": "bsv_teranode", "status": "quoted" },
    "treasury": { "destination_id": "treasury_acct_demo", "status": "pending_payment" }
  }
}
command (credits first, unfunded account)
curl -s -X POST https://xytara.onrender.com/v1/commands/execute \
  -H "content-type: application/json" \
  -d '{"account_id":"acct_demo","task_ref":"adapter.mcp.invoke","command":"mcp.invoke:summarize","payment_preference":"credits_first","body":{"tool_name":"summarize","arguments":{"text":"Summarize the naxytra first-run path in one sentence."}}}'
trimmed response (HTTP 402)
{
  "ok": false,
  "reason": "insufficient_credits",
  "insufficient_credits": {
    "account_id": "acct_demo",
    "required_units": 3,
    "available_units": 0,
    "recommended_next_surfaces": {
      "credits_topup": "/v1/checkout/purchase-intents",
      "direct_payment": "/v1/payment-quotes"
    }
  }
}
  • Funding route A, operator-issued credits: an operator with the credit-bridge bearer token issues a grant through POST /v1/credit-bridge/grants, then the credits_first call above succeeds. There is no self-serve top-up yet; hosted checkout purchase intents exist, but credits are only issued once the operator has wired a checkout provider to fulfil them.
  • Funding route B, signed payment: pay the quote with wallet material through the xytara-run client (xytara-run --url ... --wallet-id WALLET_ID --wallet-secret WALLET_SECRET) or a protocol front the operator has bound (x402, L402, BOLT). Wallet secrets never belong in public docs or JSON, so this page stops at the challenge.
  • Public GET /v1/credit-bridge/grants is readable and returns an empty list on a fresh deployment; only the write side is operator-gated.

Credit grants (public read) · x402 front · L402 front · Go-live

Step 4 · POST, proof side

4. Build and verify a proof bundle on xoonya

xoonya is the proof and review spine. The quickest end-to-end verification is to build a bundle from a canonical event and verify it back. The event_hash is any 64-hex digest you control; here it is sha256 of the string naxytra-quickstart. The verify response says exactly which verification class you got.

command (build)
curl -s -X POST https://xoonya.onrender.com/v1/proof-bundles/build \
  -H "content-type: application/json" \
  -d '{"event":{"domain_id":"naxytra.quickstart","sequence":"1","actor_id":"quickstart-agent","adapter_source":"curl","event_type":"quickstart.verify","event_hash":"0c6080431415c9dbcd0e77b18ad5d1380f1042174b892b285e402294ca6452ee","timestamp_ns":"1759425600000000000"}}' \
  -o bundle.json
trimmed bundle.json
{
  "version": "proof-bundle/v1",
  "ceb": { "version": "canonical-event-bundle/v1", "domain_id": "naxytra.quickstart", "sequence": "1", "event_type": "quickstart.verify", "...": "..." },
  "receipt": {
    "version": "receipt/v1",
    "receipt_id": "2effc7b51c5cd4bc0b9f5c3081459f286129f8a9da6cdb74eab48e8899074a1a",
    "event_commitment": "c7c63e9b2453f993b9bbe53c95c9214d4beed815af5870d9ba707b1b3f4afc12",
    "algorithm": "xoonya-native-sha256-v1",
    "signature": "xoonya-native-sha256-v1:71ecff38e502e0d06bbc77b41366481b3e68cf3786663f5199e064df3f0f4e81"
  }
}
command (verify; wraps bundle.json as {"bundle": ...})
curl -s -X POST https://xoonya.onrender.com/v1/proof-bundles/verify \
  -H "content-type: application/json" \
  --data-binary "{\"bundle\": $(cat bundle.json)}"
response
{
  "valid": true,
  "reason": null,
  "version": "proof-bundle/v1",
  "event_commitment": "c7c63e9b2453f993b9bbe53c95c9214d4beed815af5870d9ba707b1b3f4afc12",
  "receipt_id": "2effc7b51c5cd4bc0b9f5c3081459f286129f8a9da6cdb74eab48e8899074a1a",
  "verification_method": "xoonya-native-sha256-v1",
  "verification_method_family": "xoonya_native",
  "verification_state": "verified_native_digest",
  "verification_class": "digest",
  "cryptographically_verified": false,
  "strict": false,
  "trust_root_applied": false
}
  • verification_class digest means a native SHA-256 receipt was recomputed and matched; cryptographically_verified stays false until a signed or anchored method and a trust root are used.
  • On PowerShell, replace the $(cat bundle.json) substitution with --data-binary from a file you wrote as {"bundle": <contents>}, or run the two calls from bash.
  • A real xytara result package goes through the same verify surface; this walk only proves the proof side is reachable and honest about what it verified.

Verification services · Native standard · Proof page

x402 · pay-per-call

A real paid call, settled on-chain

The public MCP executor is a genuine pay-per-call endpoint, not a mock. A request with no payment returns a 402 with the price; a request carrying a signed x402 payment is verified and settled through a facilitator before the tool runs, and the response returns a settlement receipt. The payment is gasless for the buyer: you sign an EIP-3009 USDC authorization and the facilitator broadcasts the transfer. It runs on Base Sepolia today, so a call costs a fraction of a test cent and settles in seconds. This full loop has been run end to end against the live endpoint.

the loop any x402 buyer runs
# 1. discover (free)
#    tools/list on https://xytara-mcp-executor.onrender.com/mcp returns the tool catalog
# 2. call a tool with no payment -> 402 Payment Required
#    the challenge carries the price, the network, and the USDC asset
# 3. sign an x402 "exact" USDC authorization (EIP-3009, gasless)
# 4. call again with the PAYMENT-SIGNATURE header
#    -> the facilitator verifies + settles, the tool runs,
#       and the response carries a PAYMENT-RESPONSE settlement receipt

MCP endpoint · x402 protocol · Base Sepolia USDC faucet

Honest boundary

Where this quickstart stops, and what comes next

These calls prove the public surfaces are live on xytara (https://xytara.onrender.com) and xoonya (https://xoonya.onrender.com), show the exact economics of a paid task, and the MCP executor loop above settles a real payment on-chain. The xytara runtime's own credits path still needs either an operator-issued grant or signed wallet material, neither of which is self-serve today. Once an account is funded, the first-run kit and the start guide carry the same quote, execute, prove loop end to end.

  • Credits require an operator-issued grant; there is no public self-serve top-up yet.
  • Signed payment requires wallet material you hold; the public docs never carry it.
  • Every response on this page was captured from the real services and trimmed, not invented.

Start guide · Try path · First-run kit · Agents · Site map