Skip to main contentIBM Quantum Documentation

Transpile using REST API


This documentation utilizes the Python requests module to demonstrate the Cloud Transpiler API. However, this workflow can be executed using any language or framework that supports working with REST APIs. Refer to the API reference documentation for details.

The process of rewriting a given input circuit to match the topology of a specific quantum device, and optimizing the circuit instructions for execution on noisy quantum systems, is known as transpilation.

You have two transpilation options:


Transpilation is necessary(opens in a new tab) prior to submitting a circuit to IBM® QPUs.

The steps in this topic describe how to transpile a given QASM circuit and obtain results using the Cloud Transpiler REST API, and include suggestions on how to submit the transpiled quantum circuit to IBM compute resources.

Query the Qiskit transpiler service

Query the Cloud Transpiler API(opens in a new tab) and provide your QASM string as input. See more details in the API reference documentation.

There are two ways to invoke the Qiskit transpiler service using REST API: with regular transpilation, and with AI-enhanced transpilation. The following demonstrates both ways to invoke the Cloud Transpiler API.


This experimental service is only available to IBM Quantum™ Premium Plan users.

backend='ibm_brisbane' #choose your IBM Backend
headers = {
"accept": "application/json",
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
body= {
"qasm_circuits": qasm_string,
params = {
"backend": backend,
"optimization_level": 1,
"ai": "false", # "true", "false" and "auto"
resp =

Since there might be cases where it’s more effective not to use AI-enhanced passes, you can set the ai parameter to ai="auto" to enable the system to decide automatically whether to apply the standard Qiskit heuristic passes or the new AI-powered passes, based on the particulars of your circuit.

Request results based on the task_id

Request the transpilation service results using the task_id.

res = requests.get(url=f"{task_id}", headers=headers)
if res.json().get("state") == "SUCCESS":


OPENQASM 3.0; include ""; gate rzx_140040114706704(_gate_p_0) _gate_q_0, _gate_q_1 {   h _gate_q_1;   cx _gate_q_0, _gate_q_1;   rz(pi/4) _gate_q_1;   cx _gate_q_0, _gate_q_1;   h _gate_q_1; } gate rzx_140040024191376(_gate_p_0) _gate_q_0, _gate_q_1 {   h _gate_q_1;   cx _gate_q_0, _gate_q_1;   rz(-pi/4) _gate_q_1;   cx _gate_q_0, _gate_q_1;   h _gate_q_1; } gate ecr _gate_q_0, _gate_q_1 {   rzx_140040114706704(pi/4) _gate_q_0, _gate_q_1;   x _gate_q_0;   rzx_140040024191376(-pi/4) _gate_q_0, _gate_q_1; } bit[2] c; rz(-pi) $0; sx $0; rz(pi/2) $0; rz(-pi/2) $1; sx $1; rz(-pi) $1; ecr $1, $0; rz(-pi/2) $0; sx $0; rz(pi/2) $0; rz(pi/2) $1; sx $1; rz(pi/2) $1; barrier $0, $1; c[0] = measure $0; c[1] = measure $1;

Next steps

Was this page helpful?
Report a bug or request content on GitHub.