Docs / Introduction

RoRo Quantum docs

Build a quantum circuit, run it on real Qiskit simulation, and read an honest result — from the console, the SDK, or the REST API.

#Introduction

RoRo Quantum is a quantum cloud. You design circuits — visually in the console or in code with standard Qiskit — submit them as runs, and get back normalized measurement results. Every run executes on a real Qiskit Aer backend, so the counts you read are the real thing.

New to quantum? In plain words. A normal bit is a coin lying flat — heads (0) or tails (1). A qubit is a coin spinning in the air: a blend of heads and tails at once (this is superposition). A circuit is the set of nudges you give the spinning coins. When you measure, every coin lands on heads or tails; run it many times (shots) and the pattern of landings tells you what your circuit really does. Two coins can also be entangled — linked so they always land in agreement, even when far apart.
Want the real depth? Jump to Core concepts and The math — every section below layers from simple to rigorous.

There are three ways in:

#Architecture

Every entry point speaks to the same core API. The core owns identity, credits, and run records; it hands the actual circuit off to a stateless quantum service running Qiskit Aer, then stores the normalized result.

Console
visual builder
SDK
Python · Kotlin
REST
any language
Core API
auth · credits · runs
Quantum
Qiskit Aer
Clients → Core API → Quantum service (Qiskit Aer)
The quantum service is stateless and never touches the database directly — the core is the single source of truth for your runs and credits.

#Quickstart

Create an API key in the console (API keys → Create), then submit your first run.

# 1. install
pip install roro-quantum

# 2. run a Bell state
from roro import RoRoClient
from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()

roro = RoRoClient(api_key="qcs_live_…")
job = roro.submit_run("roro.sim.sv", shots=5000, circuit=qc, wait=True)
print(job["status"], job["counts"])
# completed {'00': 2500, '11': 2500}
New here? Verifying your email in the console creates your account, a free workspace, and 500 free credits — enough for thousands of shots.

#Core concepts

TermWhat it means
RunOne submission of a circuit to a target, with a number of shots. Runs are async jobs with a status.
TargetThe backend a run executes on, identified by a machineTargetId such as roro.sim.sv.
ShotsHow many times the circuit is sampled. More shots → smoother statistics, higher cost.
CreditsYour balance. Each run costs a small amount per shot, debited when it runs.
WorkspaceA container for runs and budgets — one per project, class, or team.
OrganizationYour account's top level: members, roles (owner/admin/member), and the credit pool.

#Authentication

The REST API and SDK authenticate with an API key. Create one in the console; it's shown once, so store it safely. Send it as a Bearer token:

Authorization: Bearer qcs_live_…
Keys look like qcs_live_… and are tied to your organization. Treat them like passwords — never commit them to source control. Revoke and rotate keys anytime in the console.

#Building circuits

A circuit is a set of gates on qubit wires, ending in measurements. You can build one visually in the console, or describe it in code and export QASM 2.0 — the format RoRo runs.

q0
H
q1
XM
A Bell state: H on q0, CNOT to q1, then measure
# the QASM 2.0 RoRo runs
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
creg c[2];
h q[0];
cx q[0],q[1];
measure q -> c;

#Running circuits

A run needs a target, a shot count, and a circuit as QASM 2.0. The SDK can derive QASM from a Qiskit QuantumCircuit, or you can pass it directly.

roro = RoRoClient(api_key="qcs_live_…")

qasm = """OPENQASM 2.0;
include "qelib1.inc";
qreg q[2]; creg c[2];
h q[0]; cx q[0],q[1];
measure q -> c;"""

job = roro.submit_run("roro.sim.sv", shots=2000, qasm=qasm)

#Run lifecycle

When you submit a run, RoRo validates it, reserves and debits credits, executes it on the quantum service, and stores the normalized result. If your balance is too low, the run is rejected before it ever executes.

Submit
target, shots, QASM
Validate
check & price
Reserve
debit credits
Execute
Qiskit Aer
Result
normalized counts
The path of a single run, end to end

#Reading results

A completed run returns normalized counts (a histogram of measured bitstrings) and probabilities. The console also derives the most-likely outcome and the Shannon entropy.

00
01
10
11
Bell-state counts — only 00 and 11 appear
{
  "id": "run_…",
  "status": "completed",
  "shots": 2000,
  "counts": { "00": 1001, "11": 999 },
  "probabilities": { "00": 0.5005, "11": 0.4995 }
}

#The math, briefly

You don't need the math to use RoRo — but here's what's happening underneath. A qubit is a vector, a gate is a matrix, and a measurement is a probability.

Superposition. A Hadamard gate creates an equal blend of 0 and 1 — a fair quantum coin:

$$H\,|0\rangle = \tfrac{1}{\sqrt{2}}\big(|0\rangle + |1\rangle\big), \qquad H = \tfrac{1}{\sqrt{2}}\begin{pmatrix}1 & 1\\[2pt] 1 & -1\end{pmatrix}$$

Entanglement. A Hadamard followed by a CNOT produces a Bell state — two qubits whose outcomes are perfectly correlated:

$$|\Phi^{+}\rangle = \tfrac{1}{\sqrt{2}}\big(|00\rangle + |11\rangle\big)$$

Measurement (Born rule). The probability of each outcome is the squared amplitude — exactly what your shot counts estimate:

$$P(x) = \big|\langle x\,|\,\psi\rangle\big|^{2}$$

