> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qbraid.com/llms.txt
> Use this file to discover all available pages before exploring further.

# QiskitRuntimeProvider

> Runtime integration for streamlined access to IBM Quantum hardware.

<Info>
  API Reference:
  [qbraid.runtime.ibm](https://qbraid.github.io/qBraid/stubs/qbraid.runtime.ibm.html)
</Info>

## Installation & Setup

To interface with IBM Quantum backends, install the `qiskit` extra,

```bash theme={null}
pip install 'qbraid[qiskit]'
```

and configure your [IBM credentials](https://github.com/Qiskit/qiskit-ibm-runtime?tab=readme-ov-file#account-setup).

## Basic Usage

The `QiskitRuntimeProvider` allows you to easily submit jobs to IBM Quantum devices. There are several ways to initialize the provider:

1. Direct authentication with IBM Cloud:

```python theme={null}
from qbraid.runtime import QiskitRuntimeProvider

provider = QiskitRuntimeProvider(
    channel="ibm_cloud",
    token="MY_IBM_CLOUD_API_KEY",
    instance="MY_IBM_CLOUD_CRN"
)
```

2. Authentication with IBM Quantum:

```python theme={null}
provider = QiskitRuntimeProvider(
    channel="ibm_quantum",
    token="MY_IBM_QUANTUM_TOKEN"
)
```

3. Using environment variables:

```shell theme={null}
export QISKIT_IBM_TOKEN="MY_IBM_CLOUD_API_KEY"
export QISKIT_IBM_INSTANCE="MY_IBM_CLOUD_CRN"
export QISKIT_IBM_CHANNEL="ibm_cloud"
```

4. Using credentials stored in `$HOME/.qiskit/qiskit-ibm.json`

When using environment variables or stored credentials, you can initialize the provider without any arguments:

```python theme={null}
provider = QiskitRuntimeProvider()
```

Once initialized, you can list available devices and access their information:

```python theme={null}
# Get list of available devices
provider.get_devices()
# [<qbraid.runtime.ibm.device.QiskitBackend('ibm_brisbane')>,
#  <qbraid.runtime.ibm.device.QiskitBackend('ibm_sherbrooke')>,
#  <qbraid.runtime.ibm.device.QiskitBackend('ibm_fez')>,
#  <qbraid.runtime.ibm.device.QiskitBackend('ibm_kyiv')>,
#  <qbraid.runtime.ibm.device.QiskitBackend('ibm_torino')>,
#  <qbraid.runtime.ibm.device.QiskitBackend('ibm_marrakesh')>]

# Select a specific device
device = provider.get_device('ibm_brisbane')

# View device metadata
device.metadata()
# {'device_id': 'ibm_brisbane',
#  'device_type': 'QPU',
#  'num_qubits': 127,
#  'instance': 'ibm-q/open/main',
#  'max_shots': 100000,
#  'status': 'ONLINE',
#  'queue_depth': 37}
```

Our chosen device is the IBM Osaka Backend, which we will now submit a Qiskit job to.

```python theme={null}
from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.h(0)
job = device.run(circuit, shots=10)
```

So now we have `job` which is of type `QiskitJob`, which inherits from `QuantumJob`. To see the results, we can do the following:

```python theme={null}
res = job.result()

res.data.get_counts()
# {'00': 6, '11': 4}

res.data.measurements
# array([[1, 1],
#        [0, 0],
#        [0, 0],
#        [1, 1],
#        [0, 0],
#        [1, 1],
#        [0, 0],
#        [1, 1],
#        [0, 0],
#        [0, 0]])
```

See how to visualize these results in the [Visualization](/v2/sdk/user-guide/visualization#plot-experimental-results) section.
