API Documentation

Complete reference for the XCTP quantum circuit emulation API. Version 2.0.

Overview

The XCTP API provides quantum circuit emulation over REST. Submit quantum circuits as JSON or OpenQASM 2.0, choose your execution engine, receive measurement results. No quantum hardware required.

Base URL: https://involvedinvolutions.com/api

Quick Start

1. Sign up for an API key

curl -X POST https://involvedinvolutions.com/api/v1/signup \
  -H "Content-Type: application/json" \
  -d '{"email": "you@example.com"}'

# Response: {"api_key": "xctp-abc123...", "tier": "free", ...}

2. Run a Bell state circuit

curl -X POST https://involvedinvolutions.com/api/v1/run \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "xctp-YOUR-KEY-HERE",
    "num_qubits": 2,
    "gates": [
      {"gate": "h", "target": 0},
      {"gate": "cx", "control": 0, "target": 1}
    ],
    "shots": 1024
  }'

3. Or use OpenQASM 2.0

curl -X POST https://involvedinvolutions.com/api/v1/run-qasm \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "xctp-YOUR-KEY-HERE",
    "qasm": "OPENQASM 2.0;\ninclude \"qelib1.inc\";\nqreg q[2];\nh q[0];\ncx q[0],q[1];",
    "shots": 1024
  }'

Python

import requests

# Sign up
key = requests.post("https://involvedinvolutions.com/api/v1/signup",
    json={"email": "you@example.com"}).json()["api_key"]

# Run circuit
resp = requests.post("https://involvedinvolutions.com/api/v1/run", json={
    "api_key": key,
    "num_qubits": 2,
    "gates": [
        {"gate": "h", "target": 0},
        {"gate": "cx", "control": 0, "target": 1}
    ],
    "shots": 1024
})

data = resp.json()
print(f"Status: {data['status']}")
print(f"Counts: {data['counts']}")
print(f"Time:   {data['execution_time_ms']}ms")

Authentication

An API key is required for all circuit execution endpoints. Get one via /api/v1/signup.

Pass your key in the request body as api_key:

{"api_key": "xctp-your-key-here", "num_qubits": 2, ...}

For account and usage endpoints, use the Authorization header:

Authorization: Bearer xctp-your-key-here

Sign Up

POST /api/v1/signup

Create a free account. Returns an API key with 60 seconds of free compute.

FieldTypeRequiredDescription
emailstringYesValid email address
namestringNoYour name (max 200 chars)
companystringNoCompany name (max 200 chars)
// Response
{
  "api_key": "xctp-a1b2c3d4e5f6...",
  "tier": "free",
  "email": "you@example.com",
  "message": "Account created. 60s free compute."
}

Health Check

GET /api/health

Returns engine status. No authentication required.

{
  "status": "operational",
  "engine": "XCTP",
  "version": "2.0.0",
  "max_qubits": 50000
}

List Engines

GET /api/v1/engines

Returns available execution engines and their descriptions.

{
  "engines": {
    "auto":   "Automatic dispatch (SparseQPU ≤50q, CNTA >50q)",
    "sparse": "SparseQPU — true statevector, exact amplitudes, ≤50 qubits",
    "cnta":   "CNTA — O(N) geometric, 1–50,000 qubits",
    "tee":    "TEE v1 — legacy emulator"
  }
}

Run Circuit (Synchronous)

POST /api/v1/run

Execute a circuit and return results immediately.

Request Body

FieldTypeRequiredDescription
api_keystringYesYour API key
num_qubitsintegerYes1 to 50,000
gatesarrayYesOrdered gate operations
shotsintegerNo1 to 100,000 (default: 1024)
enginestringNo"auto" (default), "sparse", "cnta", or "tee"

Gate Object

FieldTypeDescription
gatestringGate name (see Supported Gates)
targetintegerTarget qubit index
controlintegerControl qubit (for cx, cz, cp, ccx)
control2integerSecond control (for ccx/Toffoli)
target2integerSecond target (for swap)
anglefloatRotation angle in radians (for rx, ry, rz, p, cp)

Response

