Documentation

run.pay Documentation

💰 Pricing: $0.005–$0.10/call · 2% commission · No monthly fee See full pricing →

run.pay is a Stripe-native API marketplace for autonomous AI agents. Agents discover and call 205 specialized services in a single HTTP request — no account creation, no API key provisioning, no subscriptions. Stripe handles billing autonomously.

Base URL: https://runpay-backend-visibility-production.up.railway.app
RoleWhat you doTime to production
Agent developerCreate wallet → call services → agents pay autonomously~5 minutes
API providerRegister → publish endpoint → receive per-call payments~10 minutes

Quickstart — Agent Developer

The fastest path from zero to a paid API call.

1

Install the SDK

bash
pip install runpay          # Python
npm install runpay        # JavaScript
2

Create your agent wallet

Go to getrunpay.com/signup or use the API directly:

bash
curl -X POST https://runpay-backend-visibility-production.up.railway.app/api/agents/signup \
  -H "Content-Type: application/json" \
  -d '{"email": "you@example.com", "name": "My Agent"}'
{
"agent_id": "agt_abc123def456",
"wallet_secret": "wsec_XyZ9abc..."
}
Save wallet_secret right now. It's returned exactly once, right here — the server only ever stores its hash, never the value itself. If you lose it, there is genuinely no way to recover it; you'd need to create a new agent. Required for any wallet-scoped endpoint (passport, dashboard, accounting, mandates).

agent_id is your agent's identity across all services — safe to share. wallet_secret is private, required for wallet-scoped endpoints. A welcome email also arrives with a private link to manage your wallet.

3

Call your first service

Python
import runpay

runpay.configure(agent_id="agt_abc123def456")

result = runpay.call("halludetect", {
    "response": "According to Einstein, E=mc² was published in 2003"
})

print(result["hallucination_score"])  # 0-100
{
"success": true,
"hallucination_score": 72,
"risk_level": "HIGH",
"signals": ["..."],
"recommendation": "...",
"_meta": { "cost": 0.01, "balance_after": 4.99 }
}

Authentication

The SDK sends your agent ID as a header automatically (runpay.configure() handles this). If you're calling the API directly instead of using the SDK, the exact mechanism depends on the endpoint:

Direct call via /x402/:serviceId (what the SDK uses)
X-RunPay-Agent: agt_your_agent_id
Direct call via /api/call/:service_id
{ "agent_id": "agt_your_agent_id", "payload": { ... } }
Trial mode: A freshly-created wallet with a $0 balance automatically gets 3 free calls per service through the exact same /x402/:serviceId route above — no special header needed, just your real X-RunPay-Agent ID. The playground's own x-runpay-trial: your_trial_id header works the same way for anonymous, no-signup trials. Either way, the moment your wallet holds any real balance, every call is billed normally.
Wallet secret on payment calls. An agent ID is a public identifier — it appears on the leaderboard and is sent to every vendor you call, so it was never meant to double as a credential. Newer wallets therefore require an additional X-Wallet-Secret header (or a wallet_secret field in the body, for /api/call/:service_id and /api/workflows/:id/execute) on every payment call, exactly the same secret shown once at wallet creation. Older wallets are unaffected unless the owner explicitly opts in via POST /api/agents/settings with require_wallet_secret_for_payment: true. Sending the header is always safe and never rejected, so we recommend including it from day one.
Recommended: identity + proof of ownership
X-RunPay-Agent: agt_your_agent_id
X-Wallet-Secret: wsec_your_wallet_secret

Base URL

All API requests go to:

Base URL
https://runpay-backend-visibility-production.up.railway.app

No versioning prefix yet — all endpoints shown in this documentation are relative to this base URL.

Create Agent Wallet

Two ways to get a wallet, depending on whether a human is involved in the setup:

POST /api/agents/signup With a human present
ParameterTypeDescription
emailrequired stringYour email address for notifications and billing
nameoptional stringYour name or organization
use_caseoptional stringHow you'll use run.pay (helps us improve)
POST /api/agents/register Fully autonomous — no human or email required

An agent generates its own agent_id and registers it directly — no email, no human step. Useful for agent-to-agent commerce where nobody's watching.

ParameterTypeDescription
agent_idrequired stringAny unused agt_... string the agent generates itself
{
"agent_id": "agt_yourownrandomid123",
"wallet_id": "...",
"wallet_secret": "wsec_...",
"client_secret": "seti_..._secret_..."
}
wallet_secret is shown only this once — store it. Trial calls (3 per service) work immediately, no funding needed. Attaching real money to the wallet still needs a human to enter a card via Stripe at some point — no payment system can skip that step entirely.

Call a Service

POST /api/call/:service_id

Replace :service_id with the service UUID from the catalog.

ParameterTypeDescription
agent_idrequired stringYour agent wallet ID (agt_...)
payloadrequired objectService-specific input, nested under this key (see each service's schema)
wallet_secretoptional stringRequired instead if your wallet has require_wallet_secret_for_payment enabled — or send it as an X-Wallet-Secret header
Example — cURL
curl -X POST https://runpay-backend-visibility-production.up.railway.app/api/call/14783c94-915e-4054-83eb-af6b22c542c3 \
  -H "Content-Type: application/json" \
  -d '{
    "agent_id": "agt_your_agent",
    "payload": {
      "response": "The Eiffel Tower was built in 1850 according to French records."
    }
  }'

Workflows

A vendor can publish a multi-step pipeline as one purchasable unit — call the whole chain in a single request. Billed step-by-step: if a step fails partway through, you're only ever charged for the steps that genuinely succeeded, never the ones that didn't run.

GET /api/workflows

Browse published, active workflows.

GET /api/workflows/:id

Real step-by-step breakdown and an estimated total price, before you run it.

POST /api/workflows/:id/execute
ParameterTypeDescription
agent_idrequired stringYour agent wallet ID (agt_...)
inputrequired objectInput for the workflow's first step
wallet_secretoptional stringRequired instead if your wallet has require_wallet_secret_for_payment enabled — or send it as an X-Wallet-Secret header

Send an Idempotency-Key header (any unique string you generate per attempt) — a genuinely retried request after a dropped connection reuses the same result instead of re-running, and re-charging for, steps that already succeeded.

Example — cURL
curl -X POST https://runpay-backend-visibility-production.up.railway.app/api/workflows/{workflow-id}/execute \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: wf-exec-a1b2c3" \
  -d '{
    "agent_id": "agt_your_agent",
    "input": {
      "text": "The document to process"
    }
  }'

Leaderboard

Real, verified rankings — every badge requires a genuine minimum sample size and diverse usage across distinct agents. None can be earned from a single call or a handful of self-generated ones.

GET /api/leaderboard

Top APIs, top AI services, and top vendors — each with Verified, Fast, Trending, Premium, and Enterprise Ready badges where genuinely earned.

External Discovery

run.pay aggregates three independent x402 ecosystems alongside its own catalog — the Coinbase x402 Bazaar, Circle's Agent Marketplace, and agent402.tools. Search once, see everything.

POST /api/discover/external

{ "query": "weather forecast", "max_price_usd": 0.05 }

Returns runpay_results (payable directly, payable_via_runpay: true) and external_results — each tagged with its real source (x402_bazaar_external, circle_marketplace_external, or agent402_tools_external). Ecosystem status reported independently via coinbase_status, circle_status, agent402_status — one being down never affects the others.

Each external result includes a runpay_bridge_attempt field:

{ "available": true, "endpoint": "/api/call-external", "note": "..." }

This is an honest, experimental invitation, not a guarantee. run.pay can attempt to pay the external service with its own crypto wallet and bill you in USD via /api/call-external — verified to work end-to-end against lenient verifiers, but known to fail against some strict production verifiers for reasons not yet fully resolved. External results are never pre-certified as "payable" — that would require testing every provider with real funds, which we don't do speculatively.

Native Crypto Payment (x402)

run.pay accepts native crypto payment (USDC on Base) directly, alongside Stripe — no account, no API key, no wallet setup on our side needed by the buyer. Standard x402 protocol, scheme exact, verified and settled by run.pay itself, no third-party facilitator dependency. Confirmed working end-to-end with real, verifiable on-chain settlement across multiple services.

POST /x402-crypto/:serviceId

Call without a PAYMENT-SIGNATURE header to receive a real 402 challenge (also mirrored in the PAYMENT-REQUIRED response header, base64-encoded):

{ "x402Version": 2, "accepts": [{ "scheme": "exact", "network": "eip155:8453", "amount": "...", "asset": "0x8335...", "payTo": "0x...", "maxTimeoutSeconds": 300, "extra": { "name": "USD Coin", "version": "2" } }] }

Sign an EIP-3009 transferWithAuthorization for the exact amount, then retry the same request with PAYMENT-SIGNATURE: <base64(payload)>. The vendor is called and must succeed before any real settlement is submitted on-chain — if the vendor call fails, you are never charged.

service_id works for any active service in the catalog — find it via x402_crypto_endpoint on /api/services.

Architectural note — not yet implemented. Google's Agent Payments Protocol (AP2) defines an authorization layer above settlement — cryptographically signed mandates proving a human genuinely delegated a purchase before it happens. x402 is one of AP2's own supported settlement rails (Coinbase co-developed the integration). Because run.pay's native x402 implementation already handles real settlement independently, adding AP2 support later means layering authorization on top of what already works — not rebuilding payment from scratch. No timeline committed yet; flagged here for anyone evaluating run.pay's readiness for that ecosystem.

Machine Payments Protocol (MPP)

Stripe and Tempo's open standard for agent payments — a real, third native payment path alongside Stripe checkout and x402 crypto. Runs entirely on run.pay's existing Stripe infrastructure; no new dependency. Minimum $0.50 per charge — a real card network rule, not a run.pay restriction.

POST /mpp/:serviceId

Call without a PAYMENT-CREDENTIAL header to receive a real 402 challenge (RFC 9457 Problem Details format, with a WWW-Authenticate: Payment header). Obtain a Shared Payment Granted Token (spt_...) from your own payment provider, scoped to at least the requested amount, then retry with PAYMENT-CREDENTIAL: spt_....

Services priced below $0.50 are not available via MPP — a real card network minimum, not something run.pay can waive.

UCP Discoverability

run.pay publishes a standard Universal Commerce Protocol manifest so UCP-aware agents can discover it without hard-coded integration.

GET /.well-known/ucp

Returns run.pay's real service and payment-handler manifest. Honestly scoped: run.pay sells directly-payable API calls, not shopping carts — the manifest reflects that rather than forcing generic e-commerce semantics. Declares both real payment handlers already live: x402 and mpp.

Agent Economic Layer

Newer, use with care. These primitives are newer than the rest of the platform. Verified against the live schema and tested end-to-end in production, but still evolving. Loans and insurance carry a real, low default safety cap (currently $50) pending full legal review of lending/insurance regulations in your jurisdiction — see legal.html §5A. Both require an explicit acknowledge_risk: true field to use.

Beyond calling services, agents can transact directly with each other. All routes are POST to /internal/{name} with an X-RunPay-Agent header and an action field selecting the operation.

