> This is Payabli documentation. For a complete page index, fetch https://docs.payabli.com/llms.txt — append .md to any page URL for lightweight markdown. For section-level indexes, query parameters, and other AI-optimized access methods, see https://docs.payabli.com/ai-agents.md

# Changelog

This is the changelog for the Payabli Python SDK. It includes updates, bug fixes, and new features.

## October 19, 2026

## v1.0.19

This release includes breaking changes. It adds clients for the intelligent boarding API (beta) and marks the legacy boarding methods as deprecated. See [October 19, 2026](/changelog/api-changelog/2026/10/19) for more information.

### Intelligent boarding clients (beta)

The client adds the `businesses`, `people`, `paypoints`, `payment_methods`, `boarding_templates`, and `applications` clients, on both the sync and async clients. Their methods return envelope models, such as `BusinessCreatedEnvelope`, with `data` and `warnings` fields.

These endpoints only accept OAuth. Pass your OAuth `client_id` and `client_secret` when you create the client. See [OAuth authentication](/developers/oauth-authentication) and [Manage API credentials](/guides/platform-developer-api-credentials-manage).

```python
client = payabli(client_id="CLIENT_ID", client_secret="CLIENT_SECRET")
template = client.boarding_templates.get_template(uuid_="TEMPLATE_UUID")
```

### Legacy boarding methods are deprecated

Legacy boarding will be sunset in Q2 2027. Every method on `boarding` and `templates` now has a deprecation warning in its documentation. `export.export_applications` was already deprecated. Calling them doesn't raise a `DeprecationWarning`.

### `UnprocessableEntityError.body` is no longer `PayabliErrorBody`

The new applications endpoints return a different error body for HTTP `422`, so `money_out.authorize_out`, `capture_out`, and `payout` now raise `UnprocessableEntityError` with the response JSON as a `dict`, not a `PayabliErrorBody`. Code like `e.body.response_text` now raises `AttributeError`.

```python
# Before
except UnprocessableEntityError as e:
    text = e.body.response_text

# After
except UnprocessableEntityError as e:
    body = e.body  # the response JSON
```

### Case management bank account services use new types

`BankAccountServices.money_in` and `money_out` are now typed `Optional[List[CaseManagementMoneyInService]]` and `Optional[List[CaseManagementMoneyOutService]]`. These have the same values as `MoneyInService` and `MoneyOutService`, so existing code still works.

## v1.0.18

This release adds methods to get the next check number and cancel ghost cards, a check number on reissued payouts, invoice data on subscription updates, a 1099 flag on vendors, every payout that paid a bill, and card-present device details. See [October 19, 2026](/changelog/api-changelog/2026/10/19) for more information.

### New methods

* `money_out.get_next_check_number(paypoint_id, account_id)` returns `NextCheckNumberResponse`, whose `check_number` is a `str`.
* `ghost_card.delete_ghost_card(card_token)` returns `DeleteGhostCardResponse`. Its `response_data` has `delete_type` and `card_token`.

The async client has the same methods.

```python
next_check = client.money_out.get_next_check_number(paypoint_id=285, account_id="ACCOUNT_ID")
deleted = client.ghost_card.delete_ghost_card(card_token="CARD_TOKEN")
```

### Request changes

* `money_out.reissue_out` adds the `check_number` parameter.
* `subscription.update_subscription` adds the `invoice_data` parameter (`Optional[BillData]`). Pass `invoice_data=None` to remove the subscription's invoice data.
* `VendorData` adds `issue_1099` (`Optional[bool]`).

### Vendor 1099 flag

`VendorQueryRecord`, `VendorDataResponse`, `TransferOutDetailVendor`, and `PayoutSubscriptionVendor` add the required field `issue_1099` (`Issue1099`, an alias for `bool`). `AssociatedVendor`, `VCardGetResponseAssociatedVendor`, `VendorOutData`, and `GetMethodResponseResponseDataVendorsItem` add `issue_1099` (`Optional[Issue1099]`).

### Payouts that paid a bill

`BillResponseData` and `BillQueryRecord2` add `transactions` (`Optional[List[BillTransactionReference]]`). Each `BillTransactionReference` has `id_out` (`int`) and `payment_id` (`Optional[str]`).

### Card-present device details

* `TransactionQueryRecords` and `TransactionQueryRecordsCustomer` add `device_entry_mode` (`Optional[DeviceEntryMode]`), `emv_auth_data` (`Optional[EmvAuthData]`, with `request_emv_data` and `response_emv_data`), and `device_data` (`Optional[QueryDeviceData]`).
* `DeviceQueryRecord` adds the required field `operational_status` (`DeviceQueryRecordOperationalStatus`: `"online"`, `"busy"`, or `"offline"`), plus `app_version` and `os_version` (`Optional[str]`).