{
  "job_id": "a1b2c3d4-...",
  "status": "COMPLETED",
  "counts": {"00": 512, "11": 512},
  "num_qubits": 2,
  "total_shots": 1024,
  "execution_time_ms": 0.42,
  "backend": "xctp-v2",
  "engine_version": "XCTP-2.0",
  "tier": "free",
  "trial_remaining_sec": 49.5
}

Submit Job (Async)

POST /api/v1/jobs

Submit a circuit for background execution. Returns immediately with a job ID. Poll /api/v1/jobs/{id} for results.

Same request body as /api/v1/run.

// Response
{
  "job_id": "a1b2c3d4-...",
  "status": "QUEUED",
  "message": "Accepted: 10000q circuit, 2 gates, 10 shots"
}

Get Job Result

GET /api/v1/jobs/{job_id}

Retrieve results for a submitted job. Only the original submitter can access results (verified by API key or IP).

Pass your API key via header: Authorization: Bearer xctp-...

Run OpenQASM Circuit

POST /api/v1/run-qasm

Execute a circuit from an OpenQASM 2.0 string. Qiskit users: pass qc.qasm() directly.

FieldTypeRequiredDescription
api_keystringYesYour API key
qasmstringYesOpenQASM 2.0 circuit string
shotsintegerNo1 to 100,000 (default: 1024)
enginestringNo"auto", "sparse", "cnta", or "tee"
// Example: Qiskit integration
from qiskit import QuantumCircuit
import requests

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

resp = requests.post("https://involvedinvolutions.com/api/v1/run-qasm", json={
    "api_key": "xctp-YOUR-KEY",
    "qasm": qc.qasm(),
    "shots": 1024
}).json()

print(resp["counts"])  # {"00": 512, "11": 512}

Check Usage

GET /api/v1/usage

Check your account usage and remaining compute. Requires Authorization: Bearer header.

{
  "tier": "free",
  "used_sec": 10.5,
  "remaining_sec": 49.5,
  "max_qubits": 50
}

Supported Gates (22)

GateNameParametersDescription
hHadamardtargetCreates equal superposition
xPauli-XtargetBit flip
yPauli-YtargetBit + phase flip
zPauli-ZtargetPhase flip
sS gatetargetπ/2 phase
tT gatetargetπ/4 phase
sdgS†targetInverse S gate
tdgT†targetInverse T gate
idIdentitytargetNo-op (identity gate)
barrierBarrier-Optimization barrier
rxRxtarget, angleX-axis rotation
ryRytarget, angleY-axis rotation
rzRztarget, angleZ-axis rotation
pPhasetarget, anglePhase gate (alias: u1)
u2U2target, angleSingle-qubit U2 rotation
u3U3target, angleGeneral single-qubit rotation
cxCNOTcontrol, targetControlled NOT
czCZcontrol, targetControlled Z
cpCPhasecontrol, target, angleControlled phase
swapSWAPtarget, target2Swap two qubits
ccxToffolicontrol, control2, targetControlled-controlled NOT
qftQFT-Quantum Fourier Transform (whole register)

Engine Selection

Pass "engine" in your request to choose an execution backend:

EngineBest ForDescription
autoMost usersAutomatic: SparseQPU for ≤50q or rotation gates, CNTA for >50q Clifford
sparseExact results ≤50qTrue statevector simulator with complex amplitudes. Exact Born rule probabilities.
cntaLarge circuitsO(N) geometric emulator. Scales to 50,000 qubits. HH=I correct.
teeLegacy comparisonOriginal toral entanglement emulator. Known HH≠I bug above 50 qubits.
Tip: Use "engine": "auto" (or omit the field) for best results. Force an engine only when testing or comparing.

Scaling Characteristics

QubitsMemoryTime (CNTA)
10<1 KB<0.1ms
100~10 KB~0.1ms
1,000~100 KB~15ms
5,000~500 KB~100ms
10,000~1 MB~400ms
50,000~5 MB~5s

Memory scales linearly O(N). Standard quantum simulators require O(2N) memory, making circuits above ~40 qubits infeasible.