Quickstart

Five minutes from zero to a verified receipt.

1. Install the SDK

pip install plumb-sdk

2. Log in with your wallet (SIWE)

Plumb has no passwords. Authentication is a Sign-In With Ethereum handshake. The CLI helper opens a browser to sign the message, then prints a session token.

plumb auth login --api-base https://api.plumbtech.xyz
# → PLUMB_SESSION=sess_01HVBZ...
export PLUMB_SESSION=sess_01HVBZ...

During preview, an admin mint gives every new address test credits automatically. You can also top up via Settlement.deposit() on Base Sepolia.

3. Run a completion

from plumb_sdk import Client

c = Client(base_url="https://api.plumbtech.xyz", session_token=os.environ["PLUMB_SESSION"])

resp = c.chat.completions.create(
    model="anthropic/claude-haiku-4.5",
    messages=[{"role": "user", "content": "in one sentence, what is a receipt?"}],
)

print(resp.choices[0].message.content)
print("receipt →", resp.id)   # the receipt id rides alongside the completion

4. Fetch and verify the receipt

rcpt = c.receipts.get(resp.id)
assert c.verify_receipt(rcpt), "signature mismatch"
print("verified →", rcpt.id, "· cost micro-PLMB:", rcpt.cost_micro)

verify_receipt re-hashes the request and response using the canonical v1 payload and checks the ed25519 signature against Plumb's published signer-key registry. You do not need to trust the operator.

5. Look it up on the explorer

Open https://explorer.plumbtech.xyz/receipt/<id> to see the same receipt rendered publicly, plus a "Verify signature" button that runs the same check in your browser.

Next

  • Enable persistent memory on a turn: add extra_body={"plumb_memory": True}.
  • Upload a hub model and register it on-chain.
  • Call inference from a smart contract via Pipe.