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.