Every endpoint, with what it returns.

Four lines, one JSON contract: every response is anchored, sourced and disclaimed, and the ledger's are signed. Prices are the list prices; the binding figure is the atomic amount in each route's own 402. Machine-readable copies of this page: the service catalog, the x402 manifest, OpenAPI and llms.txt. Or call any of them by name: npx orcpin-ledger endpoints.

Vet the Endpoint

trust calls Measured delivery facts. No trust score, no "scam" label
x402 Resource Directory
GET /v1/x402/discovery/resources
Free · no payment

Find the endpoint before you vet it. A searchable index of public x402 resources, ordered by how many distinct wallets actually paid them in the last 30 days. The CDP Bazaar catalog behind it supports neither text search nor lookup by URL; this does.

  • ?q=: text across URL, service name and description
  • ?network=: exact network id (base, eip155:8453, solana)
  • ?max_price=: USD ceiling; unpriced entries are excluded, not assumed cheap
  • unique_payers_30d, calls_30d: the demand signal it's ranked by
  • reliability: whether we hold probe history for it; the facts are the paid call below
Endpoint Reliability
GET /v1/endpoint-reliability?url=https://…
$0.01 · one endpoint

Pre-flight a single x402 endpoint before your agent pays it: factual, independently measured delivery signals from continuous probing. Any endpoint, not just ones we've seen. An unknown URL is probed live before you get an answer.

  • url, status, sample_size, last_verified
  • facts.reachable_rate: uptime over the probe window
  • facts.http_success_rate: responded as expected (2xx or a valid 402)
  • facts.valid_402_rate: returns a well-formed x402 challenge
  • facts.latency_ms: p50 / p95 / p99 (bucketed)
  • facts.delivery_verified: sampled paid delivery check
  • flags: enumerated factual markers (e.g. consecutive_failures)
  • methodology, disclaimer
Reliability Sweep
GET /v1/endpoint-reliability/batch?urls=https://…,https://…
$0.01/endpoint · 20–40% volume off · up to 150

Vet your agent's whole tool list in one call. The same delivery facts for every x402 endpoint it depends on, before relying on them. The trust line's sweep.

  • count, results[]: one entry per endpoint
  • each result: url, status, sample_size, facts, flags
  • same facts as the single check. Reachable / valid-402 / latency / delivery
  • endpoints we hold no history for are probed live, so every billed URL returns real facts
  • up to 150 endpoints, one paid call
  • methodology, disclaimer

Keep the Books

ledger documents Signed, hash-logged, verifiable without Orcpin. Nothing stored but the hash
Statement of Account
POST /v1/statement
$5 up to a month · $10 a quarter · $30 a year

What an agent wallet actually spent in a window, read independently from the public chain, totalled by counterparty and by day, and signed. Structured like an auditor's letter: verified holds what Orcpin read itself; representations holds what your own meter reported, attested by digest and never verified; reconciliation is the arithmetic between them. Each payee is resolved to the seller and door it belongs to, with Orcpin's own probe history for that door. The 402 quotes the exact tier for the window sent.

  • verified.settlements, usd, by_day[], as_of.block
  • by_counterparty[].seller, resources[].price_usd, matches_settlement_amounts, reliability
  • by_counterparty[].flags: lookalike_of, zero_value_only: the address-poisoning pattern, named, never judged
  • representations, reconciliation.unaccounted_usd: chain spend your meter cannot account for
  • signature (ed25519, kid, payload_sha256), transparency.lookup
Door Report
POST /v1/door-report
$50 · one endpoint, four parts

One x402 endpoint, walked through by a third party with a funded wallet. Quote: what the 402 asks for, and whether the seller's manifest and the public catalog ask for the same. Purchase: up to five real purchases. Quoted, signed, settled, the receipt read back from the chain, delivered. Then the same payment replayed and a bad one sent. Books: the door's inbound side from the chain: settlements, revenue, distinct and repeat payers, one-shot buyers at list price. Cost: what a delivered response cost, and where the price sits among every priced door listed. Patterns are named in attention; no verdict is given.

  • quote.price_sources[], price_consistent, pay_to_consistent
  • purchase.records[]: quoted_usd, signed, settlement, chain.matches_signed, delivery, outcome
  • purchase.replay, malformed_payment: what the door did with a reused and a garbage payment
  • books.settlements, payers, repeat_payers, single_settlement_payers_at_this_price, top_payer_share
  • cost.this_audit.usd_per_delivered_response, cost.catalog.share_priced_below, attention[], signature
  • a URL that is not a door is refused with the free probe. Nothing charged
Keys & Transparency Log
GET /.well-known/orcpin-signing-keys.json
Free · no payment

