You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit fcba6ec
Browse filesBrowse the repository at this point in the historyBrowse files
Release 0.7.0: regenerate from contract sha256:f4cd9b5c733e
Generated by packages/sdk-generator 1.0.0 from the Desktop Accounting API OpenAPI contract (sha256:f4cd9b5c733eeada3d1a452ca3a11144f0d4b560ed58a595281cf54780b20691, API 1.0.0, 439 operations).
Copy file name to clipboardExpand all lines: CHANGELOG.md
+8Lines changed: 8 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,14 @@
2
2
3
3
## Unreleased
4
4
5
+
## 0.7.0 (2026-10-12)
6
+
7
+
- New `client.qbd.batch()`: up to 25 typed QuickBooks Desktop operations in one Web Connector round trip. Each member is the member class of its operation (`BatchCustomerCreateInput(body=CustomerCreateInput(...))`, which sets `operation_id` itself), and each result is an instance of its operation's result class (`BatchCustomerCreateResult`, whose `data` is a `Customer`), or `UnknownBatchResult` for an operation added later. One idempotency key covers the batch; a lost response raises `OutcomeUnknownError` with `details["members"]` and is never retried.
8
+
- A batch whose response was lost and whose create members the API later found in QuickBooks by their `external_id` returns each such member with `data``None` and the record's QuickBooks ID in `recovered_object_id` (on every batch result: `str | None`), on `client.requests.retrieve()` and on an idempotent replay.
9
+
- New error code `QBD_REQUEST_NOT_PROCESSED` (`ErrorCode.QBD_REQUEST_NOT_PROCESSED`): `409`, not retryable. QuickBooks skipped a batch member because an earlier member failed under `stopOnError` (status 3231).
10
+
-**Breaking (types only):** the credit card request info of receive payments is the model `QbdRequest`. It was parsed as the request resource model `Request` by mistake, so its fields read as None.
11
+
- Change feed subscriptions: `client.change_feed_subscriptions.create()`, `.list()`, `.retrieve()`, `.update()` and `.delete()` (`/v1/change-feed-subscriptions`). A subscription polls every connected end user of the project for changed and deleted records of the listed resources and sends `data.changed` webhooks with their IDs. New webhook event type `EventType.DATA_CHANGED` (`data.changed`). New error code `CHANGE_FEED_SUBSCRIPTION_LIMIT_REACHED` (`422`, not retryable).
12
+
5
13
## 0.6.0 (2026-10-12)
6
14
7
15
-**Breaking:** the list parameters type of `qbd.classes.list` is renamed from `ClasseListParams` to `ClassListParams` (the generator dropped only the final "s" of "classes"). Rename the type in your code; nothing else changes. No other type name was affected.
Copy file name to clipboardExpand all lines: README.md
+7-7Lines changed: 7 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@
2
2
3
3
The Python client for [Desktop Accounting API](https://www.desktopaccountingapi.com/), a REST API for QuickBooks Desktop and QuickBooks Enterprise. Your server makes typed calls such as `client.qbd.invoices.create(...)`, and Desktop Accounting API delivers them to your customer's company file through the QuickBooks Web Connector.
4
4
5
-
- Covers all 433 operations of API 1.0.0: QuickBooks objects and reports (`client.qbd`), end users, auth sessions, request tracking, qbXML passthrough and webhook verification.
5
+
- Covers all 439 operations of API 1.0.0: QuickBooks objects and reports (`client.qbd`), end users, auth sessions, request tracking, qbXML passthrough and webhook verification.
6
6
- Frozen dataclass models, keyword-only arguments, `Literal` enums, `mypy --strict` clean, a synchronous and an asyncio client.
7
7
- Amounts are `decimal.Decimal`, never `float`.
8
8
- Every write carries an idempotency key, retries happen only where they cannot duplicate data, and an expired QuickBooks cursor never restarts a list silently.
@@ -15,12 +15,12 @@ The Python client for [Desktop Accounting API](https://www.desktopaccountingapi.
The distribution is `desktopaccountingapi-quickbooks-desktop`; the import package is `desktopaccountingapi`.
@@ -511,7 +511,7 @@ The [migration guide](https://www.desktopaccountingapi.com/docs/get-started/migr
511
511
- The Python, Node.js, .NET and Java SDKs and the [MCP server](https://github.com/DesktopAccountingAPI/quickbooks-desktop-mcp) are released together with the same version number, generated from the same API contract.
512
512
- Every release is listed in [CHANGELOG.md](https://github.com/DesktopAccountingAPI/quickbooks-desktop-python/blob/main/CHANGELOG.md) and tagged `v<version>` on GitHub.
513
513
- The API is versioned in its path (`/v1`). Within `v1` the API only adds operations, fields, enum values and error codes, and the SDK tolerates all of them, so older SDK versions keep working.
514
-
- Each release is generated from one version of the API contract; `.daapi-sdk.json` and `desktopaccountingapi.CONTRACT_SHA256` record its digest (`sha256:45acc3e65d06...` for this release), `desktopaccountingapi.API_VERSION` the API version and `desktopaccountingapi.__version__` the package version.
514
+
- Each release is generated from one version of the API contract; `.daapi-sdk.json` and `desktopaccountingapi.CONTRACT_SHA256` record its digest (`sha256:f4cd9b5c733e...` for this release), `desktopaccountingapi.API_VERSION` the API version and `desktopaccountingapi.__version__` the package version.
515
515
516
516
## Support
517
517
@@ -525,7 +525,7 @@ The [migration guide](https://www.desktopaccountingapi.com/docs/get-started/migr
525
525
526
526
The toolchain is pinned in `mise.toml`. `mise run check` installs the pinned dev tools with uv and runs ruff, `mypy --strict`, the unit tests, the cross-language conformance suite (against `conformance/mock-server.mjs`), the example type checks, the README samples (`mypy --strict` on every Python block of this file, and the quickstart against the mock server) and a build plus clean install of the wheel. Set `UV_PYTHON=3.9` (or any supported version) to run it on another interpreter.
527
527
528
-
To install from source: `pip install "git+https://github.com/DesktopAccountingAPI/quickbooks-desktop-python.git@v0.6.0"`. The code under `src/desktopaccountingapi/types` and `src/desktopaccountingapi/resources`, `api.md`, `conformance/fixtures` and this README are generated; see [CONTRIBUTING.md](https://github.com/DesktopAccountingAPI/quickbooks-desktop-python/blob/main/CONTRIBUTING.md).
528
+
To install from source: `pip install "git+https://github.com/DesktopAccountingAPI/quickbooks-desktop-python.git@v0.7.0"`. The code under `src/desktopaccountingapi/types` and `src/desktopaccountingapi/resources`, `api.md`, `conformance/fixtures` and this README are generated; see [CONTRIBUTING.md](https://github.com/DesktopAccountingAPI/quickbooks-desktop-python/blob/main/CONTRIBUTING.md).
Copy file name to clipboardExpand all lines: conformance/README.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -85,6 +85,7 @@ Operations and parameter shapes used by the fixtures:
85
85
|`endUsers.list`||`limit`|
86
86
|`endUsers.passthrough`|`id`| free-form JSON body |
87
87
|`requests.retrieve`|`id`||
88
+
|`qbd.batch`||`onError`, `requests[]` of typed members `{ operationId, pathParams?, query?, body? }`: build each member as the SDK's member class for its `operationId` (Node.js: the object as is) |
88
89
89
90
Convert params to the SDK's native types. Decimal strings become the native decimal type and dates become the native date type. A key present with `null` is an explicit null, and an absent key is not set. The runner fails if a decimal is sent as anything other than the expected string.
90
91
@@ -123,6 +124,7 @@ The runner compares only the keys that are present.
123
124
-`text`: the exact text returned by an `xml` call.
124
125
-`items`: the `id`s of the items yielded by `iterate`, in order.
125
126
-`variant`: the SDK class of the result of an operation that returns a discriminated union (`qbd.items.retrieve` returns `Item`): the model of its `objectType` (`ServiceItem`), or the union's fallback for a kind the SDK does not know (`UnknownItem`). `itemVariants` is the same for each item yielded by `iterate`. The Node.js SDK returns plain JSON typed as a TypeScript union, so it has no class to check.
127
+
-`resultVariants`: the SDK class of each element of a batch result's `results` (`qbd.batch`): the result class of its `operationId` (`BatchCustomerCreateResult`), or the result union's fallback (`UnknownBatchResult`) for an operation the SDK does not know. Node.js returns plain JSON typed per member, so it has no class to check.
126
128
-`page`: `ids`, `nextCursor`, `hasMore`, `remainingCount` of the first page.
127
129
-`handle`: `id` and `status` of the request handle returned by `enqueue`.
128
130
-`response`: `status`, `requestId` (the SDK's reported request ID: `Daapi-Request-Id`, or after a long poll the timed-out request's `details.requestId`) and `headers` (lowercase name to value).
0 commit comments