x402 Protocol — Base Mainnet

agentic.endpoints

Pay-per-call micro-utilities for autonomous AI agents.
No API keys. No subscriptions. Just USDC micropayments.

How It Works

Agent calls endpoint 402 Payment Required Agent pays USDC on Base Response + signed receipt

Paid Endpoints

POST/once-key
Atomic idempotency witness — claim an action exactly once, record its result, and replay that result to every later caller
POST/scrape
Web scraping and text extraction
POST/pdf-parse
PDF text extraction
POST/compress
Token compression for LLMs
POST/vault/store
Store an encrypted item in the vault. The first store claims the namespace and returns a one-time namespace_token.
POST/vault/delete
Delete an item from the vault (requires the namespace_token)
POST/credits/buy
Buy $6.00 of prepaid credit for $5.00 (20% bonus). Returns a credit token; send it as X-Credit-Token on any paid endpoint to be debited at list price with no per-call payment signature.
POST/credits/buy-25
Buy $32.50 of prepaid credit for $25.00 (30% bonus). Returns a credit token; send it as X-Credit-Token on any paid endpoint to be debited at list price with no per-call payment signature.
POST/meetings/import
Import a meeting transcript. visibility "private" stores ciphertext this service cannot read; "queryable" stores plaintext and indexes it for search. The first import claims the namespace and returns a one-time namespace_token.
POST/meetings/search
Full-text search across your queryable meetings. Returns ranked excerpts, and reports how many meetings were private and therefore not searched.
POST/meetings/get
Fetch one meeting in full, by meeting_id (requires the namespace_token)
POST/meetings/list
List the meetings in a namespace with their metadata, newest first. Never returns transcripts (requires the namespace_token)
POST/meetings/delete
Delete a meeting and remove it from the search index (requires the namespace_token)
POST/vault/list
List the keys held in a vault namespace with their metadata, without returning any ciphertext (requires the namespace_token)
POST/vault/exists
Check whether a key exists in the vault without returning its ciphertext (requires the namespace_token)
POST/vault/retrieve
Retrieve an encrypted item from the vault (requires the namespace_token issued at claim time)

Free Endpoints

Lifecycle calls are free because the paid claim already covers them, and telemetry is free because a service asking to be trusted should not charge you to check whether it works.

POST/once-key/complete
Record the outcome of a claimed action_key
Free
POST/vault/rotate-token
Replace a vault namespace token
Free
POST/once-key/release
Surrender a claim whose work failed
Free
POST/credits/balance
Check a prepaid credit balance
Free
GET/status
Uptime, error rate and latency, measured from real traffic
Free
GET/stats
Demand funnel: requests challenged, paid and served free
Free
GET/revenue
USDC received, read directly from Base — not from our logs
Free
GET/health
Health check
Free
GET/openapi.json
OpenAPI 3.1 description of every route
Free
GET/llms.txt
Plain-language description for a model given only this URL
Free
POST/mcp
Remote MCP server (Streamable HTTP). Listing tools is free; calling one costs that tool's price
Free

Use as an MCP server

// Add to any MCP client (Claude Desktop, Copilot CLI, Cursor) { "mcpServers": { "agentic-endpoints": { "type": "http", "url": "https://ai.oliverkiss.com/mcp" } } }

Quick Start

// npm install agentic-endpoints import { AgenticEndpoints } from "agentic-endpoints"; // Run a side effect exactly once, even if your agent is running twice. // Claims the key, records the result, releases it if the work throws. const { outcome, result } = await client.exactlyOnce( { namespace: "billing", actionKey: `charge:${order.id}`, leaseTtl: 300 }, async () => stripe.charges.create({ amount: order.total }), ); // outcome: "performed" — you did the work // outcome: "replayed" — someone else already did it; result is theirs // throws HeldError — claimed but never completed; no result exists

Or over plain HTTP

// 1. Claim it. Costs $0.001. Any x402-enabled wallet can pay. const claim = await fetch("https://ai.oliverkiss.com/once-key", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ namespace: "billing", action_key: "charge:order-12345", lease_ttl: 300 }) }).then(r => r.json()); // "claimed" → you won the race, do the work // "duplicate" → already done; claim.result holds the outcome // "held" → claimed but never finished. No result. Do not do the work // "in_progress" → someone else holds a live lease, wait and retry // "conflict" → same key, different payload. Never retry this. // 2. Record what happened. Free — the claim paid for this. await fetch("https://ai.oliverkiss.com/once-key/complete", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ namespace: "billing", action_key: "charge:order-12345", namespace_token: claim.namespace_token, result: { charge_id: "ch_abc123" } }) });