Spec v1.0 stable · x402 in pre-release · Apache 2.0

Revenue, when your customer isn't human.

An open protocol for selling to AI agents. Provider keeps 85% of every invoke — live today with per-agent wallets and budget mandates. Next: x402 settlement on Base, where the 85/10/5 split is atomic by contract.

1
Agent calls POST /v1/invoke with capability + action.
2
402 + x402 challenge Hub returns price; SDK signs EIP-3009 USDC authorization.
3
Two-phase on-chain split Facilitator pulls USDC into the immutable Splitter (T+0); after 3 Base blocks (~6s) the Hub keeper records the 85/10/5 attribution (p99 ≤30s).

x402 flow as specified in v1.1.0-rc3 — not yet enabled on the production Hub. Today, invokes are paid from a Stripe-funded agent wallet.

$ npm install @jecpdev/sdk npm ↗
Official TypeScript SDK · Apache 2.0 · works with Node, Bun, Cloudflare Workers, Next.js
25
actions live
85%
to providers
47
countries
5 min
to ship
Two paths, one protocol

Sell to agents. Or build with them.

JECP serves two opposite intents through the same protocol — mirror images of agent commerce.

① Sell to agents

"Revenue, when your customer isn't human."

You have a service. AI agents are already trying to call it — most without paying. Wrap it as a JECP capability and charge $0.001 to $0.15 per call. 85% goes to you.

Best for:

  • SaaS founders adding a B2A revenue lane
  • Indie hackers monetizing API tools
  • Agencies turning expertise into a billable capability
→ Become a Provider (5 minutes)

② Build with agents

"An autonomous agent with its own wallet."

You're building an agent. Give it $20, give it a Mandate, let it work. It discovers capabilities across many providers, charges its own wallet, and operates autonomously under a budget you set.

Best for:

  • AI startups building autonomous super-agents
  • Researchers running agent experiments at scale
  • Teams orchestrating multi-vendor agent workflows
→ Give your agent a wallet (3 minutes)

Both sides use the same JECP protocol. Both sides settle through the same Hub. Some teams do both.

x402 · v1.1.0-rc3 pre-release

Three things only JECP does at the protocol layer.

The 85/10/5 split is not a policy. It is a Solidity contract on Base. Every paid x402 invoke either splits on-chain, or it doesn't settle at all. The invariant is binary — Provider, Hub, and Reserve all paid, or nothing settles.

Status: specified in v1.1.0-rc3 and implemented in the Hub, not live yet. The Splitter goes to Base mainnet after an independent security audit. Roadmap →

85% to the developer

The immutable Splitter contract attributes 85% of every invoke to the Provider — Hub 10%, Network reserve 5%. The ratio is constructor-fixed in Solidity, not configured in a Stripe dashboard. Stripe Connect tops out around 88% gross only after T+2 bank settlement; with x402, JECP records the on-chain attribution after 3 Base block confirmations (~6s), p99 ≤30s.

Spec §6 · jecp-contracts

x402-native

USDC on Base, EIP-3009 transferWithAuthorization, x402.org facilitator. The agent's wallet pre-funds in USDC once and pays per invoke — no Stripe Checkout, no human-in-the-loop top-ups, no recurring approvals. SDK mode: 'auto' attempts x402 from the first 402 if a Base signer is configured.

Quickstart · @jecpdev/sdk v0.8.2+

Two-phase settlement, no Hub custody

Provider EIP-712-signs register() directly. The x402.org facilitator is trust-minimized — it only pulls USDC into the immutable Splitter (T+0). A hardened Hub keeper (AWS KMS-backed, the only AUTHORIZED_SETTLER) then records the 85/10/5 attribution on-chain (after 3 Base block confirmations, p99 ≤30s). The split ratio is constructor-fixed; even a compromised keeper EOA cannot change it.

Spec §6 · JecpSplitter.sol

The Stripe wallet path is live today and stays unchanged. When x402 ships it is opt-in, additive, and backward compatible.

Trust model · v1.1.0-rc3

How JECP settlement is safe.

Three layers, separated by design. The split ratio cannot be changed by any party — including Tufe. Even a full key compromise has a bounded blast radius. This is the v1.1.0-rc3 design; it goes live together with x402 on mainnet.

