From 36b4f09b2b942d221524421d0b8d3b33d53974ce Mon Sep 17 00:00:00 2001
From: Spencer Churchill <25377399+splch@users.noreply.github.com>
Date: Wed, 24 Jun 2026 13:49:39 -0700
Subject: [PATCH 1/7] Sync OpenAPI: add clone and artifact endpoints, replace
CostModel
Regenerate the client against the upstream v0.4 spec (issue #52).
- Add clone_job (POST /jobs/{UUID}/clone) and CloneJobPayload.
- Replace get_compiled_file (GET /jobs/{UUID}/circuits/{lang}) with
get_job_artifact (GET /jobs/{UUID}/artifacts/{artifactId}); the response
body is opaque, so only the *_detailed callables are generated.
- Replace CostModel with ApiCostModel ("QCT" / "2QGE_operations").
- Add Backend.supported_gates/supported_native_gates/supported_error_mitigations.
- Add estimate_job_cost fields: estimated_quantum_compute_time_us, plus
rate_information.qct_cost_cents and rate_type; cost fields now nullable.
- Update tests, AGENTS.md, and CHANGELOG accordingly.
---
AGENTS.md | 4 +-
CHANGELOG.md | 11 +-
.../{get_compiled_file.py => clone_job.py} | 76 +++----
ionq_core/api/default/get_job_artifact.py | 129 ++++++++++++
ionq_core/models/__init__.py | 24 ++-
ionq_core/models/api_cost_model.py | 14 ++
ionq_core/models/backend.py | 46 ++++
ionq_core/models/base_job.py | 17 +-
.../models/circuit_job_creation_payload.py | 2 +-
ionq_core/models/clone_job_payload.py | 196 ++++++++++++++++++
.../models/clone_job_payload_settings.py | 119 +++++++++++
.../clone_job_payload_settings_compilation.py | 91 ++++++++
...e_job_payload_settings_error_mitigation.py | 82 ++++++++
ionq_core/models/cost_model.py | 14 --
ionq_core/models/get_circuit_job_response.py | 17 +-
ionq_core/models/get_compiled_file_lang.py | 14 --
ionq_core/models/get_job_estimate_response.py | 10 +
..._job_estimate_response_rate_information.py | 68 +++++-
...ate_response_rate_information_rate_type.py | 14 ++
ionq_core/models/get_job_response.py | 17 +-
ionq_core/models/json_multi_circuit_job.py | 2 +-
...partial_base_child_job_creation_payload.py | 196 ++++++++++++++++++
...ase_child_job_creation_payload_settings.py | 119 +++++++++++
...b_creation_payload_settings_compilation.py | 91 ++++++++
...ation_payload_settings_error_mitigation.py | 82 ++++++++
.../models/qctrl_qaoa_job_creation_payload.py | 2 +-
..._job_creation_payload_external_settings.py | 2 +-
openapi.json | 2 +-
tests/test_api.py | 44 ++--
29 files changed, 1378 insertions(+), 127 deletions(-)
rename ionq_core/api/default/{get_compiled_file.py => clone_job.py} (70%)
create mode 100644 ionq_core/api/default/get_job_artifact.py
create mode 100644 ionq_core/models/api_cost_model.py
create mode 100644 ionq_core/models/clone_job_payload.py
create mode 100644 ionq_core/models/clone_job_payload_settings.py
create mode 100644 ionq_core/models/clone_job_payload_settings_compilation.py
create mode 100644 ionq_core/models/clone_job_payload_settings_error_mitigation.py
delete mode 100644 ionq_core/models/cost_model.py
delete mode 100644 ionq_core/models/get_compiled_file_lang.py
create mode 100644 ionq_core/models/get_job_estimate_response_rate_information_rate_type.py
create mode 100644 ionq_core/models/partial_base_child_job_creation_payload.py
create mode 100644 ionq_core/models/partial_base_child_job_creation_payload_settings.py
create mode 100644 ionq_core/models/partial_base_child_job_creation_payload_settings_compilation.py
create mode 100644 ionq_core/models/partial_base_child_job_creation_payload_settings_error_mitigation.py
diff --git a/AGENTS.md b/AGENTS.md
index a6ad7d2..fb9c4f5 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -75,12 +75,12 @@ Every endpoint module exposes four callables: `sync`, `sync_detailed`, `asyncio`
```python
from ionq_core import IonQClient
-from ionq_core.api.default import create_job, get_job, get_compiled_file, get_jobs
+from ionq_core.api.default import create_job, get_job, get_variant_probabilities, get_jobs
from ionq_core.models.circuit_job_creation_payload import CircuitJobCreationPayload
client = IonQClient() # reads IONQ_API_KEY
get_job.sync(uuid, client=client) # one path param
-get_compiled_file.sync(uuid, lang, client=client) # multiple path params
+get_variant_probabilities.sync(uuid, variant_id, client=client) # multiple path params
get_jobs.sync(client=client, status="completed", limit=10) # query only
create_job.sync(client=client, body=payload) # body only
```
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c655fdb..496cab0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,12 +9,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
### Added
- `QctrlQaoaJobCreationPayload` and `QctrlQaoaJobInput` for submitting Q-CTRL QAOA maxcut combinatorial-optimization jobs via `create_job`. The `create_job` body union now also accepts `QctrlQaoaJobCreationPayload`.
-- `cost_model` optional field on `BaseJob`, `GetCircuitJobResponse`, and `GetJobResponse`, typed as `CostModel` (`"quantum_compute_time"` or `"execution_time"`).
+- `cost_model` optional field on `BaseJob`, `GetCircuitJobResponse`, and `GetJobResponse`, typed as `ApiCostModel` (`"QCT"` or `"2QGE_operations"`).
+- `clone_job` endpoint (`POST /jobs/{UUID}/clone`) and its `CloneJobPayload` model for resubmitting an existing job with optional overrides.
+- `get_job_artifact` endpoint (`GET /jobs/{UUID}/artifacts/{artifactId}`) for downloading job artifacts by id. The response body is opaque, so only the `sync_detailed` / `asyncio_detailed` callables are generated; read the bytes off `Response.content`.
+- `Backend` now exposes `supported_gates`, `supported_native_gates`, and `supported_error_mitigations`.
+- `estimate_job_cost` response gained `estimated_quantum_compute_time_us`, and its `rate_information` gained `qct_cost_cents` and `rate_type` (`"qct"` or `"2qge"`). Its `cost_1q_gate`, `cost_2q_gate`, and `job_cost_minimum` rate fields are now nullable.
### Changed
- `NativeCircuitInput.qubits` and `JsonMultiCircuitInput.qubits` are now `int | Unset` (previously `float | Unset`), matching upstream's tightening to `format: int32, minimum: 1`. `QisCircuitInput.qubits` already had this type locally via the OpenAPI overlay; that overlay action has been removed now that upstream is correct natively.
+### Removed
+
+- `get_compiled_file` endpoint (`GET /jobs/{UUID}/circuits/{lang}`) and its `GetCompiledFileLang` enum, removed upstream in favor of `get_job_artifact`. Compiled circuits are now fetched as artifacts by id rather than by `lang` (`"native"` / `"qasm3"`).
+- `CostModel` model, replaced by `ApiCostModel`.
+
## [0.1.1] - 2026-04-30
### Changed
diff --git a/ionq_core/api/default/get_compiled_file.py b/ionq_core/api/default/clone_job.py
similarity index 70%
rename from ionq_core/api/default/get_compiled_file.py
rename to ionq_core/api/default/clone_job.py
index a74ad09..c31d8f1 100644
--- a/ionq_core/api/default/get_compiled_file.py
+++ b/ionq_core/api/default/clone_job.py
@@ -12,45 +12,47 @@
from ...types import Response, UNSET
from ... import errors
-from ...models.get_compiled_file_lang import check_get_compiled_file_lang
-from ...models.get_compiled_file_lang import GetCompiledFileLang
+from ...models.clone_job_payload import CloneJobPayload
+from ...models.job_creation_response import JobCreationResponse
from typing import cast
def _get_kwargs(
uuid: str,
- lang: GetCompiledFileLang,
+ *,
+ body: CloneJobPayload,
) -> dict[str, Any]:
-
+ headers: dict[str, Any] = {}
+
_kwargs: dict[str, Any] = {
- "method": "get",
- "url": "/jobs/{uuid}/circuits/{lang}".format(uuid=quote(str(uuid), safe=""),lang=quote(str(lang), safe=""),),
+ "method": "post",
+ "url": "/jobs/{uuid}/clone".format(uuid=quote(str(uuid), safe=""),),
}
+ _kwargs["json"] = body.to_dict()
+
+ headers["Content-Type"] = "application/json"
+
+ _kwargs["headers"] = headers
return _kwargs
-def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Any | str | None:
- if response.status_code == 200:
- response_200 = cast(str, response.json())
- return response_200
+def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Any | JobCreationResponse | None:
+ if response.status_code == 201:
+ response_201 = JobCreationResponse.from_dict(response.json())
+
- if response.status_code == 403:
- response_403 = cast(Any, None)
- return response_403
- if response.status_code == 404:
- response_404 = cast(Any, None)
- return response_404
+ return response_201
if response.status_code == 429:
response_429 = cast(Any, None)
@@ -74,7 +76,7 @@ def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Res
return None
-def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[Any | str]:
+def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[Any | JobCreationResponse]:
return Response(
status_code=HTTPStatus(response.status_code),
content=response.content,
@@ -85,28 +87,28 @@ def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Res
def sync_detailed(
uuid: str,
- lang: GetCompiledFileLang,
*,
client: AuthenticatedClient,
+ body: CloneJobPayload,
-) -> Response[Any | str]:
+) -> Response[Any | JobCreationResponse]:
"""
Args:
uuid (str):
- lang (GetCompiledFileLang):
+ body (CloneJobPayload): Make all properties in T optional
Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[Any | str]
+ Response[Any | JobCreationResponse]
"""
kwargs = _get_kwargs(
uuid=uuid,
-lang=lang,
+body=body,
)
@@ -118,56 +120,56 @@ def sync_detailed(
def sync(
uuid: str,
- lang: GetCompiledFileLang,
*,
client: AuthenticatedClient,
+ body: CloneJobPayload,
-) -> Any | str | None:
+) -> Any | JobCreationResponse | None:
"""
Args:
uuid (str):
- lang (GetCompiledFileLang):
+ body (CloneJobPayload): Make all properties in T optional
Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Any | str
+ Any | JobCreationResponse
"""
return sync_detailed(
uuid=uuid,
-lang=lang,
client=client,
+body=body,
).parsed
async def asyncio_detailed(
uuid: str,
- lang: GetCompiledFileLang,
*,
client: AuthenticatedClient,
+ body: CloneJobPayload,
-) -> Response[Any | str]:
+) -> Response[Any | JobCreationResponse]:
"""
Args:
uuid (str):
- lang (GetCompiledFileLang):
+ body (CloneJobPayload): Make all properties in T optional
Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Response[Any | str]
+ Response[Any | JobCreationResponse]
"""
kwargs = _get_kwargs(
uuid=uuid,
-lang=lang,
+body=body,
)
@@ -179,28 +181,28 @@ async def asyncio_detailed(
async def asyncio(
uuid: str,
- lang: GetCompiledFileLang,
*,
client: AuthenticatedClient,
+ body: CloneJobPayload,
-) -> Any | str | None:
+) -> Any | JobCreationResponse | None:
"""
Args:
uuid (str):
- lang (GetCompiledFileLang):
+ body (CloneJobPayload): Make all properties in T optional
Raises:
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
httpx.TimeoutException: If the request takes longer than Client.timeout.
Returns:
- Any | str
+ Any | JobCreationResponse
"""
return (await asyncio_detailed(
uuid=uuid,
-lang=lang,
client=client,
+body=body,
)).parsed
diff --git a/ionq_core/api/default/get_job_artifact.py b/ionq_core/api/default/get_job_artifact.py
new file mode 100644
index 0000000..7999017
--- /dev/null
+++ b/ionq_core/api/default/get_job_artifact.py
@@ -0,0 +1,129 @@
+# SPDX-FileCopyrightText: 2026 IonQ, Inc.
+# SPDX-License-Identifier: Apache-2.0
+# @generated
+
+from http import HTTPStatus
+from typing import Any, cast
+from urllib.parse import quote
+
+import httpx
+
+from ...client import AuthenticatedClient, Client
+from ...types import Response, UNSET
+from ... import errors
+
+
+
+
+def _get_kwargs(
+ uuid: str,
+ artifact_id: str,
+
+) -> dict[str, Any]:
+
+
+
+
+
+
+ _kwargs: dict[str, Any] = {
+ "method": "get",
+ "url": "/jobs/{uuid}/artifacts/{artifact_id}".format(uuid=quote(str(uuid), safe=""),artifact_id=quote(str(artifact_id), safe=""),),
+ }
+
+
+ return _kwargs
+
+
+
+def _parse_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Any | None:
+ if response.status_code == 200:
+ return None
+
+ if response.status_code == 404:
+ return None
+
+ if client.raise_on_unexpected_status:
+ raise errors.UnexpectedStatus(response.status_code, response.content)
+ else:
+ return None
+
+
+def _build_response(*, client: AuthenticatedClient | Client, response: httpx.Response) -> Response[Any]:
+ return Response(
+ status_code=HTTPStatus(response.status_code),
+ content=response.content,
+ headers=response.headers,
+ parsed=_parse_response(client=client, response=response),
+ )
+
+
+def sync_detailed(
+ uuid: str,
+ artifact_id: str,
+ *,
+ client: AuthenticatedClient,
+
+) -> Response[Any]:
+ """ Download a job artifact.
+
+ Args:
+ uuid (str):
+ artifact_id (str):
+
+ Raises:
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
+
+ Returns:
+ Response[Any]
+ """
+
+
+ kwargs = _get_kwargs(
+ uuid=uuid,
+artifact_id=artifact_id,
+
+ )
+
+ response = client.get_httpx_client().request(
+ **kwargs,
+ )
+
+ return _build_response(client=client, response=response)
+
+
+async def asyncio_detailed(
+ uuid: str,
+ artifact_id: str,
+ *,
+ client: AuthenticatedClient,
+
+) -> Response[Any]:
+ """ Download a job artifact.
+
+ Args:
+ uuid (str):
+ artifact_id (str):
+
+ Raises:
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
+
+ Returns:
+ Response[Any]
+ """
+
+
+ kwargs = _get_kwargs(
+ uuid=uuid,
+artifact_id=artifact_id,
+
+ )
+
+ response = await client.get_async_httpx_client().request(
+ **kwargs
+ )
+
+ return _build_response(client=client, response=response)
+
diff --git a/ionq_core/models/__init__.py b/ionq_core/models/__init__.py
index 3aea456..2398d7f 100644
--- a/ionq_core/models/__init__.py
+++ b/ionq_core/models/__init__.py
@@ -7,6 +7,7 @@
from .add_job_results_payload import AddJobResultsPayload
from .add_job_results_response import AddJobResultsResponse
from .ansatz import Ansatz
+from .api_cost_model import ApiCostModel
from .backend import Backend
from .bad_request_error import BadRequestError
from .base_job import BaseJob
@@ -29,7 +30,10 @@
from .circuit_job_settings_error_mitigation_debiasing_type_0 import CircuitJobSettingsErrorMitigationDebiasingType0
from .circuit_job_settings_error_mitigation_debiasing_type_0_phi_chi_twirling import CircuitJobSettingsErrorMitigationDebiasingType0PhiChiTwirling
from .circuit_job_stats import CircuitJobStats
-from .cost_model import CostModel
+from .clone_job_payload import CloneJobPayload
+from .clone_job_payload_settings import CloneJobPayloadSettings
+from .clone_job_payload_settings_compilation import CloneJobPayloadSettingsCompilation
+from .clone_job_payload_settings_error_mitigation import CloneJobPayloadSettingsErrorMitigation
from .create_session_request import CreateSessionRequest
from .error import Error
from .failure import Failure
@@ -43,13 +47,13 @@
from .get_characterizations_for_backend_backend import GetCharacterizationsForBackendBackend
from .get_characterizations_for_backend_response_200 import GetCharacterizationsForBackendResponse200
from .get_circuit_job_response import GetCircuitJobResponse
-from .get_compiled_file_lang import GetCompiledFileLang
from .get_job_cost_response import GetJobCostResponse
from .get_job_cost_response_cost import GetJobCostResponseCost
from .get_job_cost_response_estimated_cost import GetJobCostResponseEstimatedCost
from .get_job_estimate_query_params import GetJobEstimateQueryParams
from .get_job_estimate_response import GetJobEstimateResponse
from .get_job_estimate_response_rate_information import GetJobEstimateResponseRateInformation
+from .get_job_estimate_response_rate_information_rate_type import GetJobEstimateResponseRateInformationRateType
from .get_job_response import GetJobResponse
from .get_jobs_query_params import GetJobsQueryParams
from .get_jobs_response import GetJobsResponse
@@ -94,6 +98,10 @@
from .noise import Noise
from .noise_model import NoiseModel
from .number_map import NumberMap
+from .partial_base_child_job_creation_payload import PartialBaseChildJobCreationPayload
+from .partial_base_child_job_creation_payload_settings import PartialBaseChildJobCreationPayloadSettings
+from .partial_base_child_job_creation_payload_settings_compilation import PartialBaseChildJobCreationPayloadSettingsCompilation
+from .partial_base_child_job_creation_payload_settings_error_mitigation import PartialBaseChildJobCreationPayloadSettingsErrorMitigation
from .qctrl_qaoa_job_creation_payload import QctrlQaoaJobCreationPayload
from .qctrl_qaoa_job_creation_payload_external_settings import QctrlQaoaJobCreationPayloadExternalSettings
from .qctrl_qaoa_job_creation_payload_settings import QctrlQaoaJobCreationPayloadSettings
@@ -128,6 +136,7 @@
"AddJobResultsPayload",
"AddJobResultsResponse",
"Ansatz",
+ "ApiCostModel",
"Backend",
"BadRequestError",
"BaseJob",
@@ -150,7 +159,10 @@
"CircuitJobSettingsErrorMitigationDebiasingType0",
"CircuitJobSettingsErrorMitigationDebiasingType0PhiChiTwirling",
"CircuitJobStats",
- "CostModel",
+ "CloneJobPayload",
+ "CloneJobPayloadSettings",
+ "CloneJobPayloadSettingsCompilation",
+ "CloneJobPayloadSettingsErrorMitigation",
"CreateSessionRequest",
"Error",
"Failure",
@@ -164,13 +176,13 @@
"GetCharacterizationsForBackendBackend",
"GetCharacterizationsForBackendResponse200",
"GetCircuitJobResponse",
- "GetCompiledFileLang",
"GetJobCostResponse",
"GetJobCostResponseCost",
"GetJobCostResponseEstimatedCost",
"GetJobEstimateQueryParams",
"GetJobEstimateResponse",
"GetJobEstimateResponseRateInformation",
+ "GetJobEstimateResponseRateInformationRateType",
"GetJobResponse",
"GetJobsQueryParams",
"GetJobsResponse",
@@ -215,6 +227,10 @@
"Noise",
"NoiseModel",
"NumberMap",
+ "PartialBaseChildJobCreationPayload",
+ "PartialBaseChildJobCreationPayloadSettings",
+ "PartialBaseChildJobCreationPayloadSettingsCompilation",
+ "PartialBaseChildJobCreationPayloadSettingsErrorMitigation",
"QctrlQaoaJobCreationPayload",
"QctrlQaoaJobCreationPayloadExternalSettings",
"QctrlQaoaJobCreationPayloadSettings",
diff --git a/ionq_core/models/api_cost_model.py b/ionq_core/models/api_cost_model.py
new file mode 100644
index 0000000..16efbee
--- /dev/null
+++ b/ionq_core/models/api_cost_model.py
@@ -0,0 +1,14 @@
+# SPDX-FileCopyrightText: 2026 IonQ, Inc.
+# SPDX-License-Identifier: Apache-2.0
+# @generated
+
+from typing import Literal, cast
+
+ApiCostModel = Literal['2QGE_operations', 'QCT']
+
+API_COST_MODEL_VALUES: set[ApiCostModel] = { '2QGE_operations', 'QCT', }
+
+def check_api_cost_model(value: str) -> ApiCostModel:
+ if value in API_COST_MODEL_VALUES:
+ return cast(ApiCostModel, value)
+ raise TypeError(f"Unexpected value {value!r}. Expected one of {API_COST_MODEL_VALUES!r}")
diff --git a/ionq_core/models/backend.py b/ionq_core/models/backend.py
index 31fa24a..567c588 100644
--- a/ionq_core/models/backend.py
+++ b/ionq_core/models/backend.py
@@ -13,6 +13,7 @@
from ..types import UNSET, Unset
from ..types import UNSET, Unset
+from typing import cast
@@ -39,6 +40,12 @@ class Backend:
degraded (bool | Unset): Flag to tell if the backend is degraded or not.
kw (float | Unset): The amount of energy used by the backend in kilowatt-hours. Example: 4902.81.
location (str | Unset): The location of the backend. Example: College Park, MD, USA.
+ supported_error_mitigations (list[str] | Unset): Error mitigation options supported by the backend. Example:
+ ['debiasing'].
+ supported_gates (list[str] | Unset): Gates supported by the backend. Example: ['x', 'y', 'z', 'h', 's', 'si',
+ 't', 'ti', 'v', 'vi', 'rx', 'ry', 'rz', 'cnot', 'swap', 'xx', 'yy', 'zz', 'not'].
+ supported_native_gates (list[str] | Unset): Native gates supported by the backend. Example: ['gpi', 'gpi2',
+ 'ms'].
"""
average_queue_time: float
@@ -50,6 +57,9 @@ class Backend:
degraded: bool | Unset = UNSET
kw: float | Unset = UNSET
location: str | Unset = UNSET
+ supported_error_mitigations: list[str] | Unset = UNSET
+ supported_gates: list[str] | Unset = UNSET
+ supported_native_gates: list[str] | Unset = UNSET
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
@@ -75,6 +85,24 @@ def to_dict(self) -> dict[str, Any]:
location = self.location
+ supported_error_mitigations: list[str] | Unset = UNSET
+ if not isinstance(self.supported_error_mitigations, Unset):
+ supported_error_mitigations = self.supported_error_mitigations
+
+
+
+ supported_gates: list[str] | Unset = UNSET
+ if not isinstance(self.supported_gates, Unset):
+ supported_gates = self.supported_gates
+
+
+
+ supported_native_gates: list[str] | Unset = UNSET
+ if not isinstance(self.supported_native_gates, Unset):
+ supported_native_gates = self.supported_native_gates
+
+
+
field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
@@ -93,6 +121,12 @@ def to_dict(self) -> dict[str, Any]:
field_dict["kw"] = kw
if location is not UNSET:
field_dict["location"] = location
+ if supported_error_mitigations is not UNSET:
+ field_dict["supported_error_mitigations"] = supported_error_mitigations
+ if supported_gates is not UNSET:
+ field_dict["supported_gates"] = supported_gates
+ if supported_native_gates is not UNSET:
+ field_dict["supported_native_gates"] = supported_native_gates
return field_dict
@@ -119,6 +153,15 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
location = d.pop("location", UNSET)
+ supported_error_mitigations = cast(list[str], d.pop("supported_error_mitigations", UNSET))
+
+
+ supported_gates = cast(list[str], d.pop("supported_gates", UNSET))
+
+
+ supported_native_gates = cast(list[str], d.pop("supported_native_gates", UNSET))
+
+
backend = cls(
average_queue_time=average_queue_time,
backend=backend,
@@ -129,6 +172,9 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
degraded=degraded,
kw=kw,
location=location,
+ supported_error_mitigations=supported_error_mitigations,
+ supported_gates=supported_gates,
+ supported_native_gates=supported_native_gates,
)
diff --git a/ionq_core/models/base_job.py b/ionq_core/models/base_job.py
index 5d6b39b..d63afbc 100644
--- a/ionq_core/models/base_job.py
+++ b/ionq_core/models/base_job.py
@@ -12,8 +12,8 @@
from ..types import UNSET, Unset
-from ..models.cost_model import check_cost_model
-from ..models.cost_model import CostModel
+from ..models.api_cost_model import ApiCostModel
+from ..models.api_cost_model import check_api_cost_model
from ..models.job_status import check_job_status
from ..models.job_status import JobStatus
from ..types import UNSET, Unset
@@ -42,7 +42,7 @@ class BaseJob:
type_ (str):
backend (str):
dry_run (bool):
- submitter_id (str): The id of the user who submitted the job
+ submitter_id (str): The id of the user who submitted the job.
project_id (None | str):
parent_job_id (None | str):
session_id (None | str):
@@ -60,9 +60,10 @@ class BaseJob:
settings (JsonObject):
stats (JsonObject):
results (JsonObject | None):
- shots (int | Unset):
+ shots (int | Unset): `shots` are not included with ideal simulator backend.
noise (Noise | Unset):
- cost_model (CostModel | Unset):
+ cost_model (ApiCostModel | Unset): The billing model used for this job. `QCT` for jobs billed on quantum
+ compute time, `2QGE_operations` for jobs billed on two-qubit gate operations.
"""
id: str
@@ -89,7 +90,7 @@ class BaseJob:
results: JsonObject | None
shots: int | Unset = UNSET
noise: Noise | Unset = UNSET
- cost_model: CostModel | Unset = UNSET
+ cost_model: ApiCostModel | Unset = UNSET
@@ -392,11 +393,11 @@ def _parse_results(data: object) -> JsonObject | None:
_cost_model = d.pop("cost_model", UNSET)
- cost_model: CostModel | Unset
+ cost_model: ApiCostModel | Unset
if isinstance(_cost_model, Unset):
cost_model = UNSET
else:
- cost_model = check_cost_model(_cost_model)
+ cost_model = check_api_cost_model(_cost_model)
diff --git a/ionq_core/models/circuit_job_creation_payload.py b/ionq_core/models/circuit_job_creation_payload.py
index 7b62f08..88085bc 100644
--- a/ionq_core/models/circuit_job_creation_payload.py
+++ b/ionq_core/models/circuit_job_creation_payload.py
@@ -42,7 +42,7 @@ class CircuitJobCreationPayload:
input_ (NativeCircuitInput | QisCircuitInput):
name (str | Unset):
metadata (JobMetadata | Unset):
- shots (int | Unset): Default: 100.
+ shots (int | Unset): `shots` is ignored by ideal simulator backend. Default: 100.
session_id (str | Unset):
settings (CircuitJobCreationPayloadSettings | Unset):
dry_run (bool | Unset):
diff --git a/ionq_core/models/clone_job_payload.py b/ionq_core/models/clone_job_payload.py
new file mode 100644
index 0000000..5640eb6
--- /dev/null
+++ b/ionq_core/models/clone_job_payload.py
@@ -0,0 +1,196 @@
+# SPDX-FileCopyrightText: 2026 IonQ, Inc.
+# SPDX-License-Identifier: Apache-2.0
+# @generated
+
+from __future__ import annotations
+
+from collections.abc import Mapping
+from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
+
+from attrs import define as _attrs_define
+from attrs import field as _attrs_field
+
+from ..types import UNSET, Unset
+
+from ..types import UNSET, Unset
+from typing import cast
+
+if TYPE_CHECKING:
+ from ..models.clone_job_payload_settings import CloneJobPayloadSettings
+ from ..models.job_metadata import JobMetadata
+ from ..models.noise import Noise
+
+
+
+
+
+T = TypeVar("T", bound="CloneJobPayload")
+
+
+
+@_attrs_define
+class CloneJobPayload:
+ """ Make all properties in T optional
+
+ Attributes:
+ parent (str | Unset):
+ name (str | Unset):
+ metadata (JobMetadata | Unset):
+ shots (int | Unset): `shots` is ignored by ideal simulator backend. Default: 100.
+ backend (str | Unset):
+ session_id (str | Unset):
+ settings (CloneJobPayloadSettings | Unset):
+ dry_run (bool | Unset):
+ noise (Noise | Unset):
+ """
+
+ parent: str | Unset = UNSET
+ name: str | Unset = UNSET
+ metadata: JobMetadata | Unset = UNSET
+ shots: int | Unset = 100
+ backend: str | Unset = UNSET
+ session_id: str | Unset = UNSET
+ settings: CloneJobPayloadSettings | Unset = UNSET
+ dry_run: bool | Unset = UNSET
+ noise: Noise | Unset = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
+
+
+
+
+
+ def to_dict(self) -> dict[str, Any]:
+ from ..models.clone_job_payload_settings import CloneJobPayloadSettings
+ from ..models.job_metadata import JobMetadata
+ from ..models.noise import Noise
+ parent = self.parent
+
+ name = self.name
+
+ metadata: dict[str, Any] | Unset = UNSET
+ if not isinstance(self.metadata, Unset):
+ metadata = self.metadata.to_dict()
+
+ shots = self.shots
+
+ backend = self.backend
+
+ session_id = self.session_id
+
+ settings: dict[str, Any] | Unset = UNSET
+ if not isinstance(self.settings, Unset):
+ settings = self.settings.to_dict()
+
+ dry_run = self.dry_run
+
+ noise: dict[str, Any] | Unset = UNSET
+ if not isinstance(self.noise, Unset):
+ noise = self.noise.to_dict()
+
+
+ field_dict: dict[str, Any] = {}
+ field_dict.update(self.additional_properties)
+ field_dict.update({
+ })
+ if parent is not UNSET:
+ field_dict["parent"] = parent
+ if name is not UNSET:
+ field_dict["name"] = name
+ if metadata is not UNSET:
+ field_dict["metadata"] = metadata
+ if shots is not UNSET:
+ field_dict["shots"] = shots
+ if backend is not UNSET:
+ field_dict["backend"] = backend
+ if session_id is not UNSET:
+ field_dict["session_id"] = session_id
+ if settings is not UNSET:
+ field_dict["settings"] = settings
+ if dry_run is not UNSET:
+ field_dict["dry_run"] = dry_run
+ if noise is not UNSET:
+ field_dict["noise"] = noise
+
+ return field_dict
+
+
+
+ @classmethod
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
+ from ..models.clone_job_payload_settings import CloneJobPayloadSettings
+ from ..models.job_metadata import JobMetadata
+ from ..models.noise import Noise
+ d = dict(src_dict)
+ parent = d.pop("parent", UNSET)
+
+ name = d.pop("name", UNSET)
+
+ _metadata = d.pop("metadata", UNSET)
+ metadata: JobMetadata | Unset
+ if isinstance(_metadata, Unset):
+ metadata = UNSET
+ else:
+ metadata = JobMetadata.from_dict(_metadata)
+
+
+
+
+ shots = d.pop("shots", UNSET)
+
+ backend = d.pop("backend", UNSET)
+
+ session_id = d.pop("session_id", UNSET)
+
+ _settings = d.pop("settings", UNSET)
+ settings: CloneJobPayloadSettings | Unset
+ if isinstance(_settings, Unset):
+ settings = UNSET
+ else:
+ settings = CloneJobPayloadSettings.from_dict(_settings)
+
+
+
+
+ dry_run = d.pop("dry_run", UNSET)
+
+ _noise = d.pop("noise", UNSET)
+ noise: Noise | Unset
+ if isinstance(_noise, Unset):
+ noise = UNSET
+ else:
+ noise = Noise.from_dict(_noise)
+
+
+
+
+ clone_job_payload = cls(
+ parent=parent,
+ name=name,
+ metadata=metadata,
+ shots=shots,
+ backend=backend,
+ session_id=session_id,
+ settings=settings,
+ dry_run=dry_run,
+ noise=noise,
+ )
+
+
+ clone_job_payload.additional_properties = d
+ return clone_job_payload
+
+ @property
+ def additional_keys(self) -> list[str]:
+ return list(self.additional_properties.keys())
+
+ def __getitem__(self, key: str) -> Any:
+ return self.additional_properties[key]
+
+ def __setitem__(self, key: str, value: Any) -> None:
+ self.additional_properties[key] = value
+
+ def __delitem__(self, key: str) -> None:
+ del self.additional_properties[key]
+
+ def __contains__(self, key: str) -> bool:
+ return key in self.additional_properties
diff --git a/ionq_core/models/clone_job_payload_settings.py b/ionq_core/models/clone_job_payload_settings.py
new file mode 100644
index 0000000..d5cf2d7
--- /dev/null
+++ b/ionq_core/models/clone_job_payload_settings.py
@@ -0,0 +1,119 @@
+# SPDX-FileCopyrightText: 2026 IonQ, Inc.
+# SPDX-License-Identifier: Apache-2.0
+# @generated
+
+from __future__ import annotations
+
+from collections.abc import Mapping
+from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
+
+from attrs import define as _attrs_define
+from attrs import field as _attrs_field
+
+from ..types import UNSET, Unset
+
+from ..types import UNSET, Unset
+from typing import cast
+
+if TYPE_CHECKING:
+ from ..models.clone_job_payload_settings_compilation import CloneJobPayloadSettingsCompilation
+ from ..models.clone_job_payload_settings_error_mitigation import CloneJobPayloadSettingsErrorMitigation
+
+
+
+
+
+T = TypeVar("T", bound="CloneJobPayloadSettings")
+
+
+
+@_attrs_define
+class CloneJobPayloadSettings:
+ """
+ Attributes:
+ error_mitigation (CloneJobPayloadSettingsErrorMitigation | Unset):
+ compilation (CloneJobPayloadSettingsCompilation | Unset):
+ """
+
+ error_mitigation: CloneJobPayloadSettingsErrorMitigation | Unset = UNSET
+ compilation: CloneJobPayloadSettingsCompilation | Unset = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
+
+
+
+
+
+ def to_dict(self) -> dict[str, Any]:
+ from ..models.clone_job_payload_settings_compilation import CloneJobPayloadSettingsCompilation
+ from ..models.clone_job_payload_settings_error_mitigation import CloneJobPayloadSettingsErrorMitigation
+ error_mitigation: dict[str, Any] | Unset = UNSET
+ if not isinstance(self.error_mitigation, Unset):
+ error_mitigation = self.error_mitigation.to_dict()
+
+ compilation: dict[str, Any] | Unset = UNSET
+ if not isinstance(self.compilation, Unset):
+ compilation = self.compilation.to_dict()
+
+
+ field_dict: dict[str, Any] = {}
+ field_dict.update(self.additional_properties)
+ field_dict.update({
+ })
+ if error_mitigation is not UNSET:
+ field_dict["error_mitigation"] = error_mitigation
+ if compilation is not UNSET:
+ field_dict["compilation"] = compilation
+
+ return field_dict
+
+
+
+ @classmethod
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
+ from ..models.clone_job_payload_settings_compilation import CloneJobPayloadSettingsCompilation
+ from ..models.clone_job_payload_settings_error_mitigation import CloneJobPayloadSettingsErrorMitigation
+ d = dict(src_dict)
+ _error_mitigation = d.pop("error_mitigation", UNSET)
+ error_mitigation: CloneJobPayloadSettingsErrorMitigation | Unset
+ if isinstance(_error_mitigation, Unset):
+ error_mitigation = UNSET
+ else:
+ error_mitigation = CloneJobPayloadSettingsErrorMitigation.from_dict(_error_mitigation)
+
+
+
+
+ _compilation = d.pop("compilation", UNSET)
+ compilation: CloneJobPayloadSettingsCompilation | Unset
+ if isinstance(_compilation, Unset):
+ compilation = UNSET
+ else:
+ compilation = CloneJobPayloadSettingsCompilation.from_dict(_compilation)
+
+
+
+
+ clone_job_payload_settings = cls(
+ error_mitigation=error_mitigation,
+ compilation=compilation,
+ )
+
+
+ clone_job_payload_settings.additional_properties = d
+ return clone_job_payload_settings
+
+ @property
+ def additional_keys(self) -> list[str]:
+ return list(self.additional_properties.keys())
+
+ def __getitem__(self, key: str) -> Any:
+ return self.additional_properties[key]
+
+ def __setitem__(self, key: str, value: Any) -> None:
+ self.additional_properties[key] = value
+
+ def __delitem__(self, key: str) -> None:
+ del self.additional_properties[key]
+
+ def __contains__(self, key: str) -> bool:
+ return key in self.additional_properties
diff --git a/ionq_core/models/clone_job_payload_settings_compilation.py b/ionq_core/models/clone_job_payload_settings_compilation.py
new file mode 100644
index 0000000..1b0f73a
--- /dev/null
+++ b/ionq_core/models/clone_job_payload_settings_compilation.py
@@ -0,0 +1,91 @@
+# SPDX-FileCopyrightText: 2026 IonQ, Inc.
+# SPDX-License-Identifier: Apache-2.0
+# @generated
+
+from __future__ import annotations
+
+from collections.abc import Mapping
+from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
+
+from attrs import define as _attrs_define
+from attrs import field as _attrs_field
+
+from ..types import UNSET, Unset
+
+from ..types import UNSET, Unset
+
+
+
+
+
+
+T = TypeVar("T", bound="CloneJobPayloadSettingsCompilation")
+
+
+
+@_attrs_define
+class CloneJobPayloadSettingsCompilation:
+ """
+ Attributes:
+ opt (float | Unset):
+ precision (str | Unset):
+ """
+
+ opt: float | Unset = UNSET
+ precision: str | Unset = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
+
+
+
+
+
+ def to_dict(self) -> dict[str, Any]:
+ opt = self.opt
+
+ precision = self.precision
+
+
+ field_dict: dict[str, Any] = {}
+ field_dict.update(self.additional_properties)
+ field_dict.update({
+ })
+ if opt is not UNSET:
+ field_dict["opt"] = opt
+ if precision is not UNSET:
+ field_dict["precision"] = precision
+
+ return field_dict
+
+
+
+ @classmethod
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
+ d = dict(src_dict)
+ opt = d.pop("opt", UNSET)
+
+ precision = d.pop("precision", UNSET)
+
+ clone_job_payload_settings_compilation = cls(
+ opt=opt,
+ precision=precision,
+ )
+
+
+ clone_job_payload_settings_compilation.additional_properties = d
+ return clone_job_payload_settings_compilation
+
+ @property
+ def additional_keys(self) -> list[str]:
+ return list(self.additional_properties.keys())
+
+ def __getitem__(self, key: str) -> Any:
+ return self.additional_properties[key]
+
+ def __setitem__(self, key: str, value: Any) -> None:
+ self.additional_properties[key] = value
+
+ def __delitem__(self, key: str) -> None:
+ del self.additional_properties[key]
+
+ def __contains__(self, key: str) -> bool:
+ return key in self.additional_properties
diff --git a/ionq_core/models/clone_job_payload_settings_error_mitigation.py b/ionq_core/models/clone_job_payload_settings_error_mitigation.py
new file mode 100644
index 0000000..c4aaa77
--- /dev/null
+++ b/ionq_core/models/clone_job_payload_settings_error_mitigation.py
@@ -0,0 +1,82 @@
+# SPDX-FileCopyrightText: 2026 IonQ, Inc.
+# SPDX-License-Identifier: Apache-2.0
+# @generated
+
+from __future__ import annotations
+
+from collections.abc import Mapping
+from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
+
+from attrs import define as _attrs_define
+from attrs import field as _attrs_field
+
+from ..types import UNSET, Unset
+
+from ..types import UNSET, Unset
+
+
+
+
+
+
+T = TypeVar("T", bound="CloneJobPayloadSettingsErrorMitigation")
+
+
+
+@_attrs_define
+class CloneJobPayloadSettingsErrorMitigation:
+ """
+ Attributes:
+ debiasing (bool | Unset):
+ """
+
+ debiasing: bool | Unset = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
+
+
+
+
+
+ def to_dict(self) -> dict[str, Any]:
+ debiasing = self.debiasing
+
+
+ field_dict: dict[str, Any] = {}
+ field_dict.update(self.additional_properties)
+ field_dict.update({
+ })
+ if debiasing is not UNSET:
+ field_dict["debiasing"] = debiasing
+
+ return field_dict
+
+
+
+ @classmethod
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
+ d = dict(src_dict)
+ debiasing = d.pop("debiasing", UNSET)
+
+ clone_job_payload_settings_error_mitigation = cls(
+ debiasing=debiasing,
+ )
+
+
+ clone_job_payload_settings_error_mitigation.additional_properties = d
+ return clone_job_payload_settings_error_mitigation
+
+ @property
+ def additional_keys(self) -> list[str]:
+ return list(self.additional_properties.keys())
+
+ def __getitem__(self, key: str) -> Any:
+ return self.additional_properties[key]
+
+ def __setitem__(self, key: str, value: Any) -> None:
+ self.additional_properties[key] = value
+
+ def __delitem__(self, key: str) -> None:
+ del self.additional_properties[key]
+
+ def __contains__(self, key: str) -> bool:
+ return key in self.additional_properties
diff --git a/ionq_core/models/cost_model.py b/ionq_core/models/cost_model.py
deleted file mode 100644
index c464277..0000000
--- a/ionq_core/models/cost_model.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# SPDX-FileCopyrightText: 2026 IonQ, Inc.
-# SPDX-License-Identifier: Apache-2.0
-# @generated
-
-from typing import Literal, cast
-
-CostModel = Literal['execution_time', 'quantum_compute_time']
-
-COST_MODEL_VALUES: set[CostModel] = { 'execution_time', 'quantum_compute_time', }
-
-def check_cost_model(value: str) -> CostModel:
- if value in COST_MODEL_VALUES:
- return cast(CostModel, value)
- raise TypeError(f"Unexpected value {value!r}. Expected one of {COST_MODEL_VALUES!r}")
diff --git a/ionq_core/models/get_circuit_job_response.py b/ionq_core/models/get_circuit_job_response.py
index 2084de2..c7ac59a 100644
--- a/ionq_core/models/get_circuit_job_response.py
+++ b/ionq_core/models/get_circuit_job_response.py
@@ -12,8 +12,8 @@
from ..types import UNSET, Unset
-from ..models.cost_model import check_cost_model
-from ..models.cost_model import CostModel
+from ..models.api_cost_model import ApiCostModel
+from ..models.api_cost_model import check_api_cost_model
from ..models.job_status import check_job_status
from ..models.job_status import JobStatus
from ..types import UNSET, Unset
@@ -45,7 +45,7 @@ class GetCircuitJobResponse:
type_ (str):
backend (str):
dry_run (bool):
- submitter_id (str): The id of the user who submitted the job
+ submitter_id (str): The id of the user who submitted the job.
project_id (None | str):
parent_job_id (None | str):
session_id (None | str):
@@ -64,9 +64,10 @@ class GetCircuitJobResponse:
stats (CircuitJobStats):
results (CircuitJobResult | None):
child_job_ids (list[str] | None):
- shots (int | Unset):
+ shots (int | Unset): `shots` are not included with ideal simulator backend.
noise (Noise | Unset):
- cost_model (CostModel | Unset):
+ cost_model (ApiCostModel | Unset): The billing model used for this job. `QCT` for jobs billed on quantum
+ compute time, `2QGE_operations` for jobs billed on two-qubit gate operations.
"""
id: str
@@ -94,7 +95,7 @@ class GetCircuitJobResponse:
child_job_ids: list[str] | None
shots: int | Unset = UNSET
noise: Noise | Unset = UNSET
- cost_model: CostModel | Unset = UNSET
+ cost_model: ApiCostModel | Unset = UNSET
@@ -428,11 +429,11 @@ def _parse_child_job_ids(data: object) -> list[str] | None:
_cost_model = d.pop("cost_model", UNSET)
- cost_model: CostModel | Unset
+ cost_model: ApiCostModel | Unset
if isinstance(_cost_model, Unset):
cost_model = UNSET
else:
- cost_model = check_cost_model(_cost_model)
+ cost_model = check_api_cost_model(_cost_model)
diff --git a/ionq_core/models/get_compiled_file_lang.py b/ionq_core/models/get_compiled_file_lang.py
deleted file mode 100644
index 0b4e89b..0000000
--- a/ionq_core/models/get_compiled_file_lang.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# SPDX-FileCopyrightText: 2026 IonQ, Inc.
-# SPDX-License-Identifier: Apache-2.0
-# @generated
-
-from typing import Literal, cast
-
-GetCompiledFileLang = Literal['native', 'qasm3']
-
-GET_COMPILED_FILE_LANG_VALUES: set[GetCompiledFileLang] = { 'native', 'qasm3', }
-
-def check_get_compiled_file_lang(value: str) -> GetCompiledFileLang:
- if value in GET_COMPILED_FILE_LANG_VALUES:
- return cast(GetCompiledFileLang, value)
- raise TypeError(f"Unexpected value {value!r}. Expected one of {GET_COMPILED_FILE_LANG_VALUES!r}")
diff --git a/ionq_core/models/get_job_estimate_response.py b/ionq_core/models/get_job_estimate_response.py
index 81e9386..1c04748 100644
--- a/ionq_core/models/get_job_estimate_response.py
+++ b/ionq_core/models/get_job_estimate_response.py
@@ -12,6 +12,7 @@
from ..types import UNSET, Unset
+from ..types import UNSET, Unset
from typing import cast
if TYPE_CHECKING:
@@ -37,6 +38,7 @@ class GetJobEstimateResponse:
estimated_cost (float):
estimated_execution_time (float):
current_predicted_queue_time (float):
+ estimated_quantum_compute_time_us (float | Unset):
"""
input_values: GetJobEstimateQueryParams
@@ -46,6 +48,7 @@ class GetJobEstimateResponse:
estimated_cost: float
estimated_execution_time: float
current_predicted_queue_time: float
+ estimated_quantum_compute_time_us: float | Unset = UNSET
@@ -68,6 +71,8 @@ def to_dict(self) -> dict[str, Any]:
current_predicted_queue_time = self.current_predicted_queue_time
+ estimated_quantum_compute_time_us = self.estimated_quantum_compute_time_us
+
field_dict: dict[str, Any] = {}
@@ -80,6 +85,8 @@ def to_dict(self) -> dict[str, Any]:
"estimated_execution_time": estimated_execution_time,
"current_predicted_queue_time": current_predicted_queue_time,
})
+ if estimated_quantum_compute_time_us is not UNSET:
+ field_dict["estimated_quantum_compute_time_us"] = estimated_quantum_compute_time_us
return field_dict
@@ -110,6 +117,8 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
current_predicted_queue_time = d.pop("current_predicted_queue_time")
+ estimated_quantum_compute_time_us = d.pop("estimated_quantum_compute_time_us", UNSET)
+
get_job_estimate_response = cls(
input_values=input_values,
estimated_at=estimated_at,
@@ -118,6 +127,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
estimated_cost=estimated_cost,
estimated_execution_time=estimated_execution_time,
current_predicted_queue_time=current_predicted_queue_time,
+ estimated_quantum_compute_time_us=estimated_quantum_compute_time_us,
)
return get_job_estimate_response
diff --git a/ionq_core/models/get_job_estimate_response_rate_information.py b/ionq_core/models/get_job_estimate_response_rate_information.py
index 74b2f00..514176e 100644
--- a/ionq_core/models/get_job_estimate_response_rate_information.py
+++ b/ionq_core/models/get_job_estimate_response_rate_information.py
@@ -12,6 +12,9 @@
from ..types import UNSET, Unset
+from ..models.get_job_estimate_response_rate_information_rate_type import check_get_job_estimate_response_rate_information_rate_type
+from ..models.get_job_estimate_response_rate_information_rate_type import GetJobEstimateResponseRateInformationRateType
+from typing import cast
@@ -26,15 +29,19 @@
class GetJobEstimateResponseRateInformation:
"""
Attributes:
- job_cost_minimum (float):
- cost_2q_gate (float):
- cost_1q_gate (float):
+ qct_cost_cents (float | None):
+ rate_type (GetJobEstimateResponseRateInformationRateType):
+ job_cost_minimum (float | None):
+ cost_2q_gate (float | None):
+ cost_1q_gate (float | None):
organization (str):
"""
- job_cost_minimum: float
- cost_2q_gate: float
- cost_1q_gate: float
+ qct_cost_cents: float | None
+ rate_type: GetJobEstimateResponseRateInformationRateType
+ job_cost_minimum: float | None
+ cost_2q_gate: float | None
+ cost_1q_gate: float | None
organization: str
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
@@ -43,10 +50,18 @@ class GetJobEstimateResponseRateInformation:
def to_dict(self) -> dict[str, Any]:
+ qct_cost_cents: float | None
+ qct_cost_cents = self.qct_cost_cents
+
+ rate_type: str = self.rate_type
+
+ job_cost_minimum: float | None
job_cost_minimum = self.job_cost_minimum
+ cost_2q_gate: float | None
cost_2q_gate = self.cost_2q_gate
+ cost_1q_gate: float | None
cost_1q_gate = self.cost_1q_gate
organization = self.organization
@@ -55,6 +70,8 @@ def to_dict(self) -> dict[str, Any]:
field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({
+ "qct_cost_cents": qct_cost_cents,
+ "rate_type": rate_type,
"job_cost_minimum": job_cost_minimum,
"cost_2q_gate": cost_2q_gate,
"cost_1q_gate": cost_1q_gate,
@@ -68,15 +85,48 @@ def to_dict(self) -> dict[str, Any]:
@classmethod
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
d = dict(src_dict)
- job_cost_minimum = d.pop("job_cost_minimum")
+ def _parse_qct_cost_cents(data: object) -> float | None:
+ if data is None:
+ return data
+ return cast(float | None, data)
+
+ qct_cost_cents = _parse_qct_cost_cents(d.pop("qct_cost_cents"))
+
+
+ rate_type = check_get_job_estimate_response_rate_information_rate_type(d.pop("rate_type"))
+
+
+
+
+ def _parse_job_cost_minimum(data: object) -> float | None:
+ if data is None:
+ return data
+ return cast(float | None, data)
+
+ job_cost_minimum = _parse_job_cost_minimum(d.pop("job_cost_minimum"))
+
+
+ def _parse_cost_2q_gate(data: object) -> float | None:
+ if data is None:
+ return data
+ return cast(float | None, data)
+
+ cost_2q_gate = _parse_cost_2q_gate(d.pop("cost_2q_gate"))
+
+
+ def _parse_cost_1q_gate(data: object) -> float | None:
+ if data is None:
+ return data
+ return cast(float | None, data)
- cost_2q_gate = d.pop("cost_2q_gate")
+ cost_1q_gate = _parse_cost_1q_gate(d.pop("cost_1q_gate"))
- cost_1q_gate = d.pop("cost_1q_gate")
organization = d.pop("organization")
get_job_estimate_response_rate_information = cls(
+ qct_cost_cents=qct_cost_cents,
+ rate_type=rate_type,
job_cost_minimum=job_cost_minimum,
cost_2q_gate=cost_2q_gate,
cost_1q_gate=cost_1q_gate,
diff --git a/ionq_core/models/get_job_estimate_response_rate_information_rate_type.py b/ionq_core/models/get_job_estimate_response_rate_information_rate_type.py
new file mode 100644
index 0000000..84b4dac
--- /dev/null
+++ b/ionq_core/models/get_job_estimate_response_rate_information_rate_type.py
@@ -0,0 +1,14 @@
+# SPDX-FileCopyrightText: 2026 IonQ, Inc.
+# SPDX-License-Identifier: Apache-2.0
+# @generated
+
+from typing import Literal, cast
+
+GetJobEstimateResponseRateInformationRateType = Literal['2qge', 'qct']
+
+GET_JOB_ESTIMATE_RESPONSE_RATE_INFORMATION_RATE_TYPE_VALUES: set[GetJobEstimateResponseRateInformationRateType] = { '2qge', 'qct', }
+
+def check_get_job_estimate_response_rate_information_rate_type(value: str) -> GetJobEstimateResponseRateInformationRateType:
+ if value in GET_JOB_ESTIMATE_RESPONSE_RATE_INFORMATION_RATE_TYPE_VALUES:
+ return cast(GetJobEstimateResponseRateInformationRateType, value)
+ raise TypeError(f"Unexpected value {value!r}. Expected one of {GET_JOB_ESTIMATE_RESPONSE_RATE_INFORMATION_RATE_TYPE_VALUES!r}")
diff --git a/ionq_core/models/get_job_response.py b/ionq_core/models/get_job_response.py
index 4447ab1..e541198 100644
--- a/ionq_core/models/get_job_response.py
+++ b/ionq_core/models/get_job_response.py
@@ -12,8 +12,8 @@
from ..types import UNSET, Unset
-from ..models.cost_model import check_cost_model
-from ..models.cost_model import CostModel
+from ..models.api_cost_model import ApiCostModel
+from ..models.api_cost_model import check_api_cost_model
from ..models.job_status import check_job_status
from ..models.job_status import JobStatus
from ..types import UNSET, Unset
@@ -45,7 +45,7 @@ class GetJobResponse:
type_ (str):
backend (str):
dry_run (bool):
- submitter_id (str): The id of the user who submitted the job
+ submitter_id (str): The id of the user who submitted the job.
project_id (None | str):
parent_job_id (None | str):
session_id (None | str):
@@ -64,9 +64,10 @@ class GetJobResponse:
stats (CircuitJobStats):
results (CircuitJobResult | None):
child_job_ids (list[str] | None):
- shots (int | Unset):
+ shots (int | Unset): `shots` are not included with ideal simulator backend.
noise (Noise | Unset):
- cost_model (CostModel | Unset):
+ cost_model (ApiCostModel | Unset): The billing model used for this job. `QCT` for jobs billed on quantum
+ compute time, `2QGE_operations` for jobs billed on two-qubit gate operations.
"""
id: str
@@ -94,7 +95,7 @@ class GetJobResponse:
child_job_ids: list[str] | None
shots: int | Unset = UNSET
noise: Noise | Unset = UNSET
- cost_model: CostModel | Unset = UNSET
+ cost_model: ApiCostModel | Unset = UNSET
@@ -428,11 +429,11 @@ def _parse_child_job_ids(data: object) -> list[str] | None:
_cost_model = d.pop("cost_model", UNSET)
- cost_model: CostModel | Unset
+ cost_model: ApiCostModel | Unset
if isinstance(_cost_model, Unset):
cost_model = UNSET
else:
- cost_model = check_cost_model(_cost_model)
+ cost_model = check_api_cost_model(_cost_model)
diff --git a/ionq_core/models/json_multi_circuit_job.py b/ionq_core/models/json_multi_circuit_job.py
index 1e55b48..5e4884e 100644
--- a/ionq_core/models/json_multi_circuit_job.py
+++ b/ionq_core/models/json_multi_circuit_job.py
@@ -49,7 +49,7 @@ class JSONMultiCircuitJob:
input_ (JsonMultiCircuitInput):
name (str | Unset):
metadata (JobMetadata | Unset):
- shots (int | Unset): Default: 100.
+ shots (int | Unset): `shots` is ignored by ideal simulator backend. Default: 100.
session_id (str | Unset):
settings (JSONMultiCircuitJobSettings | Unset):
dry_run (bool | Unset):
diff --git a/ionq_core/models/partial_base_child_job_creation_payload.py b/ionq_core/models/partial_base_child_job_creation_payload.py
new file mode 100644
index 0000000..774f0b4
--- /dev/null
+++ b/ionq_core/models/partial_base_child_job_creation_payload.py
@@ -0,0 +1,196 @@
+# SPDX-FileCopyrightText: 2026 IonQ, Inc.
+# SPDX-License-Identifier: Apache-2.0
+# @generated
+
+from __future__ import annotations
+
+from collections.abc import Mapping
+from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
+
+from attrs import define as _attrs_define
+from attrs import field as _attrs_field
+
+from ..types import UNSET, Unset
+
+from ..types import UNSET, Unset
+from typing import cast
+
+if TYPE_CHECKING:
+ from ..models.job_metadata import JobMetadata
+ from ..models.noise import Noise
+ from ..models.partial_base_child_job_creation_payload_settings import PartialBaseChildJobCreationPayloadSettings
+
+
+
+
+
+T = TypeVar("T", bound="PartialBaseChildJobCreationPayload")
+
+
+
+@_attrs_define
+class PartialBaseChildJobCreationPayload:
+ """ Make all properties in T optional
+
+ Attributes:
+ parent (str | Unset):
+ name (str | Unset):
+ metadata (JobMetadata | Unset):
+ shots (int | Unset): `shots` is ignored by ideal simulator backend. Default: 100.
+ backend (str | Unset):
+ session_id (str | Unset):
+ settings (PartialBaseChildJobCreationPayloadSettings | Unset):
+ dry_run (bool | Unset):
+ noise (Noise | Unset):
+ """
+
+ parent: str | Unset = UNSET
+ name: str | Unset = UNSET
+ metadata: JobMetadata | Unset = UNSET
+ shots: int | Unset = 100
+ backend: str | Unset = UNSET
+ session_id: str | Unset = UNSET
+ settings: PartialBaseChildJobCreationPayloadSettings | Unset = UNSET
+ dry_run: bool | Unset = UNSET
+ noise: Noise | Unset = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
+
+
+
+
+
+ def to_dict(self) -> dict[str, Any]:
+ from ..models.job_metadata import JobMetadata
+ from ..models.noise import Noise
+ from ..models.partial_base_child_job_creation_payload_settings import PartialBaseChildJobCreationPayloadSettings
+ parent = self.parent
+
+ name = self.name
+
+ metadata: dict[str, Any] | Unset = UNSET
+ if not isinstance(self.metadata, Unset):
+ metadata = self.metadata.to_dict()
+
+ shots = self.shots
+
+ backend = self.backend
+
+ session_id = self.session_id
+
+ settings: dict[str, Any] | Unset = UNSET
+ if not isinstance(self.settings, Unset):
+ settings = self.settings.to_dict()
+
+ dry_run = self.dry_run
+
+ noise: dict[str, Any] | Unset = UNSET
+ if not isinstance(self.noise, Unset):
+ noise = self.noise.to_dict()
+
+
+ field_dict: dict[str, Any] = {}
+ field_dict.update(self.additional_properties)
+ field_dict.update({
+ })
+ if parent is not UNSET:
+ field_dict["parent"] = parent
+ if name is not UNSET:
+ field_dict["name"] = name
+ if metadata is not UNSET:
+ field_dict["metadata"] = metadata
+ if shots is not UNSET:
+ field_dict["shots"] = shots
+ if backend is not UNSET:
+ field_dict["backend"] = backend
+ if session_id is not UNSET:
+ field_dict["session_id"] = session_id
+ if settings is not UNSET:
+ field_dict["settings"] = settings
+ if dry_run is not UNSET:
+ field_dict["dry_run"] = dry_run
+ if noise is not UNSET:
+ field_dict["noise"] = noise
+
+ return field_dict
+
+
+
+ @classmethod
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
+ from ..models.job_metadata import JobMetadata
+ from ..models.noise import Noise
+ from ..models.partial_base_child_job_creation_payload_settings import PartialBaseChildJobCreationPayloadSettings
+ d = dict(src_dict)
+ parent = d.pop("parent", UNSET)
+
+ name = d.pop("name", UNSET)
+
+ _metadata = d.pop("metadata", UNSET)
+ metadata: JobMetadata | Unset
+ if isinstance(_metadata, Unset):
+ metadata = UNSET
+ else:
+ metadata = JobMetadata.from_dict(_metadata)
+
+
+
+
+ shots = d.pop("shots", UNSET)
+
+ backend = d.pop("backend", UNSET)
+
+ session_id = d.pop("session_id", UNSET)
+
+ _settings = d.pop("settings", UNSET)
+ settings: PartialBaseChildJobCreationPayloadSettings | Unset
+ if isinstance(_settings, Unset):
+ settings = UNSET
+ else:
+ settings = PartialBaseChildJobCreationPayloadSettings.from_dict(_settings)
+
+
+
+
+ dry_run = d.pop("dry_run", UNSET)
+
+ _noise = d.pop("noise", UNSET)
+ noise: Noise | Unset
+ if isinstance(_noise, Unset):
+ noise = UNSET
+ else:
+ noise = Noise.from_dict(_noise)
+
+
+
+
+ partial_base_child_job_creation_payload = cls(
+ parent=parent,
+ name=name,
+ metadata=metadata,
+ shots=shots,
+ backend=backend,
+ session_id=session_id,
+ settings=settings,
+ dry_run=dry_run,
+ noise=noise,
+ )
+
+
+ partial_base_child_job_creation_payload.additional_properties = d
+ return partial_base_child_job_creation_payload
+
+ @property
+ def additional_keys(self) -> list[str]:
+ return list(self.additional_properties.keys())
+
+ def __getitem__(self, key: str) -> Any:
+ return self.additional_properties[key]
+
+ def __setitem__(self, key: str, value: Any) -> None:
+ self.additional_properties[key] = value
+
+ def __delitem__(self, key: str) -> None:
+ del self.additional_properties[key]
+
+ def __contains__(self, key: str) -> bool:
+ return key in self.additional_properties
diff --git a/ionq_core/models/partial_base_child_job_creation_payload_settings.py b/ionq_core/models/partial_base_child_job_creation_payload_settings.py
new file mode 100644
index 0000000..1651c06
--- /dev/null
+++ b/ionq_core/models/partial_base_child_job_creation_payload_settings.py
@@ -0,0 +1,119 @@
+# SPDX-FileCopyrightText: 2026 IonQ, Inc.
+# SPDX-License-Identifier: Apache-2.0
+# @generated
+
+from __future__ import annotations
+
+from collections.abc import Mapping
+from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
+
+from attrs import define as _attrs_define
+from attrs import field as _attrs_field
+
+from ..types import UNSET, Unset
+
+from ..types import UNSET, Unset
+from typing import cast
+
+if TYPE_CHECKING:
+ from ..models.partial_base_child_job_creation_payload_settings_compilation import PartialBaseChildJobCreationPayloadSettingsCompilation
+ from ..models.partial_base_child_job_creation_payload_settings_error_mitigation import PartialBaseChildJobCreationPayloadSettingsErrorMitigation
+
+
+
+
+
+T = TypeVar("T", bound="PartialBaseChildJobCreationPayloadSettings")
+
+
+
+@_attrs_define
+class PartialBaseChildJobCreationPayloadSettings:
+ """
+ Attributes:
+ error_mitigation (PartialBaseChildJobCreationPayloadSettingsErrorMitigation | Unset):
+ compilation (PartialBaseChildJobCreationPayloadSettingsCompilation | Unset):
+ """
+
+ error_mitigation: PartialBaseChildJobCreationPayloadSettingsErrorMitigation | Unset = UNSET
+ compilation: PartialBaseChildJobCreationPayloadSettingsCompilation | Unset = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
+
+
+
+
+
+ def to_dict(self) -> dict[str, Any]:
+ from ..models.partial_base_child_job_creation_payload_settings_compilation import PartialBaseChildJobCreationPayloadSettingsCompilation
+ from ..models.partial_base_child_job_creation_payload_settings_error_mitigation import PartialBaseChildJobCreationPayloadSettingsErrorMitigation
+ error_mitigation: dict[str, Any] | Unset = UNSET
+ if not isinstance(self.error_mitigation, Unset):
+ error_mitigation = self.error_mitigation.to_dict()
+
+ compilation: dict[str, Any] | Unset = UNSET
+ if not isinstance(self.compilation, Unset):
+ compilation = self.compilation.to_dict()
+
+
+ field_dict: dict[str, Any] = {}
+ field_dict.update(self.additional_properties)
+ field_dict.update({
+ })
+ if error_mitigation is not UNSET:
+ field_dict["error_mitigation"] = error_mitigation
+ if compilation is not UNSET:
+ field_dict["compilation"] = compilation
+
+ return field_dict
+
+
+
+ @classmethod
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
+ from ..models.partial_base_child_job_creation_payload_settings_compilation import PartialBaseChildJobCreationPayloadSettingsCompilation
+ from ..models.partial_base_child_job_creation_payload_settings_error_mitigation import PartialBaseChildJobCreationPayloadSettingsErrorMitigation
+ d = dict(src_dict)
+ _error_mitigation = d.pop("error_mitigation", UNSET)
+ error_mitigation: PartialBaseChildJobCreationPayloadSettingsErrorMitigation | Unset
+ if isinstance(_error_mitigation, Unset):
+ error_mitigation = UNSET
+ else:
+ error_mitigation = PartialBaseChildJobCreationPayloadSettingsErrorMitigation.from_dict(_error_mitigation)
+
+
+
+
+ _compilation = d.pop("compilation", UNSET)
+ compilation: PartialBaseChildJobCreationPayloadSettingsCompilation | Unset
+ if isinstance(_compilation, Unset):
+ compilation = UNSET
+ else:
+ compilation = PartialBaseChildJobCreationPayloadSettingsCompilation.from_dict(_compilation)
+
+
+
+
+ partial_base_child_job_creation_payload_settings = cls(
+ error_mitigation=error_mitigation,
+ compilation=compilation,
+ )
+
+
+ partial_base_child_job_creation_payload_settings.additional_properties = d
+ return partial_base_child_job_creation_payload_settings
+
+ @property
+ def additional_keys(self) -> list[str]:
+ return list(self.additional_properties.keys())
+
+ def __getitem__(self, key: str) -> Any:
+ return self.additional_properties[key]
+
+ def __setitem__(self, key: str, value: Any) -> None:
+ self.additional_properties[key] = value
+
+ def __delitem__(self, key: str) -> None:
+ del self.additional_properties[key]
+
+ def __contains__(self, key: str) -> bool:
+ return key in self.additional_properties
diff --git a/ionq_core/models/partial_base_child_job_creation_payload_settings_compilation.py b/ionq_core/models/partial_base_child_job_creation_payload_settings_compilation.py
new file mode 100644
index 0000000..585d2af
--- /dev/null
+++ b/ionq_core/models/partial_base_child_job_creation_payload_settings_compilation.py
@@ -0,0 +1,91 @@
+# SPDX-FileCopyrightText: 2026 IonQ, Inc.
+# SPDX-License-Identifier: Apache-2.0
+# @generated
+
+from __future__ import annotations
+
+from collections.abc import Mapping
+from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
+
+from attrs import define as _attrs_define
+from attrs import field as _attrs_field
+
+from ..types import UNSET, Unset
+
+from ..types import UNSET, Unset
+
+
+
+
+
+
+T = TypeVar("T", bound="PartialBaseChildJobCreationPayloadSettingsCompilation")
+
+
+
+@_attrs_define
+class PartialBaseChildJobCreationPayloadSettingsCompilation:
+ """
+ Attributes:
+ opt (float | Unset):
+ precision (str | Unset):
+ """
+
+ opt: float | Unset = UNSET
+ precision: str | Unset = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
+
+
+
+
+
+ def to_dict(self) -> dict[str, Any]:
+ opt = self.opt
+
+ precision = self.precision
+
+
+ field_dict: dict[str, Any] = {}
+ field_dict.update(self.additional_properties)
+ field_dict.update({
+ })
+ if opt is not UNSET:
+ field_dict["opt"] = opt
+ if precision is not UNSET:
+ field_dict["precision"] = precision
+
+ return field_dict
+
+
+
+ @classmethod
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
+ d = dict(src_dict)
+ opt = d.pop("opt", UNSET)
+
+ precision = d.pop("precision", UNSET)
+
+ partial_base_child_job_creation_payload_settings_compilation = cls(
+ opt=opt,
+ precision=precision,
+ )
+
+
+ partial_base_child_job_creation_payload_settings_compilation.additional_properties = d
+ return partial_base_child_job_creation_payload_settings_compilation
+
+ @property
+ def additional_keys(self) -> list[str]:
+ return list(self.additional_properties.keys())
+
+ def __getitem__(self, key: str) -> Any:
+ return self.additional_properties[key]
+
+ def __setitem__(self, key: str, value: Any) -> None:
+ self.additional_properties[key] = value
+
+ def __delitem__(self, key: str) -> None:
+ del self.additional_properties[key]
+
+ def __contains__(self, key: str) -> bool:
+ return key in self.additional_properties
diff --git a/ionq_core/models/partial_base_child_job_creation_payload_settings_error_mitigation.py b/ionq_core/models/partial_base_child_job_creation_payload_settings_error_mitigation.py
new file mode 100644
index 0000000..dd10d5b
--- /dev/null
+++ b/ionq_core/models/partial_base_child_job_creation_payload_settings_error_mitigation.py
@@ -0,0 +1,82 @@
+# SPDX-FileCopyrightText: 2026 IonQ, Inc.
+# SPDX-License-Identifier: Apache-2.0
+# @generated
+
+from __future__ import annotations
+
+from collections.abc import Mapping
+from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
+
+from attrs import define as _attrs_define
+from attrs import field as _attrs_field
+
+from ..types import UNSET, Unset
+
+from ..types import UNSET, Unset
+
+
+
+
+
+
+T = TypeVar("T", bound="PartialBaseChildJobCreationPayloadSettingsErrorMitigation")
+
+
+
+@_attrs_define
+class PartialBaseChildJobCreationPayloadSettingsErrorMitigation:
+ """
+ Attributes:
+ debiasing (bool | Unset):
+ """
+
+ debiasing: bool | Unset = UNSET
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
+
+
+
+
+
+ def to_dict(self) -> dict[str, Any]:
+ debiasing = self.debiasing
+
+
+ field_dict: dict[str, Any] = {}
+ field_dict.update(self.additional_properties)
+ field_dict.update({
+ })
+ if debiasing is not UNSET:
+ field_dict["debiasing"] = debiasing
+
+ return field_dict
+
+
+
+ @classmethod
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
+ d = dict(src_dict)
+ debiasing = d.pop("debiasing", UNSET)
+
+ partial_base_child_job_creation_payload_settings_error_mitigation = cls(
+ debiasing=debiasing,
+ )
+
+
+ partial_base_child_job_creation_payload_settings_error_mitigation.additional_properties = d
+ return partial_base_child_job_creation_payload_settings_error_mitigation
+
+ @property
+ def additional_keys(self) -> list[str]:
+ return list(self.additional_properties.keys())
+
+ def __getitem__(self, key: str) -> Any:
+ return self.additional_properties[key]
+
+ def __setitem__(self, key: str, value: Any) -> None:
+ self.additional_properties[key] = value
+
+ def __delitem__(self, key: str) -> None:
+ del self.additional_properties[key]
+
+ def __contains__(self, key: str) -> bool:
+ return key in self.additional_properties
diff --git a/ionq_core/models/qctrl_qaoa_job_creation_payload.py b/ionq_core/models/qctrl_qaoa_job_creation_payload.py
index 9a8f8b5..0144c9e 100644
--- a/ionq_core/models/qctrl_qaoa_job_creation_payload.py
+++ b/ionq_core/models/qctrl_qaoa_job_creation_payload.py
@@ -34,7 +34,7 @@
@_attrs_define
class QctrlQaoaJobCreationPayload:
""" Submit a combinatorial optimization job to solve a maxcut problem using Q-CTRL's QAOA Solver. See our QAOA Job guide
- for more infromation.
+ for more information.
Attributes:
backend (str): Available options: `simulator`, `qpu.aria-1`, `qpu.aria-2`, `qpu.forte-1`, `qpu.forte-
diff --git a/ionq_core/models/qctrl_qaoa_job_creation_payload_external_settings.py b/ionq_core/models/qctrl_qaoa_job_creation_payload_external_settings.py
index ca5ca9c..62b145d 100644
--- a/ionq_core/models/qctrl_qaoa_job_creation_payload_external_settings.py
+++ b/ionq_core/models/qctrl_qaoa_job_creation_payload_external_settings.py
@@ -27,7 +27,7 @@
class QctrlQaoaJobCreationPayloadExternalSettings:
"""
Attributes:
- api_credentials (str): API Key for your Q-CTRL Account
+ api_credentials (str): API Key for your Q-CTRL account
external_organization (str | Unset): Optional unique slug for your target Q-CTRL organization
"""
diff --git a/openapi.json b/openapi.json
index a067622..93e649d 100644
--- a/openapi.json
+++ b/openapi.json
@@ -1 +1 @@
-{"openapi":"3.0.3","info":{"contact":{"email":"support@ionq.co","name":"IonQ","url":"https://ionq.com/"},"description":"*Last updated: May 15, 2026*\nIonQ's API for accessing the IonQ Quantum Cloud platform\n\nPlease subscribe for automated updates when we perform maintenance or\nexperience an outage.\n\nIn addition, you may use the [status endpoint](#tag/status) to check the\ncurrent status of our API.\n\n## Authentication\n\n\n","title":"IonQ Cloud Platform API","version":"v0.4"},"servers":[{"url":"https://api.ionq.co/v0.4"}],"paths":{"/whoami":{"get":{"description":"Retrieves current key associated with this session.","operationId":"getWhoami","responses":{"200":{"$ref":"#/components/responses/Whoami"}},"summary":"Get current key","tags":["whoami"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/whoami\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}},"/backends":{"get":{"description":"This endpoint retrieves all backends.","operationId":"getBackends","responses":{"200":{"$ref":"#/components/responses/ListBackends"}},"security":[],"summary":"Get Backends","tags":["backends"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/backends\"\n"}]}},"/backends/{backend}":{"get":{"description":"This endpoint retrieves a backend.","operationId":"getBackend","parameters":[{"$ref":"#/components/parameters/backend"}],"responses":{"200":{"$ref":"#/components/responses/GetBackend"}},"security":[],"summary":"Get a Backend","tags":["backends"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/backends/qpu.aria-1\"\n"}]}},"/backends/{backend}/characterizations":{"get":{"description":"This endpoint retrieves an array of all available backend characterizations, with pagination.","operationId":"getCharacterizationsForBackend","parameters":[{"$ref":"#/components/parameters/backend"},{"description":"Characterizations starting at this time (e.g., `start=2025-12-31`)","in":"query","name":"start","schema":{"type":"string"}},{"description":"Characterizations before this time (e.g., `end=2025-12-31`)","in":"query","name":"end","schema":{"type":"string"}},{"description":"How many objects to return.","in":"query","name":"limit","schema":{"default":10,"maximum":10,"minimum":1,"type":"integer"}},{"$ref":"#/components/parameters/pagination-page"}],"responses":{"200":{"$ref":"#/components/responses/ListCharacterizations"}},"security":[],"summary":"Get All Backend Characterizations","tags":["characterizations"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/backends/qpu.aria-1/characterizations\"\n"}]}},"/backends/{backend}/characterizations/{UUID}":{"get":{"description":"This endpoint retrieves a characterization.","operationId":"getCharacterization","parameters":[{"$ref":"#/components/parameters/backend"},{"$ref":"#/components/parameters/uuid"}],"responses":{"200":{"$ref":"#/components/responses/GetCharacterization"}},"summary":"Get a Characterization","tags":["characterizations"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/backends/qpu.aria-1/characterizations/aa54e783-0a9b-4f73-ad2f-63983b6aa4a8\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}},"/jobs":{"post":{"operationId":"CreateJob","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreationResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreationPayload"}}}},"description":"Submit a single-circuit or multi-circuit job for simulation or execution. In `ionq.multi-circuit.v1` payloads, each entry in `input.circuits` inherits the parent `input.gateset` unless the circuit sets its own `gateset`.\n","x-codeSamples":[{"lang":"curl","label":"Single-circuit QIS job","source":"curl -X POST \"https://api.ionq.co/v0.4/jobs\" \\\n -H \"Authorization: apiKey your-api-key\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"type\" : \"ionq.circuit.v1\",\n \"name\": \"Sample circuit\",\n \"metadata\": {\n \"fizz\": \"buzz\",\n \"foo\": \"bar\"\n },\n \"shots\": 500,\n \"backend\": \"qpu.forte-1\",\n \"settings\" :\n {\n \"error_mitigation\":\n {\n \"debiasing\": false\n }\n },\n \"input\": {\n \"qubits\": 2,\n \"gateset\": \"qis\",\n \"circuit\": [\n {\n \"gate\": \"h\",\n \"target\": 0\n }\n ]\n }\n }'\n"},{"lang":"curl","label":"Mixed-gateset multi-circuit job","source":"curl -X POST \"https://api.ionq.co/v0.4/jobs\" \\\n -H \"Authorization: apiKey your-api-key\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"type\": \"ionq.multi-circuit.v1\",\n \"backend\": \"simulator\",\n \"shots\": 500,\n \"input\": {\n \"gateset\": \"native\",\n \"qubits\": 2,\n \"circuits\": [\n {\n \"name\": \"qis circuit override\",\n \"gateset\": \"qis\",\n \"circuit\": [\n {\n \"gate\": \"h\",\n \"target\": 0\n },\n {\n \"gate\": \"cnot\",\n \"target\": 0,\n \"control\": 1\n }\n ]\n },\n {\n \"name\": \"native circuit from parent\",\n \"circuit\": [\n {\n \"gate\": \"ms\",\n \"targets\": [0, 1],\n \"phases\": [0, 0.25]\n },\n {\n \"gate\": \"gpi2\",\n \"target\": 0,\n \"phase\": 0.75\n }\n ]\n }\n ]\n }\n }'\n"}]},"get":{"operationId":"GetJobs","responses":{"200":{"description":"Successfully retrieved a list of jobs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetJobsResponse"},"examples":{"Example 1":{"value":{"jobs":[{"id":"e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524","status":"completed","type":"ionq.circuit.v1","backend":"simulator","dry_run":false,"cost_model":"quantum_compute_time","submitter_id":"64b03577072d45001c85e9c4","project_id":"1333d459-cf47-4a5e-acc1-8d4eb4f7b025","parent_job_id":null,"session_id":null,"metadata":null,"name":null,"submitted_at":"2025-05-28T20:47:05.440Z","started_at":null,"completed_at":null,"predicted_execution_duration_ms":null,"predicted_wait_time_ms":null,"execution_duration_ms":null,"shots":1000,"noise":{"model":"ideal"},"failure":null,"settings":{"compilation":{}},"stats":{"qubits":20,"circuits":1,"gate_counts":{"1q":1028,"2q":110},"predicted_quantum_compute_time_us":5000,"billed_quantum_compute_time_us":5200},"results":{"probabilities":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/results/probabilities"}},"output":{}}],"next":null}}}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"query","name":"ids","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"in":"query","name":"parent_job_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/JobStatus"}},{"description":"Filter jobs by backend target. Supports single target or comma-separated list of targets.","in":"query","name":"target","required":false,"schema":{"type":"string"},"example":"simulator"},{"in":"query","name":"session_id","required":false,"schema":{"type":"string"}},{"description":"The id of another user within a shared project to view their submitted jobs. Ignored if not a project member.","in":"query","name":"submitter_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}},{"in":"query","name":"next","required":false,"schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"# Get all jobs:\ncurl \"https://api.ionq.co/v0.4/jobs\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]},"delete":{"operationId":"DeleteJobs","responses":{"200":{"description":"Successfully deleted a list of jobs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobsDeletedResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobsBulkOperationRequest"}}}},"x-codeSamples":[{"lang":"curl","source":"curl -X DELETE \"https://api.ionq.co/v0.4/jobs\" \\\n -H \"Authorization: apiKey your-api-key\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"ids\": [\n \"617a1f8b-59d4-435d-aa33-695433d7155e\",\n \"2ccf2773-4c28-468e-a290-2f8554808a25\",\n \"f92df2b6-d212-4f4a-b9ea-024b58c5c3e8\"\n ]\n }'\n"}]}},"/jobs/{UUID}":{"get":{"operationId":"GetJob","responses":{"200":{"description":"Successfully retrieved a job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetJobResponse"},"examples":{"Example 1":{"value":{"id":"e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524","status":"completed","type":"ionq.circuit.v1","backend":"simulator","dry_run":false,"cost_model":"quantum_compute_time","submitter_id":"64b03577072d45001c85e9c4","project_id":"1333d459-cf47-4a5e-acc1-8d4eb4f7b025","parent_job_id":null,"child_job_ids":null,"session_id":null,"metadata":null,"name":null,"submitted_at":"2025-05-28T20:47:05.440Z","started_at":null,"completed_at":null,"predicted_execution_duration_ms":null,"predicted_wait_time_ms":null,"execution_duration_ms":null,"shots":1000,"noise":{"model":"ideal"},"failure":null,"settings":{"compilation":{}},"stats":{"qubits":20,"circuits":1,"gate_counts":{"1q":1028,"2q":110},"predicted_quantum_compute_time_us":5000,"billed_quantum_compute_time_us":5200},"results":{"probabilities":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/results/probabilities"}},"output":{"compilation":{},"error_mitigation":{"debiasing":{"variants":[{"variant_id":"069ce8f8-f437-7d75-8000-9f5f8c3d7897","qubit_map":[4,12,7],"shots":120,"results":{"probabilities":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/variants/069ce8f8-f437-7d75-8000-9f5f8c3d7897/results/probabilities"},"histogram":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/variants/069ce8f8-f437-7d75-8000-9f5f8c3d7897/results/histogram"},"shots":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/variants/069ce8f8-f437-7d75-8000-9f5f8c3d7897/results/shots"}}}]}}}}}}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The UUID of the job — this UUID is provided in the response on job creation.","in":"path","name":"UUID","required":true,"schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/jobs/617a1f8b-59d4-435d-aa33-695433d7155e\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]},"delete":{"operationId":"DeleteJob","responses":{"200":{"description":"Successfully deleted a job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobDeletedResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The UUID of the job — this UUID is provided in the response on job creation.","in":"path","name":"UUID","required":true,"schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"curl -X DELETE \"https://api.ionq.co/v0.4/jobs/617a1f8b-59d4-435d-aa33-695433d7155e\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}},"/jobs/{UUID}/cost":{"get":{"operationId":"GetJobCost","responses":{"200":{"description":"Successfully retrieved the cost of a job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetJobCostResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"path","name":"UUID","required":true,"schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/jobs/0197379a-c3b8-7548-9da4-bbb7067311c1/cost\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}},"/jobs/{UUID}/circuits/{lang}":{"get":{"operationId":"GetCompiledFile","responses":{"200":{"description":"Successfully downloaded a compiled file.","content":{"application/json":{"schema":{"type":"string"}}}},"403":{"description":"Forbidden"},"404":{"description":"Not Found"},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"path","name":"UUID","required":true,"schema":{"type":"string"}},{"in":"path","name":"lang","required":true,"schema":{"type":"string","enum":["native","qasm3"]}}]}},"/jobs/{UUID}/status/cancel":{"put":{"operationId":"CancelJob","responses":{"200":{"description":"Successfully canceled a job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCanceledResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"description":"Cancel the execution of many jobs at once by passing a list of jobs.","summary":"Cancel a job","security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The UUID of the job — this UUID is provided in the response on job creation.","in":"path","name":"UUID","required":true,"schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"curl -X PUT \"https://api.ionq.co/v0.4/jobs/617a1f8b-59d4-435d-aa33-695433d7155e/status/cancel\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}},"/jobs/status/cancel":{"put":{"operationId":"CancelJobs","responses":{"200":{"description":"Successfully canceled a list of jobs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobsCanceledResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobsBulkOperationRequest"}}}},"x-codeSamples":[{"lang":"curl","source":"curl -X PUT \"https://api.ionq.co/v0.4/jobs/status/cancel\" \\\n -H \"Authorization: apiKey your-api-key\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"ids\": [\n \"617a1f8b-59d4-435d-aa33-695433d7155e\",\n \"2ccf2773-4c28-468e-a290-2f8554808a25\",\n \"f92df2b6-d212-4f4a-b9ea-024b58c5c3e8\"\n ]\n }'\n"}]}},"/jobs/estimate":{"get":{"operationId":"EstimateJobCost","responses":{"200":{"description":"Successfully retrieved the cost estimate of a job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetJobEstimateResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"query","name":"backend","required":true,"schema":{"$ref":"#/components/schemas/JobBackends"}},{"in":"query","name":"type","required":false,"schema":{"default":"ionq.circuit.v1","type":"string"}},{"in":"query","name":"qubits","required":false,"schema":{"default":25,"format":"int32","type":"integer"}},{"in":"query","name":"shots","required":false,"schema":{"default":1000,"format":"int32","type":"integer"}},{"in":"query","name":"1q_gates","required":false,"schema":{"default":0,"format":"int32","type":"integer"}},{"in":"query","name":"2q_gates","required":false,"schema":{"default":0,"format":"int32","type":"integer"}},{"in":"query","name":"error_mitigation","required":false,"schema":{"default":false,"type":"boolean"}}]}},"/jobs/{UUID}/results/probabilities":{"get":{"operationId":"GetJobProbabilities","responses":{"200":{"description":"Probability distribution keyed by decimal qubit state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetResultsResponse"}}}},"404":{"description":"Job not found or not yet completed."}},"summary":"Fetch the probability distribution for a completed job.","security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The UUID of the job.","in":"path","name":"UUID","required":true,"schema":{"type":"string"}},{"description":"Whether to apply sharpening to the probability distribution.","in":"query","name":"sharpen","required":false,"schema":{"type":"boolean"}}]}},"/jobs/{UUID}/variants/{variantId}/results/probabilities":{"get":{"operationId":"GetVariantProbabilities","responses":{"200":{"description":"Per-variant probabilities histogram","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVariantResultsResponse"}}}},"404":{"description":"Not found"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"path","name":"UUID","required":true,"schema":{"type":"string"}},{"in":"path","name":"variantId","required":true,"schema":{"type":"string"}}]}},"/jobs/{UUID}/variants/{variantId}/results/histogram":{"get":{"operationId":"GetVariantHistogram","responses":{"200":{"description":"Per-variant raw histogram (counts)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVariantResultsResponse"}}}},"404":{"description":"Not found"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"path","name":"UUID","required":true,"schema":{"type":"string"}},{"in":"path","name":"variantId","required":true,"schema":{"type":"string"}}]}},"/jobs/{UUID}/variants/{variantId}/results/shots":{"get":{"operationId":"GetVariantShots","responses":{"200":{"description":"Per-variant shot-wise results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVariantResultsResponse"}}}},"404":{"description":"Not found"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"path","name":"UUID","required":true,"schema":{"type":"string"}},{"in":"path","name":"variantId","required":true,"schema":{"type":"string"}}]}},"/sessions":{"post":{"operationId":"CreateSession","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}}},"security":[{"apiKeyAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionRequest"}}}}},"get":{"operationId":"GetSessions","responses":{"200":{"description":"Successfully retrieved a list of sessions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionsResponse"}}}}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"query","name":"active","required":false,"schema":{"type":"boolean"}}]}},"/sessions/{session_id}/end":{"post":{"operationId":"EndSession","responses":{"200":{"description":"Successfully end a session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}}},"security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The id of the session — this id is provided in the response on session creation.","in":"path","name":"session_id","required":true,"schema":{"type":"string"}}]}},"/sessions/{session_id}":{"get":{"operationId":"GetSession","responses":{"200":{"description":"Successfully retrieved a session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}}},"security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The id of the session — this id is provided in the response on session creation.","in":"path","name":"session_id","required":true,"schema":{"type":"string"}}]}},"/sessions/{session_id}/jobs":{"get":{"operationId":"GetSessionJobs","responses":{"200":{"description":"Successfully retrieved a list of jobs from a session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetJobsResponse"},"examples":{"Example 1":{"value":{"jobs":[{"id":"e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524","status":"completed","type":"ionq.circuit.v1","backend":"simulator","dry_run":false,"cost_model":"quantum_compute_time","submitter_id":"64b03577072d45001c85e9c4","project_id":"1333d459-cf47-4a5e-acc1-8d4eb4f7b025","parent_job_id":null,"session_id":null,"metadata":null,"name":null,"submitted_at":"2025-05-28T20:47:05.440Z","started_at":null,"completed_at":null,"predicted_execution_duration_ms":null,"predicted_wait_time_ms":null,"execution_duration_ms":null,"shots":1000,"noise":{"model":"ideal"},"failure":null,"settings":{"compilation":{}},"stats":{"qubits":20,"circuits":1,"gate_counts":{"1q":1028,"2q":110},"predicted_quantum_compute_time_us":5000,"billed_quantum_compute_time_us":5200},"results":{"probabilities":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/results/probabilities"}},"output":{}}],"next":null}}}}}}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}},{"in":"query","name":"ids","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"in":"query","name":"parent_job_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/JobStatus"}},{"description":"Filter jobs by backend target. Supports single target or comma-separated list of targets.","in":"query","name":"target","required":false,"schema":{"type":"string"},"example":"simulator"},{"in":"query","name":"session_id","required":false,"schema":{"type":"string"}},{"description":"The id of another user within a shared project to view their submitted jobs. Ignored if not a project member.","in":"query","name":"submitter_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}},{"in":"query","name":"next","required":false,"schema":{"type":"string"}}]}},"/organizations/{organization_id}/usage":{"get":{"description":"Retrieves the costs of a given group type, broken down by the given date modality.","operationId":"get-usages","parameters":[{"$ref":"#/components/parameters/organization_id"},{"description":"Start date, inclusive","example":"2023-07-01","in":"query","name":"start_date","required":true,"schema":{"format":"date","type":"string"}},{"description":"End date, exclusive","example":"2023-08-01","in":"query","name":"end_date","required":true,"schema":{"format":"date","type":"string"}},{"description":"QPU Usage grouping","in":"query","name":"group_by","required":true,"schema":{"$ref":"#/components/schemas/group_by"}},{"description":"Report modality","in":"query","name":"modality","required":true,"schema":{"$ref":"#/components/schemas/modality"}}],"responses":{"200":{"$ref":"#/components/responses/UsagesResponse"}},"summary":"Get usage costs","tags":["usage"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/organizations/com.my.org/usage?group_by=project&start_date=2025-01-01&end_date=2025-03-02&modality=weekly\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}}},"components":{"schemas":{"BadRequestError":{"description":"Error when a bad client request was received.","properties":{"error":{"description":"A short error type descrption.","type":"string"},"message":{"description":"A helpful error message.","type":"string"},"statusCode":{"description":"The HTTP status code for this error.","type":"integer"},"validation":{"$ref":"#/components/schemas/RequestValidation"}},"required":["statusCode","error","message"],"type":"object"},"Error":{"description":"Basic API error response.","properties":{"error":{"description":"A short error type descrption.","type":"string"},"message":{"description":"A helpful error message.","type":"string"},"statusCode":{"description":"The HTTP status code for this error.","type":"integer"}},"required":["statusCode","error","message"],"type":"object"},"RequestValidation":{"description":"Request validation failure details.","properties":{"keys":{"description":"A list of request payload keys which have bad values.","items":{"type":"string"},"type":"array"},"source":{"description":"Location in the request of the bad value(s).","type":"string"}},"type":"object"},"Whoami":{"description":"Details of current API Key session.","properties":{"key_id":{"$ref":"#/components/schemas/key-id"},"key_name":{"$ref":"#/components/schemas/key-name"},"project_id":{"$ref":"#/components/schemas/project-id"}},"required":["key_id","key_name"],"type":"object"},"key-id":{"description":"UUID of a API key.","example":"e060759f-4348-4767-a645-8c0301265791","format":"uuid","type":"string"},"key-name":{"description":"key name.","example":"My First Key","type":"string"},"project-id":{"description":"UUID of a project.","example":"944904d6-2e30-4cfb-8bc4-04afaabcdd42","format":"uuid","type":"string"},"Backend":{"description":"A backend that you can target your program to run on.","properties":{"average_queue_time":{"description":"Current wait time on the queue for execution.","example":1181215,"format":"unix-timestamp","type":"number"},"backend":{"description":"Specifies target hardware and generation where applies: `simulator`, `qpu.aria-1`, `qpu.aria-2`, `qpu.forte-1`, `qpu.forte-enterprise-1`, `qpu.forte-enterprise-2`, `qpu.forte-enterprise-3`","example":"qpu.aria-1","type":"string"},"characterization_id":{"description":"Current characterization ID for this backend","example":"617a1f8b-59d4-435d-aa33-695433d7155e","type":"string"},"degraded":{"description":"Flag to tell if the backend is degraded or not.","type":"boolean"},"kw":{"description":"The amount of energy used by the backend in kilowatt-hours.","example":4902.81,"format":"double","type":"number"},"last_updated":{"description":"Last date time the backend status was updated.","example":"2025-06-16T00:00:00Z","type":"string"},"location":{"description":"The location of the backend.","example":"College Park, MD, USA","type":"string"},"qubits":{"description":"The number of qubits available.","example":25,"minimum":0,"type":"integer"},"status":{"description":"Current status of the backend: `available`, `unavailable`, `retired`.","type":"string"}},"required":["backend","status","qubits","average_queue_time","last_updated"],"type":"object"},"Characterization":{"description":"Quantum hardware characterization data.","properties":{"backend":{"description":"The backend calibrated hardware: `simulator`, `qpu.aria-1`, `qpu.aria-2`, `qpu.forte-1`, `qpu.forte-enterprise-1`, `qpu.forte-enterprise-2`, `qpu.forte-enterprise-3`","type":"string"},"connectivity":{"description":"An array of valid, unordered tuples of possible qubits for executing two-qubit gates (e.g., `[[0, 1], [0, 2], [1, 2]]`)","example":[[0,1],[0,2],[10,9]],"items":{"items":{"type":"integer"},"type":"array"},"type":"array"},"date":{"description":"Date time of the measurement, in ISO format.","example":"2025-06-16T00:00:00Z","type":"string"},"fidelity":{"description":"Fidelity for single-qubit (`1q`) and two-qubit (`2q`) gates, and State Preparation and Measurement (`spam`) operations.\nCurrently provides only median fidelity; additional statistical data will be added in the future.\n","properties":{"spam":{"description":"SPAM error correction information.","properties":{"median":{"example":0.9962,"type":"number"},"stderr":{"description":"SPAM error.","example":null,"minimum":0,"type":"integer"}},"required":["median"],"type":"object"}},"required":["spam"],"type":"object"},"id":{"description":"UUID of the characterization.","format":"uuid","type":"string"},"qubits":{"description":"The number of qubits available.","example":25,"minimum":1,"type":"integer"},"timing":{"description":"Time, in seconds, of various system properties: `t1` time, `t2` time, `1q` gate time, `2q` gate time, `readout` time, and qubit `reset` time.","properties":{"1q":{"type":"integer"},"2q":{"type":"integer"},"readout":{"description":"Readout time.","type":"integer"},"reset":{"description":"qubit reset time.","type":"integer"},"t1":{"example":10,"type":"integer"},"t2":{"example":1,"type":"integer"}},"required":["readout","reset"],"type":"object"}},"type":"object"},"pagination-limit":{"default":25,"description":"How many objects to return.","maximum":25,"minimum":1,"type":"integer"},"pagination-next":{"description":"ID of next batch of resources to load.","format":"uuid","type":"string"},"pagination-page":{"default":1,"description":"Specify the page of results to return.","minimum":1,"type":"integer"},"JobStatus":{"type":"string","enum":["submitted","ready","started","canceled","failed","completed"]},"JobCreationResponse":{"properties":{"id":{"type":"string","example":"617a1f8b-59d4-435d-aa33-695433d7155e"},"status":{"$ref":"#/components/schemas/JobStatus"},"session_id":{"type":"string","nullable":true,"example":null}},"required":["id","status","session_id"],"type":"object","additionalProperties":false},"QisGate":{"type":"string","enum":["x","y","z","rx","ry","rz","h","s","si","v","vi","t","ti","not","cnot","swap","xx","yy","zz","pauliexp"]},"Gate_QisGate":{"properties":{"gate":{"$ref":"#/components/schemas/QisGate"},"target":{"type":"integer","format":"int32"},"targets":{"items":{"type":"number","format":"double"},"type":"array","description":"The qubits that a quantum gate is applied to"},"controls":{"items":{"type":"number","format":"double"},"type":"array","description":"The qubits that determine whether the operation is applied to targets."},"control":{"type":"integer","format":"int32"},"rotation":{"type":"number","format":"double","description":"Rotation angle for rx/ry/rz gates"}},"required":["gate"],"type":"object","additionalProperties":false},"QisCircuitInput":{"properties":{"qubits":{"type":"integer","format":"int32","minimum":1},"circuit":{"items":{"$ref":"#/components/schemas/Gate_QisGate"},"type":"array"},"gateset":{"type":"string","enum":["qis"],"nullable":false}},"required":["circuit","gateset"],"type":"object","additionalProperties":false},"NativeGate":{"type":"string","enum":["zz","ms","gpi","gpi2","nop"]},"Gate_NativeGate":{"properties":{"gate":{"$ref":"#/components/schemas/NativeGate"},"target":{"type":"integer","format":"int32"},"targets":{"items":{"type":"number","format":"double"},"type":"array","description":"The qubits that a quantum gate is applied to"},"controls":{"items":{"type":"number","format":"double"},"type":"array","description":"The qubits that determine whether the operation is applied to targets."},"phase":{"type":"number","format":"double","description":"Phase for gpi/gpi2 gates"},"phases":{"items":{"type":"number","format":"double"},"type":"array","description":"Phases for ms gate"},"angle":{"type":"number","format":"double","description":"Interaction angle for ms gate (in turns, default 0.25)"},"rotation":{"type":"number","format":"double","description":"Rotation angle for rx/ry/rz gates"}},"required":["gate"],"type":"object","additionalProperties":false},"NativeCircuitInput":{"properties":{"qubits":{"type":"integer","format":"int32","minimum":1},"circuit":{"items":{"$ref":"#/components/schemas/Gate_NativeGate"},"type":"array"},"gateset":{"type":"string","enum":["native"],"nullable":false}},"required":["circuit","gateset"],"type":"object","additionalProperties":false},"JsonCircuitInput":{"anyOf":[{"$ref":"#/components/schemas/QisCircuitInput","title":"Qis Circuit"},{"$ref":"#/components/schemas/NativeCircuitInput","title":"Native Circuit"}]},"JobMetadata":{"properties":{},"type":"object","additionalProperties":{"type":"string"}},"JobBackends":{"type":"string","description":"Available options: `simulator`, `qpu.aria-1`, `qpu.aria-2`, `qpu.forte-1`, `qpu.forte-enterprise-1`"},"NoiseModel":{"type":"string","enum":["ideal","harmony","harmony-1","harmony-2","aria-1","aria-2","forte-1","forte-enterprise-1"]},"Noise":{"properties":{"model":{"$ref":"#/components/schemas/NoiseModel"},"seed":{"type":"integer","format":"int32"}},"required":["model"],"type":"object","additionalProperties":false},"CircuitJobCreationPayload":{"properties":{"name":{"type":"string"},"metadata":{"$ref":"#/components/schemas/JobMetadata","description":"User defined metadata"},"shots":{"type":"integer","format":"int32","default":100,"minimum":1,"maximum":1000000},"backend":{"$ref":"#/components/schemas/JobBackends"},"session_id":{"type":"string"},"settings":{"properties":{"error_mitigation":{"properties":{"debiasing":{"type":"boolean"}},"type":"object","description":"To turn on debiasing, you must request at least 500 shots"},"compilation":{"properties":{"opt":{"type":"number","format":"double"},"precision":{"type":"string"}},"type":"object"}},"type":"object"},"dry_run":{"type":"boolean"},"noise":{"$ref":"#/components/schemas/Noise"},"type":{"type":"string","enum":["ionq.circuit.v1"],"nullable":false},"input":{"$ref":"#/components/schemas/JsonCircuitInput"}},"required":["backend","type","input"],"type":"object","additionalProperties":false},"Registers":{"properties":{},"type":"object","additionalProperties":{"items":{"type":"number","format":"double","nullable":true},"type":"array"}},"QISCircuit":{"properties":{"name":{"type":"string"},"circuit":{"items":{"$ref":"#/components/schemas/Gate_QisGate"},"type":"array","description":"Circuit gates. Can be either QIS gates or Native gates depending on the gateset property."},"qubits":{"type":"integer","format":"int32"},"registers":{"$ref":"#/components/schemas/Registers","description":"Registers to use in your circuit. Each register is a list of qubit indices (starting from zero)."},"gateset":{"type":"string","enum":["qis"],"nullable":false,"description":"Optional gateset override for this individual circuit. If not specified, inherits from parent.\nWhen set, the circuit must use the appropriate gate format (QIS)."}},"required":["circuit"],"type":"object","additionalProperties":false},"NativeCircuit":{"properties":{"name":{"type":"string"},"circuit":{"items":{"$ref":"#/components/schemas/Gate_NativeGate"},"type":"array","description":"Circuit gates. Can be either QIS gates or Native gates depending on the gateset property."},"qubits":{"type":"integer","format":"int32"},"registers":{"$ref":"#/components/schemas/Registers","description":"Registers to use in your circuit. Each register is a list of qubit indices (starting from zero)."},"gateset":{"type":"string","enum":["native"],"nullable":false,"description":"Optional gateset override for this individual circuit. If not specified, inherits from parent.\nWhen set, the circuit must use the appropriate gate format (Native)."}},"required":["circuit"],"type":"object","additionalProperties":false},"JsonMultiCircuitInput":{"properties":{"gateset":{"type":"string","enum":["qis","native"]},"circuits":{"items":{"anyOf":[{"$ref":"#/components/schemas/QISCircuit"},{"$ref":"#/components/schemas/NativeCircuit"}]},"type":"array"},"qubits":{"type":"integer","format":"int32","minimum":1}},"required":["gateset","circuits"],"type":"object"},"MultiCircuitJobCreationPayload":{"properties":{"name":{"type":"string"},"metadata":{"$ref":"#/components/schemas/JobMetadata","description":"User defined metadata"},"shots":{"type":"integer","format":"int32","default":100,"minimum":1,"maximum":1000000},"backend":{"$ref":"#/components/schemas/JobBackends"},"session_id":{"type":"string"},"settings":{"properties":{"error_mitigation":{"properties":{"debiasing":{"type":"boolean"}},"type":"object","description":"To turn on debiasing, you must request at least 500 shots"},"compilation":{"properties":{"opt":{"type":"number","format":"double"},"precision":{"type":"string"}},"type":"object"}},"type":"object"},"dry_run":{"type":"boolean"},"noise":{"$ref":"#/components/schemas/Noise"},"type":{"type":"string","enum":["ionq.multi-circuit.v1"],"nullable":false},"input":{"$ref":"#/components/schemas/JsonMultiCircuitInput","description":"Submit multiple circuits in a single job. Each circuit inherits the parent\n`input.gateset` unless overridden by `circuits[].gateset`."}},"required":["backend","type","input"],"type":"object","additionalProperties":false,"title":"JSON Multi Circuit Job","description":"Submit multiple circuits in a single job. Each circuit inherits the parent `input.gateset` unless overridden by `circuits[].gateset`.\n","example":{"type":"ionq.multi-circuit.v1","backend":"simulator","shots":500,"input":{"gateset":"native","qubits":2,"circuits":[{"name":"qis circuit override","gateset":"qis","circuit":[{"gate":"h","target":0},{"gate":"cnot","target":0,"control":1}]},{"name":"native circuit from parent","circuit":[{"gate":"ms","targets":[0,1],"phases":[0,0.25]},{"gate":"gpi2","target":0,"phase":0.75}]}]}}},"JobCreationPayload":{"anyOf":[{"$ref":"#/components/schemas/CircuitJobCreationPayload","title":"Single Circuit"},{"$ref":"#/components/schemas/MultiCircuitJobCreationPayload","title":"Multi Circuit"},{"$ref":"#/components/schemas/QuantumFunctionJobCreationPayload","title":"Quantum Function"},{"$ref":"#/components/schemas/QctrlQaoaJobCreationPayload","title":"QAOA Function"}],"example":{"type":"ionq.circuit.v1","input":{"qubits":1,"gateset":"qis","circuit":[{"gate":"h","target":0}]},"backend":"qpu.forte-1","shots":500,"settings":{"error_mitigation":{"debiasing":false}}}},"IsoTimestamp":{"type":"string"},"Failure":{"properties":{"code":{"type":"string","enum":["InvalidInput","CompilationError","ContractExpiredError","DebiasingError","InternalError","NotEnoughQubits","OptimizationError","PreflightError","QuantumCircuitComplexityError","QuantumComputerError","QuotaExhaustedError","SimulationError","SimulationTimeout","SystemCancel","TooLongPredictedExecutionTime","TooManyControls","TooManyGates","TooManyShots","UnknownBillingError","UnsupportedGate"]},"message":{"type":"string"}},"required":["code","message"],"type":"object","additionalProperties":false},"CostModel":{"type":"string","enum":["quantum_compute_time","execution_time"]},"JsonObject":{"properties":{},"type":"object","additionalProperties":{}},"BaseJob":{"properties":{"id":{"type":"string"},"status":{"$ref":"#/components/schemas/JobStatus"},"type":{"type":"string"},"backend":{"type":"string"},"dry_run":{"type":"boolean"},"submitter_id":{"type":"string","description":"The id of the user who submitted the job"},"project_id":{"type":"string","nullable":true},"parent_job_id":{"type":"string","nullable":true},"session_id":{"type":"string","nullable":true},"metadata":{"allOf":[{"$ref":"#/components/schemas/JobMetadata"}],"nullable":true},"name":{"type":"string","nullable":true},"submitted_at":{"$ref":"#/components/schemas/IsoTimestamp"},"started_at":{"allOf":[{"$ref":"#/components/schemas/IsoTimestamp"}],"nullable":true},"completed_at":{"allOf":[{"$ref":"#/components/schemas/IsoTimestamp"}],"nullable":true},"predicted_wait_time_ms":{"type":"integer","format":"int32","nullable":true},"predicted_execution_duration_ms":{"type":"integer","format":"int32","nullable":true},"execution_duration_ms":{"type":"integer","format":"int32","nullable":true,"description":"How long the job actually took to run on the QPU. Null if the job hasn't run yet."},"shots":{"type":"integer","format":"int32"},"noise":{"$ref":"#/components/schemas/Noise","description":"Only present in the response when `backend` is simulator."},"failure":{"allOf":[{"$ref":"#/components/schemas/Failure"}],"nullable":true},"cost_model":{"$ref":"#/components/schemas/CostModel","description":"The billing model used for this job."},"output":{"$ref":"#/components/schemas/JsonObject"},"settings":{"$ref":"#/components/schemas/JsonObject"},"stats":{"$ref":"#/components/schemas/JsonObject"},"results":{"allOf":[{"$ref":"#/components/schemas/JsonObject"}],"nullable":true}},"required":["id","status","type","backend","dry_run","submitter_id","project_id","parent_job_id","session_id","metadata","name","submitted_at","started_at","completed_at","predicted_wait_time_ms","predicted_execution_duration_ms","execution_duration_ms","failure","output","settings","stats","results"],"type":"object","additionalProperties":false},"GetJobsResponse":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/BaseJob"},"type":"array"},"next":{"type":"string","nullable":true}},"required":["jobs","next"],"type":"object","additionalProperties":false},"GetJobsQueryParams":{"properties":{"ids":{"items":{"type":"string"},"type":"array"},"parent_job_id":{"type":"string"},"status":{"$ref":"#/components/schemas/JobStatus"},"target":{"type":"string","description":"Filter jobs by backend target. Supports single target or comma-separated list of targets.","example":"simulator"},"session_id":{"type":"string"},"submitter_id":{"type":"string","description":"The id of another user within a shared project to view their submitted jobs. Ignored if not a project member."},"limit":{"type":"integer","format":"int32"},"next":{"type":"string"}},"type":"object","additionalProperties":false},"CircuitJobCompilationSettings":{"properties":{"precision":{"type":"string"},"opt":{"type":"number","format":"double"},"gate_basis":{"type":"string"},"service_version":{"type":"string"}},"type":"object","additionalProperties":false},"CircuitJobSettings":{"properties":{"compilation":{"$ref":"#/components/schemas/CircuitJobCompilationSettings"},"error_mitigation":{"properties":{"debiasing":{"anyOf":[{"properties":{"phi_chi_twirling":{"properties":{"p2q":{"type":"number","format":"double"},"t2q":{"type":"number","format":"double"},"t1q":{"type":"number","format":"double"}},"type":"object"}},"type":"object"},{"type":"boolean"}]}},"type":"object"}},"type":"object","additionalProperties":false},"NumberMap":{"properties":{},"type":"object","additionalProperties":{"type":"number","format":"double"}},"CircuitJobStats":{"properties":{"qubits":{"type":"integer","format":"int32"},"circuits":{"type":"integer","format":"int32"},"gate_counts":{"$ref":"#/components/schemas/NumberMap"},"kwh":{"type":"number","format":"double"},"predicted_quantum_compute_time_us":{"type":"integer","format":"int32"},"billed_quantum_compute_time_us":{"type":"integer","format":"int32"}},"type":"object","additionalProperties":false},"CircuitJobResult":{"properties":{"probabilities":{"properties":{"url":{"type":"string"}},"required":["url"],"type":"object"},"histogram":{"properties":{"url":{"type":"string"}},"required":["url"],"type":"object"},"shots":{"properties":{"url":{"type":"string"}},"required":["url"],"type":"object"}},"type":"object","additionalProperties":false},"GetCircuitJobResponse":{"properties":{"id":{"type":"string"},"status":{"$ref":"#/components/schemas/JobStatus"},"type":{"type":"string"},"backend":{"type":"string"},"dry_run":{"type":"boolean"},"submitter_id":{"type":"string","description":"The id of the user who submitted the job"},"project_id":{"type":"string","nullable":true},"parent_job_id":{"type":"string","nullable":true},"session_id":{"type":"string","nullable":true},"metadata":{"allOf":[{"$ref":"#/components/schemas/JobMetadata"}],"nullable":true},"name":{"type":"string","nullable":true},"submitted_at":{"$ref":"#/components/schemas/IsoTimestamp"},"started_at":{"allOf":[{"$ref":"#/components/schemas/IsoTimestamp"}],"nullable":true},"completed_at":{"allOf":[{"$ref":"#/components/schemas/IsoTimestamp"}],"nullable":true},"predicted_wait_time_ms":{"type":"integer","format":"int32","nullable":true},"predicted_execution_duration_ms":{"type":"integer","format":"int32","nullable":true},"execution_duration_ms":{"type":"integer","format":"int32","nullable":true,"description":"How long the job actually took to run on the QPU. Null if the job hasn't run yet."},"shots":{"type":"integer","format":"int32"},"noise":{"$ref":"#/components/schemas/Noise","description":"Only present in the response when `backend` is simulator."},"failure":{"allOf":[{"$ref":"#/components/schemas/Failure"}],"nullable":true},"cost_model":{"$ref":"#/components/schemas/CostModel","description":"The billing model used for this job."},"output":{"$ref":"#/components/schemas/JsonObject"},"settings":{"$ref":"#/components/schemas/CircuitJobSettings"},"stats":{"$ref":"#/components/schemas/CircuitJobStats"},"results":{"allOf":[{"$ref":"#/components/schemas/CircuitJobResult"}],"nullable":true},"child_job_ids":{"items":{"type":"string"},"type":"array","nullable":true}},"required":["id","status","type","backend","dry_run","submitter_id","project_id","parent_job_id","session_id","metadata","name","submitted_at","started_at","completed_at","predicted_wait_time_ms","predicted_execution_duration_ms","execution_duration_ms","failure","output","settings","stats","results","child_job_ids"],"type":"object","additionalProperties":false},"GetJobResponse":{"$ref":"#/components/schemas/GetCircuitJobResponse"},"GetJobCostResponse":{"properties":{"dry_run":{"type":"boolean","example":false},"estimated_cost":{"properties":{"value":{"type":"number","format":"double","example":24.83},"unit":{"type":"string","example":"usd"}},"required":["value","unit"],"type":"object"},"cost":{"properties":{"value":{"type":"number","format":"double","example":24.83},"unit":{"type":"string","example":"usd"}},"required":["value","unit"],"type":"object"}},"required":["dry_run","estimated_cost"],"type":"object","additionalProperties":false},"JobCanceledResponse":{"properties":{"id":{"type":"string","example":"617a1f8b-59d4-435d-aa33-695433d7155e"},"status":{"type":"string","enum":["canceled"],"nullable":false}},"required":["id","status"],"type":"object","additionalProperties":false},"JobsCanceledResponse":{"properties":{"ids":{"items":{"type":"string"},"type":"array","example":["617a1f8b-59d4-435d-aa33-695433d7155e","617a1f8b-59d4-435d-aa33-695433d7155f"]},"status":{"type":"string","enum":["canceled"],"nullable":false}},"required":["ids","status"],"type":"object","additionalProperties":false},"JobsBulkOperationRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array"}},"required":["ids"],"type":"object","additionalProperties":false},"JobDeletedResponse":{"properties":{"id":{"type":"string","example":"617a1f8b-59d4-435d-aa33-695433d7155e"},"status":{"type":"string","enum":["deleted"],"nullable":false}},"required":["id","status"],"type":"object","additionalProperties":false},"JobsDeletedResponse":{"properties":{"ids":{"items":{"type":"string"},"type":"array"},"status":{"type":"string","enum":["deleted"],"nullable":false}},"required":["ids","status"],"type":"object","additionalProperties":false},"GetJobEstimateQueryParams":{"properties":{"backend":{"$ref":"#/components/schemas/JobBackends"},"type":{"type":"string","default":"ionq.circuit.v1"},"qubits":{"type":"integer","format":"int32","default":25},"shots":{"type":"integer","format":"int32","default":1000},"1q_gates":{"type":"integer","format":"int32","default":0},"2q_gates":{"type":"integer","format":"int32","default":0},"error_mitigation":{"type":"boolean","default":false}},"required":["backend"],"type":"object","additionalProperties":false},"GetJobEstimateResponse":{"properties":{"input_values":{"$ref":"#/components/schemas/GetJobEstimateQueryParams"},"estimated_at":{"$ref":"#/components/schemas/IsoTimestamp"},"cost_unit":{"type":"string"},"rate_information":{"properties":{"job_cost_minimum":{"type":"number","format":"double"},"cost_2q_gate":{"type":"number","format":"double"},"cost_1q_gate":{"type":"number","format":"double"},"organization":{"type":"string"}},"required":["job_cost_minimum","cost_2q_gate","cost_1q_gate","organization"],"type":"object"},"estimated_cost":{"type":"number","format":"double"},"estimated_execution_time":{"type":"number","format":"double"},"current_predicted_queue_time":{"type":"number","format":"double"}},"required":["input_values","estimated_at","cost_unit","rate_information","estimated_cost","estimated_execution_time","current_predicted_queue_time"],"type":"object","additionalProperties":false},"AddJobResultsResponse":{"properties":{"job_id":{"type":"string"}},"required":["job_id"],"type":"object","additionalProperties":false},"JobQCtrlStatus":{"enum":["running","complete","max_iteration"],"type":"string"},"AddJobResultsPayload":{"properties":{"processing_status":{"$ref":"#/components/schemas/JobQCtrlStatus"},"optimal_cost":{"type":"number","format":"double"},"optimal_bitstring":{"type":"string"}},"required":["processing_status","optimal_cost","optimal_bitstring"],"type":"object","additionalProperties":false},"GetResultsResponse":{"properties":{},"type":"object","additionalProperties":{"type":"number","format":"double"}},"GetVariantResultsResponse":{"properties":{},"type":"object","additionalProperties":{"type":"number","format":"double"}},"SessionCostLimit":{"properties":{"unit":{"type":"string"},"value":{"type":"number","format":"double"}},"required":["unit","value"],"type":"object","additionalProperties":false},"SessionSettings":{"properties":{"job_count_limit":{"type":"integer","format":"int32"},"duration_limit_min":{"type":"integer","format":"int32"},"cost_limit":{"$ref":"#/components/schemas/SessionCostLimit"},"expires_at":{"type":"string","format":"date-time"}},"type":"object","additionalProperties":false},"SessionStatusEnum":{"enum":["created","started","ended"],"type":"string"},"Session":{"properties":{"id":{"type":"string","description":"The id of the session."},"created_at":{"type":"string","format":"date-time"},"organization_id":{"type":"string"},"backend":{"type":"string","nullable":true},"project_id":{"type":"string","nullable":true},"creator_id":{"type":"string","nullable":true},"ended_at":{"type":"string","format":"date-time","nullable":true},"ender_id":{"type":"string","nullable":true},"settings":{"$ref":"#/components/schemas/SessionSettings"},"active":{"type":"boolean"},"status":{"$ref":"#/components/schemas/SessionStatusEnum"},"started_at":{"type":"string","format":"date-time","nullable":true}},"required":["id","created_at","organization_id","backend","project_id","creator_id","ended_at","ender_id","active","status","started_at"],"type":"object","additionalProperties":false},"SessionSettingsRequest":{"properties":{"job_count_limit":{"type":"integer","format":"int32"},"duration_limit_min":{"type":"integer","format":"int32"},"cost_limit":{"$ref":"#/components/schemas/SessionCostLimit"}},"type":"object","additionalProperties":false},"CreateSessionRequest":{"properties":{"backend":{"type":"string"},"settings":{"$ref":"#/components/schemas/SessionSettingsRequest"}},"required":["backend"],"type":"object","additionalProperties":false},"SessionsResponse":{"properties":{"organization_id":{"type":"string"},"sessions":{"items":{"$ref":"#/components/schemas/Session"},"type":"array"}},"required":["organization_id","sessions"],"type":"object","additionalProperties":false},"GetSessionsQueryParams":{"properties":{"active":{"type":"boolean"}},"type":"object","additionalProperties":false},"QctrlQaoaJobInput":{"type":"object","properties":{"problem_type":{"type":"string","enum":["maxcut"]},"problem":{"type":"object","description":"A NetworkX adjacency_graph object","example":{"directed":false,"multigraph":false,"graph":[],"nodes":[{"id":0},{"id":1},{"id":2}],"adjacency":[[{"id":1},{"id":2}],[{"id":0},{"id":2}],[{"id":0},{"id":1}]]}}},"required":["problem_type","problem"]},"QuantumFunctionInput":{"oneOf":[{"$ref":"#/components/schemas/HamiltonianEnergyInput"},{"$ref":"#/components/schemas/GenericQuantumFunctionInput"}],"discriminator":{"propertyName":"type","mapping":{"hamiltonian-energy":"#/components/schemas/HamiltonianEnergyInput"}}},"QuantumFunctionJobCreationPayload":{"type":"object","properties":{"name":{"type":"string"},"metadata":{"$ref":"#/components/schemas/JobMetadata"},"shots":{"type":"integer","format":"int32","default":100,"maximum":1000000},"backend":{"$ref":"#/components/schemas/JobBackends"},"session_id":{"type":"string"},"settings":{"type":"object","properties":{"error_mitigation":{"type":"object","properties":{"debiasing":{"type":"boolean"}}}}},"dry_run":{"type":"boolean"},"type":{"type":"string","enum":["quantum-function"]},"input":{"$ref":"#/components/schemas/QuantumFunctionInput"}},"required":["backend","type","input"]},"QctrlQaoaJobCreationPayload":{"type":"object","description":"Submit a combinatorial optimization job to solve a maxcut problem using Q-CTRL's QAOA Solver. See our QAOA Job guide for more infromation.\n","properties":{"name":{"type":"string"},"metadata":{"$ref":"#/components/schemas/JobMetadata"},"shots":{"type":"integer","format":"int32","default":100,"maximum":1000000},"backend":{"$ref":"#/components/schemas/JobBackends"},"session_id":{"type":"string"},"settings":{"type":"object","properties":{"error_mitigation":{"type":"object","properties":{"debiasing":{"type":"boolean"}}}}},"dry_run":{"type":"boolean"},"type":{"type":"string","enum":["qctrl.qaoa.v1"]},"input":{"$ref":"#/components/schemas/QctrlQaoaJobInput"},"external_settings":{"type":"object","properties":{"api_credentials":{"description":"API Key for your Q-CTRL Account","type":"string"},"external_organization":{"description":"Optional unique slug for your target Q-CTRL organization","type":"string"}},"required":["api_credentials"]}},"required":["backend","type","input","external_settings"]},"GroupUsage":{"description":"A group's single date usage","properties":{"amount":{"description":"The cost amount for the group of the given date","example":144.39,"type":"number"},"group_id":{"description":"The unique ID from the group","example":"2bfd0fd5-5854-4916-917f-a907af586755","type":"string"},"group_name":{"description":"The group's descriptive name","example":"Project Jumping Lemming","type":"string"},"job_count":{"description":"The number of jobs run for the group on the given date","example":9,"type":"integer"},"time_us":{"description":"The QPU time in microseconds","example":1566154.312523,"type":"number"}},"type":"object"},"Usage":{"description":"Single date of QPU usage","properties":{"amount":{"description":"The amount as a cost in USD","example":1614.23,"type":"number"},"from":{"description":"Date for this group's usage","example":"2023-07-01","format":"date","type":"string"},"group_usages":{"description":"The top 5 usage groups in order of cost amount descending","items":{"$ref":"#/components/schemas/GroupUsage"},"type":"array"},"job_count":{"description":"The count of jobs for this group on the given from date","example":10,"type":"integer"},"time_us":{"description":"The QPU time in microseconds","example":5143166.13413,"type":"number"}},"required":["from","job_count","amount","time_us","group_usages"],"type":"object"},"Usages":{"description":"QPU usage details for a given modality and date range.","properties":{"amount_total":{"description":"The total cost amount for the given timeframe, in units given by usage_unit","example":151.31,"type":"number"},"group_type":{"$ref":"#/components/schemas/group_by"},"job_count":{"description":"The total number of jobs run in the timeframe","example":514,"type":"integer"},"modality":{"$ref":"#/components/schemas/modality"},"organization":{"$ref":"#/components/schemas/organization_id"},"time_us_total":{"description":"The total QPU time usage for the given timeframe, in microseconds","example":1566154.312523,"type":"number"},"usage_data":{"description":"The breakdown of usage by group type in date order most to least recent","items":{"$ref":"#/components/schemas/Usage"},"type":"array"},"usage_from":{"description":"Usage beginning RFC 3339 timestamp","example":"2025-10-01T00:00:00Z","format":"date-time","type":"string"},"usage_to":{"description":"Usage end RFC 3339 timestamp","example":"2025-11-01T00:00:00Z","format":"date-time","type":"string"},"usage_unit":{"description":"The currency of the total and job cost amounts","example":"USD","type":"string"}},"required":["start_date","end_date","group_type","modality"],"type":"object"},"group_by":{"description":"QPU Usage grouping","enum":["job","project","user"],"example":"project","type":"string"},"modality":{"description":"Report modality","enum":["daily","weekly","monthly"],"example":"daily","type":"string"},"organization_id":{"description":"UUID of an organization.","example":"71d164e-6ebe-4126-8839-f1529bb01a00","format":"uuid","type":"string"},"HamiltonianEnergyData":{"properties":{"hamiltonian":{"items":{"$ref":"#/components/schemas/HamiltonianPauliTerm"},"title":"Hamiltonian","type":"array"},"ansatz":{"$ref":"#/components/schemas/Ansatz"},"linear_constraints":{"default":[],"items":{"$ref":"#/components/schemas/LinearConstraint"},"title":"Linear Constraints","type":"array"},"quadratic_constraints":{"default":[],"items":{"$ref":"#/components/schemas/QuadraticConstraint"},"title":"Quadratic Constraints","type":"array"},"penalty":{"default":0,"nullable":true,"title":"Penalty","type":"number"},"cvar_alpha":{"default":null,"nullable":true,"title":"Cvar Alpha","type":"number"}},"required":["hamiltonian","ansatz"],"type":"object"},"Ansatz":{"properties":{"data":{"title":"Data","type":"string"}},"required":["data"],"type":"object"},"HamiltonianPauliTerm":{"properties":{"pauli_string":{"title":"Pauli String","type":"string"},"coefficient":{"title":"Coefficient","type":"number"}},"required":["pauli_string","coefficient"],"type":"object"},"LinearConstraint":{"description":"A class to model linear inequality constraints of the form\n\n.. math::\n\n A x \\leq b.","properties":{"coeffs":{"items":{"type":"number"},"title":"Coeffs","type":"array"},"rhs":{"title":"Rhs","type":"number"}},"required":["coeffs","rhs"],"type":"object"},"QuadraticConstraint":{"description":"A class to model quadratic inequality constraints of the form\n\n.. math::\n\n x^T P x + r^T x \\leq c.","properties":{"quadratic_coeff":{"items":{"items":{"type":"number"},"type":"array"},"title":"Quadratic Coeff","type":"array"},"linear_coeff":{"items":{"type":"number"},"title":"Linear Coeff","type":"array"},"rhs":{"title":"Rhs","type":"number"}},"required":["quadratic_coeff","linear_coeff","rhs"],"type":"object"},"HamiltonianEnergyInput":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","enum":["hamiltonian-energy"]},"data":{"$ref":"#/components/schemas/HamiltonianEnergyData"}},"required":["type","data"]},"params":{"type":"array","items":{"type":"number"}}},"required":["data"]},"GenericQuantumFunctionInput":{"type":"object","properties":{"type":{"type":"string"},"data":{"type":"object"},"params":{"type":"array","items":{"type":"number"}}},"required":["type","data"]}},"responses":{"BadRequest":{"content":{"application/json":{"example":{"error":"Bad Request","message":"\"some-parameter\" was invalid.","statusCode":400,"validation":{"keys":["some-parameter"],"source":"params"}},"schema":{"$ref":"#/components/schemas/BadRequestError"}}},"description":"Invalid request parameters"},"Error":{"content":{"application/json":{"example":{"error":"Internal Server Error","message":"Internal service outage. Visit https://status.ionq.co/ to track this incident.","statusCode":500},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"NotFound":{"content":{"application/json":{"example":{"error":"Not Found Error","message":"Resource not found. See https://docs.ionq.com/ for details, or email support@ionq.co for help.","statusCode":404},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Resource was not found."},"Unauthorized":{"content":{"application/json":{"example":{"error":"Unauthorized Error","message":"Invalid key provided. See https://docs.ionq.com/#authentication for details, or email support@ionq.co for help.","statusCode":401},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Request was not authorized."},"Whoami":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Whoami"}}},"description":"Successfully retrieved a current of key from this session."},"GetBackend":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Backend"}}},"description":"Successfully retrieved backend."},"GetCharacterization":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Characterization"}}},"description":"Successfully retrieved current characterization"},"ListBackends":{"content":{"application/json":{"schema":{"description":"The list of backends.","items":{"$ref":"#/components/schemas/Backend"},"type":"array"}}},"description":"Successfully retrieved backend."},"ListCharacterizations":{"content":{"application/json":{"schema":{"description":"Response body from requesting characterization data.","properties":{"characterizations":{"description":"A page of characterizations measurements.","items":{"$ref":"#/components/schemas/Characterization"},"type":"array"},"pages":{"description":"The number of remaining pages of characterization measurements.","type":"integer"}},"required":["characterizations"],"type":"object"}}},"description":"Successfully retrieved characterizations."},"UsagesResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usages"}}},"description":"Successfully retrieved a list of projects."}},"examples":{"Metadata":{"value":{"input":"{ \"format\": \"ionq.circuit.v0\", \"qubits\": 1, \"circuit\": [ { \"gate\": \"h\", \"target\": 0 } ] }","metadata":{"bar":2,"foo":1}}}},"securitySchemes":{"apiKeyAuth":{"description":"API keys are associated with a user and can be created on the [IonQ Quantum Cloud](https://cloud.ionq.com) application. To authenticate, prefix your API Key with `apiKey ` and place it in the `Authorization` request header. Ex: `Authorization: apiKey your-api-key`","in":"header","name":"Authorization","type":"apiKey"}},"parameters":{"backend":{"description":"A backend where jobs can run on.","in":"path","name":"backend","required":true,"schema":{"enum":["qpu.aria-1","qpu.aria-2","qpu.forte-1","qpu.forte-enterprise-1","qpu.forte-enterprise-2","qpu.forte-enterprise-3"],"type":"string"}},"pagination-limit":{"in":"query","name":"limit","schema":{"$ref":"#/components/schemas/pagination-limit"}},"pagination-next":{"in":"query","name":"next","schema":{"$ref":"#/components/schemas/pagination-next"}},"pagination-page":{"in":"query","name":"page","schema":{"$ref":"#/components/schemas/pagination-page"}},"uuid":{"description":"A UUID identifying a specific resource","example":"617a1f8b-59d4-435d-aa33-695433d7155e","in":"path","name":"UUID","required":true,"schema":{"format":"uuid","type":"string"}},"organization_id":{"description":"The UUID of the organization — this UUID is provided in the response on organization creation.","example":"71d164e-6ebe-4126-8839-f1529bb01a00","in":"path","name":"organization_id","required":true,"schema":{"format":"uuid","type":"string"}}},"requestBodies":{},"headers":{}}}
+{"openapi":"3.0.3","info":{"contact":{"email":"support@ionq.co","name":"IonQ","url":"https://ionq.com/"},"description":"*Last updated: June 24, 2026*\nIonQ's API for accessing the IonQ Quantum Cloud platform\n\nPlease subscribe for automated updates when we perform maintenance or\nexperience an outage.\n\nIn addition, you may use the [status endpoint](#tag/status) to check the\ncurrent status of our API.\n\n## Authentication\n\n\n","title":"IonQ Cloud Platform API","version":"v0.4"},"servers":[{"url":"https://api.ionq.co/v0.4"}],"paths":{"/whoami":{"get":{"description":"Retrieves current key associated with this session.","operationId":"getWhoami","responses":{"200":{"$ref":"#/components/responses/Whoami"}},"summary":"Get current key","tags":["whoami"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/whoami\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}},"/backends":{"get":{"description":"This endpoint retrieves all backends.","operationId":"getBackends","responses":{"200":{"$ref":"#/components/responses/ListBackends"}},"security":[],"summary":"Get Backends","tags":["backends"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/backends\"\n"}]}},"/backends/{backend}":{"get":{"description":"This endpoint retrieves a backend.","operationId":"getBackend","parameters":[{"$ref":"#/components/parameters/backend"}],"responses":{"200":{"$ref":"#/components/responses/GetBackend"}},"security":[],"summary":"Get a Backend","tags":["backends"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/backends/qpu.aria-1\"\n"}]}},"/backends/{backend}/characterizations":{"get":{"description":"This endpoint retrieves an array of all available backend characterizations, with pagination.","operationId":"getCharacterizationsForBackend","parameters":[{"$ref":"#/components/parameters/backend"},{"description":"Characterizations starting at this time (e.g., `start=2025-12-31`)","in":"query","name":"start","schema":{"type":"string"}},{"description":"Characterizations before this time (e.g., `end=2025-12-31`)","in":"query","name":"end","schema":{"type":"string"}},{"description":"How many objects to return.","in":"query","name":"limit","schema":{"default":10,"maximum":10,"minimum":1,"type":"integer"}},{"$ref":"#/components/parameters/pagination-page"}],"responses":{"200":{"$ref":"#/components/responses/ListCharacterizations"}},"security":[],"summary":"Get All Backend Characterizations","tags":["characterizations"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/backends/qpu.aria-1/characterizations\"\n"}]}},"/backends/{backend}/characterizations/{UUID}":{"get":{"description":"This endpoint retrieves a characterization.","operationId":"getCharacterization","parameters":[{"$ref":"#/components/parameters/backend"},{"$ref":"#/components/parameters/uuid"}],"responses":{"200":{"$ref":"#/components/responses/GetCharacterization"}},"summary":"Get a Characterization","tags":["characterizations"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/backends/qpu.aria-1/characterizations/aa54e783-0a9b-4f73-ad2f-63983b6aa4a8\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}},"/jobs":{"post":{"operationId":"CreateJob","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreationResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreationPayload"}}}},"description":"Submit a single-circuit or multi-circuit job for simulation or execution. In `ionq.multi-circuit.v1` payloads, each entry in `input.circuits` inherits the parent `input.gateset` unless the circuit sets its own `gateset`.\n","x-codeSamples":[{"lang":"curl","label":"Single-circuit QIS job","source":"curl -X POST \"https://api.ionq.co/v0.4/jobs\" \\\n -H \"Authorization: apiKey your-api-key\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"type\" : \"ionq.circuit.v1\",\n \"name\": \"Sample circuit\",\n \"metadata\": {\n \"fizz\": \"buzz\",\n \"foo\": \"bar\"\n },\n \"shots\": 500,\n \"backend\": \"qpu.forte-1\",\n \"settings\" :\n {\n \"error_mitigation\":\n {\n \"debiasing\": false\n }\n },\n \"input\": {\n \"qubits\": 2,\n \"gateset\": \"qis\",\n \"circuit\": [\n {\n \"gate\": \"h\",\n \"target\": 0\n }\n ]\n }\n }'\n"},{"lang":"curl","label":"Mixed-gateset multi-circuit job","source":"curl -X POST \"https://api.ionq.co/v0.4/jobs\" \\\n -H \"Authorization: apiKey your-api-key\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"type\": \"ionq.multi-circuit.v1\",\n \"backend\": \"simulator\",\n \"shots\": 500,\n \"input\": {\n \"gateset\": \"native\",\n \"qubits\": 2,\n \"circuits\": [\n {\n \"name\": \"qis circuit override\",\n \"gateset\": \"qis\",\n \"circuit\": [\n {\n \"gate\": \"h\",\n \"target\": 0\n },\n {\n \"gate\": \"cnot\",\n \"target\": 0,\n \"control\": 1\n }\n ]\n },\n {\n \"name\": \"native circuit from parent\",\n \"circuit\": [\n {\n \"gate\": \"ms\",\n \"targets\": [0, 1],\n \"phases\": [0, 0.25]\n },\n {\n \"gate\": \"gpi2\",\n \"target\": 0,\n \"phase\": 0.75\n }\n ]\n }\n ]\n }\n }'\n"}]},"get":{"operationId":"GetJobs","responses":{"200":{"description":"Successfully retrieved a list of jobs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetJobsResponse"},"examples":{"Example 1":{"value":{"jobs":[{"id":"e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524","status":"completed","type":"ionq.circuit.v1","backend":"simulator","dry_run":false,"cost_model":"QCT","submitter_id":"64b03577072d45001c85e9c4","project_id":"1333d459-cf47-4a5e-acc1-8d4eb4f7b025","parent_job_id":null,"session_id":null,"metadata":null,"name":null,"submitted_at":"2025-05-28T20:47:05.440Z","started_at":null,"completed_at":null,"predicted_execution_duration_ms":null,"predicted_wait_time_ms":null,"execution_duration_ms":null,"shots":1000,"noise":{"model":"ideal"},"failure":null,"settings":{"compilation":{}},"stats":{"qubits":20,"circuits":1,"gate_counts":{"1q":1028,"2q":110},"predicted_quantum_compute_time_us":5000,"billed_quantum_compute_time_us":5200},"results":{"probabilities":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/results/probabilities"}},"output":{}}],"next":null}}}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"query","name":"ids","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"in":"query","name":"parent_job_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/JobStatus"}},{"description":"Filter jobs by backend target. Supports single target or comma-separated list of targets.","in":"query","name":"target","required":false,"schema":{"type":"string"},"example":"simulator"},{"in":"query","name":"session_id","required":false,"schema":{"type":"string"}},{"description":"The id of another user within a shared project to view their submitted jobs. Ignored if not a project member.","in":"query","name":"submitter_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}},{"in":"query","name":"next","required":false,"schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"# Get all jobs:\ncurl \"https://api.ionq.co/v0.4/jobs\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]},"delete":{"operationId":"DeleteJobs","responses":{"200":{"description":"Successfully deleted a list of jobs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobsDeletedResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobsBulkOperationRequest"}}}},"x-codeSamples":[{"lang":"curl","source":"curl -X DELETE \"https://api.ionq.co/v0.4/jobs\" \\\n -H \"Authorization: apiKey your-api-key\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"ids\": [\n \"617a1f8b-59d4-435d-aa33-695433d7155e\",\n \"2ccf2773-4c28-468e-a290-2f8554808a25\",\n \"f92df2b6-d212-4f4a-b9ea-024b58c5c3e8\"\n ]\n }'\n"}]}},"/jobs/{UUID}/clone":{"post":{"operationId":"CloneJob","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreationResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The UUID of the job to clone.","in":"path","name":"UUID","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneJobPayload"}}}}}},"/jobs/{UUID}":{"get":{"operationId":"GetJob","responses":{"200":{"description":"Successfully retrieved a job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetJobResponse"},"examples":{"Example 1":{"value":{"id":"e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524","status":"completed","type":"ionq.circuit.v1","backend":"simulator","dry_run":false,"cost_model":"QCT","submitter_id":"64b03577072d45001c85e9c4","project_id":"1333d459-cf47-4a5e-acc1-8d4eb4f7b025","parent_job_id":null,"child_job_ids":null,"session_id":null,"metadata":null,"name":null,"submitted_at":"2025-05-28T20:47:05.440Z","started_at":null,"completed_at":null,"predicted_execution_duration_ms":null,"predicted_wait_time_ms":null,"execution_duration_ms":null,"shots":1000,"noise":{"model":"ideal"},"failure":null,"settings":{"compilation":{}},"stats":{"qubits":20,"circuits":1,"gate_counts":{"1q":1028,"2q":110},"predicted_quantum_compute_time_us":5000,"billed_quantum_compute_time_us":5200},"results":{"probabilities":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/results/probabilities"}},"output":{"compilation":{},"error_mitigation":{"debiasing":{"variants":[{"variant_id":"069ce8f8-f437-7d75-8000-9f5f8c3d7897","qubit_map":[4,12,7],"shots":120,"results":{"probabilities":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/variants/069ce8f8-f437-7d75-8000-9f5f8c3d7897/results/probabilities"},"histogram":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/variants/069ce8f8-f437-7d75-8000-9f5f8c3d7897/results/histogram"},"shots":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/variants/069ce8f8-f437-7d75-8000-9f5f8c3d7897/results/shots"}}}]}}}}}}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The UUID of the job — this UUID is provided in the response on job creation.","in":"path","name":"UUID","required":true,"schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/jobs/617a1f8b-59d4-435d-aa33-695433d7155e\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]},"delete":{"operationId":"DeleteJob","responses":{"200":{"description":"Successfully deleted a job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobDeletedResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The UUID of the job — this UUID is provided in the response on job creation.","in":"path","name":"UUID","required":true,"schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"curl -X DELETE \"https://api.ionq.co/v0.4/jobs/617a1f8b-59d4-435d-aa33-695433d7155e\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}},"/jobs/{UUID}/cost":{"get":{"operationId":"GetJobCost","responses":{"200":{"description":"Successfully retrieved the cost of a job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetJobCostResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"path","name":"UUID","required":true,"schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/jobs/0197379a-c3b8-7548-9da4-bbb7067311c1/cost\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}},"/jobs/{UUID}/status/cancel":{"put":{"operationId":"CancelJob","responses":{"200":{"description":"Successfully canceled a job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCanceledResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"description":"Cancel the execution of many jobs at once by passing a list of jobs.","summary":"Cancel a job","security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The UUID of the job — this UUID is provided in the response on job creation.","in":"path","name":"UUID","required":true,"schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"curl -X PUT \"https://api.ionq.co/v0.4/jobs/617a1f8b-59d4-435d-aa33-695433d7155e/status/cancel\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}},"/jobs/status/cancel":{"put":{"operationId":"CancelJobs","responses":{"200":{"description":"Successfully canceled a list of jobs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobsCanceledResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobsBulkOperationRequest"}}}},"x-codeSamples":[{"lang":"curl","source":"curl -X PUT \"https://api.ionq.co/v0.4/jobs/status/cancel\" \\\n -H \"Authorization: apiKey your-api-key\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"ids\": [\n \"617a1f8b-59d4-435d-aa33-695433d7155e\",\n \"2ccf2773-4c28-468e-a290-2f8554808a25\",\n \"f92df2b6-d212-4f4a-b9ea-024b58c5c3e8\"\n ]\n }'\n"}]}},"/jobs/estimate":{"get":{"operationId":"EstimateJobCost","responses":{"200":{"description":"Successfully retrieved the cost estimate of a job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetJobEstimateResponse"}}}},"429":{"description":"Too Many Requests. To get a higher rate limit, please reach out to support@ionq.co"},"500":{"description":"A generic server failure, please reach out to support@ionq.co for help with this error"},"502":{"description":"Bad Gateway, this can be caused by misbehaving proxies, or by service issues. These can be retried, and downtime can be found on status.ionq.co"},"503":{"description":"Service Unavailable, this is indicative of service outage, please check status.ionq.co"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"query","name":"backend","required":true,"schema":{"$ref":"#/components/schemas/JobBackends"}},{"in":"query","name":"type","required":false,"schema":{"default":"ionq.circuit.v1","type":"string"}},{"in":"query","name":"qubits","required":false,"schema":{"default":25,"format":"int32","type":"integer"}},{"in":"query","name":"shots","required":false,"schema":{"default":1000,"format":"int32","type":"integer"}},{"in":"query","name":"1q_gates","required":false,"schema":{"default":0,"format":"int32","type":"integer"}},{"in":"query","name":"2q_gates","required":false,"schema":{"default":0,"format":"int32","type":"integer"}},{"in":"query","name":"error_mitigation","required":false,"schema":{"default":false,"type":"boolean"}}]}},"/jobs/{UUID}/results/probabilities":{"get":{"operationId":"GetJobProbabilities","responses":{"200":{"description":"Probability distribution keyed by decimal qubit state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetResultsResponse"}}}},"404":{"description":"Job not found or not yet completed."}},"summary":"Fetch the probability distribution for a completed job.","security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The UUID of the job.","in":"path","name":"UUID","required":true,"schema":{"type":"string"}},{"description":"Whether to apply sharpening to the probability distribution.","in":"query","name":"sharpen","required":false,"schema":{"type":"boolean"}}]}},"/jobs/{UUID}/artifacts/{artifactId}":{"get":{"operationId":"GetJobArtifact","responses":{"200":{"description":"Artifact contents.","content":{"application/json":{"schema":{}}}},"404":{"description":"Job or artifact not found."}},"summary":"Download a job artifact.","security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The UUID of the job.","in":"path","name":"UUID","required":true,"schema":{"type":"string"}},{"description":"The artifact id.","in":"path","name":"artifactId","required":true,"schema":{"type":"string"}}],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/artifacts/3fa85f64-5717-4562-b3fc-2c963f66afa6\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}},"/jobs/{UUID}/variants/{variantId}/results/probabilities":{"get":{"operationId":"GetVariantProbabilities","responses":{"200":{"description":"Per-variant probabilities histogram","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVariantResultsResponse"}}}},"404":{"description":"Not found"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"path","name":"UUID","required":true,"schema":{"type":"string"}},{"in":"path","name":"variantId","required":true,"schema":{"type":"string"}}]}},"/jobs/{UUID}/variants/{variantId}/results/histogram":{"get":{"operationId":"GetVariantHistogram","responses":{"200":{"description":"Per-variant raw histogram (counts)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVariantResultsResponse"}}}},"404":{"description":"Not found"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"path","name":"UUID","required":true,"schema":{"type":"string"}},{"in":"path","name":"variantId","required":true,"schema":{"type":"string"}}]}},"/jobs/{UUID}/variants/{variantId}/results/shots":{"get":{"operationId":"GetVariantShots","responses":{"200":{"description":"Per-variant shot-wise results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVariantResultsResponse"}}}},"404":{"description":"Not found"}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"path","name":"UUID","required":true,"schema":{"type":"string"}},{"in":"path","name":"variantId","required":true,"schema":{"type":"string"}}]}},"/sessions":{"post":{"operationId":"CreateSession","responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}}},"security":[{"apiKeyAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionRequest"}}}}},"get":{"operationId":"GetSessions","responses":{"200":{"description":"Successfully retrieved a list of sessions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionsResponse"}}}}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"query","name":"active","required":false,"schema":{"type":"boolean"}}]}},"/sessions/{session_id}/end":{"post":{"operationId":"EndSession","responses":{"200":{"description":"Successfully end a session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}}},"security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The id of the session — this id is provided in the response on session creation.","in":"path","name":"session_id","required":true,"schema":{"type":"string"}}]}},"/sessions/{session_id}":{"get":{"operationId":"GetSession","responses":{"200":{"description":"Successfully retrieved a session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}}}},"security":[{"apiKeyAuth":[]}],"parameters":[{"description":"The id of the session — this id is provided in the response on session creation.","in":"path","name":"session_id","required":true,"schema":{"type":"string"}}]}},"/sessions/{session_id}/jobs":{"get":{"operationId":"GetSessionJobs","responses":{"200":{"description":"Successfully retrieved a list of jobs from a session.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetJobsResponse"},"examples":{"Example 1":{"value":{"jobs":[{"id":"e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524","status":"completed","type":"ionq.circuit.v1","backend":"simulator","dry_run":false,"cost_model":"QCT","submitter_id":"64b03577072d45001c85e9c4","project_id":"1333d459-cf47-4a5e-acc1-8d4eb4f7b025","parent_job_id":null,"session_id":null,"metadata":null,"name":null,"submitted_at":"2025-05-28T20:47:05.440Z","started_at":null,"completed_at":null,"predicted_execution_duration_ms":null,"predicted_wait_time_ms":null,"execution_duration_ms":null,"shots":1000,"noise":{"model":"ideal"},"failure":null,"settings":{"compilation":{}},"stats":{"qubits":20,"circuits":1,"gate_counts":{"1q":1028,"2q":110},"predicted_quantum_compute_time_us":5000,"billed_quantum_compute_time_us":5200},"results":{"probabilities":{"url":"/v0.4/jobs/e1a09d90-b2ba-4ea5-9fd7-4bfc14eac524/results/probabilities"}},"output":{}}],"next":null}}}}}}},"security":[{"apiKeyAuth":[]}],"parameters":[{"in":"path","name":"session_id","required":true,"schema":{"type":"string"}},{"in":"query","name":"ids","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"in":"query","name":"parent_job_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"status","required":false,"schema":{"$ref":"#/components/schemas/JobStatus"}},{"description":"Filter jobs by backend target. Supports single target or comma-separated list of targets.","in":"query","name":"target","required":false,"schema":{"type":"string"},"example":"simulator"},{"in":"query","name":"session_id","required":false,"schema":{"type":"string"}},{"description":"The id of another user within a shared project to view their submitted jobs. Ignored if not a project member.","in":"query","name":"submitter_id","required":false,"schema":{"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"format":"int32","type":"integer"}},{"in":"query","name":"next","required":false,"schema":{"type":"string"}}]}},"/organizations/{organization_id}/usage":{"get":{"description":"Retrieves the costs of a given group type, broken down by the given date modality.","operationId":"get-usages","parameters":[{"$ref":"#/components/parameters/organization_id"},{"description":"Start date, inclusive","example":"2023-07-01","in":"query","name":"start_date","required":true,"schema":{"format":"date","type":"string"}},{"description":"End date, exclusive","example":"2023-08-01","in":"query","name":"end_date","required":true,"schema":{"format":"date","type":"string"}},{"description":"QPU Usage grouping","in":"query","name":"group_by","required":true,"schema":{"$ref":"#/components/schemas/group_by"}},{"description":"Report modality","in":"query","name":"modality","required":true,"schema":{"$ref":"#/components/schemas/modality"}}],"responses":{"200":{"$ref":"#/components/responses/UsagesResponse"}},"summary":"Get usage costs","tags":["usage"],"x-codeSamples":[{"lang":"curl","source":"curl \"https://api.ionq.co/v0.4/organizations/com.my.org/usage?group_by=project&start_date=2025-01-01&end_date=2025-03-02&modality=weekly\" \\\n -H \"Authorization: apiKey your-api-key\"\n"}]}}},"components":{"schemas":{"BadRequestError":{"description":"Error when a bad client request was received.","properties":{"error":{"description":"A short error type descrption.","type":"string"},"message":{"description":"A helpful error message.","type":"string"},"statusCode":{"description":"The HTTP status code for this error.","type":"integer"},"validation":{"$ref":"#/components/schemas/RequestValidation"}},"required":["statusCode","error","message"],"type":"object"},"Error":{"description":"Basic API error response.","properties":{"error":{"description":"A short error type descrption.","type":"string"},"message":{"description":"A helpful error message.","type":"string"},"statusCode":{"description":"The HTTP status code for this error.","type":"integer"}},"required":["statusCode","error","message"],"type":"object"},"RequestValidation":{"description":"Request validation failure details.","properties":{"keys":{"description":"A list of request payload keys which have bad values.","items":{"type":"string"},"type":"array"},"source":{"description":"Location in the request of the bad value(s).","type":"string"}},"type":"object"},"Whoami":{"description":"Details of current API Key session.","properties":{"key_id":{"$ref":"#/components/schemas/key-id"},"key_name":{"$ref":"#/components/schemas/key-name"},"project_id":{"$ref":"#/components/schemas/project-id"}},"required":["key_id","key_name"],"type":"object"},"key-id":{"description":"UUID of a API key.","example":"e060759f-4348-4767-a645-8c0301265791","format":"uuid","type":"string"},"key-name":{"description":"key name.","example":"My First Key","type":"string"},"project-id":{"description":"UUID of a project.","example":"944904d6-2e30-4cfb-8bc4-04afaabcdd42","format":"uuid","type":"string"},"Backend":{"description":"A backend that you can target your program to run on.","properties":{"average_queue_time":{"description":"Current wait time on the queue for execution.","example":1181215,"format":"unix-timestamp","type":"number"},"backend":{"description":"Specifies target hardware and generation where applies: `simulator`, `qpu.aria-1`, `qpu.aria-2`, `qpu.forte-1`, `qpu.forte-enterprise-1`, `qpu.forte-enterprise-2`, `qpu.forte-enterprise-3`","example":"qpu.aria-1","type":"string"},"characterization_id":{"description":"Current characterization ID for this backend","example":"617a1f8b-59d4-435d-aa33-695433d7155e","type":"string"},"degraded":{"description":"Flag to tell if the backend is degraded or not.","type":"boolean"},"kw":{"description":"The amount of energy used by the backend in kilowatt-hours.","example":4902.81,"format":"double","type":"number"},"last_updated":{"description":"Last date time the backend status was updated.","example":"2025-06-16T00:00:00Z","type":"string"},"location":{"description":"The location of the backend.","example":"College Park, MD, USA","type":"string"},"qubits":{"description":"The number of qubits available.","example":25,"minimum":0,"type":"integer"},"status":{"description":"Current status of the backend: `available`, `unavailable`, `retired`.","type":"string"},"supported_error_mitigations":{"description":"Error mitigation options supported by the backend.","example":["debiasing"],"items":{"type":"string"},"type":"array"},"supported_gates":{"description":"Gates supported by the backend.","example":["x","y","z","h","s","si","t","ti","v","vi","rx","ry","rz","cnot","swap","xx","yy","zz","not"],"items":{"type":"string"},"type":"array"},"supported_native_gates":{"description":"Native gates supported by the backend.","example":["gpi","gpi2","ms"],"items":{"type":"string"},"type":"array"}},"required":["backend","status","qubits","average_queue_time","last_updated"],"type":"object"},"Characterization":{"description":"Quantum hardware characterization data.","properties":{"backend":{"description":"The backend calibrated hardware: `simulator`, `qpu.aria-1`, `qpu.aria-2`, `qpu.forte-1`, `qpu.forte-enterprise-1`, `qpu.forte-enterprise-2`, `qpu.forte-enterprise-3`","type":"string"},"connectivity":{"description":"An array of valid, unordered tuples of possible qubits for executing two-qubit gates (e.g., `[[0, 1], [0, 2], [1, 2]]`)","example":[[0,1],[0,2],[10,9]],"items":{"items":{"type":"integer"},"type":"array"},"type":"array"},"date":{"description":"Date time of the measurement, in ISO format.","example":"2025-06-16T00:00:00Z","type":"string"},"fidelity":{"description":"Fidelity for single-qubit (`1q`) and two-qubit (`2q`) gates, and State Preparation and Measurement (`spam`) operations.\nCurrently provides only median fidelity; additional statistical data will be added in the future.\n","properties":{"spam":{"description":"SPAM error correction information.","properties":{"median":{"example":0.9962,"type":"number"},"stderr":{"description":"SPAM error.","example":null,"minimum":0,"type":"integer"}},"required":["median"],"type":"object"}},"required":["spam"],"type":"object"},"id":{"description":"UUID of the characterization.","format":"uuid","type":"string"},"qubits":{"description":"The number of qubits available.","example":25,"minimum":1,"type":"integer"},"timing":{"description":"Time, in seconds, of various system properties: `t1` time, `t2` time, `1q` gate time, `2q` gate time, `readout` time, and qubit `reset` time.","properties":{"1q":{"type":"integer"},"2q":{"type":"integer"},"readout":{"description":"Readout time.","type":"integer"},"reset":{"description":"qubit reset time.","type":"integer"},"t1":{"example":10,"type":"integer"},"t2":{"example":1,"type":"integer"}},"required":["readout","reset"],"type":"object"}},"type":"object"},"pagination-limit":{"default":25,"description":"How many objects to return.","maximum":25,"minimum":1,"type":"integer"},"pagination-next":{"description":"ID of next batch of resources to load.","format":"uuid","type":"string"},"pagination-page":{"default":1,"description":"Specify the page of results to return.","minimum":1,"type":"integer"},"JobStatus":{"type":"string","enum":["submitted","ready","started","canceled","failed","completed"]},"JobCreationResponse":{"properties":{"id":{"type":"string","example":"617a1f8b-59d4-435d-aa33-695433d7155e"},"status":{"$ref":"#/components/schemas/JobStatus"},"session_id":{"type":"string","nullable":true,"example":null}},"required":["id","status","session_id"],"type":"object","additionalProperties":false},"QisGate":{"type":"string","enum":["x","y","z","rx","ry","rz","h","s","si","v","vi","t","ti","not","cnot","swap","xx","yy","zz","pauliexp"]},"Gate_QisGate":{"properties":{"gate":{"$ref":"#/components/schemas/QisGate"},"target":{"type":"integer","format":"int32"},"targets":{"items":{"type":"number","format":"double"},"type":"array","description":"The qubits that a quantum gate is applied to"},"controls":{"items":{"type":"number","format":"double"},"type":"array","description":"The qubits that determine whether the operation is applied to targets."},"control":{"type":"integer","format":"int32"},"rotation":{"type":"number","format":"double","description":"Rotation angle for rx/ry/rz gates"}},"required":["gate"],"type":"object","additionalProperties":false},"QisCircuitInput":{"properties":{"qubits":{"type":"integer","format":"int32","minimum":1},"circuit":{"items":{"$ref":"#/components/schemas/Gate_QisGate"},"type":"array"},"gateset":{"type":"string","enum":["qis"],"nullable":false}},"required":["circuit","gateset"],"type":"object","additionalProperties":false},"NativeGate":{"type":"string","enum":["zz","ms","gpi","gpi2","nop"]},"Gate_NativeGate":{"properties":{"gate":{"$ref":"#/components/schemas/NativeGate"},"target":{"type":"integer","format":"int32"},"targets":{"items":{"type":"number","format":"double"},"type":"array","description":"The qubits that a quantum gate is applied to"},"controls":{"items":{"type":"number","format":"double"},"type":"array","description":"The qubits that determine whether the operation is applied to targets."},"phase":{"type":"number","format":"double","description":"Phase for gpi/gpi2 gates"},"phases":{"items":{"type":"number","format":"double"},"type":"array","description":"Phases for ms gate"},"angle":{"type":"number","format":"double","description":"Interaction angle for ms gate (in turns, default 0.25)"},"rotation":{"type":"number","format":"double","description":"Rotation angle for rx/ry/rz gates"}},"required":["gate"],"type":"object","additionalProperties":false},"NativeCircuitInput":{"properties":{"qubits":{"type":"integer","format":"int32","minimum":1},"circuit":{"items":{"$ref":"#/components/schemas/Gate_NativeGate"},"type":"array"},"gateset":{"type":"string","enum":["native"],"nullable":false}},"required":["circuit","gateset"],"type":"object","additionalProperties":false},"JsonCircuitInput":{"anyOf":[{"$ref":"#/components/schemas/QisCircuitInput","title":"Qis Circuit"},{"$ref":"#/components/schemas/NativeCircuitInput","title":"Native Circuit"}]},"JobMetadata":{"properties":{},"type":"object","additionalProperties":{"type":"string"}},"JobBackends":{"type":"string","description":"Available options: `simulator`, `qpu.aria-1`, `qpu.aria-2`, `qpu.forte-1`, `qpu.forte-enterprise-1`"},"NoiseModel":{"type":"string","enum":["ideal","harmony","harmony-1","harmony-2","aria-1","aria-2","forte-1","forte-enterprise-1"]},"Noise":{"properties":{"model":{"$ref":"#/components/schemas/NoiseModel"},"seed":{"type":"integer","format":"int32"}},"required":["model"],"type":"object","additionalProperties":false},"CircuitJobCreationPayload":{"properties":{"name":{"type":"string"},"metadata":{"$ref":"#/components/schemas/JobMetadata","description":"User defined metadata"},"shots":{"type":"integer","format":"int32","description":"`shots` is ignored by ideal simulator backend.","default":100,"minimum":1,"maximum":1000000},"backend":{"$ref":"#/components/schemas/JobBackends"},"session_id":{"type":"string"},"settings":{"properties":{"error_mitigation":{"properties":{"debiasing":{"type":"boolean"}},"type":"object","description":"To turn on debiasing, you must request at least 500 shots"},"compilation":{"properties":{"opt":{"type":"number","format":"double"},"precision":{"type":"string"}},"type":"object"}},"type":"object"},"dry_run":{"type":"boolean"},"noise":{"$ref":"#/components/schemas/Noise"},"type":{"type":"string","enum":["ionq.circuit.v1"],"nullable":false},"input":{"$ref":"#/components/schemas/JsonCircuitInput"}},"required":["backend","type","input"],"type":"object","additionalProperties":false},"Registers":{"properties":{},"type":"object","additionalProperties":{"items":{"type":"number","format":"double","nullable":true},"type":"array"}},"QISCircuit":{"properties":{"name":{"type":"string"},"circuit":{"items":{"$ref":"#/components/schemas/Gate_QisGate"},"type":"array","description":"Circuit gates. Can be either QIS gates or Native gates depending on the gateset property."},"qubits":{"type":"integer","format":"int32"},"registers":{"$ref":"#/components/schemas/Registers","description":"Registers to use in your circuit. Each register is a list of qubit indices (starting from zero)."},"gateset":{"type":"string","enum":["qis"],"nullable":false,"description":"Optional gateset override for this individual circuit. If not specified, inherits from parent.\nWhen set, the circuit must use the appropriate gate format (QIS)."}},"required":["circuit"],"type":"object","additionalProperties":false},"NativeCircuit":{"properties":{"name":{"type":"string"},"circuit":{"items":{"$ref":"#/components/schemas/Gate_NativeGate"},"type":"array","description":"Circuit gates. Can be either QIS gates or Native gates depending on the gateset property."},"qubits":{"type":"integer","format":"int32"},"registers":{"$ref":"#/components/schemas/Registers","description":"Registers to use in your circuit. Each register is a list of qubit indices (starting from zero)."},"gateset":{"type":"string","enum":["native"],"nullable":false,"description":"Optional gateset override for this individual circuit. If not specified, inherits from parent.\nWhen set, the circuit must use the appropriate gate format (Native)."}},"required":["circuit"],"type":"object","additionalProperties":false},"JsonMultiCircuitInput":{"properties":{"gateset":{"type":"string","enum":["qis","native"]},"circuits":{"items":{"anyOf":[{"$ref":"#/components/schemas/QISCircuit"},{"$ref":"#/components/schemas/NativeCircuit"}]},"type":"array"},"qubits":{"type":"integer","format":"int32","minimum":1}},"required":["gateset","circuits"],"type":"object"},"MultiCircuitJobCreationPayload":{"properties":{"name":{"type":"string"},"metadata":{"$ref":"#/components/schemas/JobMetadata","description":"User defined metadata"},"shots":{"type":"integer","format":"int32","description":"`shots` is ignored by ideal simulator backend.","default":100,"minimum":1,"maximum":1000000},"backend":{"$ref":"#/components/schemas/JobBackends"},"session_id":{"type":"string"},"settings":{"properties":{"error_mitigation":{"properties":{"debiasing":{"type":"boolean"}},"type":"object","description":"To turn on debiasing, you must request at least 500 shots"},"compilation":{"properties":{"opt":{"type":"number","format":"double"},"precision":{"type":"string"}},"type":"object"}},"type":"object"},"dry_run":{"type":"boolean"},"noise":{"$ref":"#/components/schemas/Noise"},"type":{"type":"string","enum":["ionq.multi-circuit.v1"],"nullable":false},"input":{"$ref":"#/components/schemas/JsonMultiCircuitInput","description":"Submit multiple circuits in a single job. Each circuit inherits the parent\n`input.gateset` unless overridden by `circuits[].gateset`."}},"required":["backend","type","input"],"type":"object","additionalProperties":false,"title":"JSON Multi Circuit Job","description":"Submit multiple circuits in a single job. Each circuit inherits the parent `input.gateset` unless overridden by `circuits[].gateset`.\n","example":{"type":"ionq.multi-circuit.v1","backend":"simulator","shots":500,"input":{"gateset":"native","qubits":2,"circuits":[{"name":"qis circuit override","gateset":"qis","circuit":[{"gate":"h","target":0},{"gate":"cnot","target":0,"control":1}]},{"name":"native circuit from parent","circuit":[{"gate":"ms","targets":[0,1],"phases":[0,0.25]},{"gate":"gpi2","target":0,"phase":0.75}]}]}}},"JobCreationPayload":{"anyOf":[{"$ref":"#/components/schemas/CircuitJobCreationPayload","title":"Single Circuit"},{"$ref":"#/components/schemas/MultiCircuitJobCreationPayload","title":"Multi Circuit"},{"$ref":"#/components/schemas/QuantumFunctionJobCreationPayload","title":"Quantum Function"},{"$ref":"#/components/schemas/QctrlQaoaJobCreationPayload","title":"QAOA Function"}],"example":{"type":"ionq.circuit.v1","input":{"qubits":1,"gateset":"qis","circuit":[{"gate":"h","target":0}]},"backend":"qpu.forte-1","shots":500,"settings":{"error_mitigation":{"debiasing":false}}}},"Partial_BaseChildJobCreationPayload_":{"properties":{"parent":{"type":"string"},"name":{"type":"string"},"metadata":{"$ref":"#/components/schemas/JobMetadata","description":"User defined metadata"},"shots":{"type":"integer","format":"int32","description":"`shots` is ignored by ideal simulator backend.","default":100,"minimum":1,"maximum":1000000},"backend":{"type":"string"},"session_id":{"type":"string"},"settings":{"properties":{"error_mitigation":{"properties":{"debiasing":{"type":"boolean"}},"type":"object"},"compilation":{"properties":{"opt":{"type":"number","format":"double"},"precision":{"type":"string"}},"type":"object"}},"type":"object"},"dry_run":{"type":"boolean"},"noise":{"$ref":"#/components/schemas/Noise"}},"type":"object","description":"Make all properties in T optional"},"CloneJobPayload":{"$ref":"#/components/schemas/Partial_BaseChildJobCreationPayload_"},"IsoTimestamp":{"type":"string"},"Failure":{"properties":{"code":{"type":"string","enum":["InvalidInput","CompilationError","ContractExpiredError","DebiasingError","InternalError","NotEnoughQubits","OptimizationError","PreflightError","QuantumCircuitComplexityError","QuantumComputerError","QuotaExhaustedError","SimulationError","SimulationTimeout","SystemCancel","TooLongPredictedExecutionTime","TooManyControls","TooManyGates","TooManyShots","UnknownBillingError","UnsupportedGate"]},"message":{"type":"string"}},"required":["code","message"],"type":"object","additionalProperties":false},"ApiCostModel":{"type":"string","enum":["QCT","2QGE_operations"],"description":"The billing model used for this job. `QCT` for jobs billed on quantum\ncompute time, `2QGE_operations` for jobs billed on two-qubit gate operations."},"JsonObject":{"properties":{},"type":"object","additionalProperties":{}},"BaseJob":{"properties":{"id":{"type":"string"},"status":{"$ref":"#/components/schemas/JobStatus"},"type":{"type":"string"},"backend":{"type":"string"},"dry_run":{"type":"boolean"},"submitter_id":{"type":"string","description":"The id of the user who submitted the job."},"project_id":{"type":"string","nullable":true},"parent_job_id":{"type":"string","nullable":true},"session_id":{"type":"string","nullable":true},"metadata":{"allOf":[{"$ref":"#/components/schemas/JobMetadata"}],"nullable":true},"name":{"type":"string","nullable":true},"submitted_at":{"$ref":"#/components/schemas/IsoTimestamp"},"started_at":{"allOf":[{"$ref":"#/components/schemas/IsoTimestamp"}],"nullable":true},"completed_at":{"allOf":[{"$ref":"#/components/schemas/IsoTimestamp"}],"nullable":true},"predicted_wait_time_ms":{"type":"integer","format":"int32","nullable":true},"predicted_execution_duration_ms":{"type":"integer","format":"int32","nullable":true},"execution_duration_ms":{"type":"integer","format":"int32","nullable":true,"description":"How long the job actually took to run on the QPU. Null if the job hasn't run yet."},"shots":{"type":"integer","format":"int32","description":"`shots` are not included with ideal simulator backend."},"noise":{"$ref":"#/components/schemas/Noise","description":"Only present in the response when `backend` is simulator."},"failure":{"allOf":[{"$ref":"#/components/schemas/Failure"}],"nullable":true},"cost_model":{"$ref":"#/components/schemas/ApiCostModel","description":"The billing model used for this job."},"output":{"$ref":"#/components/schemas/JsonObject"},"settings":{"$ref":"#/components/schemas/JsonObject"},"stats":{"$ref":"#/components/schemas/JsonObject"},"results":{"allOf":[{"$ref":"#/components/schemas/JsonObject"}],"nullable":true}},"required":["id","status","type","backend","dry_run","submitter_id","project_id","parent_job_id","session_id","metadata","name","submitted_at","started_at","completed_at","predicted_wait_time_ms","predicted_execution_duration_ms","execution_duration_ms","failure","output","settings","stats","results"],"type":"object","additionalProperties":false},"GetJobsResponse":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/BaseJob"},"type":"array"},"next":{"type":"string","nullable":true}},"required":["jobs","next"],"type":"object","additionalProperties":false},"GetJobsQueryParams":{"properties":{"ids":{"items":{"type":"string"},"type":"array"},"parent_job_id":{"type":"string"},"status":{"$ref":"#/components/schemas/JobStatus"},"target":{"type":"string","description":"Filter jobs by backend target. Supports single target or comma-separated list of targets.","example":"simulator"},"session_id":{"type":"string"},"submitter_id":{"type":"string","description":"The id of another user within a shared project to view their submitted jobs. Ignored if not a project member."},"limit":{"type":"integer","format":"int32"},"next":{"type":"string"}},"type":"object","additionalProperties":false},"CircuitJobCompilationSettings":{"properties":{"precision":{"type":"string"},"opt":{"type":"number","format":"double"},"gate_basis":{"type":"string"},"service_version":{"type":"string"}},"type":"object","additionalProperties":false},"CircuitJobSettings":{"properties":{"compilation":{"$ref":"#/components/schemas/CircuitJobCompilationSettings"},"error_mitigation":{"properties":{"debiasing":{"anyOf":[{"properties":{"phi_chi_twirling":{"properties":{"p2q":{"type":"number","format":"double"},"t2q":{"type":"number","format":"double"},"t1q":{"type":"number","format":"double"}},"type":"object"}},"type":"object"},{"type":"boolean"}]}},"type":"object"}},"type":"object","additionalProperties":false},"NumberMap":{"properties":{},"type":"object","additionalProperties":{"type":"number","format":"double"}},"CircuitJobStats":{"properties":{"qubits":{"type":"integer","format":"int32"},"circuits":{"type":"integer","format":"int32"},"gate_counts":{"$ref":"#/components/schemas/NumberMap"},"kwh":{"type":"number","format":"double"},"predicted_quantum_compute_time_us":{"type":"integer","format":"int32"},"billed_quantum_compute_time_us":{"type":"integer","format":"int32"}},"type":"object","additionalProperties":false},"CircuitJobResult":{"properties":{"probabilities":{"properties":{"url":{"type":"string"}},"required":["url"],"type":"object"},"histogram":{"properties":{"url":{"type":"string"}},"required":["url"],"type":"object"},"shots":{"properties":{"url":{"type":"string"}},"required":["url"],"type":"object"}},"type":"object","additionalProperties":false},"GetCircuitJobResponse":{"properties":{"id":{"type":"string"},"status":{"$ref":"#/components/schemas/JobStatus"},"type":{"type":"string"},"backend":{"type":"string"},"dry_run":{"type":"boolean"},"submitter_id":{"type":"string","description":"The id of the user who submitted the job."},"project_id":{"type":"string","nullable":true},"parent_job_id":{"type":"string","nullable":true},"session_id":{"type":"string","nullable":true},"metadata":{"allOf":[{"$ref":"#/components/schemas/JobMetadata"}],"nullable":true},"name":{"type":"string","nullable":true},"submitted_at":{"$ref":"#/components/schemas/IsoTimestamp"},"started_at":{"allOf":[{"$ref":"#/components/schemas/IsoTimestamp"}],"nullable":true},"completed_at":{"allOf":[{"$ref":"#/components/schemas/IsoTimestamp"}],"nullable":true},"predicted_wait_time_ms":{"type":"integer","format":"int32","nullable":true},"predicted_execution_duration_ms":{"type":"integer","format":"int32","nullable":true},"execution_duration_ms":{"type":"integer","format":"int32","nullable":true,"description":"How long the job actually took to run on the QPU. Null if the job hasn't run yet."},"shots":{"type":"integer","format":"int32","description":"`shots` are not included with ideal simulator backend."},"noise":{"$ref":"#/components/schemas/Noise","description":"Only present in the response when `backend` is simulator."},"failure":{"allOf":[{"$ref":"#/components/schemas/Failure"}],"nullable":true},"cost_model":{"$ref":"#/components/schemas/ApiCostModel","description":"The billing model used for this job."},"output":{"$ref":"#/components/schemas/JsonObject"},"settings":{"$ref":"#/components/schemas/CircuitJobSettings"},"stats":{"$ref":"#/components/schemas/CircuitJobStats"},"results":{"allOf":[{"$ref":"#/components/schemas/CircuitJobResult"}],"nullable":true},"child_job_ids":{"items":{"type":"string"},"type":"array","nullable":true}},"required":["id","status","type","backend","dry_run","submitter_id","project_id","parent_job_id","session_id","metadata","name","submitted_at","started_at","completed_at","predicted_wait_time_ms","predicted_execution_duration_ms","execution_duration_ms","failure","output","settings","stats","results","child_job_ids"],"type":"object","additionalProperties":false},"GetJobResponse":{"$ref":"#/components/schemas/GetCircuitJobResponse"},"GetJobCostResponse":{"properties":{"dry_run":{"type":"boolean","example":false},"estimated_cost":{"properties":{"value":{"type":"number","format":"double","example":24.83},"unit":{"type":"string","example":"usd"}},"required":["value","unit"],"type":"object"},"cost":{"properties":{"value":{"type":"number","format":"double","example":24.83},"unit":{"type":"string","example":"usd"}},"required":["value","unit"],"type":"object"}},"required":["dry_run","estimated_cost"],"type":"object","additionalProperties":false},"JobCanceledResponse":{"properties":{"id":{"type":"string","example":"617a1f8b-59d4-435d-aa33-695433d7155e"},"status":{"type":"string","enum":["canceled"],"nullable":false}},"required":["id","status"],"type":"object","additionalProperties":false},"JobsCanceledResponse":{"properties":{"ids":{"items":{"type":"string"},"type":"array","example":["617a1f8b-59d4-435d-aa33-695433d7155e","617a1f8b-59d4-435d-aa33-695433d7155f"]},"status":{"type":"string","enum":["canceled"],"nullable":false}},"required":["ids","status"],"type":"object","additionalProperties":false},"JobsBulkOperationRequest":{"properties":{"ids":{"items":{"type":"string"},"type":"array"}},"required":["ids"],"type":"object","additionalProperties":false},"JobDeletedResponse":{"properties":{"id":{"type":"string","example":"617a1f8b-59d4-435d-aa33-695433d7155e"},"status":{"type":"string","enum":["deleted"],"nullable":false}},"required":["id","status"],"type":"object","additionalProperties":false},"JobsDeletedResponse":{"properties":{"ids":{"items":{"type":"string"},"type":"array"},"status":{"type":"string","enum":["deleted"],"nullable":false}},"required":["ids","status"],"type":"object","additionalProperties":false},"GetJobEstimateQueryParams":{"properties":{"backend":{"$ref":"#/components/schemas/JobBackends"},"type":{"type":"string","default":"ionq.circuit.v1"},"qubits":{"type":"integer","format":"int32","default":25},"shots":{"type":"integer","format":"int32","default":1000},"1q_gates":{"type":"integer","format":"int32","default":0},"2q_gates":{"type":"integer","format":"int32","default":0},"error_mitigation":{"type":"boolean","default":false}},"required":["backend"],"type":"object","additionalProperties":false},"GetJobEstimateResponse":{"properties":{"input_values":{"$ref":"#/components/schemas/GetJobEstimateQueryParams"},"estimated_at":{"$ref":"#/components/schemas/IsoTimestamp"},"cost_unit":{"type":"string"},"rate_information":{"properties":{"qct_cost_cents":{"type":"number","format":"double","nullable":true},"rate_type":{"type":"string","enum":["qct","2qge"]},"job_cost_minimum":{"type":"number","format":"double","nullable":true},"cost_2q_gate":{"type":"number","format":"double","nullable":true},"cost_1q_gate":{"type":"number","format":"double","nullable":true},"organization":{"type":"string"}},"required":["qct_cost_cents","rate_type","job_cost_minimum","cost_2q_gate","cost_1q_gate","organization"],"type":"object"},"estimated_cost":{"type":"number","format":"double"},"estimated_execution_time":{"type":"number","format":"double"},"estimated_quantum_compute_time_us":{"type":"number","format":"double"},"current_predicted_queue_time":{"type":"number","format":"double"}},"required":["input_values","estimated_at","cost_unit","rate_information","estimated_cost","estimated_execution_time","current_predicted_queue_time"],"type":"object","additionalProperties":false},"AddJobResultsResponse":{"properties":{"job_id":{"type":"string"}},"required":["job_id"],"type":"object","additionalProperties":false},"JobQCtrlStatus":{"enum":["running","complete","max_iteration"],"type":"string"},"AddJobResultsPayload":{"properties":{"processing_status":{"$ref":"#/components/schemas/JobQCtrlStatus"},"optimal_cost":{"type":"number","format":"double"},"optimal_bitstring":{"type":"string"}},"required":["processing_status","optimal_cost","optimal_bitstring"],"type":"object","additionalProperties":false},"GetResultsResponse":{"properties":{},"type":"object","additionalProperties":{"type":"number","format":"double"}},"GetVariantResultsResponse":{"properties":{},"type":"object","additionalProperties":{"type":"number","format":"double"}},"SessionCostLimit":{"properties":{"unit":{"type":"string"},"value":{"type":"number","format":"double"}},"required":["unit","value"],"type":"object","additionalProperties":false},"SessionSettings":{"properties":{"job_count_limit":{"type":"integer","format":"int32"},"duration_limit_min":{"type":"integer","format":"int32"},"cost_limit":{"$ref":"#/components/schemas/SessionCostLimit"},"expires_at":{"type":"string","format":"date-time"}},"type":"object","additionalProperties":false},"SessionStatusEnum":{"enum":["created","started","ended"],"type":"string"},"Session":{"properties":{"id":{"type":"string","description":"The id of the session."},"created_at":{"type":"string","format":"date-time"},"organization_id":{"type":"string"},"backend":{"type":"string","nullable":true},"project_id":{"type":"string","nullable":true},"creator_id":{"type":"string","nullable":true},"ended_at":{"type":"string","format":"date-time","nullable":true},"ender_id":{"type":"string","nullable":true},"settings":{"$ref":"#/components/schemas/SessionSettings"},"active":{"type":"boolean"},"status":{"$ref":"#/components/schemas/SessionStatusEnum"},"started_at":{"type":"string","format":"date-time","nullable":true}},"required":["id","created_at","organization_id","backend","project_id","creator_id","ended_at","ender_id","active","status","started_at"],"type":"object","additionalProperties":false},"SessionSettingsRequest":{"properties":{"job_count_limit":{"type":"integer","format":"int32"},"duration_limit_min":{"type":"integer","format":"int32"},"cost_limit":{"$ref":"#/components/schemas/SessionCostLimit"}},"type":"object","additionalProperties":false},"CreateSessionRequest":{"properties":{"backend":{"type":"string"},"settings":{"$ref":"#/components/schemas/SessionSettingsRequest"}},"required":["backend"],"type":"object","additionalProperties":false},"SessionsResponse":{"properties":{"organization_id":{"type":"string"},"sessions":{"items":{"$ref":"#/components/schemas/Session"},"type":"array"}},"required":["organization_id","sessions"],"type":"object","additionalProperties":false},"GetSessionsQueryParams":{"properties":{"active":{"type":"boolean"}},"type":"object","additionalProperties":false},"QctrlQaoaJobInput":{"type":"object","properties":{"problem_type":{"type":"string","enum":["maxcut"]},"problem":{"type":"object","description":"A NetworkX adjacency_graph object","example":{"directed":false,"multigraph":false,"graph":[],"nodes":[{"id":0},{"id":1},{"id":2}],"adjacency":[[{"id":1},{"id":2}],[{"id":0},{"id":2}],[{"id":0},{"id":1}]]}}},"required":["problem_type","problem"]},"QuantumFunctionInput":{"oneOf":[{"$ref":"#/components/schemas/HamiltonianEnergyInput"},{"$ref":"#/components/schemas/GenericQuantumFunctionInput"}],"discriminator":{"propertyName":"type","mapping":{"hamiltonian-energy":"#/components/schemas/HamiltonianEnergyInput"}}},"QuantumFunctionJobCreationPayload":{"type":"object","properties":{"name":{"type":"string"},"metadata":{"$ref":"#/components/schemas/JobMetadata"},"shots":{"type":"integer","format":"int32","default":100,"maximum":1000000},"backend":{"$ref":"#/components/schemas/JobBackends"},"session_id":{"type":"string"},"settings":{"type":"object","properties":{"error_mitigation":{"type":"object","properties":{"debiasing":{"type":"boolean"}}}}},"dry_run":{"type":"boolean"},"type":{"type":"string","enum":["quantum-function"]},"input":{"$ref":"#/components/schemas/QuantumFunctionInput"}},"required":["backend","type","input"]},"QctrlQaoaJobCreationPayload":{"type":"object","description":"Submit a combinatorial optimization job to solve a maxcut problem using Q-CTRL's QAOA Solver. See our QAOA Job guide for more information.\n","properties":{"name":{"type":"string"},"metadata":{"$ref":"#/components/schemas/JobMetadata"},"shots":{"type":"integer","format":"int32","default":100,"maximum":1000000},"backend":{"$ref":"#/components/schemas/JobBackends"},"session_id":{"type":"string"},"settings":{"type":"object","properties":{"error_mitigation":{"type":"object","properties":{"debiasing":{"type":"boolean"}}}}},"dry_run":{"type":"boolean"},"type":{"type":"string","enum":["qctrl.qaoa.v1"]},"input":{"$ref":"#/components/schemas/QctrlQaoaJobInput"},"external_settings":{"type":"object","properties":{"api_credentials":{"description":"API Key for your Q-CTRL account","type":"string"},"external_organization":{"description":"Optional unique slug for your target Q-CTRL organization","type":"string"}},"required":["api_credentials"]}},"required":["backend","type","input","external_settings"]},"GroupUsage":{"description":"A group's single date usage","properties":{"amount":{"description":"The cost amount for the group of the given date","example":144.39,"type":"number"},"group_id":{"description":"The unique ID from the group","example":"2bfd0fd5-5854-4916-917f-a907af586755","type":"string"},"group_name":{"description":"The group's descriptive name","example":"Project Jumping Lemming","type":"string"},"job_count":{"description":"The number of jobs run for the group on the given date","example":9,"type":"integer"},"time_us":{"description":"The QPU time in microseconds","example":1566154.312523,"type":"number"}},"type":"object"},"Usage":{"description":"Single date of QPU usage","properties":{"amount":{"description":"The amount as a cost in USD","example":1614.23,"type":"number"},"from":{"description":"Date for this group's usage","example":"2023-07-01","format":"date","type":"string"},"group_usages":{"description":"The top 5 usage groups in order of cost amount descending","items":{"$ref":"#/components/schemas/GroupUsage"},"type":"array"},"job_count":{"description":"The count of jobs for this group on the given from date","example":10,"type":"integer"},"time_us":{"description":"The QPU time in microseconds","example":5143166.13413,"type":"number"}},"required":["from","job_count","amount","time_us","group_usages"],"type":"object"},"Usages":{"description":"QPU usage details for a given modality and date range.","properties":{"amount_total":{"description":"The total cost amount for the given timeframe, in units given by usage_unit","example":151.31,"type":"number"},"group_type":{"$ref":"#/components/schemas/group_by"},"job_count":{"description":"The total number of jobs run in the timeframe","example":514,"type":"integer"},"modality":{"$ref":"#/components/schemas/modality"},"organization":{"$ref":"#/components/schemas/organization_id"},"time_us_total":{"description":"The total QPU time usage for the given timeframe, in microseconds","example":1566154.312523,"type":"number"},"usage_data":{"description":"The breakdown of usage by group type in date order most to least recent","items":{"$ref":"#/components/schemas/Usage"},"type":"array"},"usage_from":{"description":"Usage beginning RFC 3339 timestamp","example":"2025-10-01T00:00:00Z","format":"date-time","type":"string"},"usage_to":{"description":"Usage end RFC 3339 timestamp","example":"2025-11-01T00:00:00Z","format":"date-time","type":"string"},"usage_unit":{"description":"The currency of the total and job cost amounts","example":"USD","type":"string"}},"required":["start_date","end_date","group_type","modality"],"type":"object"},"group_by":{"description":"QPU Usage grouping","enum":["job","project","user"],"example":"project","type":"string"},"modality":{"description":"Report modality","enum":["daily","weekly","monthly"],"example":"daily","type":"string"},"organization_id":{"description":"UUID of an organization.","example":"71d164e-6ebe-4126-8839-f1529bb01a00","format":"uuid","type":"string"},"HamiltonianEnergyData":{"properties":{"hamiltonian":{"items":{"$ref":"#/components/schemas/HamiltonianPauliTerm"},"title":"Hamiltonian","type":"array"},"ansatz":{"$ref":"#/components/schemas/Ansatz"},"linear_constraints":{"default":[],"items":{"$ref":"#/components/schemas/LinearConstraint"},"title":"Linear Constraints","type":"array"},"quadratic_constraints":{"default":[],"items":{"$ref":"#/components/schemas/QuadraticConstraint"},"title":"Quadratic Constraints","type":"array"},"penalty":{"default":0,"nullable":true,"title":"Penalty","type":"number"},"cvar_alpha":{"default":null,"nullable":true,"title":"Cvar Alpha","type":"number"}},"required":["hamiltonian","ansatz"],"type":"object"},"Ansatz":{"properties":{"data":{"title":"Data","type":"string"}},"required":["data"],"type":"object"},"HamiltonianPauliTerm":{"properties":{"pauli_string":{"title":"Pauli String","type":"string"},"coefficient":{"title":"Coefficient","type":"number"}},"required":["pauli_string","coefficient"],"type":"object"},"LinearConstraint":{"description":"A class to model linear inequality constraints of the form\n\n.. math::\n\n A x \\leq b.","properties":{"coeffs":{"items":{"type":"number"},"title":"Coeffs","type":"array"},"rhs":{"title":"Rhs","type":"number"}},"required":["coeffs","rhs"],"type":"object"},"QuadraticConstraint":{"description":"A class to model quadratic inequality constraints of the form\n\n.. math::\n\n x^T P x + r^T x \\leq c.","properties":{"quadratic_coeff":{"items":{"items":{"type":"number"},"type":"array"},"title":"Quadratic Coeff","type":"array"},"linear_coeff":{"items":{"type":"number"},"title":"Linear Coeff","type":"array"},"rhs":{"title":"Rhs","type":"number"}},"required":["quadratic_coeff","linear_coeff","rhs"],"type":"object"},"HamiltonianEnergyInput":{"type":"object","properties":{"data":{"type":"object","properties":{"type":{"type":"string","enum":["hamiltonian-energy"]},"data":{"$ref":"#/components/schemas/HamiltonianEnergyData"}},"required":["type","data"]},"params":{"type":"array","items":{"type":"number"}}},"required":["data"]},"GenericQuantumFunctionInput":{"type":"object","properties":{"type":{"type":"string"},"data":{"type":"object"},"params":{"type":"array","items":{"type":"number"}}},"required":["type","data"]}},"responses":{"BadRequest":{"content":{"application/json":{"example":{"error":"Bad Request","message":"\"some-parameter\" was invalid.","statusCode":400,"validation":{"keys":["some-parameter"],"source":"params"}},"schema":{"$ref":"#/components/schemas/BadRequestError"}}},"description":"Invalid request parameters"},"Error":{"content":{"application/json":{"example":{"error":"Internal Server Error","message":"Internal service outage. Visit https://status.ionq.co/ to track this incident.","statusCode":500},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"NotFound":{"content":{"application/json":{"example":{"error":"Not Found Error","message":"Resource not found. See https://docs.ionq.com/ for details, or email support@ionq.co for help.","statusCode":404},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Resource was not found."},"Unauthorized":{"content":{"application/json":{"example":{"error":"Unauthorized Error","message":"Invalid key provided. See https://docs.ionq.com/#authentication for details, or email support@ionq.co for help.","statusCode":401},"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Request was not authorized."},"Whoami":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Whoami"}}},"description":"Successfully retrieved a current of key from this session."},"GetBackend":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Backend"}}},"description":"Successfully retrieved backend."},"GetCharacterization":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Characterization"}}},"description":"Successfully retrieved current characterization"},"ListBackends":{"content":{"application/json":{"schema":{"description":"The list of backends.","items":{"$ref":"#/components/schemas/Backend"},"type":"array"}}},"description":"Successfully retrieved backend."},"ListCharacterizations":{"content":{"application/json":{"schema":{"description":"Response body from requesting characterization data.","properties":{"characterizations":{"description":"A page of characterizations measurements.","items":{"$ref":"#/components/schemas/Characterization"},"type":"array"},"pages":{"description":"The number of remaining pages of characterization measurements.","type":"integer"}},"required":["characterizations"],"type":"object"}}},"description":"Successfully retrieved characterizations."},"UsagesResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Usages"}}},"description":"Successfully retrieved a list of projects."}},"examples":{"Metadata":{"value":{"input":"{ \"format\": \"ionq.circuit.v0\", \"qubits\": 1, \"circuit\": [ { \"gate\": \"h\", \"target\": 0 } ] }","metadata":{"bar":2,"foo":1}}}},"securitySchemes":{"apiKeyAuth":{"description":"API keys are associated with a user and can be created on the [IonQ Quantum Cloud](https://cloud.ionq.com) application. To authenticate, prefix your API Key with `apiKey ` and place it in the `Authorization` request header. Ex: `Authorization: apiKey your-api-key`","in":"header","name":"Authorization","type":"apiKey"}},"parameters":{"backend":{"description":"A backend where jobs can run on.","in":"path","name":"backend","required":true,"schema":{"enum":["qpu.aria-1","qpu.aria-2","qpu.forte-1","qpu.forte-enterprise-1","qpu.forte-enterprise-2","qpu.forte-enterprise-3"],"type":"string"}},"pagination-limit":{"in":"query","name":"limit","schema":{"$ref":"#/components/schemas/pagination-limit"}},"pagination-next":{"in":"query","name":"next","schema":{"$ref":"#/components/schemas/pagination-next"}},"pagination-page":{"in":"query","name":"page","schema":{"$ref":"#/components/schemas/pagination-page"}},"uuid":{"description":"A UUID identifying a specific resource","example":"617a1f8b-59d4-435d-aa33-695433d7155e","in":"path","name":"UUID","required":true,"schema":{"format":"uuid","type":"string"}},"organization_id":{"description":"The UUID of the organization — this UUID is provided in the response on organization creation.","example":"71d164e-6ebe-4126-8839-f1529bb01a00","in":"path","name":"organization_id","required":true,"schema":{"format":"uuid","type":"string"}}},"requestBodies":{},"headers":{}}}
\ No newline at end of file
diff --git a/tests/test_api.py b/tests/test_api.py
index 176829a..02f02d1 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -1,11 +1,12 @@
import pytest
from ionq_core.api.backends import get_backends
-from ionq_core.api.default import create_job, get_compiled_file, get_jobs
+from ionq_core.api.default import clone_job, create_job, get_job_artifact, get_jobs
from ionq_core.api.whoami import get_whoami
from ionq_core.errors import UnexpectedStatus
from ionq_core.models.backend import Backend
from ionq_core.models.circuit_job_creation_payload import CircuitJobCreationPayload
+from ionq_core.models.clone_job_payload import CloneJobPayload
from ionq_core.models.get_jobs_response import GetJobsResponse
from ionq_core.models.job_creation_response import JobCreationResponse
from ionq_core.models.whoami import Whoami
@@ -121,28 +122,37 @@ def test_sync(self, httpx_mock, auth_client):
assert result.status == "submitted"
-class TestGetCompiledFile:
- def test_sync(self, httpx_mock, auth_client):
- httpx_mock.add_response(json="OPENQASM 3.0;\nqubit[2] q;\nh q[0];\ncx q[0], q[1];")
- result = get_compiled_file.sync(uuid="job-123", lang="qasm3", client=auth_client)
- assert isinstance(result, str)
- assert "OPENQASM" in result
-
+class TestGetJobArtifact:
def test_sync_detailed(self, httpx_mock, auth_client):
- httpx_mock.add_response(json="compiled-native-circuit")
- resp = get_compiled_file.sync_detailed(uuid="job-123", lang="native", client=auth_client)
+ httpx_mock.add_response(content=b"OPENQASM 3.0;\nqubit[2] q;\nh q[0];\ncx q[0], q[1];")
+ resp = get_job_artifact.sync_detailed(uuid="job-123", artifact_id="art-1", client=auth_client)
assert resp.status_code.value == 200
- assert resp.parsed == "compiled-native-circuit"
+ assert resp.parsed is None
+ assert b"OPENQASM" in resp.content
- async def test_asyncio(self, httpx_mock, auth_client):
- httpx_mock.add_response(json="OPENQASM 3.0;\nh q[0];")
- result = await get_compiled_file.asyncio(uuid="job-123", lang="qasm3", client=auth_client)
- assert isinstance(result, str)
+ async def test_asyncio_detailed(self, httpx_mock, auth_client):
+ httpx_mock.add_response(content=b"compiled-native-circuit")
+ resp = await get_job_artifact.asyncio_detailed(uuid="job-123", artifact_id="art-1", client=auth_client)
+ assert resp.status_code.value == 200
+ assert resp.content == b"compiled-native-circuit"
def test_not_found(self, httpx_mock, auth_client):
httpx_mock.add_response(status_code=404)
- result = get_compiled_file.sync(uuid="nonexistent", lang="native", client=auth_client)
- assert result is None
+ resp = get_job_artifact.sync_detailed(uuid="nonexistent", artifact_id="art-1", client=auth_client)
+ assert resp.status_code.value == 404
+ assert resp.parsed is None
+
+
+class TestCloneJob:
+ def test_sync(self, httpx_mock, auth_client):
+ httpx_mock.add_response(
+ status_code=201, json={"id": "cloned-job-id", "status": "submitted", "session_id": None}
+ )
+ body = CloneJobPayload.from_dict({"backend": "simulator", "shots": 100})
+ result = clone_job.sync(uuid="job-123", client=auth_client, body=body)
+ assert isinstance(result, JobCreationResponse)
+ assert result.id == "cloned-job-id"
+ assert result.status == "submitted"
class TestUnexpectedStatus:
From a075faa2f33a12833eeb159a6fa700837f0886c3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 8 Jun 2026 01:34:40 +0000
Subject: [PATCH 2/7] Bump https://github.com/astral-sh/ruff-pre-commit
Bumps the pre-commit group with 1 update: [https://github.com/astral-sh/ruff-pre-commit](https://github.com/astral-sh/ruff-pre-commit).
Updates `https://github.com/astral-sh/ruff-pre-commit` from v0.15.14 to 0.15.15
- [Release notes](https://github.com/astral-sh/ruff-pre-commit/releases)
- [Commits](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.14...v0.15.15)
---
updated-dependencies:
- dependency-name: https://github.com/astral-sh/ruff-pre-commit
dependency-version: 0.15.15
dependency-type: direct:production
dependency-group: pre-commit
...
Signed-off-by: dependabot[bot]
---
.pre-commit-config.yaml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index c91548c..67df872 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -13,7 +13,7 @@ repos:
- id: gitleaks
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.15.14
+ rev: v0.15.15
hooks:
- id: ruff-check
args: [--fix]
From fd8524620ddffb167721c0ea5807ffa2eb3223b1 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 15 Jun 2026 01:35:17 +0000
Subject: [PATCH 3/7] Bump actions/checkout from 6.0.2 to 6.0.3 in the actions
group
Bumps the actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).
Updates `actions/checkout` from 6.0.2 to 6.0.3
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...df4cb1c069e1874edd31b4311f1884172cec0e10)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: 6.0.3
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: actions
...
Signed-off-by: dependabot[bot]
---
.github/workflows/ci.yml | 6 +++---
.github/workflows/docs.yml | 2 +-
.github/workflows/generated.yml | 2 +-
.github/workflows/integration.yml | 2 +-
.github/workflows/release.yml | 2 +-
.github/workflows/spec-drift.yml | 2 +-
.github/workflows/zizmor.yml | 2 +-
7 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 35d2797..28ec3c3 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -20,7 +20,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- uses: ./.github/actions/setup-uv
@@ -39,7 +39,7 @@ jobs:
matrix:
python-version: ["3.11", "3.12", "3.13", "3.14"]
steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- uses: ./.github/actions/setup-uv
@@ -53,7 +53,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- uses: ./.github/actions/setup-uv
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 286f799..759286c 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- uses: ./.github/actions/setup-uv
diff --git a/.github/workflows/generated.yml b/.github/workflows/generated.yml
index 6a6c7d7..a533578 100644
--- a/.github/workflows/generated.yml
+++ b/.github/workflows/generated.yml
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- uses: ./.github/actions/setup-uv
diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml
index 8f81e35..0fef18a 100644
--- a/.github/workflows/integration.yml
+++ b/.github/workflows/integration.yml
@@ -21,7 +21,7 @@ jobs:
timeout-minutes: 15
environment: integration
steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- uses: ./.github/actions/setup-uv
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 268996f..5ba331d 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -18,7 +18,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- name: Verify tag matches pyproject version
diff --git a/.github/workflows/spec-drift.yml b/.github/workflows/spec-drift.yml
index 30afff7..c64af54 100644
--- a/.github/workflows/spec-drift.yml
+++ b/.github/workflows/spec-drift.yml
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- name: Fetch latest spec
diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml
index f19dccb..f5fcaf8 100644
--- a/.github/workflows/zizmor.yml
+++ b/.github/workflows/zizmor.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- uses: zizmorcore/zizmor-action@5f14fd08f7cf1cb1609c1e344975f152c7ee938d # v0.5.6
From db70aeb5d6866f522133a34262ea74a2dab88e11 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 22 Jun 2026 01:35:56 +0000
Subject: [PATCH 4/7] Bump the python group across 1 directory with 5 updates
Bumps the python group with 5 updates in the / directory:
| Package | From | To |
| --- | --- | --- |
| [pytest](https://github.com/pytest-dev/pytest) | `9.0.3` | `9.1.0` |
| [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) | `1.3.0` | `1.4.0` |
| [ruff](https://github.com/astral-sh/ruff) | `0.15.15` | `0.15.18` |
| [ty](https://github.com/astral-sh/ty) | `0.0.40` | `0.0.50` |
| [openapi-python-client](https://github.com/openapi-generators/openapi-python-client) | `0.28.4` | `0.29.0` |
Updates `pytest` from 9.0.3 to 9.1.0
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/9.0.3...9.1.0)
Updates `pytest-asyncio` from 1.3.0 to 1.4.0
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](https://github.com/pytest-dev/pytest-asyncio/compare/v1.3.0...v1.4.0)
Updates `ruff` from 0.15.15 to 0.15.18
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.15.15...0.15.18)
Updates `ty` from 0.0.40 to 0.0.50
- [Release notes](https://github.com/astral-sh/ty/releases)
- [Changelog](https://github.com/astral-sh/ty/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ty/compare/0.0.40...0.0.50)
Updates `openapi-python-client` from 0.28.4 to 0.29.0
- [Release notes](https://github.com/openapi-generators/openapi-python-client/releases)
- [Changelog](https://github.com/openapi-generators/openapi-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/openapi-generators/openapi-python-client/compare/v0.28.4...v0.29.0)
---
updated-dependencies:
- dependency-name: pytest
dependency-version: 9.1.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: python
- dependency-name: pytest-asyncio
dependency-version: 1.4.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: python
- dependency-name: ruff
dependency-version: 0.15.18
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: python
- dependency-name: ty
dependency-version: 0.0.50
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: python
- dependency-name: openapi-python-client
dependency-version: 0.29.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: python
...
Signed-off-by: dependabot[bot]
---
pyproject.toml | 2 +-
uv.lock | 97 +++++++++++++++++++++++++-------------------------
2 files changed, 49 insertions(+), 50 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 6ec21de..7eed288 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -47,7 +47,7 @@ dev = [
]
regen = [
"oas-patch==0.6.0",
- "openapi-python-client==0.28.4",
+ "openapi-python-client==0.29.0",
]
[build-system]
diff --git a/uv.lock b/uv.lock
index cf3bb5d..6945005 100644
--- a/uv.lock
+++ b/uv.lock
@@ -301,7 +301,7 @@ dev = [
]
regen = [
{ name = "oas-patch", specifier = "==0.6.0" },
- { name = "openapi-python-client", specifier = "==0.28.4" },
+ { name = "openapi-python-client", specifier = "==0.29.0" },
]
[[package]]
@@ -476,7 +476,7 @@ wheels = [
[[package]]
name = "openapi-python-client"
-version = "0.28.4"
+version = "0.29.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "attrs" },
@@ -484,15 +484,14 @@ dependencies = [
{ name = "httpx" },
{ name = "jinja2" },
{ name = "pydantic" },
- { name = "python-dateutil" },
{ name = "ruamel-yaml" },
{ name = "ruff" },
{ name = "shellingham" },
{ name = "typer" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/7b/cf/c9278f87a8454cef126fb2594bc32472d681957ea03b8de68d304107a459/openapi_python_client-0.28.4.tar.gz", hash = "sha256:f78dfab5e21652806b17af07c16187b5911138fc526229126953c1b7b37d2b88", size = 125974, upload-time = "2026-05-11T19:44:08.427Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/63/f6/67dfe73b5073251b6e2aba3d67191819798dd33dd09fcb2d12242662a960/openapi_python_client-0.29.0.tar.gz", hash = "sha256:4ff439a63765aaef548e69c4eedd86dfad57891dc322709450af0c2c9a72a23e", size = 125697, upload-time = "2026-05-30T20:32:10.533Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/07/59/016bf13a3bfb85a0d890d492cc9fc65ccefa53ecc5eba3c9a049e5ea6317/openapi_python_client-0.28.4-py3-none-any.whl", hash = "sha256:6bb87dbb05f88e5ab5ba4e5902f0c85ea53e666d3646be49ea2bb19bc8b5bb85", size = 183212, upload-time = "2026-05-11T19:44:07.005Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/d1/7391a205622c40b8e9d1b79b892b4944d6e3637674b47a56196e2c96c5d1/openapi_python_client-0.29.0-py3-none-any.whl", hash = "sha256:1085864c1e0a42fb50e1f5eb84363b19de07ebfb8a3f82a146c8529b948b8f12", size = 182954, upload-time = "2026-05-30T20:32:09.037Z" },
]
[[package]]
@@ -665,7 +664,7 @@ wheels = [
[[package]]
name = "pytest"
-version = "9.0.3"
+version = "9.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
@@ -674,22 +673,22 @@ dependencies = [
{ name = "pluggy" },
{ name = "pygments" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/84/0e/b5858858d74958632c49b72cb25a3976ff9f632397626715be71c89d3971/pytest-9.1.0.tar.gz", hash = "sha256:41dd9148c08072446394cefd3d79701701335a9f4cae69ba92e39f6c7f5c061c", size = 1634181, upload-time = "2026-06-13T18:52:45.983Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/5a/ba30a81239b909821b3153e303e7def45178bf353da4f72380e6c5e8793b/pytest-9.1.0-py3-none-any.whl", hash = "sha256:8ebb0e7888bdf2bdfc602ec51f8f62d50200af37356c74e503c79a94f5c81f32", size = 386453, upload-time = "2026-06-13T18:52:44.045Z" },
]
[[package]]
name = "pytest-asyncio"
-version = "1.3.0"
+version = "1.4.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pytest" },
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514, upload-time = "2026-05-26T09:56:04.083Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" },
+ { url = "https://files.pythonhosted.org/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", size = 16930, upload-time = "2026-05-26T09:56:02.576Z" },
]
[[package]]
@@ -932,27 +931,27 @@ wheels = [
[[package]]
name = "ruff"
-version = "0.15.15"
+version = "0.15.18"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/84/6f/a76f7d96e5c962f5b69cee865e49c15c1116897c01990faa8a57edb62e7f/ruff-0.15.15.tar.gz", hash = "sha256:b8dff018130b46d8e5bf0f926ef6b60cf871d6d5ae45fc9334e09632daa741d6", size = 4706985, upload-time = "2026-05-28T14:16:57.784Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/74/98/1295ad5a5aa9bc85bdcdfa5d82fe7b49c61af5657df4f227637ff9de0da6/ruff-0.15.18.tar.gz", hash = "sha256:2698a964c70e8bf402dcb99c8810472d270d141e7aa8c4e13599fd52033a2f33", size = 4761437, upload-time = "2026-06-18T18:25:39.224Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/fa/9d/3a45c05b8ab04b4705989de70a79008e27c8003296a0feaee9edc18dd7e9/ruff-0.15.15-py3-none-linux_armv6l.whl", hash = "sha256:cf93e5388f412e1b108b1f8b34a6e036b70fe8aff89393befad96fe48670311b", size = 10710652, upload-time = "2026-05-28T14:16:06.701Z" },
- { url = "https://files.pythonhosted.org/packages/05/66/da974431624bf3b49f6ee1f9543c02d929ff1cba78b0d5a79c38cf21f744/ruff-0.15.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac5a646d1f6a7dadd5d50842dae2c1f9862ac887ef5d1b1375e02def791fde6e", size = 11096615, upload-time = "2026-05-28T14:16:23.313Z" },
- { url = "https://files.pythonhosted.org/packages/8c/09/7443452e5d290230a712103f2fdceeef7184f3ec99a2bd01c8be78aaceb5/ruff-0.15.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:77d955a431430c66f72dd94e379ad38a16daea3d25094872ac4edf9e797be530", size = 10436683, upload-time = "2026-05-28T14:16:40.974Z" },
- { url = "https://files.pythonhosted.org/packages/53/01/d330c26a57fa4f3943a14424904027428315b700fe4d14a84bb123a649e5/ruff-0.15.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7614ee79c69788cf6cedd568069ade9cecc22a1ad20494efe8d0c9ebb4b622d4", size = 10769064, upload-time = "2026-05-28T14:16:28.905Z" },
- { url = "https://files.pythonhosted.org/packages/1d/85/cc8770f8bdff541b1da8392d1634141fe4a0e3f4ee596605959b7906c27f/ruff-0.15.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cdb1679e06a1f6b47bc384714ae96f6e2fb65ca441eb78c43d2ca554176ce1f", size = 10511987, upload-time = "2026-05-28T14:16:43.732Z" },
- { url = "https://files.pythonhosted.org/packages/7c/29/8c190c1472b63013583ba391f3342036e02010544c1270455ed8e519bdf3/ruff-0.15.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2728b93d7b23a603ea2c0ac6eb73d760bd38ec9de35f35fb41e18f7a3fee7622", size = 11275100, upload-time = "2026-05-28T14:16:55.244Z" },
- { url = "https://files.pythonhosted.org/packages/9f/6b/7e145ce2cc8e63d6834eca03d83a0e18d121def5c69f91b4cf4011ed4879/ruff-0.15.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be582fcc0db438902c7792b08d6ddf6c9b9e21addaa10092c2c741cfb09e5a45", size = 12176903, upload-time = "2026-05-28T14:16:14.368Z" },
- { url = "https://files.pythonhosted.org/packages/80/a3/d5974637f68e451f7fadf015cf3101d1cd7d8ba5027cffe0b9e3826ebe6b/ruff-0.15.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7aa77465b8ecaf1a27bea098d696f7fed5e1eccbd10b321b682d6de586ae5627", size = 11404550, upload-time = "2026-05-28T14:16:20.138Z" },
- { url = "https://files.pythonhosted.org/packages/fe/1c/e6e5e568f22be4fb05d6244234aba384c06b451252453b821e1a529263cf/ruff-0.15.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48decfa11d740de4889de623be1463308346312f2409a56e24aa280c86162dc4", size = 11382027, upload-time = "2026-05-28T14:16:46.615Z" },
- { url = "https://files.pythonhosted.org/packages/1d/01/170921b49fcd2e8858825593f91cf7146c3e40a5c3e6df763e4bb0484dde/ruff-0.15.15-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a5015088452ca0081387063649ec67f06d3d1d6b8b936a1f836b5e9657ecd48c", size = 11366041, upload-time = "2026-05-28T14:16:26.247Z" },
- { url = "https://files.pythonhosted.org/packages/87/54/a7bad711d7de93254e15e06a4c375b89a03d18de45d3e5dcc86a4472fb1a/ruff-0.15.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5294aab6356c81600fcdea3a62bb1b924dfd5e91767c12318d3f68f86af57cd", size = 10741795, upload-time = "2026-05-28T14:16:17.11Z" },
- { url = "https://files.pythonhosted.org/packages/c9/31/38c075963668f8b41c6914ee0f6f318727fbe30ab9145cb29e6df464c5fa/ruff-0.15.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:db5bd4d802415cca656dc1616070b725952d6ae95eb5d4831e49fbd94a38f75f", size = 10511117, upload-time = "2026-05-28T14:16:31.767Z" },
- { url = "https://files.pythonhosted.org/packages/9d/96/6ff689e1f7e375d1d97075eca022f74c2bab59554a432fe4d2e6f091986a/ruff-0.15.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:587a6278ed42059191c1a466e490bd7930fb50bd2e255398bc29616c895a61cb", size = 10994867, upload-time = "2026-05-28T14:16:35.149Z" },
- { url = "https://files.pythonhosted.org/packages/c3/c2/5dce0ab9f92a8d534fa62b9bf9caca3eddb8c1a81b616f5e195ada4f0d6e/ruff-0.15.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:df0c1c084f5f4be9812f61518a45c440d3c30d69ce4bf6c5270e66d38338f02a", size = 11482101, upload-time = "2026-05-28T14:16:49.598Z" },
- { url = "https://files.pythonhosted.org/packages/b1/c0/1003b60edd697c649faf61f1a34094b1abb38fb3d1181e3f895781250a08/ruff-0.15.15-py3-none-win32.whl", hash = "sha256:29428ea79694afbe756d45fd59b36f22b6b020dc0443cf7de0173046236964b9", size = 10716774, upload-time = "2026-05-28T14:16:52.337Z" },
- { url = "https://files.pythonhosted.org/packages/02/a8/1269eddd6945a06c23f055ef7848886e37cf9d6a8bebb386a3115f01470c/ruff-0.15.15-py3-none-win_amd64.whl", hash = "sha256:8df0323902e15e24bc4bf246da830573d3cf3352bd0b9a164eab335d111ff4a4", size = 11868463, upload-time = "2026-05-28T14:16:11.333Z" },
- { url = "https://files.pythonhosted.org/packages/4e/b2/920464c907b191e37469d477a1aa8bc048b8f36c4c1610dfa4ab87b39e18/ruff-0.15.15-py3-none-win_arm64.whl", hash = "sha256:3c8ceca6792f38196b8f589bc92eccd03eef286602da92e5dc05cc42ef6441b7", size = 11138498, upload-time = "2026-05-28T14:16:38.425Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/d0/686e984941269621e2be72612d5c1e461f8f7b38415a2a7d7a81c8ae6715/ruff-0.15.18-py3-none-linux_armv6l.whl", hash = "sha256:8b6850172348c8381b8b3084c5915a4393c2373b9b54cd5b5e1ea15812bc10df", size = 10887308, upload-time = "2026-06-18T18:25:03.062Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/21/bc4123e3f5515ee99f8ce1eb93a14a0628fe4d1678663cd08f933ac16931/ruff-0.15.18-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3fccc153a85417dcd976883160cacce486997b0a0058dd18f54b8aaaac7d1ce2", size = 11281305, upload-time = "2026-06-18T18:25:30.026Z" },
+ { url = "https://files.pythonhosted.org/packages/51/93/4769464c25cf7ab2acb3c7dda9cad3d867eb41c59565b3e2a9d17249c90c/ruff-0.15.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:08d4c86a68f2c3ec2c9d56380a71fb4a4f65373055cbb8caabd645e9102f38d4", size = 10641215, upload-time = "2026-06-18T18:25:15.802Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/42/56926d17120db2c208d76bf60a1a019644dd9e91dc27f0f95c9caddb1366/ruff-0.15.18-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37e5108745c2c0705da916d7d4de533ddf547051ef45f62888c31bae73f66318", size = 10957224, upload-time = "2026-06-18T18:25:36.955Z" },
+ { url = "https://files.pythonhosted.org/packages/22/4f/d43fab8d8189afde803103022d000a8ef9f230616d436d52a8b2b8d63b50/ruff-0.15.18-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56949a6ce8b3abde54c0bcb22cebfe57e8771cadc84b407ae8b8eaf67ebdcd43", size = 10699024, upload-time = "2026-06-18T18:25:05.707Z" },
+ { url = "https://files.pythonhosted.org/packages/63/42/1e3e4c68bd408b9768cf3e439acbe2c78245225faef253f7028a0cdb63e0/ruff-0.15.18-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01a754cd6a1b630d3f97e33eb452cf7a98040482318e870f8bc52a5a30e62657", size = 11491458, upload-time = "2026-06-18T18:25:20.275Z" },
+ { url = "https://files.pythonhosted.org/packages/20/77/47a3484bea8521e14a203d98c389c5c97846675e4f02734672da4a69b52a/ruff-0.15.18-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ba7a07e03a44dbf10bb086ee06705b173625014ec99f73a7e6836a5e5590a0c", size = 12383752, upload-time = "2026-06-18T18:25:22.535Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/ca/054159590787023d83b658a1a1819c4c8910114e7015069340b71c0961cb/ruff-0.15.18-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a2c40a41a4cadbcf5897b548ab29dfe248b20c540961c0247d98a3973c70403", size = 11577923, upload-time = "2026-06-18T18:25:10.702Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/ff/d353d6b7bbd73cc0ec37f4463d7540e45e894338abdd9964eee0de332708/ruff-0.15.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f0480ce690cbb6c4db6e5d08f19fce98e10ba131a8b60c1bcdac42771e3ae2d", size = 11583925, upload-time = "2026-06-18T18:25:32.391Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/4a/891f89b9c296ed3e5f3ece1a5629badc989d9a8fdaa30431aaf4774bc1c2/ruff-0.15.18-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2330215f1f393fa8733f55edce04fcf94c36a2c460fcde31f78cc84e4951e9b1", size = 11582834, upload-time = "2026-06-18T18:25:27.309Z" },
+ { url = "https://files.pythonhosted.org/packages/32/a3/ed9e370154bf85de360b93c03026157f02d4943b2d01ff4945f4429f8e8a/ruff-0.15.18-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6aa6a3d979e48ae617578183674bf264fbe7d0114a796a26bd678d67963c7ff", size = 10927328, upload-time = "2026-06-18T18:25:34.676Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/d1/5cf5909329fedb5d39d555ee818ba5cf4638e1a301b89785d34f2905bfcb/ruff-0.15.18-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a81beadbbff2c9c245561ae3f77b16709d87f35eec650d0501679239d3449b22", size = 10693187, upload-time = "2026-06-18T18:25:08.245Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/44/ff6c635cf2c4f4e7b618b6640da057376baa36014695487d88aed4794268/ruff-0.15.18-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2186d9e940ae332ab293623a75b5f4fe49565f449954d50a72a046683aa6b809", size = 11208721, upload-time = "2026-06-18T18:25:41.327Z" },
+ { url = "https://files.pythonhosted.org/packages/88/d9/5baa2a30861adfb7022cf33c1e35b2fc18085b08c16f83eff4c7b99a5f48/ruff-0.15.18-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5c2abf140438032bc77b2284a6c9944ecd8a19e5f1c7b52b1b8e4a0a80d19a7a", size = 11678599, upload-time = "2026-06-18T18:25:13.607Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/1a/0725a7cfdc32ff769efb96ee782bec882e16448c5d9e3be947ec4c04ce27/ruff-0.15.18-py3-none-win32.whl", hash = "sha256:02299e6e9fa5b297a3f6d5d10d7bcd655c925b028bb8b9d4588214549c6b9ec4", size = 10901903, upload-time = "2026-06-18T18:25:24.755Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/51/805d9f6fb7970505c3504794a5ec350f605361b807fef4dcf214ebd35e72/ruff-0.15.18-py3-none-win_amd64.whl", hash = "sha256:dac80dc8d26b2257dbefabed62f5d255c3937b4ccb122da1fc634794fa3578b3", size = 12041189, upload-time = "2026-06-18T18:25:17.915Z" },
+ { url = "https://files.pythonhosted.org/packages/29/4c/67bb45e41609eb4726f1bfeb59e083cf91d14c696d4bd14c234a980be93d/ruff-0.15.18-py3-none-win_arm64.whl", hash = "sha256:b2c9257fcbd4a3e5b977a1904e6facca016bafe2edc17df24db67cfaee03b4e4", size = 11329958, upload-time = "2026-06-18T18:25:43.686Z" },
]
[[package]]
@@ -1029,27 +1028,27 @@ wheels = [
[[package]]
name = "ty"
-version = "0.0.40"
+version = "0.0.50"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/5a/f8/a754c96967b71de8723f88be17df8738216bd382ffed229cd500b7a24d13/ty-0.0.40.tar.gz", hash = "sha256:883b53dd98f6e5b33ab1c8e1a3cd94b0f29c762ef22cdf1e86aaffb4fd711c67", size = 5726484, upload-time = "2026-05-27T17:55:43.615Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/ea/fa/930ab48010e89fd1ecccc8f588afc9a79d540a1e8a379cf9cb3a41812254/ty-0.0.50.tar.gz", hash = "sha256:74b8c0df3e7d3294110e9862b7f8a3767f0e073dcb6ffa27f69fd63fd876149c", size = 5935862, upload-time = "2026-06-17T21:36:42.04Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/2c/42/d029a72165ad39f95228b67355927fbd35c821dc8e3e475d49f47c2eeb1e/ty-0.0.40-py3-none-linux_armv6l.whl", hash = "sha256:9defb4742450e569a6a09de286a04008d6c2e815112da4362c88b6eaa2f52a36", size = 11406372, upload-time = "2026-05-27T17:55:49.633Z" },
- { url = "https://files.pythonhosted.org/packages/23/99/7f8ea09b7e49afbf795cb3341a3217f30f228db7e62a2268ed8cbbf813d6/ty-0.0.40-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:868258a3330db88b683fcafe2c4e936d6226a6312799bf15b585d93557b2d38c", size = 11159782, upload-time = "2026-05-27T17:55:47.405Z" },
- { url = "https://files.pythonhosted.org/packages/04/d8/1ea745ee97a98b26ae9564d19a430a76a35297cd450e84dcaad22e1f7ee8/ty-0.0.40-py3-none-macosx_11_0_arm64.whl", hash = "sha256:589c81060cf1e7a9ffa2f45bfa35ffd9b9fbd214104e3f13959f113627efcd91", size = 10594139, upload-time = "2026-05-27T17:55:37.206Z" },
- { url = "https://files.pythonhosted.org/packages/39/1a/fbef21273c6617ff4715b4827ee1c0b6550aa7d1df4b8c43b325545c1cf4/ty-0.0.40-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b06108990cb338d941c315ae6e9ba2fff8f518bc15d3f33e5619ff6a6c9beab", size = 11114156, upload-time = "2026-05-27T17:55:56.11Z" },
- { url = "https://files.pythonhosted.org/packages/3c/f9/389fc4976d7ec016a7473cf1274bf9c4f491bb54c66649bd022bff9f2b6a/ty-0.0.40-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3913ef37336bec4f96bd2512f8c3a543ca34c259b7170f7eb5adf75b3ed7f04c", size = 11189050, upload-time = "2026-05-27T17:55:54.099Z" },
- { url = "https://files.pythonhosted.org/packages/fa/a9/4ecabbf4bdda7df0d99d8d3892c6edac0efc8c4cae756a5109178a3d0e86/ty-0.0.40-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8fd1486bd5fe48779a8aa857137f3642a0a9161f5cf57d4380f4a0ecea01c8f3", size = 11664266, upload-time = "2026-05-27T17:55:28.17Z" },
- { url = "https://files.pythonhosted.org/packages/45/02/0aa78730116507c265afb1d6d5961c583b49d4c2e368c4a49fd81bcae6dc/ty-0.0.40-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1668364d5254a734329917ee66c2c5fdd5665389d41043f6fce0f22ddb32b749", size = 12187743, upload-time = "2026-05-27T17:56:04.337Z" },
- { url = "https://files.pythonhosted.org/packages/e6/68/ccabf2d173523598271a385c1d3f864dbda23e5ebdc67f5969b9e830ea05/ty-0.0.40-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f77a73edb91e5dfa2ab9af7c4cac64614f8cc121f38a8875f22e830d3aba6a", size = 11862999, upload-time = "2026-05-27T17:55:58.087Z" },
- { url = "https://files.pythonhosted.org/packages/03/8d/6d7ec22771bb23d534797cdb446eb644bccfe7a62b729bb99e7235a02fc3/ty-0.0.40-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1274ce0212ecbfed01bda7c3659c46e8bd0068e32d00c46c790466a95274c3df", size = 11743896, upload-time = "2026-05-27T17:56:00.017Z" },
- { url = "https://files.pythonhosted.org/packages/cd/a4/f9fa076b010c91cb249b1fcc3476569b7b8462cb4b688da2d04c23a0622f/ty-0.0.40-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5ee1261dbc363e5cc1a0c5bb0c8612c192bfe53491214df8bc85a540835685f9", size = 11883581, upload-time = "2026-05-27T17:56:02.319Z" },
- { url = "https://files.pythonhosted.org/packages/fd/0f/5b776a2328c756d574dd4d6afbd30fc24e1ab4b76935c7c3c23f27ebbcb9/ty-0.0.40-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6220e2cd5cdc4683dd87fb150d195bbd9f1a021395e04cb08bd3c66ea6da6ef8", size = 11093946, upload-time = "2026-05-27T17:55:33.284Z" },
- { url = "https://files.pythonhosted.org/packages/64/c4/eb23154bae83ad7c2935e9e5916660fb3e31598a92ee232aebd79410480c/ty-0.0.40-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:46b9ed69d01d98ef046afac9983c68336f572605ea2a27b90fbe6f80bfc8d6b7", size = 11210737, upload-time = "2026-05-27T17:55:45.523Z" },
- { url = "https://files.pythonhosted.org/packages/ff/19/1fb2529703f708cacfd13a89f98613cae2907dfa941b26976467e6119803/ty-0.0.40-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ddbca9fab4406260f141674ab5efcfe7b02bd468e6985e4cdde0a21626e69ffe", size = 11332563, upload-time = "2026-05-27T17:55:41.674Z" },
- { url = "https://files.pythonhosted.org/packages/87/69/b3f5a8ef26c31204e0391147b3adcdb0674eda3e7d99868478ef168a41c6/ty-0.0.40-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b1fcc082a749e6dc11b68fe9aab0420238bbf2a2374c2c7aa3c22e8c1618b136", size = 11843216, upload-time = "2026-05-27T17:55:35.367Z" },
- { url = "https://files.pythonhosted.org/packages/ac/e8/20193069d32787f3e1a6ec8940aaa3759d3de8f48f9281bcc0c5cb0939da/ty-0.0.40-py3-none-win32.whl", hash = "sha256:75feb115b3587824c5bdf8f8305e9547b0d1e398e3077b0addc7a1988ea9bb50", size = 10670731, upload-time = "2026-05-27T17:55:31.316Z" },
- { url = "https://files.pythonhosted.org/packages/a3/f9/8b2aa4da61db81322d4a2f9db227afeb48110ca15ae31d380f64c64ceb63/ty-0.0.40-py3-none-win_amd64.whl", hash = "sha256:b0f905edaad788bd61f779a85801b60a267a25ed57fca05aaddd168d9d8896be", size = 11766211, upload-time = "2026-05-27T17:55:51.898Z" },
- { url = "https://files.pythonhosted.org/packages/04/87/369056ed46f1b235130ec0595393262f9cd2061ca3dab276d490980f9343/ty-0.0.40-py3-none-win_arm64.whl", hash = "sha256:07da2b09d9130e2c9a257d2a29beb53105835b0256ee5fdb288fe1aab83fee47", size = 11117369, upload-time = "2026-05-27T17:55:39.329Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/81/2161de593e722ba27d04ee394d974604e8041c2246e2f75012d612c9934a/ty-0.0.50-py3-none-linux_armv6l.whl", hash = "sha256:b04a7717c22b9c66e9161e5af608669194cdd099c5ba0c507aeb479e6c1f9176", size = 11917031, upload-time = "2026-06-17T21:37:20.615Z" },
+ { url = "https://files.pythonhosted.org/packages/05/95/70c0f1915c91c9ed68b89a8f16741d73ad65628e334e1ae5691972003702/ty-0.0.50-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:cd8204f3a8df8fe68581e0b978124a90a143f35e3e7a7725a6e247b5ce1dcb33", size = 11675310, upload-time = "2026-06-17T21:36:51.627Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/6c/d0318ed6f52a6b184f6480137f5d1d3d6032fa81e4bd7eff495ccf4d2977/ty-0.0.50-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d336bbad38a68f16f16f84bb18f67215049b33196050c8ff67503e79619e70d2", size = 11060709, upload-time = "2026-06-17T21:36:47.226Z" },
+ { url = "https://files.pythonhosted.org/packages/13/13/aff2242a51d66e4b99b71bb24081cf274b58db2909f82041ebd1f4bb2e35/ty-0.0.50-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3933810d0360a108c60cd3ea56e6c2eba2f5ecf7ee99d66ff30775d2ae9ed29", size = 11577192, upload-time = "2026-06-17T21:37:13.953Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/c0/46ceb4dd1f6a8a89027e5af6bc7171301e545e7d179403c06e4067c24dee/ty-0.0.50-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:88eed477756c7a0280a38de60bcabc64b3c6dcea1ac8b2a41c9210896358f6b9", size = 11693109, upload-time = "2026-06-17T21:37:09.589Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/9c/347e3d9959cd39641a54fc74dd4c152863f55c9079b9e16e9b4c35dd5775/ty-0.0.50-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caa5d1c76f75cb6d3105ec8bf835c0a8fbc0950ccf15e3d1e9c52cb99b0ab2f5", size = 12190755, upload-time = "2026-06-17T21:36:49.193Z" },
+ { url = "https://files.pythonhosted.org/packages/85/ca/d8226604f57a8f1ead1973b01f2f8c987a60d0fc09f726cbc9a7ef074dad/ty-0.0.50-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d323f2a663e260923c11434655e95f37e04865b1e1641288a23cbcbca53074ee", size = 12761345, upload-time = "2026-06-17T21:36:55.81Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/23/0adcbd4676b30f6b58741ce2c1218c73988fdc8fb8c276005df2fe1817a3/ty-0.0.50-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d61cf42b8517e774354466252b085d83cdd0b51d771a63f99a4f21d5a44afc52", size = 12387850, upload-time = "2026-06-17T21:36:53.611Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/43/254fd544e95ec6f2368aab9cc9f7ffdf1329ad95d2c9f62dea22f986bee2/ty-0.0.50-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbcd0ee844fd551bd946bb9d4fd2baf39a12aa0ad2f9f64db48352a82758abb3", size = 12220520, upload-time = "2026-06-17T21:37:00.127Z" },
+ { url = "https://files.pythonhosted.org/packages/51/cd/711e649397e34d14f63d42586aebede0d4006a1a77c8c4c63bf4fb36bcbe/ty-0.0.50-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:8acf55714ec075997edfbf4dfd7ba3241c18c773e96f41398bb6d8008b83751a", size = 12439071, upload-time = "2026-06-17T21:36:57.921Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/48/743d3ff46307e904377ac264d6c365ef25fd6e36cbc12c10c73437fef3de/ty-0.0.50-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:8b1e02ff71af62d7a1d9b8bfef98847f5c8bfd5bb8ae6da691cea405eb5a5e98", size = 11532092, upload-time = "2026-06-17T21:37:04.892Z" },
+ { url = "https://files.pythonhosted.org/packages/27/b5/5589976874b04a62de124f8f79fc11a45207d27f1c1fd2e7b7ddfa55aeea/ty-0.0.50-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7781ace006ab6b8bb9a7591dc20d1aaa79549d9d4e8169e5dc5cf8eef0754cd7", size = 11706451, upload-time = "2026-06-17T21:37:02.5Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/f4/e15ea290712e61528287a353cb3103b744a092ea0a59039f17a035960717/ty-0.0.50-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e8015a10f4caf07edc9245f178e64ea388bddb9fb8d2d73d2dc1cfe6b9790493", size = 11842752, upload-time = "2026-06-17T21:37:18.12Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/35/323b949d29cf6be2a71638498a1c43e4a2b84a1c1d206228cf3415384604/ty-0.0.50-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:87289648401648f455823334f2a8c67bbc341d502033591c8b044e67537e661b", size = 12325834, upload-time = "2026-06-17T21:37:16.124Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/0a/5128b055493e41cb37f4f2a24a8ffce657e8c0d01086000c5f234d9b4622/ty-0.0.50-py3-none-win32.whl", hash = "sha256:ca73efc88be2942c1733e88b026f1cea88cafeca0ee63742dd673971d9a96642", size = 11171705, upload-time = "2026-06-17T21:36:45.191Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/65/91ffda139aa2b1d5c0fd321c859c5d10b7a912779d426422c4b25bca4362/ty-0.0.50-py3-none-win_amd64.whl", hash = "sha256:229d08c069beb2d896cc5556c3ba0e7f4c1b6d6a885297fabf2e6bcafa382a71", size = 12319493, upload-time = "2026-06-17T21:37:11.738Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/4c/0c1ca628c5da7840e16801caa0bfeed1241e1113d8a5156a34245d4fa927/ty-0.0.50-py3-none-win_arm64.whl", hash = "sha256:96a84d970b59f2eddb92a4af3ba9906f24bda118cf487d923765ccd4ca24627b", size = 11635811, upload-time = "2026-06-17T21:37:07.191Z" },
]
[[package]]
From 1a4a1d10cbbf325f2139f3246481bba779dc4988 Mon Sep 17 00:00:00 2001
From: Spencer Churchill <25377399+splch@users.noreply.github.com>
Date: Wed, 24 Jun 2026 14:12:01 -0700
Subject: [PATCH 5/7] Regenerate client with openapi-python-client 0.29.0
Pulls in the pending dependabot bumps (openapi-python-client 0.29.0,
ruff 0.15.18, ty 0.0.50, pytest 9.1.0, pytest-asyncio 1.4.0,
actions/checkout 6.0.3, ruff-pre-commit v0.15.15) and regenerates the
client against them.
- 0.29.0 parses timestamps via stdlib datetime.fromisoformat instead of
dateutil.parser.isoparse, so drop the now-unused python-dateutil runtime
dependency.
- 0.29.0 emits bare 'return value' (not cast(Enum, value)) in the generated
enum check_* helpers, which ty 0.0.50 flags as invalid-return-type since
it can't narrow str to the Literal through the 'value in ' guard.
Ignore that rule for ionq_core/models/** (the only place those helpers
live; api/** return types stay checked), mirroring the existing
invalid-argument-type override for generated code.
---
CHANGELOG.md | 2 ++
ionq_core/api/default/cancel_jobs.py | 1 -
ionq_core/api/default/clone_job.py | 1 -
ionq_core/api/default/create_job.py | 1 -
ionq_core/api/default/create_session.py | 1 -
ionq_core/api/default/delete_jobs.py | 1 -
ionq_core/api/usage/get_usages.py | 1 -
ionq_core/models/api_cost_model.py | 4 ++--
.../circuit_job_creation_payload_type.py | 4 ++--
ionq_core/models/failure_code.py | 4 ++--
ionq_core/models/get_backend_backend.py | 4 ++--
.../models/get_characterization_backend.py | 4 ++--
...t_characterizations_for_backend_backend.py | 4 ++--
...ate_response_rate_information_rate_type.py | 4 ++--
ionq_core/models/group_by.py | 4 ++--
.../hamiltonian_energy_input_data_type.py | 4 ++--
.../models/job_canceled_response_status.py | 4 ++--
.../models/job_deleted_response_status.py | 4 ++--
ionq_core/models/job_q_ctrl_status.py | 4 ++--
ionq_core/models/job_status.py | 4 ++--
.../models/jobs_canceled_response_status.py | 4 ++--
.../models/jobs_deleted_response_status.py | 4 ++--
.../json_multi_circuit_input_gateset.py | 4 ++--
.../models/json_multi_circuit_job_type.py | 4 ++--
ionq_core/models/modality.py | 4 ++--
ionq_core/models/native_circuit_gateset.py | 4 ++--
.../models/native_circuit_input_gateset.py | 4 ++--
ionq_core/models/native_gate.py | 4 ++--
ionq_core/models/noise_model.py | 4 ++--
.../qctrl_qaoa_job_creation_payload_type.py | 4 ++--
.../qctrl_qaoa_job_input_problem_type.py | 4 ++--
ionq_core/models/qis_circuit_gateset.py | 4 ++--
ionq_core/models/qis_circuit_input_gateset.py | 4 ++--
ionq_core/models/qis_gate.py | 4 ++--
...ntum_function_job_creation_payload_type.py | 4 ++--
ionq_core/models/session.py | 7 +++---
ionq_core/models/session_settings.py | 3 +--
ionq_core/models/session_status_enum.py | 4 ++--
ionq_core/models/usage.py | 3 +--
ionq_core/models/usages.py | 5 ++--
pyproject.toml | 10 +++++++-
uv.lock | 23 -------------------
42 files changed, 76 insertions(+), 99 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 496cab0..706ed79 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,11 +18,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
### Changed
- `NativeCircuitInput.qubits` and `JsonMultiCircuitInput.qubits` are now `int | Unset` (previously `float | Unset`), matching upstream's tightening to `format: int32, minimum: 1`. `QisCircuitInput.qubits` already had this type locally via the OpenAPI overlay; that overlay action has been removed now that upstream is correct natively.
+- Regenerated with `openapi-python-client` 0.29.0. Generated models now parse timestamps with the standard library (`datetime.fromisoformat`) instead of `dateutil.parser.isoparse`.
### Removed
- `get_compiled_file` endpoint (`GET /jobs/{UUID}/circuits/{lang}`) and its `GetCompiledFileLang` enum, removed upstream in favor of `get_job_artifact`. Compiled circuits are now fetched as artifacts by id rather than by `lang` (`"native"` / `"qasm3"`).
- `CostModel` model, replaced by `ApiCostModel`.
+- The `python-dateutil` runtime dependency, no longer needed now that generated code uses `datetime.fromisoformat`.
## [0.1.1] - 2026-04-30
diff --git a/ionq_core/api/default/cancel_jobs.py b/ionq_core/api/default/cancel_jobs.py
index 84f0de1..389caea 100644
--- a/ionq_core/api/default/cancel_jobs.py
+++ b/ionq_core/api/default/cancel_jobs.py
@@ -37,7 +37,6 @@ def _get_kwargs(
_kwargs["json"] = body.to_dict()
-
headers["Content-Type"] = "application/json"
_kwargs["headers"] = headers
diff --git a/ionq_core/api/default/clone_job.py b/ionq_core/api/default/clone_job.py
index c31d8f1..8dbd54a 100644
--- a/ionq_core/api/default/clone_job.py
+++ b/ionq_core/api/default/clone_job.py
@@ -38,7 +38,6 @@ def _get_kwargs(
_kwargs["json"] = body.to_dict()
-
headers["Content-Type"] = "application/json"
_kwargs["headers"] = headers
diff --git a/ionq_core/api/default/create_job.py b/ionq_core/api/default/create_job.py
index b75f365..14e3cfc 100644
--- a/ionq_core/api/default/create_job.py
+++ b/ionq_core/api/default/create_job.py
@@ -49,7 +49,6 @@ def _get_kwargs(
_kwargs["json"] = body.to_dict()
-
headers["Content-Type"] = "application/json"
_kwargs["headers"] = headers
diff --git a/ionq_core/api/default/create_session.py b/ionq_core/api/default/create_session.py
index aaf44dc..97a40f3 100644
--- a/ionq_core/api/default/create_session.py
+++ b/ionq_core/api/default/create_session.py
@@ -37,7 +37,6 @@ def _get_kwargs(
_kwargs["json"] = body.to_dict()
-
headers["Content-Type"] = "application/json"
_kwargs["headers"] = headers
diff --git a/ionq_core/api/default/delete_jobs.py b/ionq_core/api/default/delete_jobs.py
index 0fa77be..34711b0 100644
--- a/ionq_core/api/default/delete_jobs.py
+++ b/ionq_core/api/default/delete_jobs.py
@@ -37,7 +37,6 @@ def _get_kwargs(
_kwargs["json"] = body.to_dict()
-
headers["Content-Type"] = "application/json"
_kwargs["headers"] = headers
diff --git a/ionq_core/api/usage/get_usages.py b/ionq_core/api/usage/get_usages.py
index a3a771b..8d12949 100644
--- a/ionq_core/api/usage/get_usages.py
+++ b/ionq_core/api/usage/get_usages.py
@@ -17,7 +17,6 @@
from ...models.modality import check_modality
from ...models.modality import Modality
from ...models.usages import Usages
-from dateutil.parser import isoparse
from typing import cast
from uuid import UUID
import datetime
diff --git a/ionq_core/models/api_cost_model.py b/ionq_core/models/api_cost_model.py
index 16efbee..dff6dc1 100644
--- a/ionq_core/models/api_cost_model.py
+++ b/ionq_core/models/api_cost_model.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
ApiCostModel = Literal['2QGE_operations', 'QCT']
@@ -10,5 +10,5 @@
def check_api_cost_model(value: str) -> ApiCostModel:
if value in API_COST_MODEL_VALUES:
- return cast(ApiCostModel, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {API_COST_MODEL_VALUES!r}")
diff --git a/ionq_core/models/circuit_job_creation_payload_type.py b/ionq_core/models/circuit_job_creation_payload_type.py
index cf22404..b10f4fc 100644
--- a/ionq_core/models/circuit_job_creation_payload_type.py
+++ b/ionq_core/models/circuit_job_creation_payload_type.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
CircuitJobCreationPayloadType = Literal['ionq.circuit.v1']
@@ -10,5 +10,5 @@
def check_circuit_job_creation_payload_type(value: str) -> CircuitJobCreationPayloadType:
if value in CIRCUIT_JOB_CREATION_PAYLOAD_TYPE_VALUES:
- return cast(CircuitJobCreationPayloadType, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {CIRCUIT_JOB_CREATION_PAYLOAD_TYPE_VALUES!r}")
diff --git a/ionq_core/models/failure_code.py b/ionq_core/models/failure_code.py
index 637824f..bea2a2c 100644
--- a/ionq_core/models/failure_code.py
+++ b/ionq_core/models/failure_code.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
FailureCode = Literal['CompilationError', 'ContractExpiredError', 'DebiasingError', 'InternalError', 'InvalidInput', 'NotEnoughQubits', 'OptimizationError', 'PreflightError', 'QuantumCircuitComplexityError', 'QuantumComputerError', 'QuotaExhaustedError', 'SimulationError', 'SimulationTimeout', 'SystemCancel', 'TooLongPredictedExecutionTime', 'TooManyControls', 'TooManyGates', 'TooManyShots', 'UnknownBillingError', 'UnsupportedGate']
@@ -10,5 +10,5 @@
def check_failure_code(value: str) -> FailureCode:
if value in FAILURE_CODE_VALUES:
- return cast(FailureCode, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {FAILURE_CODE_VALUES!r}")
diff --git a/ionq_core/models/get_backend_backend.py b/ionq_core/models/get_backend_backend.py
index 5f503a4..d0876c8 100644
--- a/ionq_core/models/get_backend_backend.py
+++ b/ionq_core/models/get_backend_backend.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
GetBackendBackend = Literal['qpu.aria-1', 'qpu.aria-2', 'qpu.forte-1', 'qpu.forte-enterprise-1', 'qpu.forte-enterprise-2', 'qpu.forte-enterprise-3']
@@ -10,5 +10,5 @@
def check_get_backend_backend(value: str) -> GetBackendBackend:
if value in GET_BACKEND_BACKEND_VALUES:
- return cast(GetBackendBackend, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {GET_BACKEND_BACKEND_VALUES!r}")
diff --git a/ionq_core/models/get_characterization_backend.py b/ionq_core/models/get_characterization_backend.py
index c9cb7a2..fb94b21 100644
--- a/ionq_core/models/get_characterization_backend.py
+++ b/ionq_core/models/get_characterization_backend.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
GetCharacterizationBackend = Literal['qpu.aria-1', 'qpu.aria-2', 'qpu.forte-1', 'qpu.forte-enterprise-1', 'qpu.forte-enterprise-2', 'qpu.forte-enterprise-3']
@@ -10,5 +10,5 @@
def check_get_characterization_backend(value: str) -> GetCharacterizationBackend:
if value in GET_CHARACTERIZATION_BACKEND_VALUES:
- return cast(GetCharacterizationBackend, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {GET_CHARACTERIZATION_BACKEND_VALUES!r}")
diff --git a/ionq_core/models/get_characterizations_for_backend_backend.py b/ionq_core/models/get_characterizations_for_backend_backend.py
index a7fd152..5a7543f 100644
--- a/ionq_core/models/get_characterizations_for_backend_backend.py
+++ b/ionq_core/models/get_characterizations_for_backend_backend.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
GetCharacterizationsForBackendBackend = Literal['qpu.aria-1', 'qpu.aria-2', 'qpu.forte-1', 'qpu.forte-enterprise-1', 'qpu.forte-enterprise-2', 'qpu.forte-enterprise-3']
@@ -10,5 +10,5 @@
def check_get_characterizations_for_backend_backend(value: str) -> GetCharacterizationsForBackendBackend:
if value in GET_CHARACTERIZATIONS_FOR_BACKEND_BACKEND_VALUES:
- return cast(GetCharacterizationsForBackendBackend, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {GET_CHARACTERIZATIONS_FOR_BACKEND_BACKEND_VALUES!r}")
diff --git a/ionq_core/models/get_job_estimate_response_rate_information_rate_type.py b/ionq_core/models/get_job_estimate_response_rate_information_rate_type.py
index 84b4dac..be8103b 100644
--- a/ionq_core/models/get_job_estimate_response_rate_information_rate_type.py
+++ b/ionq_core/models/get_job_estimate_response_rate_information_rate_type.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
GetJobEstimateResponseRateInformationRateType = Literal['2qge', 'qct']
@@ -10,5 +10,5 @@
def check_get_job_estimate_response_rate_information_rate_type(value: str) -> GetJobEstimateResponseRateInformationRateType:
if value in GET_JOB_ESTIMATE_RESPONSE_RATE_INFORMATION_RATE_TYPE_VALUES:
- return cast(GetJobEstimateResponseRateInformationRateType, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {GET_JOB_ESTIMATE_RESPONSE_RATE_INFORMATION_RATE_TYPE_VALUES!r}")
diff --git a/ionq_core/models/group_by.py b/ionq_core/models/group_by.py
index 4911ec5..194fdee 100644
--- a/ionq_core/models/group_by.py
+++ b/ionq_core/models/group_by.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
GroupBy = Literal['job', 'project', 'user']
@@ -10,5 +10,5 @@
def check_group_by(value: str) -> GroupBy:
if value in GROUP_BY_VALUES:
- return cast(GroupBy, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {GROUP_BY_VALUES!r}")
diff --git a/ionq_core/models/hamiltonian_energy_input_data_type.py b/ionq_core/models/hamiltonian_energy_input_data_type.py
index 477696b..01800e8 100644
--- a/ionq_core/models/hamiltonian_energy_input_data_type.py
+++ b/ionq_core/models/hamiltonian_energy_input_data_type.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
HamiltonianEnergyInputDataType = Literal['hamiltonian-energy']
@@ -10,5 +10,5 @@
def check_hamiltonian_energy_input_data_type(value: str) -> HamiltonianEnergyInputDataType:
if value in HAMILTONIAN_ENERGY_INPUT_DATA_TYPE_VALUES:
- return cast(HamiltonianEnergyInputDataType, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {HAMILTONIAN_ENERGY_INPUT_DATA_TYPE_VALUES!r}")
diff --git a/ionq_core/models/job_canceled_response_status.py b/ionq_core/models/job_canceled_response_status.py
index 621b41c..c94b2d7 100644
--- a/ionq_core/models/job_canceled_response_status.py
+++ b/ionq_core/models/job_canceled_response_status.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
JobCanceledResponseStatus = Literal['canceled']
@@ -10,5 +10,5 @@
def check_job_canceled_response_status(value: str) -> JobCanceledResponseStatus:
if value in JOB_CANCELED_RESPONSE_STATUS_VALUES:
- return cast(JobCanceledResponseStatus, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {JOB_CANCELED_RESPONSE_STATUS_VALUES!r}")
diff --git a/ionq_core/models/job_deleted_response_status.py b/ionq_core/models/job_deleted_response_status.py
index 111c8a6..2c8cc24 100644
--- a/ionq_core/models/job_deleted_response_status.py
+++ b/ionq_core/models/job_deleted_response_status.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
JobDeletedResponseStatus = Literal['deleted']
@@ -10,5 +10,5 @@
def check_job_deleted_response_status(value: str) -> JobDeletedResponseStatus:
if value in JOB_DELETED_RESPONSE_STATUS_VALUES:
- return cast(JobDeletedResponseStatus, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {JOB_DELETED_RESPONSE_STATUS_VALUES!r}")
diff --git a/ionq_core/models/job_q_ctrl_status.py b/ionq_core/models/job_q_ctrl_status.py
index d265a8e..ebdd475 100644
--- a/ionq_core/models/job_q_ctrl_status.py
+++ b/ionq_core/models/job_q_ctrl_status.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
JobQCtrlStatus = Literal['complete', 'max_iteration', 'running']
@@ -10,5 +10,5 @@
def check_job_q_ctrl_status(value: str) -> JobQCtrlStatus:
if value in JOB_Q_CTRL_STATUS_VALUES:
- return cast(JobQCtrlStatus, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {JOB_Q_CTRL_STATUS_VALUES!r}")
diff --git a/ionq_core/models/job_status.py b/ionq_core/models/job_status.py
index 26c1d72..395e0c1 100644
--- a/ionq_core/models/job_status.py
+++ b/ionq_core/models/job_status.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
JobStatus = Literal['canceled', 'completed', 'failed', 'ready', 'started', 'submitted']
@@ -10,5 +10,5 @@
def check_job_status(value: str) -> JobStatus:
if value in JOB_STATUS_VALUES:
- return cast(JobStatus, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {JOB_STATUS_VALUES!r}")
diff --git a/ionq_core/models/jobs_canceled_response_status.py b/ionq_core/models/jobs_canceled_response_status.py
index 0b6f954..040284c 100644
--- a/ionq_core/models/jobs_canceled_response_status.py
+++ b/ionq_core/models/jobs_canceled_response_status.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
JobsCanceledResponseStatus = Literal['canceled']
@@ -10,5 +10,5 @@
def check_jobs_canceled_response_status(value: str) -> JobsCanceledResponseStatus:
if value in JOBS_CANCELED_RESPONSE_STATUS_VALUES:
- return cast(JobsCanceledResponseStatus, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {JOBS_CANCELED_RESPONSE_STATUS_VALUES!r}")
diff --git a/ionq_core/models/jobs_deleted_response_status.py b/ionq_core/models/jobs_deleted_response_status.py
index 487de95..0cfa7a8 100644
--- a/ionq_core/models/jobs_deleted_response_status.py
+++ b/ionq_core/models/jobs_deleted_response_status.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
JobsDeletedResponseStatus = Literal['deleted']
@@ -10,5 +10,5 @@
def check_jobs_deleted_response_status(value: str) -> JobsDeletedResponseStatus:
if value in JOBS_DELETED_RESPONSE_STATUS_VALUES:
- return cast(JobsDeletedResponseStatus, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {JOBS_DELETED_RESPONSE_STATUS_VALUES!r}")
diff --git a/ionq_core/models/json_multi_circuit_input_gateset.py b/ionq_core/models/json_multi_circuit_input_gateset.py
index e271202..eef9754 100644
--- a/ionq_core/models/json_multi_circuit_input_gateset.py
+++ b/ionq_core/models/json_multi_circuit_input_gateset.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
JsonMultiCircuitInputGateset = Literal['native', 'qis']
@@ -10,5 +10,5 @@
def check_json_multi_circuit_input_gateset(value: str) -> JsonMultiCircuitInputGateset:
if value in JSON_MULTI_CIRCUIT_INPUT_GATESET_VALUES:
- return cast(JsonMultiCircuitInputGateset, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {JSON_MULTI_CIRCUIT_INPUT_GATESET_VALUES!r}")
diff --git a/ionq_core/models/json_multi_circuit_job_type.py b/ionq_core/models/json_multi_circuit_job_type.py
index 019b14d..8dfab5e 100644
--- a/ionq_core/models/json_multi_circuit_job_type.py
+++ b/ionq_core/models/json_multi_circuit_job_type.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
JSONMultiCircuitJobType = Literal['ionq.multi-circuit.v1']
@@ -10,5 +10,5 @@
def check_json_multi_circuit_job_type(value: str) -> JSONMultiCircuitJobType:
if value in JSON_MULTI_CIRCUIT_JOB_TYPE_VALUES:
- return cast(JSONMultiCircuitJobType, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {JSON_MULTI_CIRCUIT_JOB_TYPE_VALUES!r}")
diff --git a/ionq_core/models/modality.py b/ionq_core/models/modality.py
index 6bd70eb..c9692d1 100644
--- a/ionq_core/models/modality.py
+++ b/ionq_core/models/modality.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
Modality = Literal['daily', 'monthly', 'weekly']
@@ -10,5 +10,5 @@
def check_modality(value: str) -> Modality:
if value in MODALITY_VALUES:
- return cast(Modality, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {MODALITY_VALUES!r}")
diff --git a/ionq_core/models/native_circuit_gateset.py b/ionq_core/models/native_circuit_gateset.py
index 366d55a..67d3e05 100644
--- a/ionq_core/models/native_circuit_gateset.py
+++ b/ionq_core/models/native_circuit_gateset.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
NativeCircuitGateset = Literal['native']
@@ -10,5 +10,5 @@
def check_native_circuit_gateset(value: str) -> NativeCircuitGateset:
if value in NATIVE_CIRCUIT_GATESET_VALUES:
- return cast(NativeCircuitGateset, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {NATIVE_CIRCUIT_GATESET_VALUES!r}")
diff --git a/ionq_core/models/native_circuit_input_gateset.py b/ionq_core/models/native_circuit_input_gateset.py
index 8cb7f22..be32190 100644
--- a/ionq_core/models/native_circuit_input_gateset.py
+++ b/ionq_core/models/native_circuit_input_gateset.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
NativeCircuitInputGateset = Literal['native']
@@ -10,5 +10,5 @@
def check_native_circuit_input_gateset(value: str) -> NativeCircuitInputGateset:
if value in NATIVE_CIRCUIT_INPUT_GATESET_VALUES:
- return cast(NativeCircuitInputGateset, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {NATIVE_CIRCUIT_INPUT_GATESET_VALUES!r}")
diff --git a/ionq_core/models/native_gate.py b/ionq_core/models/native_gate.py
index 2d408f1..9a9537b 100644
--- a/ionq_core/models/native_gate.py
+++ b/ionq_core/models/native_gate.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
NativeGate = Literal['gpi', 'gpi2', 'ms', 'nop', 'zz']
@@ -10,5 +10,5 @@
def check_native_gate(value: str) -> NativeGate:
if value in NATIVE_GATE_VALUES:
- return cast(NativeGate, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {NATIVE_GATE_VALUES!r}")
diff --git a/ionq_core/models/noise_model.py b/ionq_core/models/noise_model.py
index d043f12..77dcd4b 100644
--- a/ionq_core/models/noise_model.py
+++ b/ionq_core/models/noise_model.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
NoiseModel = Literal['aria-1', 'aria-2', 'forte-1', 'forte-enterprise-1', 'harmony', 'harmony-1', 'harmony-2', 'ideal']
@@ -10,5 +10,5 @@
def check_noise_model(value: str) -> NoiseModel:
if value in NOISE_MODEL_VALUES:
- return cast(NoiseModel, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {NOISE_MODEL_VALUES!r}")
diff --git a/ionq_core/models/qctrl_qaoa_job_creation_payload_type.py b/ionq_core/models/qctrl_qaoa_job_creation_payload_type.py
index 8f8d8a8..568f118 100644
--- a/ionq_core/models/qctrl_qaoa_job_creation_payload_type.py
+++ b/ionq_core/models/qctrl_qaoa_job_creation_payload_type.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
QctrlQaoaJobCreationPayloadType = Literal['qctrl.qaoa.v1']
@@ -10,5 +10,5 @@
def check_qctrl_qaoa_job_creation_payload_type(value: str) -> QctrlQaoaJobCreationPayloadType:
if value in QCTRL_QAOA_JOB_CREATION_PAYLOAD_TYPE_VALUES:
- return cast(QctrlQaoaJobCreationPayloadType, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {QCTRL_QAOA_JOB_CREATION_PAYLOAD_TYPE_VALUES!r}")
diff --git a/ionq_core/models/qctrl_qaoa_job_input_problem_type.py b/ionq_core/models/qctrl_qaoa_job_input_problem_type.py
index ef9c929..d94d604 100644
--- a/ionq_core/models/qctrl_qaoa_job_input_problem_type.py
+++ b/ionq_core/models/qctrl_qaoa_job_input_problem_type.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
QctrlQaoaJobInputProblemType = Literal['maxcut']
@@ -10,5 +10,5 @@
def check_qctrl_qaoa_job_input_problem_type(value: str) -> QctrlQaoaJobInputProblemType:
if value in QCTRL_QAOA_JOB_INPUT_PROBLEM_TYPE_VALUES:
- return cast(QctrlQaoaJobInputProblemType, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {QCTRL_QAOA_JOB_INPUT_PROBLEM_TYPE_VALUES!r}")
diff --git a/ionq_core/models/qis_circuit_gateset.py b/ionq_core/models/qis_circuit_gateset.py
index 5b4bab8..c59b424 100644
--- a/ionq_core/models/qis_circuit_gateset.py
+++ b/ionq_core/models/qis_circuit_gateset.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
QISCircuitGateset = Literal['qis']
@@ -10,5 +10,5 @@
def check_qis_circuit_gateset(value: str) -> QISCircuitGateset:
if value in QIS_CIRCUIT_GATESET_VALUES:
- return cast(QISCircuitGateset, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {QIS_CIRCUIT_GATESET_VALUES!r}")
diff --git a/ionq_core/models/qis_circuit_input_gateset.py b/ionq_core/models/qis_circuit_input_gateset.py
index 3a0ec9c..3755e9b 100644
--- a/ionq_core/models/qis_circuit_input_gateset.py
+++ b/ionq_core/models/qis_circuit_input_gateset.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
QisCircuitInputGateset = Literal['qis']
@@ -10,5 +10,5 @@
def check_qis_circuit_input_gateset(value: str) -> QisCircuitInputGateset:
if value in QIS_CIRCUIT_INPUT_GATESET_VALUES:
- return cast(QisCircuitInputGateset, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {QIS_CIRCUIT_INPUT_GATESET_VALUES!r}")
diff --git a/ionq_core/models/qis_gate.py b/ionq_core/models/qis_gate.py
index d4a5915..e5dec6e 100644
--- a/ionq_core/models/qis_gate.py
+++ b/ionq_core/models/qis_gate.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
QisGate = Literal['cnot', 'h', 'not', 'pauliexp', 'rx', 'ry', 'rz', 's', 'si', 'swap', 't', 'ti', 'v', 'vi', 'x', 'xx', 'y', 'yy', 'z', 'zz']
@@ -10,5 +10,5 @@
def check_qis_gate(value: str) -> QisGate:
if value in QIS_GATE_VALUES:
- return cast(QisGate, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {QIS_GATE_VALUES!r}")
diff --git a/ionq_core/models/quantum_function_job_creation_payload_type.py b/ionq_core/models/quantum_function_job_creation_payload_type.py
index 1663dda..ab9a0bd 100644
--- a/ionq_core/models/quantum_function_job_creation_payload_type.py
+++ b/ionq_core/models/quantum_function_job_creation_payload_type.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
QuantumFunctionJobCreationPayloadType = Literal['quantum-function']
@@ -10,5 +10,5 @@
def check_quantum_function_job_creation_payload_type(value: str) -> QuantumFunctionJobCreationPayloadType:
if value in QUANTUM_FUNCTION_JOB_CREATION_PAYLOAD_TYPE_VALUES:
- return cast(QuantumFunctionJobCreationPayloadType, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {QUANTUM_FUNCTION_JOB_CREATION_PAYLOAD_TYPE_VALUES!r}")
diff --git a/ionq_core/models/session.py b/ionq_core/models/session.py
index 152a27b..27678b3 100644
--- a/ionq_core/models/session.py
+++ b/ionq_core/models/session.py
@@ -15,7 +15,6 @@
from ..models.session_status_enum import check_session_status_enum
from ..models.session_status_enum import SessionStatusEnum
from ..types import UNSET, Unset
-from dateutil.parser import isoparse
from typing import cast
import datetime
@@ -134,7 +133,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
d = dict(src_dict)
id = d.pop("id")
- created_at = isoparse(d.pop("created_at"))
+ created_at = datetime.datetime.fromisoformat(d.pop("created_at"))
@@ -171,7 +170,7 @@ def _parse_ended_at(data: object) -> datetime.datetime | None:
try:
if not isinstance(data, str):
raise TypeError()
- ended_at_type_0 = isoparse(data)
+ ended_at_type_0 = datetime.datetime.fromisoformat(data)
@@ -204,7 +203,7 @@ def _parse_started_at(data: object) -> datetime.datetime | None:
try:
if not isinstance(data, str):
raise TypeError()
- started_at_type_0 = isoparse(data)
+ started_at_type_0 = datetime.datetime.fromisoformat(data)
diff --git a/ionq_core/models/session_settings.py b/ionq_core/models/session_settings.py
index 6698baa..940ea98 100644
--- a/ionq_core/models/session_settings.py
+++ b/ionq_core/models/session_settings.py
@@ -13,7 +13,6 @@
from ..types import UNSET, Unset
from ..types import UNSET, Unset
-from dateutil.parser import isoparse
from typing import cast
import datetime
@@ -102,7 +101,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
if isinstance(_expires_at, Unset):
expires_at = UNSET
else:
- expires_at = isoparse(_expires_at)
+ expires_at = datetime.datetime.fromisoformat(_expires_at)
diff --git a/ionq_core/models/session_status_enum.py b/ionq_core/models/session_status_enum.py
index 7ac3b85..d9876d1 100644
--- a/ionq_core/models/session_status_enum.py
+++ b/ionq_core/models/session_status_enum.py
@@ -2,7 +2,7 @@
# SPDX-License-Identifier: Apache-2.0
# @generated
-from typing import Literal, cast
+from typing import Literal
SessionStatusEnum = Literal['created', 'ended', 'started']
@@ -10,5 +10,5 @@
def check_session_status_enum(value: str) -> SessionStatusEnum:
if value in SESSION_STATUS_ENUM_VALUES:
- return cast(SessionStatusEnum, value)
+ return value
raise TypeError(f"Unexpected value {value!r}. Expected one of {SESSION_STATUS_ENUM_VALUES!r}")
diff --git a/ionq_core/models/usage.py b/ionq_core/models/usage.py
index 0b50be8..226d985 100644
--- a/ionq_core/models/usage.py
+++ b/ionq_core/models/usage.py
@@ -12,7 +12,6 @@
from ..types import UNSET, Unset
-from dateutil.parser import isoparse
from typing import cast
import datetime
@@ -88,7 +87,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
d = dict(src_dict)
amount = d.pop("amount")
- from_ = isoparse(d.pop("from")).date()
+ from_ = datetime.date.fromisoformat(d.pop("from"))
diff --git a/ionq_core/models/usages.py b/ionq_core/models/usages.py
index 009bb19..a5a10a9 100644
--- a/ionq_core/models/usages.py
+++ b/ionq_core/models/usages.py
@@ -17,7 +17,6 @@
from ..models.modality import check_modality
from ..models.modality import Modality
from ..types import UNSET, Unset
-from dateutil.parser import isoparse
from typing import cast
from uuid import UUID
import datetime
@@ -178,7 +177,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
if isinstance(_usage_from, Unset):
usage_from = UNSET
else:
- usage_from = isoparse(_usage_from)
+ usage_from = datetime.datetime.fromisoformat(_usage_from)
@@ -188,7 +187,7 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
if isinstance(_usage_to, Unset):
usage_to = UNSET
else:
- usage_to = isoparse(_usage_to)
+ usage_to = datetime.datetime.fromisoformat(_usage_to)
diff --git a/pyproject.toml b/pyproject.toml
index 7eed288..92c1b69 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -25,7 +25,6 @@ dependencies = [
"httpx>=0.27,<0.29",
"httpx-retries>=0.5",
"attrs>=24.2",
- "python-dateutil>=2.9",
]
[project.urls]
@@ -88,6 +87,15 @@ include = ["ionq_core/models/**", "ionq_core/api/**"]
[tool.ty.overrides.rules]
invalid-argument-type = "ignore"
+# openapi-python-client 0.29.0 emits `return value` (not `cast(Enum, value)`) in the
+# generated enum `check_*` helpers; ty cannot narrow `str` to the Literal through the
+# `value in ` guard. Scoped to models/** (api/** has no such helpers) so endpoint
+# return types stay checked. Drop this if a future generator restores the cast.
+[[tool.ty.overrides]]
+include = ["ionq_core/models/**"]
+[tool.ty.overrides.rules]
+invalid-return-type = "ignore"
+
[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
diff --git a/uv.lock b/uv.lock
index 6945005..1c78db5 100644
--- a/uv.lock
+++ b/uv.lock
@@ -263,7 +263,6 @@ dependencies = [
{ name = "attrs" },
{ name = "httpx" },
{ name = "httpx-retries" },
- { name = "python-dateutil" },
]
[package.dev-dependencies]
@@ -286,7 +285,6 @@ requires-dist = [
{ name = "attrs", specifier = ">=24.2" },
{ name = "httpx", specifier = ">=0.27,<0.29" },
{ name = "httpx-retries", specifier = ">=0.5" },
- { name = "python-dateutil", specifier = ">=2.9" },
]
[package.metadata.requires-dev]
@@ -718,18 +716,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/1e/55/1fa65f8e4fceb19dd6daa867c162ad845d547f6058cd92b4b02384a44777/pytest_httpx-0.36.2-py3-none-any.whl", hash = "sha256:d42ebd5679442dc7bfb0c48e0767b6562e9bc4534d805127b0084171886a5e22", size = 20315, upload-time = "2026-04-09T13:57:18.587Z" },
]
-[[package]]
-name = "python-dateutil"
-version = "2.9.0.post0"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "six" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
-]
-
[[package]]
name = "pyyaml"
version = "6.0.3"
@@ -963,15 +949,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
]
-[[package]]
-name = "six"
-version = "1.17.0"
-source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
-]
-
[[package]]
name = "tomli"
version = "2.4.1"
From a6c7766bbf20ac536b6f6198945c20dd1ba24054 Mon Sep 17 00:00:00 2001
From: Spencer Churchill <25377399+splch@users.noreply.github.com>
Date: Wed, 24 Jun 2026 15:01:33 -0700
Subject: [PATCH 6/7] chore: Simplify the comment
---
pyproject.toml | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/pyproject.toml b/pyproject.toml
index 92c1b69..f227f38 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -87,10 +87,7 @@ include = ["ionq_core/models/**", "ionq_core/api/**"]
[tool.ty.overrides.rules]
invalid-argument-type = "ignore"
-# openapi-python-client 0.29.0 emits `return value` (not `cast(Enum, value)`) in the
-# generated enum `check_*` helpers; ty cannot narrow `str` to the Literal through the
-# `value in ` guard. Scoped to models/** (api/** has no such helpers) so endpoint
-# return types stay checked. Drop this if a future generator restores the cast.
+# TODO: drop this if a future generator restores the cast
[[tool.ty.overrides]]
include = ["ionq_core/models/**"]
[tool.ty.overrides.rules]
From 8e03c60b8fde3164b994ec99cc1fd61ba372da6c Mon Sep 17 00:00:00 2001
From: Spencer Churchill <25377399+splch@users.noreply.github.com>
Date: Wed, 24 Jun 2026 15:02:30 -0700
Subject: [PATCH 7/7] chore: Normalize indentations
---
AGENTS.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/AGENTS.md b/AGENTS.md
index fb9c4f5..eb67dd5 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -78,11 +78,11 @@ from ionq_core import IonQClient
from ionq_core.api.default import create_job, get_job, get_variant_probabilities, get_jobs
from ionq_core.models.circuit_job_creation_payload import CircuitJobCreationPayload
-client = IonQClient() # reads IONQ_API_KEY
-get_job.sync(uuid, client=client) # one path param
+client = IonQClient() # reads IONQ_API_KEY
+get_job.sync(uuid, client=client) # one path param
get_variant_probabilities.sync(uuid, variant_id, client=client) # multiple path params
-get_jobs.sync(client=client, status="completed", limit=10) # query only
-create_job.sync(client=client, body=payload) # body only
+get_jobs.sync(client=client, status="completed", limit=10) # query only
+create_job.sync(client=client, body=payload) # body only
```
Use `next_=` (trailing underscore) for the cursor pagination kwarg — Python keyword collision. The `iter_jobs` / `aiter_jobs` / `iter_session_jobs` / `aiter_session_jobs` helpers handle paging for you.