Models built without the new required fields, such as test fixtures, now raise `ValidationError`.

## October 14, 2026

## v1.0.17

The get payout subscription response now uses its own camelCase types, and payout subscription and vendor responses add fields. Attribute names don't change, so code that reads these fields keeps working. Update type annotations and `isinstance` checks that name the old types. This release also covers v1.0.16, which wasn't published to PyPI. See [October 14, 2026](/changelog/api-changelog/2026/10/14) for more information.

### New types in the get payout subscription response

`PayoutSubscriptionQueryRecord` now types `vendor` as `PayoutSubscriptionVendor`, `bill_data` as `typing.List[PayoutSubscriptionBill]`, and `payment_data` as `PayoutSubscriptionPaymentData`. In list payout subscriptions, `PayoutSubscriptionQueryRecordPascal.payment_data` is now a `PayoutSubscriptionPaymentDataPascal`.

### New fields

`PayoutSubscriptionQueryRecord` and `PayoutSubscriptionQueryRecordPascal` add `same_day_ach`, `do_not_create_bills`, `allow_duplicated_bills`, `auto_convert_same_day_ach`, and `subscription_type`. `VendorQueryRecord` adds `vendor_portal` (`VendorPortalAccess`), its `stored_methods` items are now `VendorStoredMethod` with `is_default`, and `BillingDataResponse` adds `country`.

### Client updates

`Asyncpayabli` accepts an `async_token` parameter: an async callable that returns a bearer token, for token refreshes that need async I/O. Debug logs now redact the `requestToken` header.

## October 5, 2026

## v1.0.15

This release includes breaking changes. The notification log and stored payment method models now match what the API returns, and OCR results have new amount fields. See [September 22, 2026](/changelog/api-changelog/2026/9/22), [September 29, 2026](/changelog/api-changelog/2026/9/29), [October 1, 2026](/changelog/api-changelog/2026/10/1), [October 2, 2026](/changelog/api-changelog/2026/10/2), and [October 5, 2026](/changelog/api-changelog/2026/10/5) for more information.

### Notification log retry methods return new types

`notificationlogs.retry_notification_log` now returns `NotificationRetryResponse`, which has a single `message` field, instead of `NotificationLogDetail`. `notificationlogs.bulk_retry_notification_logs` now returns `str` instead of `None`. The async client has the same changes.

```python
# Before
log: NotificationLogDetail = client.notificationlogs.retry_notification_log("UUID")

# After
retry: NotificationRetryResponse = client.notificationlogs.retry_notification_log("UUID")
message: str = retry.message
bulk: str = client.notificationlogs.bulk_retry_notification_logs(request=["UUID"])
```

### Notification log models share a new base model

`NotificationLog` and `NotificationLogDetail` now both subclass the new `NotificationLogBase`. `NotificationLogDetail` no longer subclasses `NotificationLog`, so `isinstance(detail, NotificationLog)` is now `False`.

* Both models add the required fields `organization_name`, `paypoint_name`, `request_id`, and `response_status_code` (`int`).
* `response_status` is now `str` instead of `Optional[str]`. It holds a status message such as `OK`. The HTTP status code is in `response_status_code`.
* `NotificationLog` adds the required fields `notification_type`, `organization_logo`, `organization_fav_icon`, and `paypoint_logo`.
* On `NotificationLogDetail`, `response_content` is now a required `str`.

Models built without the new required fields, such as test fixtures, now raise `ValidationError`.

### Customer fields on stored payment methods

`GetMethodResponseResponseDataCustomersItem` no longer subclasses `PayorDataRequest`. It now has the customer record's fields. `first_name` and `last_name` are now `firstname` and `lastname`, and `shipping_address_1` is now typed `Shippingaddressadditional`.

#### Removed and added fields

Removed: `additional_data`, `billing_address_1`, `billing_address_2`, `billing_city`, `billing_country`, `billing_email`, `billing_phone`, `billing_state`, `billing_zip`, and `shipping_address_2`.

Added: `additional_fields`, `address`, `address_1`, `city`, `country`, `customer_events`, `customer_portal`, `email`, `phone`, `shipping_address`, `state`, and `zip`.

### New response fields

* `AddMethodResponse` adds `page_identifier`, and `AddMethodResponseResponseData` adds `auth_code`, `avs_response_text`, `cvv_response_text`, and `vendor_id`.
* `GetMethodResponseResponseData` adds `wallet_type`.
* `OcrResultData` adds `total_amount` and `discount` (`Optional[float]`).

## September 18, 2026

## v1.0.14

Regenerated the Python SDK to incorporate latest API documentation improvements. See [September 18, 2026](/changelog/api-changelog/2026/9/18) for more information.

## September 16, 2026

## v1.0.13