1. Splitter contract (immutable)

Controls the 85/10/5 split ratio. Cannot be upgraded or paused. The Provider 85% claim is constructor-fixed. Splitter v1 is intentionally immutable per design SC-A14 — there is no pause() function and no admin path to rewrite shares. An independent audit is a precondition for mainnet deployment.

2. x402.org facilitator (trust-minimized)

Only authorized to pull USDC from agent wallets into the Splitter contract. Cannot call recordSettlement or any other Splitter method. The facilitator is a USDC puller, not a settlement actor.

3. Hub keeper (Tufe-operated, AWS KMS-backed)

The single AUTHORIZED_SETTLER on the Splitter contract. Calls recordSettlement to attribute each pull to a Provider. The keeper key lives in AWS KMS — never exposed to the Hub process, never on disk in plaintext. If compromised, the attacker is bounded by PER_TX_CAP and cannot change the split ratio.

Once the Splitter is on Base mainnet, verify on BaseScan: read the contract, confirm the constructor-set AUTHORIZED_SETTLER address, and check that the x402.org facilitator EOAs (Coinbase x402 Facilitator 1-8, Canza, Daydreams, X402rs) do NOT have settlement authority. jecp-contracts

FAQ

Settlement, in plain terms.

Why two phases? Isn't x402 single-block?

The earlier (pre-v1.1.0-rc3) framing said "single-block atomic." That described the ideal case for an x402 facilitator that could record settlements on-chain directly. In practice the x402.org facilitator is specifically designed NOT to do that — its job is to execute the USDC pull, and nothing more.

We agree with that design (it's better for trust minimization), so we moved the settlement recording into a hardened Hub keeper service. The atomicity guarantee is now: the split ratio is constructor-fixed in an immutable contract; the keeper either records the split correctly or the call reverts. End-state correctness is unchanged. On wall-clock: the pull is confirmed after 3 Base blocks (~6s, reorg defense), then the keeper records the split with a p99 target of ≤30s end-to-end.

ADR-0003 Am-7

What if the Hub keeper key is compromised?

Bounded blast radius:

  • The Splitter contract is immutable. Split ratio (85/10/5) cannot be changed by any party.
  • PER_TX_CAP limits the maximum amount any single recordSettlement call can move.
  • The keeper key lives in AWS KMS — never exposed to the Hub process, never logged, never on disk in plaintext.
  • IAM policy is least-privilege: only the Hub keeper Fly machine identity can call kms:Sign on the keeper key.
  • Rotation via Splitter v2 redeploy + provider remigration is the documented emergency path.

A keeper key compromise is a serious incident, not a catastrophic one. Splitter immutability means an attacker cannot rewrite the protocol.

Can I pay with x402 today?

Not yet. x402 is specified in v1.1.0-rc3 and implemented in the Hub behind a feature flag. Before it is switched on, the Hub keeper key is provisioned, the keeper runs a 7-day staging soak, and the Splitter contract and keeper pass an independent security audit. Only then does the Splitter go to Base mainnet.

Today, agents pay from a Stripe-funded wallet with the same 85/10/5 split, recorded in the Hub ledger. Existing integrations keep working when x402 ships.

Roadmap: v1.1.0 GA gates

The inversion

Your business model assumes humans buy.

For 30 years

Every revenue model on the internet was built for humans: forms, OAuth flows, checkout pages, monthly subscriptions.

Then agents arrived

They have intent. They have wallets. They cannot fill out checkout forms. Today, every API call from an agent is either unpaid (you eat the cost) or hardcoded to one provider (you skip discovery).

JECP closes that gap

The first open protocol that treats agents as economic actors. Discovery, capability execution, and per-call settlement — all in one envelope.

More than a payment rail

Give your agent economic identity.

Until now, agents borrowed your API key. With JECP, an agent has its own wallet, its own budget, its own trust history. Payment is one layer. Identity, safety, orchestration, and portability are the others.

Wallets — Agents hold their own balance

Each agent has a USDC wallet, separate from any human's card. Top up $5, $20, or $100 via Stripe Checkout. Balance never expires. Charge atomically per call. The agent is the economic actor — not its operator.

# Agent has wallet, like a Stripe customer
POST /v1/agents/topup
{ "amount": 20 }
→ Stripe Checkout URL → balance += $20

# Every call atomically debits agent's wallet
balance_after = balance_before - cost

Mandate — Cap your agent's spend

Pre-authorize a budget before invocation. Auto-stop on overrun. The first protocol-level safeguard against runaway agents that drain wallets. Spec §4.

"mandate": {
  "agent_id": "...",
  "budget_usdc": 5.00,
  "expires_at": "2027-01-01T00:00:00Z"
}

Trust Gate — Tier capabilities by trust

Bronze agents do basic translations. Platinum agents do file uploads, transactions, sensitive ops. Trust is earned by verifiable history, not flags. Spec §5.

# manifest action
trust_tier_required: silver
# Bronze agents get 403
# Silver+ proceed

Multi-step workflows — One call, atomic commit

"Generate invoice, then email it" runs as one transaction with a single envelope, full audit trail, and idempotency on retry. No glue code, no orchestration layer.

"capability":"jobdonebot/workflow",
"action":"invoice-and-notify"
# = generate-invoice + email-send
# under one mandate, one charge

Multi-vendor — Switch providers without rewrite

DeepL today, your in-house model tomorrow, OpenAI on weekends — same JSON envelope, same contract. Agents discover via manifest. No vendor lock-in by design.

"capability":"deepl/translate"
# swap to:
"capability":"yourco/translate"
# Identical protocol contract.

Binary artifacts — Files, not just JSON

PDFs, images, audio, datasets — return them as first-class artifacts with content-type, size, and signed URLs. Agents handle them like any tool output.

next_action — Machine-readable recovery

When something fails, errors include a structured next_action field telling the agent exactly what to do: retry, top up, request mandate, or escalate. No string-matching error codes.

JECP is to agents what HTTP was to browsers — a single envelope, multiple concerns, no vendor lock-in.

How it works

Three roles, one protocol.

A

Agent Developer

Give your agent its own wallet. Discover capabilities, invoke any provider, pay per call. No subscription, no OAuth dance.

# Invoke any active capability
curl -X POST https://jecp.dev/v1/invoke \
  -H "X-Agent-ID: $AID" \
  -H "X-API-Key: $KEY" \
  -d '{"jecp":"1.0","id":"r1",
       "capability":"jobdonebot/content-factory",
       "action":"translate",
       "input":{"text":"Hello","target_lang":"JA"}}'