RoutePurpose
/internal/loanPeer-to-peer collateralized lending with real interest — action=request then action=fund
/internal/stakeFinancially-backed sponsorship, slashed on the protégé's verified default
/internal/syndicateShared wallets with M-of-N approval thresholds for spending
/internal/contracttransferTransfer an active contract obligation to a new agent
/internal/truthmarketStake real money behind a real-world claim, challengeable, resolved by peer jury
/internal/insuranceIndividually-underwritten policies between agents — action=offer then action=buy
/internal/revenueshareSell a capped percentage of future earnings for upfront capital
/internal/capacityfuturesLock in future task capacity at a fixed price
/internal/disputejuryPeer-jury resolution for rejected transaction disputes

Spending Mandates (AP2-inspired)

A real human can cryptographically pre-authorize what an agent may spend, before any call happens — reusing the same EIP-712 signature infrastructure as native crypto payment.

POST /api/agents/mandates

Requires the agent's real wallet_secret to prove genuine ownership before a mandate can be created for it. Body: { agent_id, signer_address, max_amount_per_call, max_total_amount, allowed_service_id, allowed_category, min_vendor_score, expires_at, signature, nonce, wallet_secret }. allowed_category and min_vendor_score are genuinely part of the cryptographically signed payload — never falsifiable metadata added after the fact. Checked automatically before every call this agent makes, until it expires, is revoked, or its total is exhausted.

Guard (Risk Engine)

A real, unified decision engine — combines trust score, active mandate limits, and the human approval threshold into one coherent verdict. Read-only: it never commits a spend itself, real enforcement still happens at actual payment time.

POST/api/guard/evaluate

Body: { agent_id, amount_usd, vendor_id, service_id }. Returns { verdict: "green"|"yellow"|"red", trust_score, reasons[] }. A non-existent agent genuinely returns red; a registered agent with no history yet returns yellow — never silently treated as fully trusted.

Intent Firewall

Distinct from Guard: Guard asks "can this agent spend this amount?" — Intent Firewall asks "is this actually what the agent said it was going to do?" A real, direct mitigation against prompt-injection and context-manipulation risks in agentic payment flows.

POST/api/intents/declare

Body: { agent_id, description, expected_category, max_expected_amount, ttl_seconds }. Returns a short-lived intent_id (default 5 min, max 1h).

POST/api/intents/:id/verify

Body: { service_id, amount_usd }. Returns { matches: true|false, reason } — checks category match exactly, and amount within a real 10% tolerance of what was declared.

Multi-Rail Router

Recommends the real best payment rail among those actually built and working — x402 crypto, MPP, Stripe, and now XRPL.

POST/api/pay/route

Body: { amount_usd, prefers_crypto }. Returns recommended_rail plus every rail's real availability — e.g. MPP is honestly marked unavailable below its real $0.50 card-network minimum. This is routing guidance only, it never executes a payment itself.

Agent Passport

A real aggregation, never a new source of truth — pulls identity verification, wallet status, reputation, active mandate, and recent activity into one unified view.

GET/api/agents/:agent_id/passport

Also see GET /api/agents/:agent_id/score-explained for a real, honest breakdown of exactly how the trust score was reached — real point values, never an opaque number.

Accounting

Real spending broken down by service category — reuses the existing hierarchical wallet system for a genuine fleet-wide view when an agent has children.

GET/api/agents/:agent_id/accounting?days=30

Returns totals and a real per-category breakdown. Not a legal invoice — no VAT/tax jurisdiction handling. A formatted single-transaction receipt is also available at GET /api/agents/:agent_id/accounting/receipt/:transaction_id.

Treasury

A real enrichment of the hierarchical wallet system — group child agents into departments for cost-center-style aggregation.

GET/api/agents/:agent_id/treasury

Pass an optional treasury_department when creating a child via POST /api/agents/children. Returns allocated-remaining and spent totals grouped by department.

Financial Dashboard

A real fleet-wide summary — total agents, balance, today's spend, transaction count, failure rate, pending approvals.

GET/api/agents/:agent_id/dashboard

risk_alerts is honestly a live count of currently low-trust agents in the fleet — run.pay does not store a historical log of past Guard verdicts, so this is never a count of past incidents.

Observability

Connects the Intent Firewall to the real transaction it resulted in — a complete, real audit chain: declared intent → vendor selected → price → payment status.

POST/api/intents/:id/link-transaction

Body: { transaction_id }. Then view the full real chain at GET /api/observability/:transaction_id.

Economic Chains

A real, hash-chained ledger for multi-hop agent-to-agent workflows — genuinely a ledger, never an auto-executing orchestrator. Each agent reports its own real payment, already made separately through the normal payment routes.

RoutePurpose
POST /api/chains/createStart a new chain
POST /api/chains/:id/hopReport a real hop that already happened
GET /api/chains/:idView the full hash-chained history and totals

Smart Ranking

An honestly-documented composite ranking — never an opaque score. Add sort=smart to /api/services/catalog.

Formula: 50% trust score, 25% price (cheaper scores higher), 25% latency (faster scores higher). Exposed on each result as smart_score.

Kill Switch

Admin only. Requires the real X-Admin-Key header.

A real, three-level emergency freeze — platform-wide, per-agent, or per-vendor — checked before every real payment across x402, native crypto, MPP, and XRPL.

RoutePurpose
POST /api/admin/kill-switch/freeze-allBlocks every payment on the platform, immediately
POST /api/admin/kill-switch/freeze-agent/:agent_idBlocks a specific agent
POST /api/admin/kill-switch/freeze-vendor/:vendor_idBlocks a specific vendor
GET /api/admin/kill-switch/statusReal current freeze status at every level

SDK Reference

Python

pip install runpay
import runpay

runpay.configure(agent_id="agt_your_agent")

# Call any service by ID
result = runpay.call("halludetect", {"response": "..."})

# List available services
services = runpay.services(category="AI")

# Check wallet balance
balance = runpay.wallet()

JavaScript

npm install runpay
const { configure, call, services, wallet } = require('runpay')
// or: import { configure, call, services, wallet } from 'runpay'

configure('agt_your_agent')

// Call any service by ID
const result = await call('halludetect', { response: '...' })

// List available services
const allServices = await services('AI')

// Check wallet balance
const balance = await wallet()

Framework Guides

LangChain

Generate all 205 services as ready-to-use LangChain tools in one line — no manual wrapping needed:

Python — pip install runpay[langchain]
from runpay.langchain import get_tools

tools = get_tools(agent_id="agt_your_agent")                      # all your available services
tools = get_tools(agent_id="agt_your_agent", category="Security")  # just one category

from langchain.agents import initialize_agent
agent = initialize_agent(tools, llm, agent="zero-shot-react-description")

CrewAI

Same idea — generated automatically from the live catalog:

Python — pip install runpay[crewai]
from runpay.crewai import get_tools

tools = get_tools(agent_id="agt_your_agent")

from crewai import Agent
researcher = Agent(role="Researcher", goal="...", tools=tools)

AutoGen

No dedicated integration yet — wrap the function you need directly:

Python
import autogen
import runpay

runpay.configure(agent_id="agt_your_agent")

def check_hallucination(response: str) -> dict:
    """Check if an LLM response contains hallucinations."""
    return runpay.call("halludetect", {"response": response})

assistant = autogen.AssistantAgent(
    name="assistant",
    llm_config={
        "functions": [{
            "name": "check_hallucination",
            "description": "Check LLM output for hallucination risk",
            "parameters": {"type": "object", "properties": {"response": {"type": "string"}}}
        }]
    }
)
autogen.register_function(check_hallucination, caller=assistant)

Error Handling

StatusError codeMeaning
400invalid_payloadMissing required field or wrong format
401invalid_agentAgent ID not found or inactive
402insufficient_balanceWallet balance too low — add funds
429rate_limitedToo many requests — retry with backoff
500service_errorService temporarily unavailable
Python — error handling
import runpay
from runpay import RunpayError, InsufficientBalanceError

try:
    result = runpay.call("halludetect", payload)
except InsufficientBalanceError as e:
    print(f"Need ${e.required}, have ${e.balance}")
    add_funds_to_wallet()
except RunpayError as e:
    print(f"Call failed: {e}")

Publishing a Service (Providers)

Publish your API on run.pay and every AI agent developer becomes a potential customer. You keep 98% of every call.

1

Register as a vendor

bash
curl -X POST .../api/vendors/register \
  -d '{"email": "you@company.com", "name": "My Service"}'

# Returns: {"vendor_id": "...", "api_key": "vnd_xxxxxxxxxx", "stripe_onboarding_url": "..."}
2

Publish your service

There's no SDK method for this yet — publish directly via the API, or from your vendor dashboard:

bash
curl -X POST .../api/services \
  -H "x-api-key: vnd_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My Web Scraper",
    "description": "Scrape any URL, returns clean markdown",
    "price_per_call": 0.05,
    "endpoint_url": "https://api.yoursite.com/scrape",
    "category": "DATA",
    "schema_input": {
      "url": "URL to scrape"
    }
  }'

Pricing Guide

You set your own price per call — run.pay takes a flat 2% commission, no subscription, no listing fee. Payouts go to your connected Stripe account.

ModelWhat happens
You set price_per_callAny amount from $0.001 to $1000, whatever your service is worth
Agent paysFull price_per_call, charged automatically per call
You receive98% of each call, added to your Stripe balance
PayoutsAutomatic every 7 days, or request one manually from your vendor dashboard
There's no minimum price, but very low prices (under ~$0.01) mean you'll rarely see a payout on its own — most vendors batch several cheap services under one Stripe account.

Analytics

Your vendor dashboard shows live revenue, calls per service, error rates, and a breakdown by agent — no separate analytics API needed for normal use. If you're building your own reporting, the same data is available at GET /api/vendors/stats and GET /api/vendors/analytics (both require your x-api-key header).

Webhook Format

When an agent calls your service, run.pay forwards the agent's payload directly to your endpoint — no wrapper object, just the raw payload the agent sent:

Incoming request to your endpoint
POST https://api.yoursite.com/your-endpoint
Content-Type: application/json
X-RunPay-Call-Id: 1735689600.a1b2c3d4e5f6...
X-RunPay-Agent: agt_caller_agent
X-RunPay-Protocol: x402
X-RunPay-Signature: sha256=...