Regenerated the Python SDK to incorporate latest API documentation improvements. See [September 16, 2026](/changelog/api-changelog/2026/9/16) for more information.

## September 10, 2026

## v1.0.12

Regenerated the Python SDK to incorporate latest API documentation improvements. See [September 10, 2026](/changelog/api-changelog/2026/9/10) for more information.

## September 9, 2026

## v1.0.11

Regenerated the Python SDK to incorporate latest API documentation improvements. See [September 8, 2026](/changelog/api-changelog/2026/9/8) for more information.

## August 28, 2026

## v1.0.10

### New `business_summary` field on `PaypointData`

`PaypointData` now includes `business_summary`, a business description from boarding. See [August 28, 2026](/changelog/api-changelog/2026/8/28) for more information.

## July 28, 2026

## v1.0.8

Regenerated the Python SDK to incorporate latest API documentation improvements. See [July 28, 2026](/changelog/api-changelog/2026/7/28) for more information.

## July 27, 2026

## v1.0.7

Added OAuth2 client-credentials support. Pass `client_id`/`client_secret` instead of `api_key` and the SDK handles the token exchange and refresh automatically:

```python
client = payabli(
    client_id="...",
    client_secret="...",
    environment=payabliEnvironment.SANDBOX,
)
```

The existing `api_key`-based constructor still works unchanged — no action needed if you're not switching auth methods. See the [Python SDK guide](/developers/platform-sdk-python-guide) and [Authentication](/developers/authentication) to compare both methods.

## July 20, 2026

## v1.0.4

Changed the `VendorQueryRecord.additional_data` type from `typing.Optional[typing.Dict[str, typing.Dict[str, typing.Any]]]` to `typing.Optional[typing.Dict[str, str]]` to match the API.

## June 30, 2026

## v1.0.2

Regenerated the Python SDK to incorporate latest API documentation improvements. See [June 30, 2026](/changelog/api-changelog/2026/6/30) for more information.

## June 11, 2026

## v1.0.1

Regenerated the Python SDK to incorporate latest API documentation improvements. See [June 11, 2026](/changelog/api-changelog/2026/6/11) for more information.

## June 8, 2026

## v1.0.0

