POST /api/v1/platform/execution/jobs. The platform authorizes the
run, reserves its worst-case cost, submits it to the provider, then settles the
actual cost and attaches an Evidence Bundle.
This quickstart runs a two-qubit Bell circuit on the free statevector simulator
(qcos.simulator.statevector) — real execution, zero cost.
Quickstart: Bell circuit over REST
1
Create an API key
In the console open API Keys → create a key (scope
qcos:execute).
Copy it — it is shown once.2
Check what you can run
Every workspace gets the simulator plus the GPU/CPU tiers activated as its
default catalog (real QPUs need entitlements). Listing your targets also
activates that default catalog on first call:(The CLI’s
qcoscloud targets and the console’s Compute Console do the
same.)3
Submit the circuit
The circuit is OpenQASM 2.0, carried in the workload’s The platform authorizes, reserves the worst-case cost (here 0 — the
simulator is free) and returns the job:
qasm field. Send an
Idempotency-Key so a retried request never double-submits:4
Poll until it settles
status is SETTLED. On a settled job actual_cost_usd is the
real charge (here 0.0), usage_metrics reports shots and timing, and
result_verified: true means the run completed and its result is pinned
by hash.5
Verify the run
409 evidence_not_available_until_settled).Reading the result
The Execution Plane job object carries status, cost,usage_metrics and the
result hash (in the Evidence Bundle) — it does not embed raw measurement
counts. For interactive circuit runs with counts returned directly, use the QCOS
Sampler through the console proxy (requires the qcos:execute scope; this is
also what the QCOS Compute Hub composer uses — counts come from QCOS, never
synthesized in the browser):
qasm and backend_id are required (400 otherwise); list backend ids with
GET /api/v1/platform/qcos/backends. You can also price a circuit before
running anything with POST /api/v1/platform/qcos/estimate.
The three workload shapes
QUANTUM_CIRCUIT — simulator or real QPU
target at a real device id to run the same circuit on hardware, metered
per shot (IBM-class devices meter per second of runtime and additionally require
max_runtime_seconds). execution_mode is NATIVE (default) or
QCOS_OPTIMIZED — the latter applies QCOS transforms and requires an active
QCOS license (403 qcos_license_required otherwise). See
Backends & pricing.
GPU_JOB — on-demand NVIDIA GPU
Runs a container command on an on-demand GPU, billed per minute. A runtime bound is required (max_runtime_seconds; the worst case is reserved up front
and the GPU is stopped when the reservation is exhausted):
setup (install script), image (container image),
memory_gb, region and cloud hints. If GPU capacity is not yet available
for your workspace the submission fails closed with
503 gpu_provider_unavailable and no money is held.
CPU_JOB — on-demand CPUs for large simulations
Same reserve-and-bound model, per-minute billing:softquantus.sim.cpu, 10 minutes per
workspace per month, runtime bound required); past the allowance you get
403 free_cpu_limit_met and can switch to the paid cpu.* tiers.
Idempotency
Send anIdempotency-Key header (any unique string, e.g. a UUID) on every
submission:
- A fresh authorization returns
201. - Retrying the same key in the same workspace returns the same job with
200— no double submission, no double reservation. - A key collision that cannot be replayed cleanly returns
409 conflict.
run() call automatically (override with
idempotency_key=).
Per-run budgets and guardrails
All optional, all applied before money moves (or as a cap at settlement):
For prepaid runs the settled debit can never exceed the reservation, so your
balance cannot go negative; the platform absorbs any provider overrun.
Job lifecycle
CREDIT_RESERVED— authorized, worst-case cost held, not yet at the provider. A background pass promotes reserved jobs to the provider (typically within a minute; simulator jobs settle shortly after).SETTLED— finished;actual_cost_usdis the real charge and the unused reservation is released.FAILED— no usage charge; the reservation is released.- Reservations stranded without a provider (for example a crash between reserve and submit) are auto-released by a money-safety sweep.
GET /api/v1/platform/execution/jobs/{id} returns the job at any point;
GET /api/v1/platform/usage/jobs lists recent runs.
Cancel a job
- Not yet dispatched: the job is cancelled immediately and the full reservation is released.
- Already at the provider: the job parks in
CANCEL_REQUESTEDuntil the abort is confirmed. If shots actually ran before the abort, they are settled and charged; if nothing ran, the reservation is returned in full. You are only ever billed for usage that actually happened.
Next steps
Backends & pricing
Target ids, rates and the cost-safety model.
REST API reference
The full endpoint table and schemas.
Evidence Bundles
Verify how and where a settled run was produced.
Errors
Every refusal reason with status and fix.