run.pay Documentation
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.
https://runpay-backend-visibility-production.up.railway.app| Role | What you do | Time to production |
|---|---|---|
| Agent developer | Create wallet → call services → agents pay autonomously | ~5 minutes |
| API provider | Register → publish endpoint → receive per-call payments | ~10 minutes |
Quickstart — Agent Developer
The fastest path from zero to a paid API call.
Install the SDK
pip install runpay # Python npm install runpay # JavaScript
Create your agent wallet
Go to getrunpay.com/signup or use the API directly:
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..."
}
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.
Call your first service
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:
X-RunPay-Agent: agt_your_agent_id
{ "agent_id": "agt_your_agent_id", "payload": { ... } }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:
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:
| Parameter | Type | Description |
|---|---|---|
| required string | Your email address for notifications and billing | |
| name | optional string | Your name or organization |
| use_case | optional string | How you'll use run.pay (helps us improve) |
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.
| Parameter | Type | Description |
|---|---|---|
| agent_id | required string | Any 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
Replace :service_id with the service UUID from the catalog.
| Parameter | Type | Description |
|---|---|---|
| agent_id | required string | Your agent wallet ID (agt_...) |
| payload | required object | Service-specific input, nested under this key (see each service's schema) |
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.
Browse published, active workflows.
Real step-by-step breakdown and an estimated total price, before you run it.
| Parameter | Type | Description |
|---|---|---|
| agent_id | required string | Your agent wallet ID (agt_...) |
| input | required object | Input 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.
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.
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.
{ "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.
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.
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.
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.
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
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.
| Route | Purpose |
|---|---|
/internal/loan | Peer-to-peer collateralized lending with real interest — action=request then action=fund |
/internal/stake | Financially-backed sponsorship, slashed on the protégé's verified default |
/internal/syndicate | Shared wallets with M-of-N approval thresholds for spending |
/internal/contracttransfer | Transfer an active contract obligation to a new agent |
/internal/truthmarket | Stake real money behind a real-world claim, challengeable, resolved by peer jury |
/internal/insurance | Individually-underwritten policies between agents — action=offer then action=buy |
/internal/revenueshare | Sell a capped percentage of future earnings for upfront capital |
/internal/capacityfutures | Lock in future task capacity at a fixed price |
/internal/disputejury | Peer-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.
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.
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.
Body: { agent_id, description, expected_category, max_expected_amount, ttl_seconds }. Returns a short-lived intent_id (default 5 min, max 1h).
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.
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.
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.
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.
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.
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.
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.
| Route | Purpose |
|---|---|
POST /api/chains/create | Start a new chain |
POST /api/chains/:id/hop | Report a real hop that already happened |
GET /api/chains/:id | View 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.
smart_score.Kill Switch
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.
| Route | Purpose |
|---|---|
POST /api/admin/kill-switch/freeze-all | Blocks every payment on the platform, immediately |
POST /api/admin/kill-switch/freeze-agent/:agent_id | Blocks a specific agent |
POST /api/admin/kill-switch/freeze-vendor/:vendor_id | Blocks a specific vendor |
GET /api/admin/kill-switch/status | Real current freeze status at every level |
SDK Reference
Python
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
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:
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:
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:
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
| Status | Error code | Meaning |
|---|---|---|
| 400 | invalid_payload | Missing required field or wrong format |
| 401 | invalid_agent | Agent ID not found or inactive |
| 402 | insufficient_balance | Wallet balance too low — add funds |
| 429 | rate_limited | Too many requests — retry with backoff |
| 500 | service_error | Service temporarily unavailable |
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.
Register as a vendor
curl -X POST .../api/vendors/register \
-d '{"email": "you@company.com", "name": "My Service"}'
# Returns: {"vendor_id": "...", "api_key": "vnd_xxxxxxxxxx", "stripe_onboarding_url": "..."}Publish your service
There's no SDK method for this yet — publish directly via the API, or from your vendor dashboard:
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.
| Model | What happens |
|---|---|
You set price_per_call | Any amount from $0.001 to $1000, whatever your service is worth |
| Agent pays | Full price_per_call, charged automatically per call |
| You receive | 98% of each call, added to your Stripe balance |
| Payouts | Automatic every 7 days, or request one manually from your vendor dashboard |
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:
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... }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' });
}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
| Query param | Type | Description |
|---|---|---|
| limit | optional number | Max results (default: 50, max: 200) |
| category | optional string | Filter by: AI, DATA, MEDIA |
| search | optional string | Search by name or description |
API Reference — Call Service
The service ID is the UUID from GET /api/services. Your agent's card on file is charged directly for this specific call.
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... }
}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.API Reference — Wallet
"agent_id": "agt_abc123xyz",
"balance": 4.99,
"total_spent": 0.12,
"mode": "production"
}
API Reference — Vendors
See the Publishing a Service section above for the full signup + publish flow.
Requires your x-api-key header. Powers the vendor dashboard Overview tab — same data.
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.
| Field | Type | Description |
|---|---|---|
| name | string | Organization display name |
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).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).
| Field | Type | Description |
|---|---|---|
| string | Invitee's email | |
| role | string | viewer, 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.
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.
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.
| Field | Type | Description |
|---|---|---|
| agent_id | string | The agent to link |
| daily_limit_usd | optional number | Per-agent daily cap within the shared pool — omit for no limit |
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).
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.
Same validation as a public service — HTTPS required, price between $0.005–$0.10. It never appears in the public catalog, ranking, or discovery.
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)
| Field | Type | Description |
|---|---|---|
| issuer_url | string | Your IdP's OIDC issuer (HTTPS only) |
| client_id / client_secret | string | From your IdP |
| redirect_uri | string | Where the IdP sends the browser back |
| default_role | string | Role 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
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.
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
The old key stops working immediately. Every agent using it needs the new one.
Body: { "new_owner_email": "..." }. The recipient must already have a vendor account. The current owner's owner-level access ends immediately.
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
| Service | Price | Key output |
|---|---|---|
| Hallucination Detector | $0.01 | hallucination_score, risk_level |
| PII Scanner | $0.01 | pii_found, findings[] |
| GDPR Compliance Checker | $0.02 | gdpr_compliant, issues[] |
| AI Act Compliance | $0.02 | risk_category, obligations[] |
| Bias Detector | $0.02 | bias_score, biases[] |
| Sycophancy Detector | $0.01 | sycophancy_score, signals[] |
| Logical Fallacy Detector | $0.01 | fallacies[], count |
| Ethical Red Teamer | $0.02 | attack_vectors[], severity |
Services — Data
| Service | Price | Key output |
|---|---|---|
| Statistics Calculator | $0.005 | mean, std, percentiles |
| Synthetic Data Generator | $0.01 | records[], count |
| Monte Carlo Simulator | $0.02 | mean, percentiles.p95, histogram |
| CSV Validator | $0.005 | valid, errors[] |
| Data Profiler | $0.01 | quality_score, columns |
| Hypothesis Tester | $0.005 | p_value, conclusion |
| Semantic Diff | $0.01 | similarity, change_magnitude |
Services — Reasoning
| Service | Price | Key output |
|---|---|---|
| Moral Reasoning Engine | $0.02 | consensus, recommendation |
| Simulation Sandbox | $0.01 | safe_to_execute, risk_score |
| Goal Decomposer | $0.01 | subtasks[], critical_path |
| Argument Extractor | $0.01 | pros[], cons[], balance |
| Chain of Thought Validator | $0.005 | is_coherent, issues[] |
| Counterfactual Generator | $0.01 | scenarios[], probability |
| Error Propagation Analyzer | $0.01 | blast_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)
| Method | Path | Description |
|---|---|---|
| GET | /api/vendors/:vendor_id/due-diligence | A binary APPROVED/HIGH_RISK verdict, computed from real vendor data with transparent thresholds. |
| GET | /api/vendors/:vendor_id/passport | The real vendor-side equivalent of Agent Passport — trust, volume, reliability, customers. |
| POST | /api/vendors/affiliate-payout | Api vendors affiliate payout (see implementation for full detail). |
| GET | /api/vendors/affiliation | Returns referral_code: myCode, referred_vendors: referred.length, ... |
| GET | /api/vendors/analytics | Api vendors analytics (see implementation for full detail). |
| GET | /api/vendors/audit-log | Returns logs |
| GET | /api/vendors/balance | Returns available: 0, pending: 0, currency: 'usd', onboarding_complete: false |
| POST | /api/vendors/disconnect-stripe | Returns success: true |
| GET | /api/vendors/disputes | Returns count: rows.length, disputes: rows |
| POST | /api/vendors/disputes/:id/respond | ── POST /api/vendors/disputes/:id/respond — accepter (rembourse |
| POST | /api/vendors/email-export | Api vendors email export (see implementation for full detail). |
| POST | /api/vendors/exchange-handoff | Directement dans l'URL de redirection, qui exposait des identifiants |
| POST | /api/vendors/forgot-key | Returns message: 'Si cet email existe, vous recevrez votre clé API par email.' |
| POST | /api/vendors/login | Api vendors login (see implementation for full detail). |
| POST | /api/vendors/logout | Returns success: true |
| GET | /api/vendors/me | Returns vendor: { id: session.vendor_id, email: session.email, |
| GET | /api/vendors/notifications | Returns success: true |
| POST | /api/vendors/notifications | Returns success: true |
| POST | /api/vendors/onboard | Returns stripe_onboarding_url: link.url |
| GET | /api/vendors/onboard-link | Returns url: link.url |
| POST | /api/vendors/organizations/:orgId/approve-service | Liste blanche explicite — jamais d'accès implicite à tout le catalogue, |
| GET | /api/vendors/organizations/:orgId/catalog | Appliqué au wallet : il ne devrait pas avoir besoin de la clé d'accès |
| DELETE | /api/vendors/organizations/:orgId/members/:memberId | Returns success: true, note: 'Revoked — their personal token no longer authent... |
| POST | /api/vendors/organizations/:orgId/sla | Returns success: true, org_id: req.org.id, uptime_target_percent: target |
| GET | /api/vendors/organizations/:orgId/subscription | Returns org_id: req.org.id, subscription_status: req.org.subscription_st... |
| POST | /api/vendors/organizations/:orgId/subscription/cancel | Abonnement existe, sinon marque simplement l'activation manuelle comme |
| POST | /api/vendors/organizations/:orgId/subscription/checkout | Directement le compte de la plateforme, distinct de Stripe Connect |
| POST | /api/vendors/organizations/:orgId/subscription/send-invoice | Un 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/teams | Returns teams: teams.map(t => ({ id: t.id, name: t.name, agent_count: parseInt... |
| DELETE | /api/vendors/organizations/:orgId/teams/:teamId | Returns success: true, note: 'Team deleted — its agents are now ungrouped, not... |
| POST | /api/vendors/organizations/:orgId/unapprove-service | Returns success: true |
| GET | /api/vendors/organizations/:orgId/wallet | Consulter son propre solde sans détenir séparément la clé d'accès |
| POST | /api/vendors/organizations/:orgId/wallet/checkout | Distingué via metadata.type pour que le webhook sache créditer le |
| POST | /api/vendors/organizations/:orgId/wallet/link-agents-bulk | Certains agents échouent individuellement, plutôt que de tout annuler |
| POST | /api/vendors/organizations/:orgId/wallet/unlink-agent | Returns success: true, note: 'This agent now uses its own individual wallet ag... |
| POST | /api/vendors/payout | Api vendors payout (see implementation for full detail). |
| GET | /api/vendors/payouts | Returns payouts: [] |
| POST | /api/vendors/rotate-key | Returns success: true, new_key: newKey |
| GET | /api/vendors/services | Api vendors services (see implementation for full detail). |
| POST | /api/vendors/services | Api vendors services (see implementation for full detail). |
| GET | /api/vendors/services/:id/analytics | Tâche, jamais une métrique inventée séparément. La géolocalisation des |
| GET | /api/vendors/services/:id/conversion | Tous deux définis précisément et calculés sur de vraies données, jamais |
| POST | /api/vendors/services/:id/deprecate | Returns success: true, note: 'Marked deprecated — existing callers still recei... |
| GET | /api/vendors/services/:id/external-visibility | Api vendors services external visibility (see implementation for full detail). |
| POST | /api/vendors/services/:id/generate-marketing-copy | Le 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-copy | Returns draft: service.marketing_copy_draft, published: service.marketing_copy... |
| POST | /api/vendors/services/:id/new-version | Api vendors services new version (see implementation for full detail). |
| GET | /api/vendors/services/:id/pricing-suggestion | A real, bidirectional pricing suggestion based on peer pricing and utilization — conflict of interest disclosed. |
| POST | /api/vendors/services/:id/publish-marketing-copy | Returns success: true, published: toPublish.trim() |
| POST | /api/vendors/services/:id/sla-tiers | Create 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-openapi | Spécifications JSON OpenAPI 3.x, pas de YAML (aucune dépendance |
| POST | /api/vendors/services/unpublish-all | Returns success: true |
| POST | /api/vendors/test-webhook | Returns success: response.ok, status: response.status, ms, body: body.slice(0,... |
| GET | /api/vendors/transactions | Api vendors transactions (see implementation for full detail). |
| GET | /api/vendors/transactions/export | Returns vendor_id: req.vendor.id, count: chain.length, transactions: chain, no... |
| POST | /api/vendors/transactions/verify | Recalculer la chaîne à partir d'un export et confirmer qu'elle n'a |
| POST | /api/vendors/update-profile | Returns success: true |
| POST | /api/vendors/verify-session | ── POST /api/vendors/logout — révoquer le token ──────────────────────────── |
| POST | /api/vendors/webhook | Returns message: webhook_url ? 'Webhook enregistré' : 'Webhook supprimé', webh... |
| POST | /api/vendors/workflows | De schéma entre étapes, jamais deviné à l'exécution. Chaque étape sera |
| GET | /api/vendors/workflows | Returns count: rows.length, workflows: rows.map(w => ({ id: w.id, name: w.name... |
Agent Management (40 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/agents/:agentId/cost-optimization | Ayant une fiabilité comparable ou meilleure — jamais juste "le moins cher" |
| GET | /api/agents/:agentId/trust-summary | Réussite de contrats, et l'historique d'abonnements en un seul |
| GET | /api/agents/:agent_id/accounting/receipt/:transaction_id | Vrai reçu formaté pour une transaction précise — jamais une nouvelle |
| POST | /api/agents/:agent_id/capabilities | Declare what this agent can/cannot do — self-declared, never independently verified. |
| GET | /api/agents/:agent_id/certification | Real track-record-based certification — never simulated security testing. |
| GET | /api/agents/:agent_id/economy-graph | Real graph edges — this agent's vendor/service relationships, weighted by real transaction history. |
| GET | /api/agents/:agent_id/erc8004-registration-file | Parfaitement conforme, seulement une vraie meilleure tentative |
| GET | /api/agents/:agent_id/lifecycle-status | Honest status across all 15 stages of the agent economic lifecycle. |
| POST | /api/agents/:agent_id/request-budget-increase | A child agent requests more budget from its parent — evaluated via Guard. |
| GET | /api/agents/:agent_id/sandbox/report | Real usage-pattern report from a sandbox session. |
| POST | /api/agents/:agent_id/sandbox/start | Start a 24h session with $10,000 virtual balance — never real money. |
| GET | /api/agents/:agent_id/score-explained | Vrai journal historique exact événement par événement — celui-là |
| POST | /api/agents/:agent_id/stress-test | Tests 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-funds | Move funds between two specific child agents under the same parent. |
| GET | /api/agents/analytics | Api agents analytics (see implementation for full detail). |
| GET | /api/agents/approvals | Returns count: rows.length, approvals: rows.map(r => ({ id: r.id, service_id: ... |
| POST | /api/agents/approvals/:id/approve | Returns success: true, approval_id: claimed.id, service_id: claimed.service_id... |
| POST | /api/agents/approvals/:id/reject | Returns success: true, approval_id: claimed.id, status: 'rejected' |
| GET | /api/agents/chart/:agentId | Returns days, total_calls: totalCalls |
| POST | /api/agents/children | La création : sans carte propre, il ne peut jamais dépenser au-delà de |
| POST | /api/agents/children/activity | Transforme le contrôle budgétaire en vraie supervision (où part l'argent, |
| POST | /api/agents/children/list | Remettre le solde du parent si la création de l'enfant échoue après le prélèvement |
| POST | /api/agents/confirm-card | Returns success: true, message: 'Carte attachée avec succès' |
| POST | /api/agents/dashboard | Tableau de bord unifié : rassemble en lecture seule ce qui est aujourd'hui |
| POST | /api/agents/disputes | Après l'appel, une seule contestation par transaction (garantie par la |
| GET | /api/agents/identity-status/:agent_id | Vrai statut de vérification — jamais un vrai secret sensible exposé, |
| POST | /api/agents/import-attestation | AILLEURS, le vérifier structurellement, et l'afficher à côté du vrai |
| GET | /api/agents/leaderboard | Returns count: top.length, agents: top.map((a, i) => ({ rank: i + 1, |
| GET | /api/agents/mandates/:agent_id | Returns mandates |
| POST | /api/agents/mandates/:id/revoke | Returns success: true |
| POST | /api/agents/remove-card | Returns success: true, removed: true, message: 'Card removed successfully' |
| POST | /api/agents/resend | Returns success: true |
| POST | /api/agents/rotate-id | Si un ID a fuité, on peut le remplacer, ce qui rend l'ancien totalement |
| POST | /api/agents/settings | Api agents settings (see implementation for full detail). |
| POST | /api/agents/stripe-setup | Api agents stripe setup (see implementation for full detail). |
| POST | /api/agents/test-webhook | Returns success: response.ok, status: response.status, ms, body: body.slice(0,... |
| GET | /api/agents/transactions/:agentId | Returns 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-identity | Jamais reconstructible avec un nouvel agent après un mauvais |
| GET | /api/agents/wallet | Returns agent_id: wallet.agent_id, wallet_id: wallet.id, stripe_payment_method... |
Admin & Platform Operations (27 routes)
| Method | Path | Description |
|---|---|---|
| POST | /api/admin/benchmark-cases | ── Banc d'essai — cas de test réels uniquement, jamais inventés côté |
| GET | /api/admin/benchmark-cases | Returns count: cases.length, cases |
| DELETE | /api/admin/benchmark-cases/:id | Returns success: true |
| GET | /api/admin/bridge-stats | Fonctionnent vraiment avec notre implémentation, plutôt que de |
| GET | /api/admin/collusion-flags | Signalements de collusion, pour revue humaine — pas une punition |
| POST | /api/admin/collusion-flags/:id/dismiss | Automatique, un vrai signal statistique à examiner. |
| GET | /api/admin/disputes | Returns 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-service | Returns message: 'Service mis à jour', service |
| POST | /api/admin/fix-vendor | Returns message: 'Vendeur mis à jour', vendor |
| GET | /api/admin/jobs-health | Returns jobs, generated_at: new Date().toISOString() |
| POST | /api/admin/kill-switch/freeze-agent/:agent_id | Returns success: true, agent_id: req.params.agent_id |
| POST | /api/admin/kill-switch/freeze-all | Returns success: true, note: 'ALL payments across the entire platform are now ... |
| POST | /api/admin/kill-switch/freeze-vendor/:vendor_id | Returns success: true, vendor_id: req.params.vendor_id |
| GET | /api/admin/kill-switch/status | Returns platform, frozen_agents: frozenAgents, frozen_vendors: frozenVendors |
| POST | /api/admin/kill-switch/unfreeze-agent/:agent_id | Returns success: true, agent_id: req.params.agent_id |
| POST | /api/admin/kill-switch/unfreeze-all | Returns success: true |
| POST | /api/admin/kill-switch/unfreeze-vendor/:vendor_id | Returns 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/overview | Clés vendeur vnd_... — variable d'environnement ADMIN_KEY côté Railway. |
| GET | /api/admin/services | Returns services: withHealth, total: withHealth.length |
| GET | /api/admin/services/:id/failures | Returns 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-signals | Real signals — shared IPs and time-clustered account creation — for potential fake agent farms. |
| GET | /api/admin/transactions | Returns transactions, total: parseInt(total?.n || 0) |
| GET | /api/admin/vendor-concentration-anomalies | Flags vendors whose recent customers are unusually concentrated among brand-new agents. |
| GET | /api/admin/vendors | Returns vendors, total: vendors.length |
Service Management (10 routes)
| Method | Path | Description |
|---|---|---|
| PATCH | /api/services/:id | Api 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/review | Api services review (see implementation for full detail). |
| GET | /api/services/:id/reviews | Returns reviews, avg_rating: parseFloat(stats?.avg_rating || 0).toFixed(1), to... |
| GET | /api/services/:id/sla-tiers | Returns service_id: req.params.id, tiers |
| GET | /api/services/:id/sla-tiers/:tier_id/compliance | Returns tier_id: tier.id, tier_name: tier.tier_name, promised_uptime_pct: pars... |
| GET | /api/services/:id/versions | Returns count: versions.length, versions: versions.map(v => ({ s... |
| GET | /api/services/by-task/:taskType | Latence et taux d'erreur réels sur 7 jours (déjà collectés par |
| GET | /api/services/catalog | Api services catalog (see implementation for full detail). |
| GET | /api/services/mine | Rare plutôt qu'une erreur 500 brute. |
Agent Invoicing (4 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/invoices/:id | View an invoice — requires proof of ownership from either party. |
| POST | /api/invoices/:id/accept | Recipient accepts a pending invoice. |
| POST | /api/invoices/:id/pay | Recipient pays an accepted invoice — real atomic debit/credit. |
| POST | /api/invoices/create | Create a structured payment request from one agent to another. |
Organizations (4 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/organizations/:orgId/catalog | Avec la clé d'accès : ses APIs privées + les services publics |
| GET | /api/organizations/:orgId/sso/callback | Api organizations sso callback (see implementation for full detail). |
| GET | /api/organizations/:orgId/sso/login | Api organizations sso login (see implementation for full detail). |
| GET | /api/organizations/:orgId/wallet | Returns org_id: req.params.orgId, balance: wallet ? parseFloat(wallet.ba... |
Economic Chains (3 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/chains/:id | Returns ...chain, hops, total_amount_usd: totalAmount, total_commission_usd: t... |
| POST | /api/chains/:id/hop | Api chains hop (see implementation for full detail). |
| POST | /api/chains/create | Enchaîne ces vrais rapports avec la même vraie chaîne de hachage déjà |
Agent Coordination (3 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/coordination/search | Returns query: q, bounties: bounties.map(b => ({ type: 'bounty', id: b.id,... |
| GET | /api/coordination/transparency | Existantes. Le genre de chiffre qui donne confiance à quelqu'un qui |
| GET | /api/coordination/trust-graph | Vraiment tenu, quel escrow reste actif). C'est de l'historique accumulé, |
Marketplace Meta (2 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/marketplace | Api marketplace (see implementation for full detail). |
| GET | /api/marketplace/:id | Returns ...service, schema_input: JSON.parse(service.schema_input||'{ |
Sandbox (2 routes)
| Method | Path | Description |
|---|---|---|
| POST | /api/sandbox/call/:service_id | Api sandbox call (see implementation for full detail). |
| GET | /api/sandbox/services | Returns sandbox: true, note: 'Sandbox mode — calls are free but no real work i... |
Support (2 routes)
| Method | Path | Description |
|---|---|---|
| POST | /api/support | Returns success: true |
| POST | /api/support/contact | Api support contact (see implementation for full detail). |
(1 routes)
| Method | Path | Description |
|---|---|---|
| GET | / | Returns status: 'ok', name: 'run.pay', version: '5.0.0', model: '2% commission... |
.well-known/agent-trust-protocol.json (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /.well-known/agent-trust-protocol.json | Returns protocol: 'agent-trust-certificate', current_version: '1.0', s... |
.well-known/agent.json (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /.well-known/agent.json | Returns name: 'run.pay', description: 'The API marketplace for AI agents... |
.well-known/mcp (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /.well-known/mcp/server-card.json | Returns name: 'run.pay Marketplace', description: `Stripe-native marketp... |
.well-known/runpay-trust-key.json (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /.well-known/runpay-trust-key.json | De run.pay, peut vérifier un certificat de confiance sans jamais avoir |
agent-trust-protocol.md (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /agent-trust-protocol.md | Returns protocol: 'agent-trust-certificate', current_version: '1.0', s... |
api/affiliation (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /api/affiliation/register | Returns affiliate_code: affiliateCode, affiliate_link: `https://getrunpay.... |
api/analytics (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /api/analytics | Returns ok: false |
api/call-external (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /api/call-external | Api call external (see implementation for full detail). |
api/config (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/config | Returns publishable_key: process.env.STRIPE_PUBLISHABLE_KEY || '', platform: '... |
api/contact-sales (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /api/contact-sales | Returns success: true, note: 'Thanks — we\'ll get back to you shortly.' |
api/discover (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /api/discover | Api discover (see implementation for full detail). |
api/liability-chain (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/liability-chain/:transaction_id | Assembles mandate signer, declared intent, and transaction outcome into one accountability record. |
api/market-coverage (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/market-coverage | Besoin d'être fraîche à la seconde près. |
api/observability (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/observability/:transaction_id | Api observability (see implementation for full detail). |
api/proof-of-service (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/proof-of-service/:transaction_id | A signed, machine-readable receipt for a completed transaction. |
api/stats (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/stats | Api stats (see implementation for full detail). |
api/test-email (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/test-email | (Créée via migration auto au démarrage) |
api/transactions (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /api/transactions/vendor | Pagination par curseur (created_at) — passe ?before=<created_at de la dernière ligne reçue> |
api/verify-trust-certificate (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /api/verify-trust-certificate | Clé publique seule, mais cette route évite à un vérificateur externe |
health (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /health | Returns status: 'ok', database: 'connected', timestamp: new Date().toISOString... |
internal-services/currency-exchange (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /internal-services/currency-exchange | Returns success: true, from: fromCcy, to: toCcy, amount: amt, converted: data.... |
internal-services/earthquake-search (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /internal-services/earthquake-search | Vraiment dans le domaine public par la loi, jamais de vraie |
internal-services/public-holidays (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /internal-services/public-holidays | Réseau vers ces vraies API précises. À vérifier une fois en |
internal-services/weather-alerts-us (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /internal-services/weather-alerts-us | Returns success: true, state_code: sc, count: alerts.length, alerts |
llms.txt (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /llms.txt | Returns name: 'run.pay', description: 'The API marketplace for AI agents... |
mcp (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /mcp | Returns jsonrpc: '2.0', id, result: { protocolVersion: '2024-11-... |
mcp/invoke (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /mcp/invoke | Returns result: services |
mcp/manifest (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /mcp/manifest | Returns schema_version: 'v1', name: 'runpay-marketplace', description:... |
openapi.json (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /openapi.json | Returns protocol: 'agent-trust-certificate', current_version: '1.0', s... |
playground/call (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /playground/call/:endpoint | Playground call (see implementation for full detail). |
playground/me (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /playground/me | Returns found: false |
playground/quick-signup (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /playground/quick-signup | Returns success: true, agent_id: existing.agent_id, existing: ... |
playground/register-trial (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /playground/register-trial | Compteur d'appels gratuits (3/service) soit visible même entre deux sessions |
playground/request-trial (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /playground/request-trial | Returns success: true, message: 'Check your email for your trial link.' |
playground/session (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /playground/session/:agentId | (ajouté dans initDB automatiquement) |
playground/trial (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /playground/trial/:agentId | Returns found: false |
playground/verify (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /playground/verify/:token | Playground verify (see implementation for full detail). |
risk/evaluate (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /risk/evaluate | Guard, exposed as a paid B2B API — usable even by callers who don't otherwise use the marketplace. |
skill.md (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /skill.md | Skill.md (see implementation for full detail). |
webhooks/stripe (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /webhooks/stripe | Webhooks stripe (see implementation for full detail). |
x402 (1 routes)
| Method | Path | Description |
|---|---|---|
| GET | /x402 | Returns protocol: 'x402', version: '1', scheme: 'runpay-stripe', |
x402-flash/:serviceId (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /x402-flash/:serviceId | Accumulates micro-payments off-chain, settling in one transaction once a $0.50 threshold is reached. |
x402-sandbox/:serviceId (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /x402-sandbox/:serviceId | Same as /x402/:serviceId but spends virtual sandbox balance — real vendor calls, no real money. |
x402-tier/:tier_id (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /x402-tier/:tier_id | Pay for a specific SLA tier rather than a service's base price. |
x402-with-failover/:serviceId (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /x402-with-failover/:serviceId | Tries the primary service; on real failure, automatically retries an alternate of the same task_type. |
x402/:serviceId (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /x402/:serviceId | X402 (see implementation for full detail). |
xrpl/:serviceId (1 routes)
| Method | Path | Description |
|---|---|---|
| POST | /xrpl/:serviceId | L'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 path | Real fields / response (extracted from code) |
|---|---|
/internal/abstractlevel | Real input fields: text, target_level, source_level = 'auto' |
/internal/abtest | Real input fields: action, test_key, variants, result_variant, converted — Returns: success: true, action: 'create', test_key, variants: normalizedVariants |
/internal/agentcard | Real input fields: action, name, description, version = '1.0.0', capabilities = [], provider, conta |
/internal/agentcontract | Real input fields: action, party_b_id, title, terms, deadline, penalties, contract_id, penalty_usd, |
/internal/agentlisting | Real 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/agentreflect | Real input fields: period_hours = 24, goals, focus_area — Returns: success: true, period_hours, message: 'No telemetry data for this period', refle |
/internal/agentversion | Real input fields: action, version, description, changelog = [], metadata, target_agent_id — Returns: success: true, action: 'publish', agent_id, version, description, changelog_entr |
/internal/aiactcheck | Real input fields: system_description, use_case, deployment_context |
/internal/alertmanager | Real 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/analogy | Real input fields: source_domain, target_domain, find_analogies, evaluate_analogy |
/internal/anonymize | Real input fields: text, keep_mapping = false, replacement_style = 'label' |
/internal/approvalgate | Real input fields: action, gate_action, payload, webhook_url, ttl_minutes = 60, gate_id |
/internal/argextract | Real input fields: text, topic |
/internal/audienceadapt | Real input fields: text, target_audience, preserve_meaning = true |
/internal/audit | Chaque entrée contient un hash SHA256 du contenu + le hash de l'entrée précédente, |
/internal/avatar | Real input fields: email, name, size = 80, bg_color, text_color = 'ffffff', style = 'initials' |
/internal/barcode | Real input fields: value, format = 'CODE128', width = 2, height = 100, show_text = true |
/internal/base64 | Utile pour les agents qui manipulent des images, fichiers ou données binaires. |
/internal/biasdetect | ─── 12 SERVICES META-INTELLIGENCE ─────────────────────────────────────────── |
/internal/blueprint | Real input fields: action, blueprint_key, config, version = '1.0.0' — Returns: success: true, action: 'save', blueprint_key, checksum, version, size_bytes: con |
/internal/bounty | N'importe qui peut financer une tâche, pas seulement un accord fermé |
/internal/budget | Real input fields: action, budget_key, max_amount, period_days = 30, spend_amount |
/internal/businesshours | Real input fields: datetime, timezone = 'UTC', country = 'US', custom_hours |
/internal/calendarics | Real input fields: title, start, end, description, location, organizer_email, attendees, rrule, uid |
/internal/capabilityregistry | Real 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/capbound | Real 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/cardvalidate | Real input fields: card_number, card_numbers |
/internal/causalchain | Real input fields: text |
/internal/checkpoint | Real input fields: action, checkpoint_key, state |
/internal/chunker | Real input fields: text, chunk_size = 500, overlap = 50, mode = 'tokens', separator |
/internal/circuitbreaker | Real input fields: action, service_key, failure_threshold = 5, timeout_seconds = 60 |
/internal/codeformat | Real input fields: code, language = 'json', indent = 2 |
/internal/collectintel | Real input fields: question, responses, aggregation_method = 'weighted_consensus', include_minority |
/internal/color | Real input fields: color |
/internal/confcalibrate | Real input fields: claim, evidence = [], context |
/internal/consensus | Envoie une liste de votes/réponses, le service calcule le consensus. |
/internal/consensusvote | Real 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/contractcheck | Real input fields: text, risk_level = 'all' |
/internal/contracttemplate | Termes à chaque fois, un agent adopte directement un modèle éprouvé — |
/internal/contracttransfer | ── CONTRACT TRANSFERS: cession d'une position contractuelle en cours — |
/internal/contradict | Real input fields: fact_a, fact_b, context |
/internal/convsummarize | Real input fields: messages, target_tokens = 500, format = 'structured', preserve_last = 3 |
/internal/cost | Connaître ses propres dépenses cumulées sur run.pay pour rester dans un |
/internal/costtrack | ─── 9 NOUVEAUX SERVICES ───────────────────────────────────────────────────── |
/internal/cotvalidate | Real input fields: reasoning, conclusion, question |
/internal/counterfactual | Real input fields: event, counterfactual_condition, context, depth = 3 |
/internal/countryinfo | ── 8. COUNTRY INFO ────────────────────────────────────────────────────────── |
/internal/creditscore | ─── 12 SERVICES RARES ─────────────────────────────────────────────────────── |
/internal/cronparse | Real input fields: expression, next_count = 5, timezone = 'UTC' |
/internal/csv2json | ─── GROUPE C : SERVICES UTILITAIRES ZÉRO COÛT (suite) ────────────────────── |
/internal/csvtransform | Real 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/csvvalidate | Real input fields: csv, schema |
/internal/ctxoptimize | ─── 12 SERVICES RARES — VAGUE 3 ───────────────────────────────────────────── |
/internal/currency | Real input fields: from = 'USD', to, amount = 1 |
/internal/dataprofiler | Real input fields: data, csv |
/internal/datecalc | Real input fields: action, date, date1, date2, amount, unit = 'days', business_days = false |
/internal/deadmansswitch | Real input fields: action, switch_key, webhook_url, interval_seconds = 3600 — Returns: success: true, action: 'register', switch_key, webhook_url, interval_seconds: tt |
/internal/decisiontree | Decisiontree (see implementation). |
/internal/dedupe | Real input fields: items, threshold = 0.85, key |
/internal/diff | Utile pour agents de code review, de rédaction collaborative, ou de validation. |
/internal/disputejury | Real input fields: action, dispute_id, vote |
/internal/divergethink | Real 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/embsimilarity | Real input fields: vector_a, vector_b, pairs, threshold = 0.8 |
/internal/errorprop | Real input fields: action_chain, error_at_step, error_type |
/internal/escrow | Real input fields: action, receiver_agent_id, amount_usd, task_description, escrow_id, ttl_hours = |
/internal/escrowpool | Les participants ont contribué ET approuvé — contrairement à l'escrow à |
/internal/evalexpr | Evalexpr (see implementation). |
/internal/eventlog | Real 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/fakedata | Real input fields: type = 'person', count = 1, locale = 'en' |
/internal/fallacydetect | Real input fields: text, texts |
/internal/featureflag | Real input fields: action, flag_key, enabled, rollout_percent, variant, metadata, flags — Returns: success: true, action: 'set', flag_key, enabled: enabled !== false, rollout_perc |
/internal/feedback | Real input fields: action, session_key, rating, comment, metadata — Returns: success: true, action: 'submit', feedback_id: id, session_key, rating: parseInt( |
/internal/filetype | Real input fields: base64, filename |
/internal/finance | Real input fields: action, principal, rate, years, periods_per_year = 12, monthly_payment, loan_amo |
/internal/freshness | Real input fields: content, created_at, topic_type, domain |
/internal/gametheory | Real input fields: players, payoff_matrix, game_type = 'normal_form' |
/internal/gdprcheck | Real input fields: text, context = 'general' |
/internal/geocode | Real input fields: address, addresses, lat, lon, limit = 5 |
/internal/goalcheck | Real input fields: goals, proposed_action, context |
/internal/goaldecomp | Real input fields: goal, context, max_depth = 3, style = 'hierarchical' |
/internal/halludetect | Real input fields: response, context, question |
/internal/hashgen | Real input fields: text, texts, algorithm = 'sha256', hmac_key, encoding = 'hex' |
/internal/healthmonitor | ── 1. AGENT HEALTH MONITOR ─────────────────────────────────────────────────── |
/internal/html2md | Real input fields: html, url |
/internal/htmlsanitize | Real input fields: html, mode = 'safe', allowed_tags, strip_comments = true, strip_scripts = true |
/internal/hyptest | Real input fields: test, group_a, group_b, alpha = 0.05 |
/internal/ibanvalidate | Real input fields: iban, ibans |
/internal/idgen | UUID v4, ULID (tri chronologique), NanoID (court), CUID-like, timestamp-based. |
/internal/imgcompress | Real input fields: image_base64, quality = 80, max_width, max_height, format |
/internal/insurance | Real input fields: action, risk_description, premium, payout, period_end, policy_id, claim_descript |
/internal/invoice | Real input fields: invoice_number, date, due_date, seller, buyer, items, currency = 'USD', tax_rate |
/internal/ipgeo | Géolocalisation d'IP via ip-api.com (gratuit, 1000 req/min, aucune clé requise). |
/internal/iprep | Real input fields: ip, ips |
/internal/json2csv | Real input fields: data, delimiter = ',', include_header = true, columns — Returns: success: true, csv, row_count: data.length, column_count: keys.length, columns: |
/internal/jsonflatten | Real input fields: data, action = 'flatten', separator = '.', max_depth = 50 |
/internal/jsonformat | Détecte les erreurs courantes (virgule en trop, guillemets manquants, etc.) |
/internal/jsonmerge | ─── 9 NOUVEAUX SERVICES ZÉRO COÛT ─────────────────────────────────────────── |
/internal/jsonschema | Real 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/keywords | Real input fields: text, top_n = 15, min_length = 3, include_phrases = true |
/internal/knowledgegraph | Real input fields: text |
/internal/langdetect | Real input fields: text, texts |
/internal/linkextract | Real input fields: url, html, include_internal = true, include_external = true, include_emails = tr |
/internal/llmrouter | Real input fields: task, priority = 'balanced', max_cost_per_1m_tokens, context_length, require_vis |
/internal/loan | Real input fields: action, principal_usd, interest_rate_percent, term_seconds, loan_id, amount |
/internal/lock | Le verrou expire automatiquement après expires_in_seconds, donc un agent |
/internal/loopdetect | Real input fields: action_history, similarity_threshold = 0.8 |
/internal/math | Real input fields: expression, expressions, precision = 14 |
/internal/matrix | Real input fields: operation, matrix_a, matrix_b, scalar — Returns: success: true, operation, result: m, shape: [n, n] |
/internal/md2html | Real input fields: markdown |
/internal/mdtable | Real input fields: markdown, data, headers: customHeaders |
/internal/meetingscheduler | Meetingscheduler (see implementation). |
/internal/memimportance | Real input fields: memories, current_goal, top_k |
/internal/memory | Sont des appels HTTP externes vers runpay-services. |
/internal/metatags | Real input fields: title, description, url, image, site_name, twitter_handle, type = 'website', loc |
/internal/moderate | Real input fields: text, texts, categories = ['hate','toxic','adult','violence','spam'] |
/internal/montecarlo | ─── 12 SERVICES RARES — VAGUE 2 ───────────────────────────────────────────── |
/internal/moralreason | Real input fields: action, context, stakeholders = [], consequences |
/internal/narrative | Real input fields: action, narrative_key, character, event, context_update, query: narrativeQuery |
/internal/negostrat | Real input fields: situation, your_goal, counterpart_goal, your_batna, your_position, negotiation_t |
/internal/ner | Real input fields: text, entity_types |
/internal/newssearch | ─── GROUPES B, C, D : 13 NOUVEAUX SERVICES ────────────────────────────────── |
/internal/notify | Notify (see implementation). |
/internal/num2words | Real input fields: number, locale = 'en', currency = false, currency_name = 'dollar' |
/internal/numformat | Real input fields: number, numbers, format = 'decimal', locale = 'en-US', currency = 'USD', decimal |
/internal/ocr | ─── 6 NOUVEAUX SERVICES ZÉRO COÛT ─────────────────────────────────────────── |
/internal/pagemeta | Real input fields: url, html |
/internal/password | PIN numérique, et hex. Zéro dépendance externe — crypto.randomBytes natif. |
/internal/pdf2text | Real input fields: pdf_base64, max_pages — Returns: success: true, text, |
/internal/permissions | ─── 6 NOUVEAUX SERVICES GOUVERNANCE + UTILITAIRES ─────────────────────────── |
/internal/perscheck | Real input fields: persona, responses, response |
/internal/phoneformat | Real input fields: phone, phones, default_country = 'US', format = 'all' |
/internal/piiscan | Real input fields: text, texts |
/internal/prices | Real input fields: type = 'crypto', symbol, symbols, currency = 'usd' |
/internal/promptbuild | Promptbuild (see implementation). |
/internal/promptcheck | Real input fields: text, texts |
/internal/promptoptimize | Real input fields: prompt, task_type, target_model |
/internal/pushnotify | Pushnotify (see implementation). |
/internal/pwdstrength | Real input fields: password, passwords |
/internal/qrcode | Génère un QR code en base64 PNG ou SVG depuis n'importe quel texte/URL. |
/internal/ratelimit | La fenêtre se réinitialise automatiquement quand window_seconds s'est écoulé |
/internal/readability | Retourne le texte propre + Markdown optimisé pour injection dans un LLM. |
/internal/redteam | Real input fields: agent_description, capabilities, use_case, severity_filter = 'all' |
/internal/regex | Real input fields: pattern, flags = 'g', text, texts |
/internal/reputation | Real input fields: action, ratee_agent_id, score, comment, context |
/internal/responsevalidate | Real input fields: response, rules |
/internal/retryscheduler | Real input fields: action, task_key, payload, max_attempts = 5, base_delay_seconds = 60, error_mess |
/internal/revenueshare | Real input fields: action, percentage, cap, upfront_price, share_id, earnings_amount |
/internal/rhetdetect | Real input fields: text |
/internal/robotstxt | Real 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/scheduler | Lui-même si elle est due ("check_due") — pas de webhook automatique, |
/internal/schemainfer | Real input fields: examples, title = 'InferredSchema', required_threshold = 0.9 |
/internal/semanticdiff | Real input fields: text_a, text_b |
/internal/semaphore | Real input fields: action, semaphore_key, ttl_seconds = 30 |
/internal/semcache | Real input fields: action, query: queryText, result, ttl_hours = 24, similarity_threshold = 0.8 |
/internal/sentiment | Supporte l'analyse de listes de textes (batch). Zéro dépendance externe. |
/internal/simsandbox | Simsandbox (see implementation). |
/internal/slug | Real input fields: text, texts, separator = '-', lowercase = true, max_length = 80 |
/internal/smartroute | Corrigée) garantit qu'aucune tentative échouée ne laisse une charge |
/internal/snippets | Real input fields: action, snippet_key, content, tags = [], metadata, search, limit = 20 — Returns: success: true, action: 'set', snippet_key, tags, size_bytes: contentStr.length |
/internal/spamdetect | Real input fields: text, texts, subject |
/internal/sslcheck | Real input fields: hostname, port = 443, domains |
/internal/stake | Une action directement appelable, seulement déclenchée par de vrais |
/internal/statistics | Real input fields: values, values_b, operation = 'all' |
/internal/strdistance | Real input fields: str1, str2, pairs, algorithm = 'levenshtein' |
/internal/subscription | Spécial qui fausserait la comparaison entre un appel ponctuel et un |
/internal/summarize | Real input fields: text, max_sentences = 5, style = 'bullets', focus_keywords = [] |
/internal/swarmcoord | ─── 12 SERVICES RARES — VAGUE 4 ───────────────────────────────────────────── |
/internal/sycophancydetect | Real input fields: response, user_claim, conversation_history |
/internal/syndicate | Real 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/synthdata | Real input fields: schema, count = 10, locale = 'en', seed |
/internal/taskauction | Real 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/taskqueue | Un agent soumet des tâches, un autre les récupère et les traite. |
/internal/taxcalc | Real input fields: action, amount, tax_rate, country, state, price_includes_tax = false, items |
/internal/techstack | Real input fields: url, html |
/internal/telemetry | Real 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/template | Real input fields: template, variables, templates |
/internal/temporalvalidate | Real input fields: text, events |
/internal/textencrypt | Real input fields: action, text, encrypted, key, algorithm = 'aes-256-gcm' |
/internal/textstats | Real input fields: text, top_words = 10 |
/internal/timecapsule | Real input fields: action, capsule_key, content, unlock_at, unlock_after_calls, metadata |
/internal/timezone | Real input fields: datetime, from_tz = 'UTC', to_tz, to_tzs |
/internal/tokencost | Real input fields: model, input_tokens, output_tokens, text, calls |
/internal/tokencount | Approximation GPT-4 : ~4 caractères par token (suffisant pour 99% des cas). |
/internal/translate | Utilise MyMemory API (gratuit, 5000 req/jour, pas de clé requise). |
/internal/trustprop | Real 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/uncertainty | Real input fields: statement, domain |
/internal/units | Real input fields: value, from, to, category |
/internal/urlparse | Et détecte si c'est une URL valide, une IP, un localhost, etc. |
/internal/urlshorten | Real input fields: url, urls |
/internal/vatvalidate | Real input fields: vat_number, vat_numbers |
/internal/vault | Real input fields: action, key, value, prefix |
/internal/vouch | Un score combiné inventé, l'accès emprunté est strictement celui du |
/internal/weather | Utilise Open-Meteo API (gratuit, illimité, pas de clé requise). |
/internal/webhook | Webhook (see implementation). |
/internal/webhooksig | Real input fields: provider, payload, signature, secret, timestamp |
/internal/websearch | ─── GROUPE A : 10 SERVICES ZÉRO COÛT ──────────────────────────────────────── |
/internal/whois | Real input fields: domain |
/internal/workflow | Real input fields: action, machine_key, initial_state, transitions, event, context, metadata |
/internal/xlsxgen | Real input fields: sheets, title = 'Workbook' |
/internal/xml2json | Returns: success: true, mode: 'parse', data: result |
/internal/yamlparse | Real input fields: yaml: yamlContent, json, action = 'parse' — Returns: success: true, action: 'parse', data: r.result, type: r.type |
/internal/zipcode | Real input fields: zip, zips, country_code = 'us' |