As part of an ongoing effort to improve the consistency and usability of our SDKs, we've updated the SDK generation process.
This update introduces breaking changes to the SDK.
All breaking changes affect only method signatures and namespacing, not core record types or properties.
SDK initialization, configuration, business logic, and workflows remain unchanged.
For more information on precise method signatures and example usage, please see the [SDK reference on GitHub](https://github.com/payabli/sdk-python/blob/main/reference.md).

### Import paths consolidated

All types are now importable from the top-level `payabli` package. The following submodules no longer exist:

#### Removed submodules

* `payabli.money_in` — types moved to `payabli`
* `payabli.money_out_types` — types moved to `payabli`
* `payabli.query_types` — types moved to `payabli`
* `payabli.v_2_money_in_types` — types moved to `payabli`

#### Example import changes

| Old                                                                 | New                                                 |
| ------------------------------------------------------------------- | --------------------------------------------------- |
| `from payabli.money_in import RequestCreditPaymentMethod`           | `from payabli import RequestCreditPaymentMethod`    |
| `from payabli.money_out_types import AuthorizePaymentMethod`        | `from payabli import AuthorizePaymentMethod`        |
| `from payabli.money_out_types import ReissuePaymentMethod`          | `from payabli import ReissuePaymentMethod`          |
| `from payabli.money_out_types import RequestOutAuthorizeVendorData` | `from payabli import RequestOutAuthorizeVendorData` |
| `from payabli.payout_subscription import PayoutPaymentDetail`       | `from payabli import PayoutPaymentDetail`           |
| `from payabli.payout_subscription import PayoutScheduleDetail`      | `from payabli import PayoutScheduleDetail`          |
| `from payabli.paypoint import NotificationRequest`                  | `from payabli import NotificationRequest`           |
| `from payabli.token_storage import TokenizeCard`                    | `from payabli import TokenizeCard`                  |

### Request wrapper types removed

The following wrapper types are deleted. Their fields are now passed directly as keyword arguments to the calling method.

#### Removed types and their replacements

| Removed type                           | Fields now on                                                |
| -------------------------------------- | ------------------------------------------------------------ |
| `AuthorizePayoutBody`                  | `money_out.authorize_out(...)` kwargs                        |
| `ReissuePayoutBody`                    | `money_out.reissue_out(payment_method=...)`                  |
| `SubscriptionRequestBody`              | `subscription.new_subscription(...)` kwargs                  |
| `PayoutSubscriptionRequestBody`        | `payout_subscription.create_payout_subscription(...)` kwargs |
| `UpdatePayoutSubscriptionBody`         | `payout_subscription.update_payout_subscription(...)` kwargs |
| `PaypointMoveRequest`                  | `paypoint.migrate(...)` kwargs                               |
| `VendorEnrichRequest`                  | `vendor.enrich_vendor(...)` kwargs                           |
| `NotificationLogSearchRequest`         | `notificationlogs.search_notification_logs(...)` kwargs      |
| `CreateApplicationFromPaypointRequest` | `boarding.add_service_to_paypoint_from_app(...)` kwargs      |
| `PaymentPageRequestBody`               | `payment_link.add_pay_link_from_invoice(...)` kwargs         |
| `PatchOutPaymentLinkRequest`           | `payment_link.patch_out_payment_link(...)` kwargs            |

The `notificationlogs.search_notification_logs` method now requires `start_date` and `end_date` as explicit keyword arguments. They were previously optional fields inside the removed wrapper.

### `method` is now required on all payment types

The `method` field previously defaulted to a value on each payment type. It's now required and has no default.

#### Affected types

| Type              | Old                                             | New                                        |
| ----------------- | ----------------------------------------------- | ------------------------------------------ |
| `PayMethodCredit` | `method: Literal["card"] = "card"` (optional)   | `method: PayMethodCreditMethod` (required) |
| `PayMethodAch`    | `method: Literal["ach"] = "ach"` (optional)     | `method: PayMethodAchMethod` (required)    |
| `PayMethodCloud`  | `method: Literal["cloud"] = "cloud"` (optional) | `method: PayMethodCloudMethod` (required)  |
| `Cash`            | `method: Literal["cash"] = "cash"` (optional)   | `method: CashMethod` (required)            |
| `Check`           | `method: Literal["check"] = "check"` (optional) | `method: CheckMethod` (required)           |

### V2 error types renamed

The per-endpoint V2 error classes from `payabli.v_2_money_in_types.errors` are removed. V2 endpoints now raise the same error types as all other methods.

| Old exception                   | New exception          | HTTP status |
| ------------------------------- | ---------------------- | ----------- |
| `BadRequestAuthResponseErrorV2` | `BadRequestError`      | 400         |
| `DeclinedAuthResponseErrorV2`   | `PaymentRequiredError` | 402         |
| `InternalServerResponseErrorV2` | `InternalServerError`  | 500         |

`ConflictError` has been removed from `payabli.errors`. `PaymentRequiredError` has been added.

### Type renames

#### Renamed types

| Old name                            | New name            | Used in                      |
| ----------------------------------- | ------------------- | ---------------------------- |
| `VendorData` (bill vendor field)    | `BillOutDataVendor` | `bill.add_bill(vendor=...)`  |
| `ApplicationDataPayInServicesAch`   | `AchSetup`          | `boarding.add_application()` |
| `ApplicationDataPayInServicesCard`  | `CardSetup`         | `boarding.add_application()` |
| `ApplicationDataPayInContactsItem`  | `Contacts`          | `boarding.add_application()` |
| `ApplicationDataPayInOwnershipItem` | `Owners`            | `boarding.add_application()` |

### Notification log ID type changed

`get_notification_log`, `retry_notification_log`, and `bulk_retry_notification_logs` now accept `str` instead of `uuid.UUID` for ID parameters.

### Subscription date format changed

`ScheduleDetail.start_date` and `ScheduleDetail.end_date` now use ISO 8601 (`YYYY-MM-DD`) instead of `MM-DD-YYYY`.

## May 20, 2026

## v0.0.319

Fixed an issue where the Python SDK wasn't properly deserializing the `extra_data` field in certain API response models.

## May 11, 2026

## v0.0.318

Regenerated the Python SDK to incorporate latest API documentation improvements. See [May 11, 2026](/changelog/api-changelog/2026/5/11) for more information.

## May 8, 2026

## v0.0.316

Fixed a bug that caused the `CustomerSummary` object to be deserialized incorrectly in customer records.
Fixed a bug that caused the `InvoiceData` object to be deserialized incorrectly in transaction records.
Regenerated the Python SDK to incorporate latest API definition updates.

## April 30, 2026

## v0.0.315

Fixed a bug that caused `money_in.getpaidv_2` to error when deserializing the response. Regenerated the Python SDK to incorporate latest API definition updates.

## April 13, 2026

## v0.0.313

Regenerated the Python SDK to incorporate latest API documentation improvements. See [April 13, 2026](/changelog/api-changelog/2026/4/13) for more information.

## March 17, 2026

## v0.0.308

Removed unused notification types from the `NotificationStandardRequestContentEventType` type in the Python SDK.

## v0.0.307

Regenerated the Python SDK to incorporate latest API documentation improvements. See [March 16, 2026](/changelog/api-changelog/2026/3/16) for more information.

_Showing the 20 most recent of 31 entries. Append `/llms.txt` to the changelog URL for the complete index._