Let’s start by defining a simple qiskit quantum circuit that we wish to execute.

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(1, 1)

circuit.ry(np.pi / 4, 0)
circuit.rz(np.pi / 2, 0)
circuit.measure(0, 0)

This time, we’ll run our quantum program on the IBMQ Armonk QPU. After the job has completed, we’ll gather the result, and plot a histogram of the measurement counts.

from qbraid import device_wrapper

shots = 2**10

qdevice = device_wrapper('ibm_q_belem')
qjob =, shots=shots)

qresult_ibmq = qjob.result()


The results layer follows the same wrapper abstraction as the circuit, device and job layers. You can access the underlying “result-like” object using the vendor_rlo attribute:

>>> type(qresult_ibmq)
>>> type(qresult_ibmq.vendor_rlo)

Now, let’s execute the same one-qubit qiskit circuit on a density-matrix simulator provided AWS:

aws_device = device_wrapper('aws_dm_sim')

aws_job =, shots=shots)

qresult_aws = aws_job.result()

Using the qBraid quantum wrapper flow, result data will be returned with consistent typing, formatting, and qubit indexing for every supported backend.

>>> qresult_ibmq.measurement_counts()
{'0': 139, '1': 885}
>>> qresult_aws.measurement_counts()
{'0': 136, '1': 888}

The qBraid SDK not only allows executing your quantum programs on a range of quantum backends, but also has built-in protocols that enable seemless comparisson of results. As shown above, we can now easily compare the measurement counts across all three runs, perfect for benchmarking and countless other applications.