{ ...agent's raw input, exactly as they sent it... }
Verify the signature: find your signing secret in your vendor dashboard → Settings → Security, then verify each incoming call:
Node.js
const crypto = require('crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', SIGNING_SECRET)
  .update(rawRequestBody).digest('hex');
if (expected !== req.headers['x-runpay-signature']) {
  return res.status(401).json({ error: 'Invalid signature' });
}
Note: the agent's identity is in the X-RunPay-Agent header, not in the request body — your endpoint receives only the payload fields your service expects (e.g. {"text": "..."}), not a wrapper object.

API Reference — List Services

GET /api/services List all available services
Query paramTypeDescription
limitoptional numberMax results (default: 50, max: 200)
categoryoptional stringFilter by: AI, DATA, MEDIA
searchoptional stringSearch by name or description

API Reference — Call Service

POST /api/call/:service_id

The service ID is the UUID from GET /api/services. Your agent's card on file is charged directly for this specific call.

Request
POST https://runpay-backend-visibility-production.up.railway.app/api/call/<service_id>
Content-Type: application/json

{
  "agent_id": "agt_your_agent_id",
  "payload": { ...whatever this specific service expects... }
}
Most agents use the SDK instead (runpay.call()), which talks to the newer /x402/:serviceId endpoint and handles wallet balance + auto top-up automatically. This endpoint charges your card directly per call — useful if you're not using the SDK.
Try any service for free in the interactive playground — first 3 calls free, no credit card.

API Reference — Wallet

GET /api/agents/wallet/:agentId Check balance and spending history
X-Wallet-Secret required for agents created after this protection was added — find yours in your agent dashboard. Older agents can still access their wallet without it.
{
"agent_id": "agt_abc123xyz",
"balance": 4.99,
"total_spent": 0.12,
"mode": "production"
}

API Reference — Vendors

POST /api/vendors/register Create a vendor account

See the Publishing a Service section above for the full signup + publish flow.

GET /api/vendors/stats Revenue, calls, and balance for your account

Requires your x-api-key header. Powers the vendor dashboard Overview tab — same data.

PATCH /api/vendors/services/:id Update one of your own listed services

Requires your x-api-key header. Every field is optional — send only what you're changing. Real fields: active (bool), price_per_call (0.005–0.10), name, min_agent_score (0–1000 or null), high_trust_threshold / high_trust_discount_pct, trust_discount_tiers, allow_vouching.

Schema declaration: schema_input and schema_output — a real JSON Schema object for each (must include at least a type field, or the update is rejected). Most services currently have no declared schema at all — this is genuinely optional, but declaring one lets agents and integration partners validate a request before sending it, instead of guessing from examples.

{
  "schema_input": { "type": "object", "properties": { "phone": {"type": "string"} }, "required": ["phone"] },
  "schema_output": { "type": "object", "properties": { "is_valid": {"type": "boolean"} } }
}

Enterprise — Getting Started

Organizations centralize spend, identity, and control across every agent a company runs. An organization is owned by a verified vendor account — creating one doesn't require completing Stripe payout onboarding, just a vendor account with an API key.

POST /api/vendors/organizations Create an organization
FieldTypeDescription
namestringOrganization display name
Access key shown once. The response includes an access_key — this is how agents authenticate to see and call the organization's private catalog. It cannot be recovered later; if lost, rotate it (see Ownership & deletion).
The full workflow — creating an org, inviting members, funding the wallet, reviewing the audit log — is easiest through the Enterprise dashboard rather than raw API calls.

Members & Roles

Four roles, in order: viewer (read-only) < member (use the catalog and wallet) < admin (manage services, wallet, members) < owner (the vendor who created the organization — full control, including billing and deletion).

POST /api/vendors/organizations/:orgId/members Invite a member
FieldTypeDescription
emailstringInvitee's email
rolestringviewer, member, or admin

Returns a one-time invite_token. Send it to the invitee directly — it's used at POST /api/organizations/members/accept to activate their membership and generate their own personal token.

POST /api/organizations/members/accept Accept an invite

Body: { "invite_token": "inv_..." }. Returns a personal personal_token, shown once — this authenticates the member for every role-gated action, sent as an X-Member-Token header instead of the owner's X-Api-Key.

Members sign in separately from owners — the Enterprise dashboard has a distinct "Sign in as member" flow using this personal token, alongside the organization ID they were invited to.
POST /api/vendors/organizations/:orgId/members/:memberId/resend Resend a pending invitation

Admin role required. Only valid while the member is still pending. Issues a fresh invite_token — the previous one stops working immediately. Returns { success, email, invite_token }.

POST /api/vendors/organizations/:orgId/members/reset-token Member: replace a lost personal token

Public — no authentication. Body: { "email": "..." }. If the email belongs to an active member of this organization, a new personal token is emailed and the old one stops working. The response is always the same generic message, so the endpoint never reveals whether an email exists. Rate limited to 3 requests per hour per email.

POST /api/vendors/organizations/:orgId/owner/reset-secret Owner: replace a lost wallet secret

Public — no authentication. Body: { "email": "..." }, matched against the owner agent's email on file. A wallet secret is only ever stored hashed, so it can never be recovered — it is replaced: a new one is emailed and the old one stops working at once. It controls both the owner's own agent wallet and ownership of the organization. Same generic response and same 3-per-hour limit.

Shared Wallet & Spending Limits

One real shared balance, distinct from individual agent wallets. An agent explicitly linked to the organization draws exclusively from this pool for every call — never its own wallet, as long as it stays linked.

POST /api/vendors/organizations/:orgId/wallet/link-agent Link an agent to the shared wallet
FieldTypeDescription
agent_idstringThe agent to link
daily_limit_usdoptional numberPer-agent daily cap within the shared pool — omit for no limit
POST /api/vendors/organizations/:orgId/wallet/credit Fund the shared wallet

Body: { "amount_usd": 500 }. Manual crediting for now — no self-service card charge flow exists yet specifically for wallet top-ups (distinct from the $1,999/month subscription itself, which does have real Stripe checkout).

GET /api/vendors/organizations/:orgId/analytics Spending by agent and by day

Query param days (default 30, max 90). Returns per-agent totals and a daily trend, for agents linked to this organization's wallet.

GET /api/vendors/organizations/:orgId/approvals Pending human approvals, across every linked agent

Viewer role. Query status (default pending), newest first, up to 100. Each item: id, agent_id, service_id, service_name, amount_usd, status, created_at, expires_at. Only agents linked to this organization appear.

POST /api/vendors/organizations/:orgId/approvals/:id/decide Approve or reject a request

Admin role. Body: { "decision": "approve" | "reject" }. Returns 403 if the approval belongs to an agent outside this organization, and 404 if it was already resolved or has expired. The decision is claimed atomically — two admins deciding at the same instant can never both succeed — and is written to the audit log.

GET /api/vendors/organizations/:orgId/smart-routing Share of traffic using automatic failover

Viewer role. Over the last 30 days: how many calls went through failover or parallel-race routing versus direct calls. Returns total_real_calls_30d, smart_routed_calls, smart_routed_pct, smart_routed_spend_usd, direct_spend_usd. Direct calls are a choice, not a failure.

GET /api/agents/:agent_id/limits Current limits for one agent

Authenticated with the agent's wallet secret, or that of the organization that owns it. Returns maintain_minimum_usd, max_balance_usd and daily_call_limits — each null when unset.

Private Marketplace

Publish internal APIs visible only to your own agents, plus an explicit allowlist of public services — never implicit access to the full public catalog.

POST /api/vendors/organizations/:orgId/private-services Publish an internal API

Same validation as a public service — HTTPS required, price between $0.005–$0.10. It never appears in the public catalog, ranking, or discovery.

POST /api/vendors/organizations/:orgId/allowed-task-types Restrict agents to specific task types

Body: { "task_types": ["ocr", "translation"] }. Opt-in only — an empty array (the default) means no restriction. Once set, agents linked to this organization's wallet can only call services of these types.

How agents call a private service. Exactly like any other service — POST /x402/:serviceId — plus two headers: X-Payment: <agent_id> and X-Org-Access-Key: <your organization access key>. Without a valid key the service answers 404, identical to an unknown service, so its existence is never revealed. The access key can be rotated at any time.

SSO (OIDC)

First implementation. Tested against real attack patterns (PKCE, algorithm confusion, replay, SSRF via a malicious discovery document) — but authentication infrastructure deserves an external security review before relying on it for sensitive access, not just internal testing.
POST /api/vendors/organizations/:orgId/sso/config Configure an identity provider
FieldTypeDescription
issuer_urlstringYour IdP's OIDC issuer (HTTPS only)
client_id / client_secretstringFrom your IdP
redirect_uristringWhere the IdP sends the browser back
default_rolestringRole assigned on first SSO sign-in

Sign-in URL: GET /api/organizations/:orgId/sso/login. Uses PKCE (RFC 9700) and real RS256 signature verification against your IdP's JWKS — no third-party JWT library, only Node's built-in crypto.

POST /api/vendors/organizations/:orgId/sso/test Test an OIDC issuer before saving it

Admin role. Body: { "issuer_url": "https://..." } (HTTPS only). Fetches the issuer's discovery document and checks that it is reachable, that its issuer matches the URL you entered, and that token_endpoint and jwks_uri are present and safe. Returns { ok: true, issuer, token_endpoint } or { ok: false, error }. It does not verify client_id or client_secret — those can only be checked by a real sign-in.

SLA & Audit Log

GET /api/organizations/:orgId/sla Measured uptime vs. target

Measured from real health checks recorded every 5 minutes — never backfilled. If tracking began partway through the requested period, the response says so explicitly rather than treating missing history as compliant.

GET /api/vendors/organizations/:orgId/audit-log Every action, attributed and timestamped

Membership changes, service publishing, wallet activity, config changes — each entry records whether the owner or a specific member (and their role) performed it.

GET /api/vendors/organizations/:orgId/sla-tracking Measured uptime against declared SLA tiers

Viewer role. For every service your agents used in the last 30 days: real call count, measured_uptime_pct, and each declared SLA tier with meets_target. Computed only from your own transaction outcomes — never a vendor's self-reported figure. A service with no declared tiers has no commitment to compare against.

Ownership & Deletion

POST /api/vendors/organizations/:orgId/rotate-access-key Rotate a leaked access key

The old key stops working immediately. Every agent using it needs the new one.

POST /api/vendors/organizations/:orgId/transfer-ownership Hand off to another vendor account

Body: { "new_owner_email": "..." }. The recipient must already have a vendor account. The current owner's owner-level access ends immediately.

DELETE /api/vendors/organizations/:orgId Permanently delete an organization

Body: { "confirm_name": "..." } — must exactly match the organization's name. Refused if the wallet balance isn't zero. Private services are deactivated, never deleted, to preserve past transaction history.

Services — AI Safety

ServicePriceKey output
Hallucination Detector$0.01hallucination_score, risk_level
PII Scanner$0.01pii_found, findings[]
GDPR Compliance Checker$0.02gdpr_compliant, issues[]
AI Act Compliance$0.02risk_category, obligations[]
Bias Detector$0.02bias_score, biases[]
Sycophancy Detector$0.01sycophancy_score, signals[]
Logical Fallacy Detector$0.01fallacies[], count
Ethical Red Teamer$0.02attack_vectors[], severity

Services — Data

ServicePriceKey output
Statistics Calculator$0.005mean, std, percentiles
Synthetic Data Generator$0.01records[], count
Monte Carlo Simulator$0.02mean, percentiles.p95, histogram
CSV Validator$0.005valid, errors[]
Data Profiler$0.01quality_score, columns
Hypothesis Tester$0.005p_value, conclusion
Semantic Diff$0.01similarity, change_magnitude

Services — Reasoning

ServicePriceKey output
Moral Reasoning Engine$0.02consensus, recommendation
Simulation Sandbox$0.01safe_to_execute, risk_score
Goal Decomposer$0.01subtasks[], critical_path
Argument Extractor$0.01pros[], cons[], balance
Chain of Thought Validator$0.005is_coherent, issues[]
Counterfactual Generator$0.01scenarios[], probability
Error Propagation Analyzer$0.01blast_radius, impacted_steps_detail[]

Complete API Reference — Everything Else

Every remaining platform route, in one place. Descriptions marked with real response fields were derived directly from the actual code, not written from memory. Internal per-service implementation routes (the 200+ marketplace services themselves) are intentionally excluded here — browse those via GET /api/services/catalog instead.

Vendor Management (64 routes)

MethodPathDescription
GET/api/vendors/:vendor_id/due-diligenceA binary APPROVED/HIGH_RISK verdict, computed from real vendor data with transparent thresholds.
GET/api/vendors/:vendor_id/passportThe real vendor-side equivalent of Agent Passport — trust, volume, reliability, customers.
POST/api/vendors/affiliate-payoutApi vendors affiliate payout (see implementation for full detail).
GET/api/vendors/affiliationReturns referral_code: myCode, referred_vendors: referred.length, ...
GET/api/vendors/analyticsApi vendors analytics (see implementation for full detail).
GET/api/vendors/audit-logReturns logs
GET/api/vendors/balanceReturns available: 0, pending: 0, currency: 'usd', onboarding_complete: false
POST/api/vendors/disconnect-stripeReturns success: true
GET/api/vendors/disputesReturns count: rows.length, disputes: rows
POST/api/vendors/disputes/:id/respond── POST /api/vendors/disputes/:id/respond — accepter (rembourse
POST/api/vendors/email-exportApi vendors email export (see implementation for full detail).
POST/api/vendors/exchange-handoffDirectement dans l'URL de redirection, qui exposait des identifiants
POST/api/vendors/forgot-keyReturns message: 'Si cet email existe, vous recevrez votre clé API par email.'
POST/api/vendors/loginApi vendors login (see implementation for full detail).
POST/api/vendors/logoutReturns success: true
GET/api/vendors/meReturns vendor: { id: session.vendor_id, email: session.email,
GET/api/vendors/notificationsReturns success: true
POST/api/vendors/notificationsReturns success: true
POST/api/vendors/onboardReturns stripe_onboarding_url: link.url
GET/api/vendors/onboard-linkReturns url: link.url
POST/api/vendors/organizations/:orgId/approve-serviceListe blanche explicite — jamais d'accès implicite à tout le catalogue,
GET/api/vendors/organizations/:orgId/catalogAppliqué au wallet : il ne devrait pas avoir besoin de la clé d'accès
DELETE/api/vendors/organizations/:orgId/members/:memberIdReturns success: true, note: 'Revoked — their personal token no longer authent...
POST/api/vendors/organizations/:orgId/slaReturns success: true, org_id: req.org.id, uptime_target_percent: target
GET/api/vendors/organizations/:orgId/subscriptionReturns org_id: req.org.id, subscription_status: req.org.subscription_st...
POST/api/vendors/organizations/:orgId/subscription/cancelAbonnement existe, sinon marque simplement l'activation manuelle comme
POST/api/vendors/organizations/:orgId/subscription/checkoutDirectement le compte de la plateforme, distinct de Stripe Connect
POST/api/vendors/organizations/:orgId/subscription/send-invoiceUn débit automatique) — une vraie facture envoyée par email, payable via
POST/api/vendors/organizations/:orgId/teams── Équipes/départements — grouper les agents à l'échelle, jamais une
GET/api/vendors/organizations/:orgId/teamsReturns teams: teams.map(t => ({ id: t.id, name: t.name, agent_count: parseInt...
DELETE/api/vendors/organizations/:orgId/teams/:teamIdReturns success: true, note: 'Team deleted — its agents are now ungrouped, not...
POST/api/vendors/organizations/:orgId/unapprove-serviceReturns success: true
GET/api/vendors/organizations/:orgId/walletConsulter son propre solde sans détenir séparément la clé d'accès
POST/api/vendors/organizations/:orgId/wallet/checkoutDistingué via metadata.type pour que le webhook sache créditer le
POST/api/vendors/organizations/:orgId/wallet/link-agents-bulkCertains agents échouent individuellement, plutôt que de tout annuler
POST/api/vendors/organizations/:orgId/wallet/unlink-agentReturns success: true, note: 'This agent now uses its own individual wallet ag...
POST/api/vendors/payoutApi vendors payout (see implementation for full detail).
GET/api/vendors/payoutsReturns payouts: []
POST/api/vendors/rotate-keyReturns success: true, new_key: newKey
GET/api/vendors/servicesApi vendors services (see implementation for full detail).
POST/api/vendors/servicesApi vendors services (see implementation for full detail).
GET/api/vendors/services/:id/analyticsTâche, jamais une métrique inventée séparément. La géolocalisation des
GET/api/vendors/services/:id/conversionTous deux définis précisément et calculés sur de vraies données, jamais
POST/api/vendors/services/:id/deprecateReturns success: true, note: 'Marked deprecated — existing callers still recei...
GET/api/vendors/services/:id/external-visibilityApi vendors services external visibility (see implementation for full detail).
POST/api/vendors/services/:id/generate-marketing-copyLe schéma réel, la description du vendeur, et les vraies statistiques
GET/api/vendors/services/:id/geolocation── Géolocalisation — trouvé absent en audit, construit honnêtement.
GET/api/vendors/services/:id/marketing-copyReturns draft: service.marketing_copy_draft, published: service.marketing_copy...
POST/api/vendors/services/:id/new-versionApi vendors services new version (see implementation for full detail).
GET/api/vendors/services/:id/pricing-suggestionA real, bidirectional pricing suggestion based on peer pricing and utilization — conflict of interest disclosed.
POST/api/vendors/services/:id/publish-marketing-copyReturns success: true, published: toPublish.trim()
POST/api/vendors/services/:id/sla-tiersCreate a priced SLA tier (Standard/Premium/Enterprise) for a service.
GET/api/vendors/services/:id/uptimeÉtablie ailleurs (status_code >= 500), jamais une nouvelle mesure
POST/api/vendors/services/parse-openapiSpécifications JSON OpenAPI 3.x, pas de YAML (aucune dépendance
POST/api/vendors/services/unpublish-allReturns success: true
POST/api/vendors/test-webhookReturns success: response.ok, status: response.status, ms, body: body.slice(0,...
GET/api/vendors/transactionsApi vendors transactions (see implementation for full detail).
GET/api/vendors/transactions/exportReturns vendor_id: req.vendor.id, count: chain.length, transactions: chain, no...
POST/api/vendors/transactions/verifyRecalculer la chaîne à partir d'un export et confirmer qu'elle n'a
POST/api/vendors/update-profileReturns success: true
POST/api/vendors/verify-session── POST /api/vendors/logout — révoquer le token ────────────────────────────
POST/api/vendors/webhookReturns message: webhook_url ? 'Webhook enregistré' : 'Webhook supprimé', webh...
POST/api/vendors/workflowsDe schéma entre étapes, jamais deviné à l'exécution. Chaque étape sera
GET/api/vendors/workflowsReturns count: rows.length, workflows: rows.map(w => ({ id: w.id, name: w.name...

Agent Management (40 routes)

MethodPathDescription
GET/api/agents/:agentId/cost-optimizationAyant une fiabilité comparable ou meilleure — jamais juste "le moins cher"
GET/api/agents/:agentId/trust-summaryRéussite de contrats, et l'historique d'abonnements en un seul
GET/api/agents/:agent_id/accounting/receipt/:transaction_idVrai reçu formaté pour une transaction précise — jamais une nouvelle
POST/api/agents/:agent_id/capabilitiesDeclare what this agent can/cannot do — self-declared, never independently verified.
GET/api/agents/:agent_id/certificationReal track-record-based certification — never simulated security testing.
GET/api/agents/:agent_id/economy-graphReal graph edges — this agent's vendor/service relationships, weighted by real transaction history.
GET/api/agents/:agent_id/erc8004-registration-fileParfaitement conforme, seulement une vraie meilleure tentative
GET/api/agents/:agent_id/lifecycle-statusHonest status across all 15 stages of the agent economic lifecycle.
POST/api/agents/:agent_id/request-budget-increaseA child agent requests more budget from its parent — evaluated via Guard.
GET/api/agents/:agent_id/sandbox/reportReal usage-pattern report from a sandbox session.
POST/api/agents/:agent_id/sandbox/startStart a 24h session with $10,000 virtual balance — never real money.
GET/api/agents/:agent_id/score-explainedVrai journal historique exact événement par événement — celui-là
POST/api/agents/:agent_id/stress-testTests run.pay's own defenses against adversarial-shaped requests — not the agent's own resistance to prompt injection.
POST/api/agents/:parent_id/treasury/move-fundsMove funds between two specific child agents under the same parent.
GET/api/agents/analyticsApi agents analytics (see implementation for full detail).
GET/api/agents/approvalsReturns count: rows.length, approvals: rows.map(r => ({ id: r.id, service_id: ...
POST/api/agents/approvals/:id/approveReturns success: true, approval_id: claimed.id, service_id: claimed.service_id...
POST/api/agents/approvals/:id/rejectReturns success: true, approval_id: claimed.id, status: 'rejected'
GET/api/agents/chart/:agentIdReturns days, total_calls: totalCalls
POST/api/agents/childrenLa création : sans carte propre, il ne peut jamais dépenser au-delà de
POST/api/agents/children/activityTransforme le contrôle budgétaire en vraie supervision (où part l'argent,
POST/api/agents/children/listRemettre le solde du parent si la création de l'enfant échoue après le prélèvement
POST/api/agents/confirm-cardReturns success: true, message: 'Carte attachée avec succès'
POST/api/agents/dashboardTableau de bord unifié : rassemble en lecture seule ce qui est aujourd'hui
POST/api/agents/disputesAprès l'appel, une seule contestation par transaction (garantie par la
GET/api/agents/identity-status/:agent_idVrai statut de vérification — jamais un vrai secret sensible exposé,
POST/api/agents/import-attestationAILLEURS, le vérifier structurellement, et l'afficher à côté du vrai
GET/api/agents/leaderboardReturns count: top.length, agents: top.map((a, i) => ({ rank: i + 1,
GET/api/agents/mandates/:agent_idReturns mandates
POST/api/agents/mandates/:id/revokeReturns success: true
POST/api/agents/remove-cardReturns success: true, removed: true, message: 'Card removed successfully'
POST/api/agents/resendReturns success: true
POST/api/agents/rotate-idSi un ID a fuité, on peut le remplacer, ce qui rend l'ancien totalement
POST/api/agents/settingsApi agents settings (see implementation for full detail).
POST/api/agents/stripe-setupApi agents stripe setup (see implementation for full detail).
POST/api/agents/test-webhookReturns success: response.ok, status: response.status, ms, body: body.slice(0,...
GET/api/agents/transactions/:agentIdReturns transactions: txs, total: parseInt(total?.count || 0),
POST/api/agents/trust-certificate(24h) pour qu'une preuve périmée ne puisse pas circuler indéfiniment comme
POST/api/agents/verify-identityJamais reconstructible avec un nouvel agent après un mauvais
GET/api/agents/walletReturns agent_id: wallet.agent_id, wallet_id: wallet.id, stripe_payment_method...

Admin & Platform Operations (27 routes)

MethodPathDescription
POST/api/admin/benchmark-cases── Banc d'essai — cas de test réels uniquement, jamais inventés côté
GET/api/admin/benchmark-casesReturns count: cases.length, cases
DELETE/api/admin/benchmark-cases/:idReturns success: true
GET/api/admin/bridge-statsFonctionnent vraiment avec notre implémentation, plutôt que de
GET/api/admin/collusion-flagsSignalements de collusion, pour revue humaine — pas une punition
POST/api/admin/collusion-flags/:id/dismissAutomatique, un vrai signal statistique à examiner.
GET/api/admin/disputesReturns count: disputes.length, disputes
POST/api/admin/disputes/:id/resolve── Admin — file d'attente des contestations rejetées ou non résolues ────
POST/api/admin/fix-serviceReturns message: 'Service mis à jour', service
POST/api/admin/fix-vendorReturns message: 'Vendeur mis à jour', vendor
GET/api/admin/jobs-healthReturns jobs, generated_at: new Date().toISOString()
POST/api/admin/kill-switch/freeze-agent/:agent_idReturns success: true, agent_id: req.params.agent_id
POST/api/admin/kill-switch/freeze-allReturns success: true, note: 'ALL payments across the entire platform are now ...
POST/api/admin/kill-switch/freeze-vendor/:vendor_idReturns success: true, vendor_id: req.params.vendor_id
GET/api/admin/kill-switch/statusReturns platform, frozen_agents: frozenAgents, frozen_vendors: frozenVendors
POST/api/admin/kill-switch/unfreeze-agent/:agent_idReturns success: true, agent_id: req.params.agent_id
POST/api/admin/kill-switch/unfreeze-allReturns success: true
POST/api/admin/kill-switch/unfreeze-vendor/:vendor_idReturns success: true, vendor_id: req.params.vendor_id
POST/api/admin/organizations/:orgId/subscription/activate-manually── Activation manuelle — pour les ventes négociées, cohérent avec une
GET/api/admin/overviewClés vendeur vnd_... — variable d'environnement ADMIN_KEY côté Railway.
GET/api/admin/servicesReturns services: withHealth, total: withHealth.length
GET/api/admin/services/:id/failuresReturns failures, total: failures.length
POST/api/admin/services/:id/reactivate(utile si le vendeur ne réagit pas et que tu veux forcer la réactivation
GET/api/admin/sybil-signalsReal signals — shared IPs and time-clustered account creation — for potential fake agent farms.
GET/api/admin/transactionsReturns transactions, total: parseInt(total?.n || 0)
GET/api/admin/vendor-concentration-anomaliesFlags vendors whose recent customers are unusually concentrated among brand-new agents.
GET/api/admin/vendorsReturns vendors, total: vendors.length

Service Management (10 routes)

MethodPathDescription
PATCH/api/services/:idApi services (see implementation for full detail).
GET/api/services/:id/benchmark── GET /api/services/:id/benchmark — résultats agrégés, un signal séparé
POST/api/services/:id/reviewApi services review (see implementation for full detail).
GET/api/services/:id/reviewsReturns reviews, avg_rating: parseFloat(stats?.avg_rating || 0).toFixed(1), to...
GET/api/services/:id/sla-tiersReturns service_id: req.params.id, tiers
GET/api/services/:id/sla-tiers/:tier_id/complianceReturns tier_id: tier.id, tier_name: tier.tier_name, promised_uptime_pct: pars...
GET/api/services/:id/versionsReturns count: versions.length, versions: versions.map(v => ({ s...
GET/api/services/by-task/:taskTypeLatence et taux d'erreur réels sur 7 jours (déjà collectés par
GET/api/services/catalogApi services catalog (see implementation for full detail).
GET/api/services/mineRare plutôt qu'une erreur 500 brute.

Agent Invoicing (4 routes)

MethodPathDescription
GET/api/invoices/:idView an invoice — requires proof of ownership from either party.
POST/api/invoices/:id/acceptRecipient accepts a pending invoice.
POST/api/invoices/:id/payRecipient pays an accepted invoice — real atomic debit/credit.
POST/api/invoices/createCreate a structured payment request from one agent to another.

Organizations (4 routes)

MethodPathDescription
GET/api/organizations/:orgId/catalogAvec la clé d'accès : ses APIs privées + les services publics
GET/api/organizations/:orgId/sso/callbackApi organizations sso callback (see implementation for full detail).
GET/api/organizations/:orgId/sso/loginApi organizations sso login (see implementation for full detail).
GET/api/organizations/:orgId/walletReturns org_id: req.params.orgId, balance: wallet ? parseFloat(wallet.ba...

Economic Chains (3 routes)

MethodPathDescription
GET/api/chains/:idReturns ...chain, hops, total_amount_usd: totalAmount, total_commission_usd: t...
POST/api/chains/:id/hopApi chains hop (see implementation for full detail).
POST/api/chains/createEnchaîne ces vrais rapports avec la même vraie chaîne de hachage déjà

Agent Coordination (3 routes)

MethodPathDescription
GET/api/coordination/searchReturns query: q, bounties: bounties.map(b => ({ type: 'bounty', id: b.id,...
GET/api/coordination/transparencyExistantes. Le genre de chiffre qui donne confiance à quelqu'un qui
GET/api/coordination/trust-graphVraiment tenu, quel escrow reste actif). C'est de l'historique accumulé,

Marketplace Meta (2 routes)

MethodPathDescription
GET/api/marketplaceApi marketplace (see implementation for full detail).
GET/api/marketplace/:idReturns ...service, schema_input: JSON.parse(service.schema_input||'{

Sandbox (2 routes)

MethodPathDescription
POST/api/sandbox/call/:service_idApi sandbox call (see implementation for full detail).
GET/api/sandbox/servicesReturns sandbox: true, note: 'Sandbox mode — calls are free but no real work i...

Support (2 routes)

MethodPathDescription
POST/api/supportReturns success: true
POST/api/support/contactApi support contact (see implementation for full detail).

(1 routes)

MethodPathDescription
GET/Returns status: 'ok', name: 'run.pay', version: '5.0.0', model: '2% commission...

.well-known/agent-trust-protocol.json (1 routes)

MethodPathDescription
GET/.well-known/agent-trust-protocol.jsonReturns protocol: 'agent-trust-certificate', current_version: '1.0', s...

.well-known/agent.json (1 routes)

MethodPathDescription
GET/.well-known/agent.jsonReturns name: 'run.pay', description: 'The API marketplace for AI agents...

.well-known/mcp (1 routes)

MethodPathDescription
GET/.well-known/mcp/server-card.jsonReturns name: 'run.pay Marketplace', description: `Stripe-native marketp...

.well-known/runpay-trust-key.json (1 routes)

MethodPathDescription
GET/.well-known/runpay-trust-key.jsonDe run.pay, peut vérifier un certificat de confiance sans jamais avoir

agent-trust-protocol.md (1 routes)

MethodPathDescription
GET/agent-trust-protocol.mdReturns protocol: 'agent-trust-certificate', current_version: '1.0', s...

api/affiliation (1 routes)

MethodPathDescription
POST/api/affiliation/registerReturns affiliate_code: affiliateCode, affiliate_link: `https://getrunpay....

api/analytics (1 routes)

MethodPathDescription
POST/api/analyticsReturns ok: false

api/call-external (1 routes)

MethodPathDescription
POST/api/call-externalApi call external (see implementation for full detail).

api/config (1 routes)

MethodPathDescription
GET/api/configReturns publishable_key: process.env.STRIPE_PUBLISHABLE_KEY || '', platform: '...

api/contact-sales (1 routes)

MethodPathDescription
POST/api/contact-salesReturns success: true, note: 'Thanks — we\'ll get back to you shortly.'

api/discover (1 routes)

MethodPathDescription
POST/api/discoverApi discover (see implementation for full detail).

api/liability-chain (1 routes)

MethodPathDescription
GET/api/liability-chain/:transaction_idAssembles mandate signer, declared intent, and transaction outcome into one accountability record.

api/market-coverage (1 routes)

MethodPathDescription
GET/api/market-coverageBesoin d'être fraîche à la seconde près.

api/observability (1 routes)

MethodPathDescription
GET/api/observability/:transaction_idApi observability (see implementation for full detail).

api/proof-of-service (1 routes)

MethodPathDescription
GET/api/proof-of-service/:transaction_idA signed, machine-readable receipt for a completed transaction.

api/stats (1 routes)

MethodPathDescription
GET/api/statsApi stats (see implementation for full detail).

api/test-email (1 routes)

MethodPathDescription
GET/api/test-email(Créée via migration auto au démarrage)

api/transactions (1 routes)

MethodPathDescription
GET/api/transactions/vendorPagination par curseur (created_at) — passe ?before=<created_at de la dernière ligne reçue>

api/verify-trust-certificate (1 routes)

MethodPathDescription
POST/api/verify-trust-certificateClé publique seule, mais cette route évite à un vérificateur externe

health (1 routes)

MethodPathDescription
GET/healthReturns status: 'ok', database: 'connected', timestamp: new Date().toISOString...

internal-services/currency-exchange (1 routes)

MethodPathDescription
POST/internal-services/currency-exchangeReturns success: true, from: fromCcy, to: toCcy, amount: amt, converted: data....
MethodPathDescription
POST/internal-services/earthquake-searchVraiment dans le domaine public par la loi, jamais de vraie

internal-services/public-holidays (1 routes)

MethodPathDescription
POST/internal-services/public-holidaysRéseau vers ces vraies API précises. À vérifier une fois en

internal-services/weather-alerts-us (1 routes)

MethodPathDescription
POST/internal-services/weather-alerts-usReturns success: true, state_code: sc, count: alerts.length, alerts

llms.txt (1 routes)

MethodPathDescription
GET/llms.txtReturns name: 'run.pay', description: 'The API marketplace for AI agents...

mcp (1 routes)

MethodPathDescription
POST/mcpReturns jsonrpc: '2.0', id, result: { protocolVersion: '2024-11-...

mcp/invoke (1 routes)

MethodPathDescription
POST/mcp/invokeReturns result: services

mcp/manifest (1 routes)

MethodPathDescription
GET/mcp/manifestReturns schema_version: 'v1', name: 'runpay-marketplace', description:...

openapi.json (1 routes)

MethodPathDescription
GET/openapi.jsonReturns protocol: 'agent-trust-certificate', current_version: '1.0', s...

playground/call (1 routes)

MethodPathDescription
POST/playground/call/:endpointPlayground call (see implementation for full detail).

playground/me (1 routes)

MethodPathDescription
GET/playground/meReturns found: false

playground/quick-signup (1 routes)

MethodPathDescription
POST/playground/quick-signupReturns success: true, agent_id: existing.agent_id, existing: ...

playground/register-trial (1 routes)

MethodPathDescription
POST/playground/register-trialCompteur d'appels gratuits (3/service) soit visible même entre deux sessions

playground/request-trial (1 routes)

MethodPathDescription
POST/playground/request-trialReturns success: true, message: 'Check your email for your trial link.'

playground/session (1 routes)

MethodPathDescription
GET/playground/session/:agentId(ajouté dans initDB automatiquement)

playground/trial (1 routes)

MethodPathDescription
GET/playground/trial/:agentIdReturns found: false

playground/verify (1 routes)

MethodPathDescription
GET/playground/verify/:tokenPlayground verify (see implementation for full detail).

risk/evaluate (1 routes)

MethodPathDescription
POST/risk/evaluateGuard, exposed as a paid B2B API — usable even by callers who don't otherwise use the marketplace.

skill.md (1 routes)

MethodPathDescription
GET/skill.mdSkill.md (see implementation for full detail).

webhooks/stripe (1 routes)

MethodPathDescription
POST/webhooks/stripeWebhooks stripe (see implementation for full detail).

x402 (1 routes)

MethodPathDescription
GET/x402Returns protocol: 'x402', version: '1', scheme: 'runpay-stripe',

x402-flash/:serviceId (1 routes)

MethodPathDescription
POST/x402-flash/:serviceIdAccumulates micro-payments off-chain, settling in one transaction once a $0.50 threshold is reached. Requires X-Wallet-Secret on protected wallets — see Authentication above.

x402-sandbox/:serviceId (1 routes)

MethodPathDescription
POST/x402-sandbox/:serviceIdSame as /x402/:serviceId but spends virtual sandbox balance — real vendor calls, no real money. Requires X-Wallet-Secret on protected wallets — see Authentication above.

x402-tier/:tier_id (1 routes)

MethodPathDescription
POST/x402-tier/:tier_idPay for a specific SLA tier rather than a service's base price. Requires X-Wallet-Secret on protected wallets — see Authentication above.

x402-with-failover/:serviceId (1 routes)

MethodPathDescription
POST/x402-with-failover/:serviceIdTries the primary service; on real failure, automatically retries an alternate of the same task_type. Requires X-Wallet-Secret on protected wallets — see Authentication above.

x402/:serviceId (1 routes)

MethodPathDescription
POST/x402/:serviceIdThe main payment route — call a service, pay per call. Requires X-Wallet-Secret on protected wallets — see Authentication above.

xrpl/:serviceId (1 routes)

MethodPathDescription
POST/xrpl/:serviceIdL'acheteur doit vraiment envoyer le paiement lui-même en premier, puis

Marketplace Service Implementations (Schema Reference)

These are the real backend implementations behind catalog services — never call these /internal/* paths directly. Always invoke through POST /x402/:serviceId, using the real id from GET /api/services/catalog. Listed here for full schema transparency — descriptions were extracted directly from the real request/response fields in the code, never written from memory.

Internal pathReal fields / response (extracted from code)
/internal/abstractlevelReal input fields: text, target_level, source_level = 'auto'
/internal/abtestReal input fields: action, test_key, variants, result_variant, converted — Returns: success: true, action: 'create', test_key, variants: normalizedVariants
/internal/agentcardReal input fields: action, name, description, version = '1.0.0', capabilities = [], provider, conta
/internal/agentcontractReal input fields: action, party_b_id, title, terms, deadline, penalties, contract_id, penalty_usd,
/internal/agentlistingReal input fields: action, name, description, capabilities = [], tags = [], price_per_call, search, — Returns: success: true, action: 'publish', agent_id, name, capabilities, tags, price_per_
/internal/agentmsg─── SERVICES UNIQUES : AGENT INFRA + DATA INTELLIGENCE + FINANCE ────────────
/internal/agentreflectReal input fields: period_hours = 24, goals, focus_area — Returns: success: true, period_hours, message: 'No telemetry data for this period', refle
/internal/agentversionReal input fields: action, version, description, changelog = [], metadata, target_agent_id — Returns: success: true, action: 'publish', agent_id, version, description, changelog_entr
/internal/aiactcheckReal input fields: system_description, use_case, deployment_context
/internal/alertmanagerReal input fields: action, alert_key, condition_type, threshold, window_seconds = 3600, webhook_url — Returns: success: true, action: 'create', alert_key, condition_type, threshold, window_se
/internal/analogyReal input fields: source_domain, target_domain, find_analogies, evaluate_analogy
/internal/anonymizeReal input fields: text, keep_mapping = false, replacement_style = 'label'
/internal/approvalgateReal input fields: action, gate_action, payload, webhook_url, ttl_minutes = 60, gate_id
/internal/argextractReal input fields: text, topic
/internal/audienceadaptReal input fields: text, target_audience, preserve_meaning = true
/internal/auditChaque entrée contient un hash SHA256 du contenu + le hash de l'entrée précédente,
/internal/avatarReal input fields: email, name, size = 80, bg_color, text_color = 'ffffff', style = 'initials'
/internal/barcodeReal input fields: value, format = 'CODE128', width = 2, height = 100, show_text = true
/internal/base64Utile pour les agents qui manipulent des images, fichiers ou données binaires.
/internal/biasdetect─── 12 SERVICES META-INTELLIGENCE ───────────────────────────────────────────
/internal/blueprintReal input fields: action, blueprint_key, config, version = '1.0.0' — Returns: success: true, action: 'save', blueprint_key, checksum, version, size_bytes: con
/internal/bountyN'importe qui peut financer une tâche, pas seulement un accord fermé
/internal/budgetReal input fields: action, budget_key, max_amount, period_days = 30, spend_amount
/internal/businesshoursReal input fields: datetime, timezone = 'UTC', country = 'US', custom_hours
/internal/calendaricsReal input fields: title, start, end, description, location, organizer_email, attendees, rrule, uid
/internal/capabilityregistryReal input fields: action, capability_name, tags = [], description, version = '1.0.0', search, limi — Returns: success: true, action: 'register', agent_id, capability_name, tags, version
/internal/capacityfutures── CAPACITY FUTURES: un agent s'engage à traiter jusqu'à N tâches d'un
/internal/capboundReal input fields: action, allowed_actions, denied_actions, denied_patterns, strict_mode, check_act — Returns: success: true, action: 'set', agent_id, allowed_count: (allowed_actions || []).l
/internal/cardvalidateReal input fields: card_number, card_numbers
/internal/causalchainReal input fields: text
/internal/checkpointReal input fields: action, checkpoint_key, state
/internal/chunkerReal input fields: text, chunk_size = 500, overlap = 50, mode = 'tokens', separator
/internal/circuitbreakerReal input fields: action, service_key, failure_threshold = 5, timeout_seconds = 60
/internal/codeformatReal input fields: code, language = 'json', indent = 2
/internal/collectintelReal input fields: question, responses, aggregation_method = 'weighted_consensus', include_minority
/internal/colorReal input fields: color
/internal/confcalibrateReal input fields: claim, evidence = [], context
/internal/consensusEnvoie une liste de votes/réponses, le service calcule le consensus.
/internal/consensusvoteReal input fields: action, topic, options, votes, vote_option, weight = 1, method = 'majority', thr — Returns: success: true, action: 'create', vote_id: id, topic, options, method, threshold
/internal/contractcheckReal input fields: text, risk_level = 'all'
/internal/contracttemplateTermes à chaque fois, un agent adopte directement un modèle éprouvé —
/internal/contracttransfer── CONTRACT TRANSFERS: cession d'une position contractuelle en cours —
/internal/contradictReal input fields: fact_a, fact_b, context
/internal/convsummarizeReal input fields: messages, target_tokens = 500, format = 'structured', preserve_last = 3
/internal/costConnaître ses propres dépenses cumulées sur run.pay pour rester dans un
/internal/costtrack─── 9 NOUVEAUX SERVICES ─────────────────────────────────────────────────────
/internal/cotvalidateReal input fields: reasoning, conclusion, question
/internal/counterfactualReal input fields: event, counterfactual_condition, context, depth = 3
/internal/countryinfo── 8. COUNTRY INFO ──────────────────────────────────────────────────────────
/internal/creditscore─── 12 SERVICES RARES ───────────────────────────────────────────────────────
/internal/cronparseReal input fields: expression, next_count = 5, timezone = 'UTC'
/internal/csv2json─── GROUPE C : SERVICES UTILITAIRES ZÉRO COÛT (suite) ──────────────────────
/internal/csvtransformReal input fields: csv, action, filter_column, filter_value, sort_column, sort_order = 'asc', selec — Returns: success: true, action: 'info', row_count: rows.length, column_count: columns.len
/internal/csvvalidateReal input fields: csv, schema
/internal/ctxoptimize─── 12 SERVICES RARES — VAGUE 3 ─────────────────────────────────────────────
/internal/currencyReal input fields: from = 'USD', to, amount = 1
/internal/dataprofilerReal input fields: data, csv
/internal/datecalcReal input fields: action, date, date1, date2, amount, unit = 'days', business_days = false
/internal/deadmansswitchReal input fields: action, switch_key, webhook_url, interval_seconds = 3600 — Returns: success: true, action: 'register', switch_key, webhook_url, interval_seconds: tt
/internal/decisiontreeDecisiontree (see implementation).
/internal/dedupeReal input fields: items, threshold = 0.85, key
/internal/diffUtile pour agents de code review, de rédaction collaborative, ou de validation.
/internal/disputejuryReal input fields: action, dispute_id, vote
/internal/divergethinkReal input fields: problem, techniques, count = 5
/internal/dnslookup─── 6 NOUVEAUX SERVICES ZÉRO COÛT ───────────────────────────────────────────
/internal/email─── 5 NOUVEAUX SERVICES : COMMUNICATION + DATA ───────────────────────────────
/internal/emailvalidate── 2. EMAIL VALIDATOR ────────────────────────────────────────────────────────
/internal/embsimilarityReal input fields: vector_a, vector_b, pairs, threshold = 0.8
/internal/errorpropReal input fields: action_chain, error_at_step, error_type
/internal/escrowReal input fields: action, receiver_agent_id, amount_usd, task_description, escrow_id, ttl_hours =
/internal/escrowpoolLes participants ont contribué ET approuvé — contrairement à l'escrow à
/internal/evalexprEvalexpr (see implementation).
/internal/eventlogReal input fields: action, event_type, data, limit = 50, since, event_type_filter — Returns: success: true, action: 'log', event_id: id, event_type, logged_at: new Date(now
/internal/fakedataReal input fields: type = 'person', count = 1, locale = 'en'
/internal/fallacydetectReal input fields: text, texts
/internal/featureflagReal input fields: action, flag_key, enabled, rollout_percent, variant, metadata, flags — Returns: success: true, action: 'set', flag_key, enabled: enabled !== false, rollout_perc
/internal/feedbackReal input fields: action, session_key, rating, comment, metadata — Returns: success: true, action: 'submit', feedback_id: id, session_key, rating: parseInt(
/internal/filetypeReal input fields: base64, filename
/internal/financeReal input fields: action, principal, rate, years, periods_per_year = 12, monthly_payment, loan_amo
/internal/freshnessReal input fields: content, created_at, topic_type, domain
/internal/gametheoryReal input fields: players, payoff_matrix, game_type = 'normal_form'
/internal/gdprcheckReal input fields: text, context = 'general'
/internal/geocodeReal input fields: address, addresses, lat, lon, limit = 5
/internal/goalcheckReal input fields: goals, proposed_action, context
/internal/goaldecompReal input fields: goal, context, max_depth = 3, style = 'hierarchical'
/internal/halludetectReal input fields: response, context, question
/internal/hashgenReal input fields: text, texts, algorithm = 'sha256', hmac_key, encoding = 'hex'
/internal/healthmonitor── 1. AGENT HEALTH MONITOR ───────────────────────────────────────────────────
/internal/html2mdReal input fields: html, url
/internal/htmlsanitizeReal input fields: html, mode = 'safe', allowed_tags, strip_comments = true, strip_scripts = true
/internal/hyptestReal input fields: test, group_a, group_b, alpha = 0.05
/internal/ibanvalidateReal input fields: iban, ibans
/internal/idgenUUID v4, ULID (tri chronologique), NanoID (court), CUID-like, timestamp-based.
/internal/imgcompressReal input fields: image_base64, quality = 80, max_width, max_height, format
/internal/insuranceReal input fields: action, risk_description, premium, payout, period_end, policy_id, claim_descript
/internal/invoiceReal input fields: invoice_number, date, due_date, seller, buyer, items, currency = 'USD', tax_rate
/internal/ipgeoGéolocalisation d'IP via ip-api.com (gratuit, 1000 req/min, aucune clé requise).
/internal/iprepReal input fields: ip, ips
/internal/json2csvReal input fields: data, delimiter = ',', include_header = true, columns — Returns: success: true, csv, row_count: data.length, column_count: keys.length, columns:
/internal/jsonflattenReal input fields: data, action = 'flatten', separator = '.', max_depth = 50
/internal/jsonformatDétecte les erreurs courantes (virgule en trop, guillemets manquants, etc.)
/internal/jsonmerge─── 9 NOUVEAUX SERVICES ZÉRO COÛT ───────────────────────────────────────────
/internal/jsonschemaReal input fields: schema, data, datas — Returns: success: true, mode: 'batch', total: r.results.length, valid_count: r.results.fi
/internal/jwtdecode─── 15 NOUVEAUX SERVICES ────────────────────────────────────────────────────
/internal/keywordsReal input fields: text, top_n = 15, min_length = 3, include_phrases = true
/internal/knowledgegraphReal input fields: text
/internal/langdetectReal input fields: text, texts
/internal/linkextractReal input fields: url, html, include_internal = true, include_external = true, include_emails = tr
/internal/llmrouterReal input fields: task, priority = 'balanced', max_cost_per_1m_tokens, context_length, require_vis
/internal/loanReal input fields: action, principal_usd, interest_rate_percent, term_seconds, loan_id, amount
/internal/lockLe verrou expire automatiquement après expires_in_seconds, donc un agent
/internal/loopdetectReal input fields: action_history, similarity_threshold = 0.8
/internal/mathReal input fields: expression, expressions, precision = 14
/internal/matrixReal input fields: operation, matrix_a, matrix_b, scalar — Returns: success: true, operation, result: m, shape: [n, n]
/internal/md2htmlReal input fields: markdown
/internal/mdtableReal input fields: markdown, data, headers: customHeaders
/internal/meetingschedulerMeetingscheduler (see implementation).
/internal/memimportanceReal input fields: memories, current_goal, top_k
/internal/memorySont des appels HTTP externes vers runpay-services.
/internal/metatagsReal input fields: title, description, url, image, site_name, twitter_handle, type = 'website', loc
/internal/moderateReal input fields: text, texts, categories = ['hate','toxic','adult','violence','spam']
/internal/montecarlo─── 12 SERVICES RARES — VAGUE 2 ─────────────────────────────────────────────
/internal/moralreasonReal input fields: action, context, stakeholders = [], consequences
/internal/narrativeReal input fields: action, narrative_key, character, event, context_update, query: narrativeQuery
/internal/negostratReal input fields: situation, your_goal, counterpart_goal, your_batna, your_position, negotiation_t
/internal/nerReal input fields: text, entity_types
/internal/newssearch─── GROUPES B, C, D : 13 NOUVEAUX SERVICES ──────────────────────────────────
/internal/notifyNotify (see implementation).
/internal/num2wordsReal input fields: number, locale = 'en', currency = false, currency_name = 'dollar'
/internal/numformatReal input fields: number, numbers, format = 'decimal', locale = 'en-US', currency = 'USD', decimal
/internal/ocr─── 6 NOUVEAUX SERVICES ZÉRO COÛT ───────────────────────────────────────────
/internal/pagemetaReal input fields: url, html
/internal/passwordPIN numérique, et hex. Zéro dépendance externe — crypto.randomBytes natif.
/internal/pdf2textReal input fields: pdf_base64, max_pages — Returns: success: true, text,
/internal/permissions─── 6 NOUVEAUX SERVICES GOUVERNANCE + UTILITAIRES ───────────────────────────
/internal/perscheckReal input fields: persona, responses, response
/internal/phoneformatReal input fields: phone, phones, default_country = 'US', format = 'all'
/internal/piiscanReal input fields: text, texts
/internal/pricesReal input fields: type = 'crypto', symbol, symbols, currency = 'usd'
/internal/promptbuildPromptbuild (see implementation).
/internal/promptcheckReal input fields: text, texts
/internal/promptoptimizeReal input fields: prompt, task_type, target_model
/internal/pushnotifyPushnotify (see implementation).
/internal/pwdstrengthReal input fields: password, passwords
/internal/qrcodeGénère un QR code en base64 PNG ou SVG depuis n'importe quel texte/URL.
/internal/ratelimitLa fenêtre se réinitialise automatiquement quand window_seconds s'est écoulé
/internal/readabilityRetourne le texte propre + Markdown optimisé pour injection dans un LLM.
/internal/redteamReal input fields: agent_description, capabilities, use_case, severity_filter = 'all'
/internal/regexReal input fields: pattern, flags = 'g', text, texts
/internal/reputationReal input fields: action, ratee_agent_id, score, comment, context
/internal/responsevalidateReal input fields: response, rules
/internal/retryschedulerReal input fields: action, task_key, payload, max_attempts = 5, base_delay_seconds = 60, error_mess
/internal/revenueshareReal input fields: action, percentage, cap, upfront_price, share_id, earnings_amount
/internal/rhetdetectReal input fields: text
/internal/robotstxtReal input fields: url, content: robotsContent, check_url, user_agent = '*' — Returns: success: true, found: false, url: robotsUrl, message: 'No robots.txt found (HTTP
/internal/rss── 1. RSS FEED READER ────────────────────────────────────────────────────────
/internal/schedulerLui-même si elle est due ("check_due") — pas de webhook automatique,
/internal/schemainferReal input fields: examples, title = 'InferredSchema', required_threshold = 0.9
/internal/semanticdiffReal input fields: text_a, text_b
/internal/semaphoreReal input fields: action, semaphore_key, ttl_seconds = 30
/internal/semcacheReal input fields: action, query: queryText, result, ttl_hours = 24, similarity_threshold = 0.8
/internal/sentimentSupporte l'analyse de listes de textes (batch). Zéro dépendance externe.
/internal/simsandboxSimsandbox (see implementation).
/internal/slugReal input fields: text, texts, separator = '-', lowercase = true, max_length = 80
/internal/smartrouteCorrigée) garantit qu'aucune tentative échouée ne laisse une charge
/internal/snippetsReal input fields: action, snippet_key, content, tags = [], metadata, search, limit = 20 — Returns: success: true, action: 'set', snippet_key, tags, size_bytes: contentStr.length
/internal/spamdetectReal input fields: text, texts, subject
/internal/sslcheckReal input fields: hostname, port = 443, domains
/internal/stakeUne action directement appelable, seulement déclenchée par de vrais
/internal/statisticsReal input fields: values, values_b, operation = 'all'
/internal/strdistanceReal input fields: str1, str2, pairs, algorithm = 'levenshtein'
/internal/subscriptionSpécial qui fausserait la comparaison entre un appel ponctuel et un
/internal/summarizeReal input fields: text, max_sentences = 5, style = 'bullets', focus_keywords = []
/internal/swarmcoord─── 12 SERVICES RARES — VAGUE 4 ─────────────────────────────────────────────
/internal/sycophancydetectReal input fields: response, user_claim, conversation_history
/internal/syndicateReal input fields: action, name, required_signatures, syndicate_id, amount, purpose, receiver_agent — Returns: success: true, action: 'create', syndicate_id: id, name: name.trim(), required_s
/internal/synthdataReal input fields: schema, count = 10, locale = 'en', seed
/internal/taskauctionReal input fields: action, task_description, budget_usd, ttl_minutes = 60, auction_id, price_usd, m — Returns: success: true, action: 'create', auction_id: id, task_description, budget_usd: p
/internal/taskqueueUn agent soumet des tâches, un autre les récupère et les traite.
/internal/taxcalcReal input fields: action, amount, tax_rate, country, state, price_includes_tax = false, items
/internal/techstackReal input fields: url, html
/internal/telemetryReal input fields: action, session_id, event_type, latency_ms, tokens_used, cost_usd, status = 'suc — Returns: success: true, action: 'log', entry_id: id, event_type, status, at: new Date(now
/internal/templateReal input fields: template, variables, templates
/internal/temporalvalidateReal input fields: text, events
/internal/textencryptReal input fields: action, text, encrypted, key, algorithm = 'aes-256-gcm'
/internal/textstatsReal input fields: text, top_words = 10
/internal/timecapsuleReal input fields: action, capsule_key, content, unlock_at, unlock_after_calls, metadata
/internal/timezoneReal input fields: datetime, from_tz = 'UTC', to_tz, to_tzs
/internal/tokencostReal input fields: model, input_tokens, output_tokens, text, calls
/internal/tokencountApproximation GPT-4 : ~4 caractères par token (suffisant pour 99% des cas).
/internal/translateUtilise MyMemory API (gratuit, 5000 req/jour, pas de clé requise).
/internal/trustpropReal input fields: trust_graph, source, target, max_hops = 4, method = 'multiplicative'
/internal/truthmarket── TRUTH MARKET: attestation avec vrai enjeu financier sur un fait du
/internal/uncertaintyReal input fields: statement, domain
/internal/unitsReal input fields: value, from, to, category
/internal/urlparseEt détecte si c'est une URL valide, une IP, un localhost, etc.
/internal/urlshortenReal input fields: url, urls
/internal/vatvalidateReal input fields: vat_number, vat_numbers
/internal/vaultReal input fields: action, key, value, prefix
/internal/vouchUn score combiné inventé, l'accès emprunté est strictement celui du
/internal/weatherUtilise Open-Meteo API (gratuit, illimité, pas de clé requise).
/internal/webhookWebhook (see implementation).
/internal/webhooksigReal input fields: provider, payload, signature, secret, timestamp
/internal/websearch─── GROUPE A : 10 SERVICES ZÉRO COÛT ────────────────────────────────────────
/internal/whoisReal input fields: domain
/internal/workflowReal input fields: action, machine_key, initial_state, transitions, event, context, metadata
/internal/xlsxgenReal input fields: sheets, title = 'Workbook'
/internal/xml2jsonReturns: success: true, mode: 'parse', data: result
/internal/yamlparseReal input fields: yaml: yamlContent, json, action = 'parse' — Returns: success: true, action: 'parse', data: r.result, type: r.type
/internal/zipcodeReal input fields: zip, zips, country_code = 'us'

Latest Additions — Everything Built Tonight

The newest layer of run.pay — checkout sessions, milestone escrow, RFQ, net settlement, the double-entry ledger, and a full suite of risk, reputation, and treasury tools. Every description here traces to real, tested code.

Vendor Tools (27 routes)

MethodPathDescription
GET/api/vendors/:vendor_id/outcome-reputationA vendor's real aggregate outcome quality score, distinct from infrastructure trust.
GET/api/vendors/:vendor_id/performance-bondView a vendor's real performance bond balance and real forfeiture history.
GET/api/vendors/:vendor_id/reputation-by-capabilityA vendor's real success rate broken down by real task type.
GET/api/vendors/:vendor_id/reputation-decay-adjustedA vendor's real trust score, honestly adjusted for real inactivity.
POST/api/vendors/organizationsDes services publics explicitement approuvés et ses propres APIs
GET/api/vendors/organizationsApi vendors organizations (see implementation for full detail).
DELETE/api/vendors/organizations/:orgIdD'argent silencieuse), annule vraiment tout abonnement Stripe réel
POST/api/vendors/organizations/:orgId/allowed-task-typesPlus simple et sans état intermédiaire ambigu qu'un ajout/retrait un par
GET/api/vendors/organizations/:orgId/allowed-task-typesApi vendors organizations allowed task types (see implementation for full detail).
GET/api/vendors/organizations/:orgId/analytics── Analyses de consommation — au-delà du simple solde actuel, quels
GET/api/vendors/organizations/:orgId/audit-logL'ensemble de l'activité du vendeur (qui peut posséder plusieurs
POST/api/vendors/organizations/:orgId/membersApi vendors organizations members (see implementation for full detail).
GET/api/vendors/organizations/:orgId/membersApi vendors organizations members (see implementation for full detail).
POST/api/vendors/organizations/:orgId/private-servicesBorné, type de tâche du vocabulaire fermé) — un service privé n'est pas
POST/api/vendors/organizations/:orgId/rotate-access-keyRéservé au propriétaire, cohérent avec le niveau d'une action de
POST/api/vendors/organizations/:orgId/sso/config── SSO (OIDC) — voir la note du schéma sur les limites honnêtes avant un
POST/api/vendors/organizations/:orgId/transfer-ownershipReprendre la main. Le nouveau propriétaire doit déjà avoir un vrai
GET/api/vendors/organizations/:orgId/wallet/agentsIndividuel — jamais trouvée avant ce soir, seulement un ajout un par
POST/api/vendors/organizations/:orgId/wallet/creditRECEVOIR les versements, pas à être débité). Une vraie fonctionnalité à
POST/api/vendors/organizations/:orgId/wallet/link-agentApi vendors organizations wallet link agent (see implementation for full detail).
POST/api/vendors/performance-bond/depositDeposit a real Stripe-backed performance bond, forfeited on real declared violations.
POST/api/vendors/register─── ROUTES VENDEURS ──────────────────────────────────────────────────────────
PATCH/api/vendors/services/:idApi vendors services (see implementation for full detail).
DELETE/api/vendors/services/:idApi vendors services (see implementation for full detail).
POST/api/vendors/services/:id/capability-tagsDeclare a service's own real capability phrases, in the vendor's own words.
POST/api/vendors/services/:id/output-schemaDeclare the real expected shape of this service's results — enables outcome verification and outcome-based pricing.
GET/api/vendors/statsApi vendors stats (see implementation for full detail).

Agent Tools (25 routes)

MethodPathDescription
GET/api/agents/:agent_id/accountingParent/enfant déjà existant des wallets hiérarchiques pour donner une
GET/api/agents/:agent_id/cost-attributionReal hierarchical spend breakdown — department, agent, and individual service.
GET/api/agents/:agent_id/cost-intelligenceCompares this agent's real spend against real cheaper alternatives in the same category.
POST/api/agents/:agent_id/daily-call-limitsSet a real daily call-count cap per category, independent of the dollar amount spent.
GET/api/agents/:agent_id/dashboardActuel d'agents à faible confiance dans la flotte, jamais un vrai
GET/api/agents/:agent_id/dependency-mapReal vendor concentration risk for this agent — flags a single point of failure.
GET/api/agents/:agent_id/economic-dnaA real behavioral baseline for this agent — flags real transactions that genuinely deviate from it.
GET/api/agents/:agent_id/ledgerView this agent's real double-entry ledger entries, reconciled against their real wallet balance.
POST/api/agents/:agent_id/organizationsAn agent (never a vendor) creates a real organization — same real SSO/RBAC as the vendor path.
GET/api/agents/:agent_id/passport(identité vérifiée, wallet, score de confiance, mandat actif,
GET/api/agents/:agent_id/reputation-decay-adjustedThis agent's real trust score, honestly adjusted for real inactivity.
GET/api/agents/:agent_id/reserveView this agent's real reserve bucket balances.
POST/api/agents/:agent_id/reserve/configureConfigure a real automatic revenue split (operating/reserve/tax/emergency) for this agent.
GET/api/agents/:agent_id/security-scoreA real multi-dimensional security score, aggregating existing signals — prompt_safety honestly excluded as unmeasurable.
GET/api/agents/:agent_id/treasuryDéclaré, montrant ce qui a vraiment été alloué, dépensé, et ce qui
POST/api/agents/:agent_id/treasury/maintain-minimumSet a real minimum balance this agent should always have — auto-topped up hourly from its real parent.
POST/api/agents/:agent_id/treasury/max-balanceSet a real surplus cap — automatically reallocated to a sibling agent in real need.
GET/api/agents/:agent_id/trust-tierThis agent's real, transparent progression tier — escrow required through credit-eligible.
GET/api/agents/:agent_id/vendor-independenceA real, verifiable measure of how much of this agent's spend went through vendor-independent routing.
GET/api/agents/:agent_id/vendor-relationship/:vendor_idCet agent précis avec ce vendeur précis, jamais une seule note
POST/api/agents/mandatesApi agents mandates (see implementation for full detail).
POST/api/agents/mandates/ap2-importImport a real AP2 Payment Mandate — structural translation only, never independent W3C VC signature verification.
POST/api/agents/registerApi agents register (see implementation for full detail).
POST/api/agents/signupApi agents signup (see implementation for full detail).
GET/api/agents/wallet/:agentIdApi agents wallet (see implementation for full detail).

Admin & Risk Detection (8 routes)

MethodPathDescription
POST/api/admin/benchmark-tasksDefine a real standardized benchmark task.
GET/api/admin/benchmark-tasks/:taskId/resultsView real accumulated benchmark results across every service tested.
POST/api/admin/benchmark-tasks/:taskId/run/:serviceIdExplicitly trigger one real benchmark run — genuinely costs real money, charged to your own provided wallet.
GET/api/admin/circular-payment-signalsAlgorithme de graphe générique capable de détecter des vrais cycles
POST/api/admin/kill-switch/freeze-category/:categoryFreeze all real payments for a specific category, regardless of agent or vendor.
POST/api/admin/kill-switch/unfreeze-category/:categoryUnfreeze a real previously frozen category.
GET/api/admin/network-vendor-degradationDetects a real vendor failing across many independent agents simultaneously — never a single agent's own broken integration.
GET/api/admin/wash-trading-signalsReal circular invoice and near-minimum high-frequency transaction signals, worth human review.

ACP-Style Checkout Sessions (5 routes)

MethodPathDescription
GET/api/checkout/:sessionIdView a real checkout session and its current cart contents.
POST/api/checkout/:sessionId/completeExecute real payment for every item in the cart — each billed independently, only on real vendor success.
POST/api/checkout/:sessionId/itemsAdd a real item to an open checkout session.
DELETE/api/checkout/:sessionId/items/:itemIdRemove a real item from an open checkout session.
POST/api/checkout/createCreate a real checkout session (cart) — nothing charged until completion.

Milestone Escrow (5 routes)

MethodPathDescription
GET/api/milestone-escrow/:escrowIdView a real milestone escrow and its stage-by-stage status.
POST/api/milestone-escrow/:escrowId/revenue-splitsDeclare how a real milestone escrow payout splits across multiple contributing agents.
POST/api/milestone-escrow/:escrowId/stages/:stageId/refundRefund one real stage of a milestone escrow back to the sender.
POST/api/milestone-escrow/:escrowId/stages/:stageId/releaseRelease one real stage of a milestone escrow to the receiver.
POST/api/milestone-escrow/createCreate a real multi-stage escrow — holds the full total upfront, stages released independently.

Service Discovery & Pricing (5 routes)

MethodPathDescription
POST/api/servicesApi services (see implementation for full detail).
GET/api/services── GET /api/services/catalog — catalogue public avec trust scores ───────────
GET/api/services/catalog/personalizedA real, never-cached, per-agent catalog view with a small transparent ranking boost from real history.
GET/api/services/discover-by-capabilityFind real services by real vendor-declared capability phrases — honest text matching, never real ML semantics.
GET/api/services/total-cost-rankingRanks real services by real expected cost per success, not just sticker price.

Request for Quote (RFQ) (4 routes)

MethodPathDescription
GET/api/rfq/:rfqIdView a real RFQ and every real bid submitted.
POST/api/rfq/:rfqId/bidsSubmit a real bid on an open RFQ.
POST/api/rfq/:rfqId/bids/:bidId/acceptAccept a real winning bid on an RFQ.
POST/api/rfq/createPublish a real request-for-quote with real requirements — vendors submit their own bids.

api/intents (3 routes)

MethodPathDescription
POST/api/intents/:id/link-transactionPayé". Jamais une nouvelle donnée inventée, juste un vrai
POST/api/intents/:id/verifyAnnoncé.
POST/api/intents/declareDétournement de contexte et d'injection de prompt dans les flux de

api/workflows (3 routes)

MethodPathDescription
GET/api/workflows── Découverte publique des workflows — un agent doit voir exactement ce
GET/api/workflows/:idApi workflows (see implementation for full detail).
POST/api/workflows/:id/executeJamais de remboursement à gérer, puisqu'on n'a jamais facturé ce qui

Net Settlement (2 routes)

MethodPathDescription
POST/api/net-settlement/computeCompute real net positions across a group of agents' pending invoices — nothing settled yet.
POST/api/net-settlement/executeExecute real net settlement — only the real net differences move, never each invoice separately.

api/organizations (2 routes)

MethodPathDescription
GET/api/organizations/:orgId/slaApi organizations sla (see implementation for full detail).
POST/api/organizations/members/acceptApi organizations members accept (see implementation for full detail).

(1 routes)

MethodPathDescription
GET/ (see implementation for full detail).

.well-known/ucp (1 routes)

MethodPathDescription
GET/.well-known/ucpMPP — cohérent avec ce que "Payment token exchange" représente

api/call (1 routes)

MethodPathDescription
POST/api/call/:service_idApi call (see implementation for full detail).

api/discover (1 routes)

MethodPathDescription
POST/api/discover/externalTraiter le paiement crypto natif de ces services, c'est de la vraie

api/guard (1 routes)

MethodPathDescription
POST/api/guard/evaluateApi guard evaluate (see implementation for full detail).

api/leaderboard (1 routes)

MethodPathDescription
GET/api/leaderboardDifféremment ; "Top Vendors" se base sur du volume réel, pas une

Market Data (1 routes)

MethodPathDescription
GET/api/market/economy-indexA real, honest public aggregate of price/latency/success rate by category.

api/pay (1 routes)

MethodPathDescription
POST/api/pay/routeImplémenté, jamais présenté comme disponible alors qu'il ne l'est

mpp/:serviceId (1 routes)

MethodPathDescription
POST/mpp/:serviceIdPar cohérence avec PAYMENT-SIGNATURE déjà utilisé pour x402, jamais

x402-crypto/:serviceId (1 routes)

MethodPathDescription
POST/x402-crypto/:serviceIdTransférer le solde, mettre à jour la variable sur Railway. Jamais une

x402-race/:serviceId (1 routes)

MethodPathDescription
POST/x402-race/:serviceIdCalls up to 3 real candidates simultaneously — bills only the real first genuine success. Requires X-Wallet-Secret on protected wallets — see Authentication above.
Ready to start?
Test any service free in the playground — no credit card needed.
Open playground →