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: Use x-runpay-trial: your_trial_id header for the 3 free calls in the playground. Production calls require a funded wallet.

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

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.

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.

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.

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.

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.

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.

x402-sandbox/:serviceId (1 routes)

MethodPathDescription
POST/x402-sandbox/:serviceIdSame as /x402/:serviceId but spends virtual sandbox balance — real vendor calls, no real money.

x402-tier/:tier_id (1 routes)

MethodPathDescription
POST/x402-tier/:tier_idPay for a specific SLA tier rather than a service's base price.

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.

x402/:serviceId (1 routes)

MethodPathDescription
POST/x402/:serviceIdX402 (see implementation for full detail).

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'
Ready to start?
Test any service free in the playground — no credit card needed.
Open playground →