> 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

## v2.0.20

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)

`ApiClient` adds the `businesses`, `people`, `paypoints`, `payment_methods`, `boarding_templates`, and `applications` clients. Their methods return envelope types, such as `BusinessDetailEnvelope`.

These endpoints only accept OAuth. Set your OAuth `client_id` and `client_secret` in `ClientConfig`. See [OAuth authentication](/developers/oauth-authentication) and [Manage API credentials](/guides/platform-developer-api-credentials-manage).

```rust
let config = ClientConfig {
    client_id: Some("CLIENT_ID".to_string()),
    client_secret: Some("CLIENT_SECRET".to_string()),
    ..Default::default()
};
let client = ApiClient::new(config).expect("Failed to build client");
let business = client.businesses.get_business("BUSINESS_REFERENCE", None).await?;
```

### 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. The methods don't have the `#[deprecated]` attribute, so the compiler doesn't warn you.

### Renamed request types

Three request types were renamed so they don't collide with the new clients' types. Their fields haven't changed.

| Method                       | Before                         | After                                  |
| ---------------------------- | ------------------------------ | -------------------------------------- |
| `boarding.list_applications` | `ListApplicationsQueryRequest` | `BoardingListApplicationsQueryRequest` |
| `templates.list_templates`   | `ListTemplatesQueryRequest`    | `TemplatesListTemplatesQueryRequest`   |
| `query.list_paypoints`       | `ListPaypointsQueryRequest`    | `QueryListPaypointsQueryRequest`       |

### `ApiError::UnprocessableEntityError` has new fields

The new applications endpoints return a different error body for HTTP `422`. `ApiError::UnprocessableEntityError` now has `message`, `field`, and `validation_error` instead of `message`, `is_success`, `response_code`, `response_text`, and `response_data`. Code that matches on the old fields no longer compiles.

```rust
// After
if let Err(ApiError::UnprocessableEntityError { message, field, validation_error }) = &result {
    // ...
}
```

### Case management bank account services use new types

`BankAccountServices::money_in` is now `Option<Vec<CaseManagementMoneyInService>>`, and `money_out` is now `Option<Vec<CaseManagementMoneyOutService>>`. The new enumerations have the same variants as `MoneyInService` and `MoneyOutService`.

```rust
// Before
money_in: Some(vec![MoneyInService::Ach]),

// After
money_in: Some(vec![CaseManagementMoneyInService::Ach]),
```

### New `pagination` module

The new `pagination` types module has the same name as the `pagination` module that the crate root already re-exports, so imports that start with `payabli_api::pagination::`, such as `use payabli_api::pagination::AsyncPaginator;`, no longer compile. Import `AsyncPaginator`, `SyncPaginator`, and `PaginationResult` from the crate root or from `payabli_api::core::pagination` instead. The new `Pagination` type is available from the crate root and the prelude.

## v2.0.19

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: i64, account_id: &str, options)` returns `Result<NextCheckNumberResponse, ApiError>`. `NextCheckNumberResponse::check_number` is a `String`.
* `ghost_card.delete_ghost_card(card_token: &str, options)` returns `Result<DeleteGhostCardResponse, ApiError>`. Its `response_data` has `delete_type` and `card_token` (`Option<String>`).

```rust
let next: NextCheckNumberResponse = client.money_out.get_next_check_number(285, "ACCOUNT_ID", None).await?;
let deleted: DeleteGhostCardResponse = client.ghost_card.delete_ghost_card("CARD_TOKEN", None).await?;
```

### Request changes

* `ReissueOutRequest` adds `check_number` (`Option<VendorCheckNumber>`).
* `RequestUpdateSchedule`, the request for `subscription.update_subscription`, adds `invoice_data` (`Option<BillData>`).
* `VendorData` adds `issue_1099` (`Option<bool>`).

### Vendor 1099 flag

`VendorQueryRecord`, `VendorDataResponse`, `TransferOutDetailVendor`, and `PayoutSubscriptionVendor` add the required field `issue_1099` (`Issue1099`, a tuple struct that wraps a `bool`). `AssociatedVendor`, `VCardGetResponseAssociatedVendor`, `VendorOutData`, and `GetMethodResponseResponseDataVendorsItem` add `issue_1099` (`Option<Issue1099>`).

### Payouts that paid a bill

`BillResponseData` and `BillQueryRecord2` add `transactions` (`Option<Vec<BillTransactionReference>>`). Each `BillTransactionReference` has `id_out` (`i64`) and `payment_id` (`Option<String>`).

### Card-present device details

* `TransactionQueryRecords` and `TransactionQueryRecordsCustomer` add `device_entry_mode` (`Option<DeviceEntryMode>`), `emv_auth_data` (`Option<EmvAuthData>`, with `request_emv_data` and `response_emv_data`), and `device_data` (`Option<QueryDeviceData>`).
* `DeviceQueryRecord` adds the required field `operational_status` (`DeviceQueryRecordOperationalStatus`, with the variants `Online`, `Busy`, and `Offline`), plus `app_version` and `os_version` (`Option<String>`).

Builders for `VendorQueryRecord`, `VendorDataResponse`, `TransferOutDetailVendor`, `PayoutSubscriptionVendor`, and `DeviceQueryRecord` fail with `BuildError` when a new required field is missing. Struct literals of the changed types must set the new fields.