B

Service Provider

List your capabilities. Receive 85% of every successful call. Payouts in 47 countries.

# Register, then publish a manifest
curl -X POST https://jecp.dev/v1/providers/register \
  -d '{"namespace":"yourco",
       "country":"US",
       "owner_email":"...",
       "endpoint_url":"https://yourco.com/jecp"}'

# DNS verify, Stripe Connect, publish manifest
# 5 min total. See "Become a Provider" below.
C

Spec Contributor

The protocol is Apache 2.0, RFC 2119 compliant, JSON Schema 2020-12. Read, fork, propose.

# Read or fork the spec
git clone https://github.com/jecpdev/jecp-spec
cd jecp-spec/spec

# Spec sections:
#   00-overview      04-manifest
#   01-protocol      05-discovery
#   02-authentication
#   03-errors
The economic inversion

Two worlds, one protocol layer.

Old world (human commerce) New world (agent commerce)
CustomerHuman userAI agent (24/7, scales infinitely)
DiscoverySEO, ads, contentmanifest discovery + capability resolve
AuthenticationOAuth, sessionsAPI key + wallet
SettlementCard / subscriptionPer-call wallet deduct
Cost of acquisitionHigh (CAC ~ $50-500)Near zero (CAC ≈ $0)
LTV ceilingBounded by human churnBounded by agent count × calls
ScalingLinearNon-linear, per-API

Most providers have no system for the right column. JECP is that system.

Why JECP

What other tools do, and what only JECP does.

Capability MCP LangChain Stripe Connect OpenAI Agents JECP
Tool discovery
Binary artifacts
Multi-step workflow
Pre-auth budgets (Mandate)
Tiered trust (Trust Gate)
Per-call billing
On-chain revenue split— (T+2 off-chain)✓ immutable 85/10/5 (v1.1, pre-release)
x402-native (USDC/Base)✓ (v1.1, pre-release)
Multi-vendor by design
Open spec (RFC 2119)

