$ pip install catstate
Your QPU accounts.
One control plane.
CatState is the control plane and observability layer for quantum computing. Store provider credentials in an envelope-encrypted vault, route circuits to the best eligible device, track every experiment — and fan out access with capped, revocable sub-keys.
- 3
- providers · IBM, IonQ, Braket
- 1
- key for every device you own
- $0
- compute markup — pure passthrough
cs_run_8f9a2b1c · routed by cs("best")synthetic demo data
bring your own account
You already own the hardware access.
Keep it.
CatState proxies every job through the provider credentials you store — no CatState-owned accounts, no credit resale, no markup on shots. The platform layers routing, governance, and reproducibility on top of the grants you already have.
Store your credentials once
Drop your IBM Quantum, IonQ, and AWS Braket API keys into the CatState vault. Each credential is sealed with AES-256-GCM under its own per-credential data-encryption key, wrapped by a KMS master key. Plaintext exists only in worker RAM, and only for the duration of a dispatch.
AES-256-GCM · per-credential DEK · KMS envelope
Route every circuit intelligently
A live device catalog — calibration, queue depth, and pricing per device — feeds a five-stage routing pipeline. Ask for cs("best"), cs("cheapest"), or cs("fastest"), or pin an exact device. Every run records why the router picked it.
best · cheapest · fastest · pinned
Pay your provider directly
CatState is a pure control plane. Your jobs execute on accounts you already own, and your provider bills you straight from your existing grant or account. We never hold compute funds, never resell hardware time, and never sit in the financial path.
zero custody · BYOA-only
delegated sub-keys
Never share the root credential again.
Fan a stored provider credential out into scoped cs_sub_* keys — one per student, teammate, or CI pipeline — each with its own spend cap, device allowlist, and expiry. The root credential never leaves the vault.
- Hard spend caps
- A strict dollar ceiling per key. Reserve-then-reconcile accounting holds funds for in-flight jobs, so fifteen students can submit concurrently without blowing past the cap.
- Scoped allowlists
- Each sub-key permits a subset of the parent credential's devices — enforced server-side at mint time, not by convention. ibm:brisbane yes, ibm:kyoto no.
- Expiry & revocation
- Semester ends, keys expire. Intern leaves, one click revokes. Runs already in flight complete; nothing new starts.
- Bulk issuance
- Mint a classroom of scoped keys in one atomic call — per-student overrides included, partial batches rejected.
# Mint a capped sub-key for one studentsub = cs.vault.create_sub_key(parent="ibm-production",label="student:jane_doe",spend_cap_usd=25.00,allowed_devices=["ibm:brisbane", "simulator:*"],cap_hit_behavior="HARD_BLOCK",expires_at="2026-12-15T23:59:59Z",)print(sub.token_hint)# cs_...b5c4 (plaintext shown exactly once)
smart hardware router
Stop reading calibration tables by hand.
A dedicated catalog worker polls every provider for calibration, queue depth, pricing, and device lifecycle — so the router always decides against fresh data, and your runs are reproducible against the calibration snapshot they actually executed on.
cs("best")BEST
Composite fidelity score across 2Q gate fidelity, readout error, SWAP overhead, and a normalized queue penalty.
cs("cheapest")CHEAPEST
Minimizes task base fee plus shots × per-shot rate, from live per-device pricing data.
cs("fastest")FASTEST
Minimizes estimated queue wait plus execution duration for your circuit and shot count.
// Pin an exact device with cs("ibm:brisbane") — or pass cs() and let the key's configured default decide.
framework adapters
Keep the stack you already write in.
Superfermion-native, a Qiskit BackendV2 provider, or a PennyLane device plugin — the same vault, router, and spend governance underneath all three.
import superfermion as sfimport catstatecs = catstate.connect() # reads CATSTATE_API_KEYcircuit = sf.Circuit(4).h(0).cx(0, 1).cx(1, 2).cx(2, 3)with cs.experiment("ghz_benchmark"):result = sf.run(circuit, device=cs("best"), shots=4096)print(result.counts)# {'0000': 1013, '1111': 1029, ...}
import superfermion as sfimport catstatecs = catstate.connect() # reads CATSTATE_API_KEYcircuit = sf.Circuit(2).h(0).cx(0, 1)with cs.experiment("bell_benchmark"):result = sf.run(circuit, device=cs("best"), shots=4096)print(result.counts)# {'00': 2041, '11': 2055}
$ catstate.connect()
Your next 4,096 shots are one API key away.
Store a credential, mint a sub-key, and route your first circuit in under five minutes.