Live v2 sandbox · test_usd only

Venmo for agents.

One centralized ledger where a business gives its software agents a budget and pays agents operated by other businesses. Fast, programmable, and legible to the humans responsible for the money. Today it moves sandbox test_usd credits only. They have no cash value.

$ tab request \
    --amount-micros 25000 \
    --reference weather:req-143
{"asset":"test_usd",
 "payment_request":"tab_req_..."}

$ tab pay-request tab_req_...
{"asset":"test_usd",
 "receipt":"tab_rcpt_..."}

$ tab curl https://service.example/weather \
    --max-price-micros 25000
test_usd sandbox · no cash value
The model

Humans own the account. Agents receive bounded sandbox authority.

01 / SELLER REQUESTS

Signed, exact terms

The seller issues a 15-minute test_usd request bound to its agent, amount, reference, and optional memo.

02 / BUYER DECIDES

Manual or automatic

tab pay-request pays directly. tab curl resolves the request with Tab and enforces a mandatory price cap.

03 / SELLER CONSUMES

Service after proof

PaidCall consumes a payee-bound, one-use receipt before invoking seller code. Replays and mismatches fail closed.

Reviewed v2 flow

Request, pay, and serve from the command line.

This is a private developer sandbox. Install the v0.2 CLI and SDK from GitHub source; the PyPI package is the old v0.1 client. Repository and sandbox credentials require pilot access. Every balance below is test_usd with no cash value, not real USD.

CLI buyer and seller

# Install from GitHub source only
uv tool install \
  "tab-payments @ git+https://github.com/bsjcho/tab-api.git#subdirectory=sdk"

export TAB_API_KEY="YOUR_SANDBOX_AGENT_KEY"

# Seller: create a signed request
tab request \
  --amount-micros 25000 \
  --reference weather:req-143

# Buyer: pay that exact request
tab pay-request tab_req_... \
  --idempotency-key pay-request:req-143

# Or automate one HTTP 402 paid call
tab curl https://service.example/weather \
  --max-price-micros 25000

Seller paid-service gate

import os
from tab_payments import (
    PaidCall,
    PaymentRequired,
    TabClient,
)

gate = PaidCall(
    TabClient(api_key=os.environ["TAB_API_KEY"]),
    amount_micros=25_000,
    reference=f"weather:{request_id}",
    seller_agent_id=os.environ["TAB_AGENT_ID"],
    service_request_id=request_id,
)

outcome = gate.run(tab_receipt, serve_weather)
if isinstance(outcome, PaymentRequired):
    return outcome.status_code, outcome.headers, outcome.body
return 200, outcome

tab curl sends no Tab credential to the seller, follows no redirects, pays at most one request, and retries the exact service call once with only the Tab-Receipt header added. Seller service effects still need durable idempotency keyed by the verified payment ID.

Truth in labeling

The v2 sandbox is live. Real money is not.

Live now: test_usd

The hosted API exercises real authorization, concurrency controls, balanced-ledger invariants, signed payment requests, and one-use receipts. test_usd cannot be purchased, redeemed, withdrawn, or exchanged and has no cash value.

The bet

Agent commerce needs a shared balance, not another wallet prompt.

Tab is centralized on purpose: a policy engine and auditable ledger for businesses that want software to transact without managing crypto infrastructure. The current sandbox tests that thesis with test_usd; it does not offer real-money movement.

Request sandbox access