What makes a signed document checkable after a key is revoked. Every key that ever signed, with its status and dates; and a hash-chained log of every document issued. Payload hash, key id, time, nothing identifying. A document whose hash is not in the log under its key is a forgery. Verification needs no account and no fee: npx orcpin-ledger verify statement.json.

  • keys[].kid, public_key, status: active · retired · revoked
  • GET /v1/statement/log: the chain, newest last; /v1/statement/log/{payload_sha256}: position, prev, head; 404 means never issued

Read the Chain

information calls Wallet & DeFi state, block-anchored
Wallet Snapshot
GET /v1/wallet-snapshot?address=0x…
$0.02 · one address

Native and token balances plus account flags for a single wallet at the current block.

  • address, block_number, timestamp
  • account.is_contract: whether the address is a contract
  • account.transaction_count: outbound nonce
  • native_balance: ETH as wei + human formatted
  • token_balances[]: USDC & tracked ERC-20s (symbol, contract, raw, formatted, decimals)
  • derived: wallet_type, activity_tier, and gas_runway (transfers the balance can still pay for)
  • sources, disclaimer
DeFi Snapshot
GET /v1/defi-snapshot?address=0x…
$0.05 · one address

Everything in a wallet snapshot, plus the address's Aave v3 position on Base and derived risk metrics.

  • All wallet-snapshot fields above
  • aave_v3.available, aave_v3.pool, has_position
  • total_collateral, total_debt, available_borrows (USD, 8 decimals)
  • current_liquidation_threshold_bps, loan_to_value_bps
  • health_factor: null when there's no debt
  • no_outstanding_debt: quick boolean flag
  • derived.aave: net_equity, ltv_utilization_pct, leverage_multiplier, health_factor_band
  • derived.aave.collateral_drawdown_tolerance_pct: how far collateral can fall before liquidation
  • sources, disclaimer
Snapshot Sweep
GET /v1/batch-snapshot?addresses=0x…,0x…
$0.02/addr · 20–40% volume off · up to 1000

Wallet snapshots for many addresses in one call, all anchored to a single block.

  • block_number, timestamp, count
  • results[]: one entry per address
  • each result: address + full wallet-snapshot data
  • up to 1000 addresses, one consistent block anchor
  • sources, disclaimer

Check the Trade

trading calls Deterministic date & lot math. Rules quoted, never applied; nothing stored
Holding Period
POST /v1/holding-period
$0.02 · up to 500 lots

Send your tax lots (and optionally a proposed sell) as JSON: per-lot days held, the exact date each lot's gain character turns long-term, and FIFO or specific-identification allocation with realized gain per lot. IRC §1222's threshold is quoted in the response; cost basis is used exactly as supplied.

  • lots[].daysHeld, longTermFrom, character, daysUntilLongTerm
  • sell.allocations[]: per lot: quantity, character, costBasis, proceeds, realizedGain
  • sell.totals: short-term / long-term quantity and gain (null over guessed, always)
  • missing basis or price → null math, never a partial sum
  • explanation, methodology, disclaimer
Settlement Dates
POST /v1/settlement-dates
$0.02 · up to 1000 trades

The T+1 settlement date for each trade and whether it has settled as of a date you supply. Weekends and market holidays handled by the same versioned NYSE calendar. SEC Rule 15c6-1 is quoted in the response; sequencing conclusions stay yours.

  • trades[].settlementDate: next trading day after the trade (T+1)
  • trades[].settledAsOf, tradingDaysUntilSettlement
  • settled_count, unsettled_count
  • dates outside the calendar's range are a 400. Never a guessed holiday
  • rule_citation, calendar_version, methodology, disclaimer
Settlement Date · single
GET /v1/settlement-date?trade_date=…&as_of=…
$0.02 · one trade

The same T+1 answer for one trade, as a one-line GET. No request body. Pass a trade date and an as-of date; get the settlement date and whether it has settled. For when an agent has a single date to check, not a list.

  • settlement_date: next trading day after the trade (T+1)
  • settled, trading_days_until_settlement
  • same versioned NYSE calendar and SEC Rule 15c6-1 citation as the batch route
  • out-of-range dates are a 400. Never a guessed holiday
Wash-Sale Status
POST /v1/wash-sale-status
$0.05 · one order

Before an agent buys, check the order against the operator's realized-loss sales across ALL accounts. The ±30-day IRC §1091 window the agent's own silo can't see. Returns would_trigger with the matched loss sales, an honest clear, or insufficient_data naming the gap. Tax status with the rule quoted. Never advisability; a disallowed loss defers into replacement basis, it isn't forfeited.

  • status: would_trigger · clear · not_applicable · insufficient_data
  • matches[].saleDate, realizedLoss, daysFromOrder
  • window, coverage: declare salesCoverageFrom so a loss-free period reads as a determination, not missing data
  • IRC §1091 cited as a published rule; exact-ticker matching in v1

Call any of these in one line

The library meters every call; the CLI runs it from a terminal; the MCP hands the tools to an agent runtime.