Entropy. The console reports the Shannon entropy of the outcome distribution — how spread-out the result is. A fair coin gives 1 bit; a certain outcome gives 0:

$$S = -\sum_{x} p_x \log_2 p_x$$

#Credits & pricing

Credits work like tokens. Each run costs a small amount per shot, debited from your balance when it executes. You start with 500 free credits; top up anytime, and allocate budgets to members and workspaces.

# cost of a run
cost = ceil(shots × target.costPerShot)

#Targets

Pass a target's machineTargetId when you submit a run. List the targets available to you with GET /v1/machines rather than hard-coding them.

Target IDTypeDescription
roro.sim.svSimulatorStatevector simulator — fast, exact sampling. The default for learning and prototyping.
roro.sim.noisySimulatorSimulator with a basic noise model, for more realistic statistics.

#REST API

Base URL https://api.roroquantum.com. All endpoints require the Authorization: Bearer header and return JSON.

Prefer an interactive reference? Try the OpenAPI / Swagger explorer — authorize with your key and call endpoints from the browser. Spec: openapi.yaml.

List targets

GET /v1/machines
curl https://api.roroquantum.com/v1/machines \
  -H "Authorization: Bearer qcs_live_…"

Submit a run

POST /v1/runs

Body fields: machineTargetId (string), shots (int), qasm (string, QASM 2.0).

curl -X POST https://api.roroquantum.com/v1/runs \
  -H "Authorization: Bearer qcs_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "machineTargetId": "roro.sim.sv",
    "shots": 5000,
    "qasm": "OPENQASM 2.0; include \"qelib1.inc\"; qreg q[2]; creg c[2]; h q[0]; cx q[0],q[1]; measure q -> c;"
  }'

List & fetch runs

GET /v1/runs
GET /v1/runs/{id}
curl https://api.roroquantum.com/v1/runs/run_123 \
  -H "Authorization: Bearer qcs_live_…"

#Run statuses

StatusMeaning
queuedAccepted and waiting to execute.
runningExecuting on the quantum service.
completedFinished — counts and probabilities are available.
failedCould not complete; no credits are charged for failed execution.

#Errors

Errors use standard HTTP status codes with a JSON body: { "error": "message" }.

CodeMeaning
400Bad request — invalid QASM, missing field, or bad shots value.
401Missing or invalid API key.
402Insufficient credits for the requested run.
404Run or resource not found.
429Too many requests — slow down and retry.

#Python SDK

The official SDK wraps the REST API with a small, Qiskit-friendly client. It's open source and published on PyPI.

PyPI · roro-quantum v0.3.0 Source on GitHub

# REST client only
pip install roro-quantum
# + Qiskit BackendV2 provider
pip install "roro-quantum[qiskit]"
from roro import RoRoClient
from qiskit import QuantumCircuit

roro = RoRoClient(api_key="qcs_live_…")

# discover targets
for m in roro.machines():
    print(m["targetId"], m["qubits"])

# build + submit a GHZ state, block until it finishes
qc = QuantumCircuit(3, 3)
qc.h(0); qc.cx(0, 1); qc.cx(1, 2)
qc.measure_all()
job = roro.submit_run("roro.sim.sv", shots=4000, circuit=qc, wait=True)
print(job["counts"])

# or submit without blocking, then poll yourself
job = roro.submit_run("roro.sim.sv", shots=4000, circuit=qc)
job = roro.wait_for_run(job["id"])  # or roro.run(job["id"])

Already on Qiskit? Use RoRo as a drop-in BackendV2 provider:

from qiskit import QuantumCircuit
from roro.provider import RoRoProvider

qc = QuantumCircuit(2, 2)
qc.h(0); qc.cx(0, 1); qc.measure_all()

backend = RoRoProvider(api_key="qcs_live_…").get_backend("roro.sim.sv")
result = backend.run(qc, shots=5000).result()
print(result.get_counts())
Prefer another language? Every SDK call maps to a plain REST endpoint above — use curl or any HTTP client.

#JavaScript / TypeScript SDK

Roadmap  An isomorphic client for Node and the browser. The code lives in the repo and isn't on npm yet — until it ships, call the REST API directly (it's a couple of fetch calls). Here's the shape it will have:

// (coming soon) npm install @roro/quantum
import { RoRoClient } from "@roro/quantum";

const roro = new RoRoClient({ apiKey: "qcs_live_…" });

// submit a Bell state (OpenQASM 2.0)
const qasm = `OPENQASM 2.0;
include "qelib1.inc";
qreg q[2]; creg c[2];
h q[0]; cx q[0],q[1];
measure q -> c;`;
const job = await roro.submitAndWait("roro.sim.sv", { shots: 5000, qasm });
console.log(job.status, job.counts);
// completed { '00': 2500, '11': 2500 }

#Glossary

TermDefinition
QubitA quantum bit — the basic unit of quantum information; can be in superposition of 0 and 1.
SuperpositionA qubit being a blend of 0 and 1 until measured. A Hadamard (H) gate creates an equal one.
EntanglementA correlation between qubits so the result of one constrains another — e.g. a Bell state.
GateAn operation on one or more qubits — H, X, CX (CNOT), measurement, and more.
QASMOpenQASM 2.0, the text format describing a circuit, which RoRo executes.
AerQiskit's high-performance simulator, where RoRo runs your circuits today.