Comprehensive guides, API references, and tutorials to help you build quantum applications.
Quick setup and first quantum simulation
Complete quantum API documentation
Get up and running with the Open Quantum Python SDK. Follow these steps to install, authenticate, and run your first quantum job.
pip install -U openquantum-sdk
# or local dev:
pip install -e .Python 3.9+ required.
Download from Open Quantum SDK Keys:
{
"client_id": "s_abc123...",
"client_secret": "e460c8..."
}export OPENQUANTUM_SDK_KEY=/path/to/sdk-key.jsonexport OPENQUANTUM_CLIENT_ID="s_..."
export OPENQUANTUM_CLIENT_SECRET="e460c8..."from openquantum_sdk.auth import ClientCredentials, ClientCredentialsAuth
auth = ClientCredentialsAuth(
creds=ClientCredentials(client_id="s_...", client_secret="e460c8...")
)from openquantum_sdk.clients import SchedulerClient, ManagementClient, JobSubmissionConfig
from openquantum_sdk.enums import ExecutionPlanType, QueuePriorityType
import json
# Instantiate clients (auto-loads auth from env)
scheduler = SchedulerClient()
management = ManagementClient()try:
# Discover your Organization ID
print("Discovering organization...")
orgs = management.list_user_organizations()
org_id = orgs.organizations[0].id
print(f" > Using Org: {orgs.organizations[0].name}") # Discover available backend providers
print("\nAvailable providers:")
providers = management.list_providers()
for p in providers.providers:
print(f" > {p.name} ({p.short_code or 'no short code'}) — {p.description}")
# Discover backend classes
print("\nAvailable backend classes:")
classes = management.list_backend_classes()
for bc in classes.backend_classes:
print(f" > {bc.name} ({bc.short_code or 'no short code'}) — {bc.type}")
print(f" ├ Status: {bc.status or 'Unknown'} | Queue depth: {bc.queue_depth or 'N/A'}")
print(f" └ Use: '{bc.short_code or bc.id}' in backend_class_id") # Define config
config = JobSubmissionConfig(
organization_id=org_id,
backend_class_id="ionq:aria-1",
name="Bell State SDK Quickstart",
job_subcategory_id="finance:portfolio-optimization",
shots=100,
execution_plan="auto",
queue_priority="auto",
auto_approve_quote=True,
verbose=True
) # Submit + wait + get result
dummy_qasm = b"OPENQASM 2.0; include 'qelib1.inc'; qreg q[2]; creg c[2]; h q[0]; cx q[0],q[1]; measure q -> c;"
job = scheduler.submit_job(config, file_content=dummy_qasm) # Download and print parsed JSON output
print("\n--- JOB SUCCEEDED ---")
print(f"Job ID: {job.id}")
print(f"Status: {job.status}")
if job.output_data_url:
output_json = scheduler.download_job_output(job)
print("\n--- JOB OUTPUT (JSON) ---")
print(json.dumps(output_json, indent=2))
else:
print("No output available.")
except Exception as e:
print(f"\n--- JOB FAILED ---")
print(f"Error: {e}")
finally:
scheduler.close()
management.close()Handles everything in one call — including automatic JSON download.
from openquantum_sdk.clients import SchedulerClient, ManagementClient
from openquantum_sdk.models import JobPreparationCreate
from openquantum_sdk.utils import poll_for_status
import json
scheduler = SchedulerClient()
management = ManagementClient()try:
# Get org
org = management.list_user_organizations().organizations[0]
# List providers & backend classes
print("Providers:")
for p in management.list_providers().providers:
print(f" - {p.name} ({p.short_code})")
print("\nBackend classes:")
for bc in management.list_backend_classes().backend_classes:
print(f" - {bc.name} [{bc.type}] — {bc.short_code or bc.id}") # Choose IDs
MY_BACKEND = "ionq:aria-1"
MY_SUBCATEGORY = "finance:portfolio-optimization"
# Upload
upload_id = scheduler.upload_job_input(file_path="circuit.qasm") # Prepare
prep = JobPreparationCreate(
organization_id=org.id,
backend_class_id=MY_BACKEND,
name="Low-Level Test",
upload_endpoint_id=upload_id,
job_subcategory_id=MY_SUBCATEGORY,
shots=100,
configuration_data={}
)
prep_resp = scheduler.prepare_job(prep) # Poll preparation
def get_prep_status(prep_id: str):
result = scheduler.get_preparation_result(prep_id)
done = result.status in ("Completed", "Failed")
return done, result
result = poll_for_status(
get_status_fn=get_prep_status,
resource_id=prep_resp.id,
interval=2.0,
timeout=300
)
if result.status == "Failed":
raise RuntimeError(f"Preparation failed: {result.message or 'Unknown error'}") # Quote inspection
print("\nQuote received:")
for plan in result.quote:
print(f" • {plan.name} — Base: {plan.price} credit{'s' if plan.price != 1 else ''}")
for qp in plan.queue_priorities:
total = plan.price + qp.price_increase
print(f" ├ {qp.name}: +{qp.price_increase} → Total: {total}")
print(f" └ Plan ID: {plan.execution_plan_id}")
# Select cheapest
cheapest_plan = min(result.quote, key=lambda p: p.price)
cheapest_prio = min(cheapest_plan.queue_priorities, key=lambda q: q.price_increase) # Create job
job = scheduler.create_job(
organization_id=org.id,
job_preparation_id=prep_resp.id,
execution_plan_id=cheapest_plan.execution_plan_id,
queue_priority_id=cheapest_prio.queue_priority_id,
) # Poll completion
def get_job_status(job_id: str):
job_obj = scheduler.get_job(job_id)
done = job_obj.status in ("Completed", "Failed", "Canceled")
return done, job_obj
final_job = poll_for_status(
get_status_fn=get_job_status,
resource_id=job.id,
interval=5.0,
timeout=86_400,
)
print(f"\nJob finished: {final_job.status}") # Download and print JSON output
if final_job.output_data_url:
output_json = scheduler.download_job_output(final_job)
print("\n--- JOB OUTPUT (JSON) ---")
print(json.dumps(output_json, indent=2))
else:
print("No output available.")
finally:
scheduler.close()
management.close()