Mandate — pre-authorized budget caps, auto-stop on overrun (Spec §4) · Trust Gate — Bronze→Silver→Gold→Platinum, per-action gates (Spec §5) · Per-call billing — atomic deduct + 85/10/5 split, no subscription required.

Reference implementation

How JobDoneBot uses JECP.

JobDoneBot is a SaaS by Tufe Company — the same author of the protocol — with 25 actions across 6 capabilities. Every call from every agent flows through the same code path any third-party would use.

document-pipeline

$0.003 – $0.02

Generate professional PDFs: invoices, quotes, receipts, contracts, reports.

5 actions

file-chain

$0.005 – $0.01

Image processing, PDF merge/split/compress, batch conversion across formats.

3 actions

content-factory

$0.003 – $0.02

Generate blogs, SNS posts, translations, summaries, rewrites via Claude.

5 actions

data-insight

$0.005 – $0.02

Analyze CSV / JSON, generate time-series forecasts with confidence intervals.

3 actions

workflow

$0.01 – $0.05

Multi-step chains: invoice→email, content→SNS, analysis→report→mail.

3 actions

sns-engine

$0.02 – $0.15

Automate X / TikTok / Instagram. A/B test, autopilot, engagement analytics.

6 actions
Money flow on every call
Agent  ─────►  JECP Hub  ─────►  JobDoneBot Provider
                  │
                  ├─  deduct wallet      ($0.005)
                  ├─  split revenue
                  │     ├─ Provider     $0.00425   (85%)
                  │     ├─ Hub fee      $0.00050   (10%)
                  │     └─ Payment fee  $0.00025   (5%)
                  └─  Stripe transfer to Provider (automated payouts: planned)

Tufe Company earns 85% as a Provider plus 10% as the Hub operator. This is dogfeeding by the protocol author — the same path is open to you.

→ See live catalog

For agent developers

Give your agent a wallet in 3 steps.

1

Register the agent

POST https://jecp.dev/api/agents/register
{
  "name": "MyResearchAgent",
  "agent_type": "research",
  "description": "Reads docs and writes summaries"
}

← {
  "agent_id": "jdb_ag_a1b2c3...",
  "api_key": "jdb_ak_xxxxxxxxxxxx"
}

One call. agent_id + api_key are yours forever. Registration is free.

2

Top up the wallet

POST https://jecp.dev/api/agents/topup
X-Agent-ID: jdb_ag_a1b2c3...
X-API-Key:  jdb_ak_xxxxxxxxxxxx

{ "amount": 20 }    # one of: 5, 20, 100

← { "url": "https://checkout.stripe.com/..." }
# Open URL → pay via Stripe → wallet credited.

Stripe Checkout (one-time). Balance never expires. Webhook credits the wallet on payment success.

3

Invoke — wallet auto-debits

POST https://jecp.dev/v1/invoke
X-Agent-ID: jdb_ag_a1b2c3...
X-API-Key:  jdb_ak_xxxxxxxxxxxx

{
  "jecp": "1.0",
  "id": "req-001",
  "capability": "jobdonebot/content-factory",
  "action": "translate",
  "input": {"text":"Hello","target_lang":"JA"},

  "mandate": {                 # optional safety
    "agent_id": "jdb_ag_a1b2c3...",
    "api_key":  "jdb_ak_xxxxxxxxxxxx",
    "budget_usdc": 1.00,
    "expires_at": "2027-01-01T00:00:00Z"
  }
}

← { "status":"success",
    "billing": { "charged":true, "balance_after": 19.995 } }

Per-call atomic debit. Wrap with mandate to cap total spend across calls.

That's it. Your agent now has its own wallet, its own API key, and operates autonomously under a budget you control. No human-card OAuth dance, no per-call credit-card-on-file.

TypeScript? Skip the curl. Use the SDK.
npm install @jecpdev/sdk

import { JecpClient } from '@jecpdev/sdk';

const jecp = new JecpClient({ agentId, apiKey });

const { output, billing, wallet_balance_after } = await jecp.invoke(
  'jobdonebot/content-factory', 'translate',
  { text: 'Hello', target_lang: 'JA' },
  { mandate: { budget_usdc: 1.00 } }
);
Apache 2.0 · Node ≥18 · Bun · Cloudflare Workers · Next.js · 9 typed errors with next_action auto-recovery · npm · GitHub
For service providers

Ship to agents in 5 minutes.

1

Register

POST /v1/providers/register
{
  "namespace": "yourco",
  "display_name": "Your Co",
  "country": "US",
  "owner_email": "founder@yourco.com",
  "endpoint_url": "https://yourco.com/jecp"
}

Receive provider_api_key + hmac_secret (shown once).

2

DNS verify

TXT _jecp.yourco.com
"jecp-verify=<token>"

POST /v1/providers/verify-dns
Authorization: Bearer jdb_pk_...
{ "domain": "yourco.com" }

Proves you own the endpoint domain.

3

Stripe Connect

POST /v1/providers/connect-stripe
Authorization: Bearer jdb_pk_...
→ onboarding_url

5-minute onboarding via Stripe Express. 47 countries supported.

4

Publish manifest

POST /v1/manifests
Authorization: Bearer jdb_pk_...
Content-Type: application/x-yaml

namespace: yourco
capability: translate
version: 1.0.0
endpoint: https://yourco.com/jecp
actions: [...]

Active immediately if DNS + Stripe verified.

5

Earn

Agent invokes  ──►  you receive 85%
                ──►  hub keeps 10%
                ──►  payment 5%

Revenue allocated atomically per call.
Stripe Transfer (automated payouts: planned).

Same path JobDoneBot uses. Same SLA, same auth, same revenue split.

Provider endpoint, in 12 lines (TypeScript)
import { JecpProvider } from '@jecpdev/sdk';

const provider = new JecpProvider({
  hmacSecret: process.env.JECP_HMAC_SECRET!,
});

// Works on Bun, Cloudflare Workers, Next.js Route Handlers...
export const POST = provider.createHandler(async (req) => {
  if (req.action === 'translate') {
    return { translated: await myTranslate(req.input) };
  }
  throw new Error(`unknown action: ${req.action}`);
});
HMAC verification + ±5 min replay window built-in. Apache 2.0. npm · GitHub
Pricing for agents

Pay only for what you use.

Browse

$0

Registration and the full catalog — every capability, schema, and price — are free. No account needed to browse.

Top up $5

$5

~1,000 calls @ $0.005. One-time payment. Balance never expires.

Top up $20 Recommended

$20

~4,000 calls. Stripe one-time payment. No subscription.

Top up $100

$100

~20,000 calls. Best for high-volume agents. Same per-call pricing.

No subscription. Pay-per-call. Balance never expires.

x402 mode — pay direct from a Base USDC wallet Coming in v1.1

Once x402 ships: skip Stripe top-ups. Fund a Base wallet with USDC, point the SDK at it, and every invoke settles on-chain. Roughly ~1% in network gas instead of the 5.9% Stripe markup on small top-ups. Provider still keeps 85% — the split is atomic by contract in an immutable Splitter.

~1%
on-chain gas, no payment markup
maxPerCallUsdc
SDK refuses to sign over your cap (v0.8.2+)
maxPerHourUsdc
rolling-hour spend cap before signing
split-or-revert
85/10/5 recorded by Hub keeper after 3 Base blocks (~6s), p99 ≤30s
→ /guides/x402 (preview quickstart)
Spec-grade by design

Built to outlast any single vendor.

Standards

Apache 2.0 license · RFC 2119 keywords · JSON Schema 2020-12 · spec v1.0.2 stable · v1.1.0-rc3 pre-release.

Reference impl

Rust + Axum + SQLx + Tokio. Open source. Production since May 2026.

Settlement

Stripe Connect Express across 47 countries. HMAC-SHA256 with replay window. Idempotent per (agent_id, request_id) for 24h.

Standards track (planned)
Next        IETF Internet-Draft  draft-jecp-agent-commerce-00
Then        arXiv preprint
Then        IETF BoF session

Backed by 100% open spec. No vendor lock-in by design.