# Changes and deprecations

> What v1 and v2 mean, how API changes reach you, the deprecated operations and the headers that mark them, and a dated list of changes.

Web page: https://developer.yoprint.com/start/changes/

## What v1 and v2 mean

`v1` and `v2` are part of each operation's path. They aren't two versions of the whole API, and both are current. The v2 operations cover sales orders, quotes, their lines, jobs, shipments, invoices and payments. The v1 operations cover customers, products, settings, webhooks, exports and reports. One key calls both. See [Base URL and versions](https://developer.yoprint.com/concepts/base-url-and-versions.md).

There's no version header and nothing to pin. An operation changes in place, at its own path.

## What to expect

- **Additions come without notice.** YoPrint adds operations, fields in answers, optional fields in requests and error codes as it builds features. Write your code to ignore fields and codes it doesn't know.
- **Replacements are marked first.** When a newer operation or field replaces an older one, the reference marks the old one **Legacy** or **deprecated** and names the new one. Deprecated operations also say so in every answer (see below).
- **Nothing deprecated has a removal date yet.** Each deprecated operation and field keeps working for now. When one gets a date, it's added on this page.

## How a deprecated operation tells you

Every answer from a deprecated operation carries two headers:

```text
Deprecation: @1794009600
X-YoPrint-Successor: POST /v2/api/store/{team_slug}/v2/invoice/filter
```

- `Deprecation` is when the operation was deprecated, in seconds since 1970 ([RFC 9745](https://www.rfc-editor.org/rfc/rfc9745)). `@1794009600` is November 7, 2026.
- `X-YoPrint-Successor` is the method and path of the operation to use instead.

There's no `Sunset` header yet. To find the calls you still need to move, log any answer that has a `Deprecation` header, with its successor.

## The deprecated operations

These 18 operations send the headers. Some of them no longer work at all, as their reference pages say. Move each one to its successor.

**Invoices**

- `GET /v1/api/store/{team_slug}/invoice` [List invoices (v1)](https://developer.yoprint.com/reference/invoices/v1-invoice-index.md), use `POST /v2/api/store/{team_slug}/v2/invoice/filter` [Filter invoices](https://developer.yoprint.com/reference/invoices/v2-invoice-filter.md)
- `GET /v1/api/store/{team_slug}/invoice/{hash_id}` [Get an invoice (v1)](https://developer.yoprint.com/reference/invoices/v1-invoice-show.md), use `GET /v2/api/store/{team_slug}/v2/invoice/{unique_key}` [Get an invoice](https://developer.yoprint.com/reference/invoices/v2-invoice-show.md)
- `PUT /v1/api/store/{team_slug}/invoice/{hash_id}` [Change an invoice number (v1)](https://developer.yoprint.com/reference/invoices/v1-invoice-update-put.md) and `PATCH /v1/api/store/{team_slug}/invoice/{hash_id}` [Change an invoice number (v1) (same as PUT)](https://developer.yoprint.com/reference/invoices/v1-invoice-update-patch.md), use `PUT /v2/api/store/{team_slug}/v2/invoice/{unique_key}` [Update an invoice](https://developer.yoprint.com/reference/invoices/v2-invoice-update.md)

**Sales orders and quotes**

- `POST /v1/api/store/{team_slug}/sales_order/filter` [Filter sales orders (retired v1)](https://developer.yoprint.com/reference/sales-orders/v1-sales-order-filter.md), use `POST /v2/api/store/{team_slug}/v2/sales_order/filter` [List sales orders](https://developer.yoprint.com/reference/sales-orders/v2-sales-order-filter.md)
- `POST /v1/api/store/{team_slug}/quote/filter` [Filter quotes (retired v1)](https://developer.yoprint.com/reference/quotes/v1-quote-filter.md), use `POST /v2/api/store/{team_slug}/v2/quote/filter` [List quotes](https://developer.yoprint.com/reference/quotes/v2-quote-filter.md)
- `GET /v1/api/store/{team_slug}/sales_order/{hash_id}/history` [Get an order's history (retired v1)](https://developer.yoprint.com/reference/sales-orders/v1-sales-order-history.md), use `GET /v2/api/store/{team_slug}/v2/sales_order/{order_unique_key}/history` [List the history of a sales order or quote](https://developer.yoprint.com/reference/sales-orders/v2-order-history.md)
- `GET /v1/api/store/{team_slug}/sales_order/{hash_id}/message` [List the messages of an order (v1)](https://developer.yoprint.com/reference/sales-order-messages/v1-sales-order-v1-message-index.md), use `GET /v2/api/store/{team_slug}/v2/sales_order/{hash_id}/message` [List the messages of an order](https://developer.yoprint.com/reference/sales-order-messages/v2-order-message-index.md)
- `POST /v1/api/store/{team_slug}/sales_order/{hash_id}/message` [Send a message to the customer (v1)](https://developer.yoprint.com/reference/sales-order-messages/v1-sales-order-v1-message-store.md), use `POST /v2/api/store/{team_slug}/v2/sales_order/{hash_id}/message` [Send a message to the customer](https://developer.yoprint.com/reference/sales-order-messages/v2-order-message-store.md)

**Jobs and shipments**

- `GET /v1/api/store/{team_slug}/job/{hash_id}` [Get a job (retired)](https://developer.yoprint.com/reference/jobs/v1-job-show.md), use `GET /v2/api/store/{team_slug}/v2/sales_order/{hash_id}/job/{job_id}` [Get one job of an order](https://developer.yoprint.com/reference/jobs/v2-job-show.md)
- `PUT /v1/api/store/{team_slug}/job/{hash_id}/status` [Change a job's status (retired)](https://developer.yoprint.com/reference/jobs/v1-job-change-status.md), use `PUT /v2/api/store/{team_slug}/v2/job/{hash_id}/status` [Change a job's status](https://developer.yoprint.com/reference/jobs/v2-job-change-status.md)
- `PATCH /v2/api/store/{team_slug}/v2/sales_order/{hash_id}/shipment/delete_all` [Delete all shipments of an order (retired)](https://developer.yoprint.com/reference/shipments/v2-sales-order-shipment-destroy-all.md), use `DELETE /v2/api/store/{team_slug}/v2/shipment/{unique_key}` [Delete a shipment](https://developer.yoprint.com/reference/shipments/v2-shipment-destroy.md) for each shipment

**Card payments**

- `PUT /v1/api/store/{team_slug}/sales_order/{hash_id}/payment_gateway_refund/{id}` [Refund a card payment (v1)](https://developer.yoprint.com/reference/payments/v1-sales-order-payment-gateway-refund.md), use `PUT /v2/api/store/{team_slug}/v2/sales_order/{hash_id}/payment_gateway_refund/{id}` [Refund a card payment through the gateway](https://developer.yoprint.com/reference/payments/v2-sales-order-payment-gateway-refund.md)
- `POST /v1/api/store/{team_slug}/sales_order/poll_pending_payment` [Check a pending card payment (v1, not usable)](https://developer.yoprint.com/reference/payments/v1-sales-order-payment-gateway-polling.md), use `GET /v2/api/store/{team_slug}/v2/sales_order/{hash_id}/payment` [List the payments of a sales order](https://developer.yoprint.com/reference/payments/v2-sales-order-payment-index.md)
- `POST /v1/api/store/{team_slug}/sales_order/{hash_id}/payment/{payment_gateway}/pre_execute` [Prepare a card payment (v1)](https://developer.yoprint.com/reference/payments/v1-sales-order-payment-gateway-pre-execute.md), `POST /v1/api/store/{team_slug}/sales_order/{hash_id}/payment/{payment_gateway}` [Charge a card through the gateway (v1)](https://developer.yoprint.com/reference/payments/v1-sales-order-payment-gateway-execute.md), `POST /v1/api/store/{team_slug}/sales_order/{hash_id}/square_terminal/create` [Start a Square Terminal checkout (v1)](https://developer.yoprint.com/reference/payments/v1-sales-order-payment-square-terminal-create.md) and `PATCH /v1/api/store/{team_slug}/sales_order/{hash_id}/square_terminal/{checkout_id}/cancel` [Cancel a Square Terminal checkout (v1)](https://developer.yoprint.com/reference/payments/v1-sales-order-payment-square-terminal-cancel.md): their v2 successors are internal, built for YoPrint's own payment screens. See [Cards and the API](https://developer.yoprint.com/guides/payments.md#cards-and-the-api).

## Deprecated fields

Some answers still carry an older copy of a newer field, such as an order's `calc_total`. The reference marks each one **deprecated**. See [Deprecated fields](https://developer.yoprint.com/concepts/base-url-and-versions.md#deprecated-fields) for each field and the one to read instead.

## Changes

### November 2026

> **Caution: Your team's plan now matters**
>
> The API, webhooks and Zapier need a plan with API access: Pro or higher, with an active subscription or trial. Other teams get `403` `api_access_not_in_plan` on every request, and no webhook deliveries. See [Authentication](https://developer.yoprint.com/concepts/authentication.md#when-your-teams-plan-doesnt-include-api-access).

- **This site.** The API reference, guides and concepts are public at developer.yoprint.com, with a Markdown copy of every page and the OpenAPI file.
- **Bearer keys.** Send your key as `Authorization: Bearer YOUR_API_KEY`. The older ways (the key alone in `Authorization`, or `user_api_key` in the query string or body) keep working. See [Authentication](https://developer.yoprint.com/concepts/authentication.md).
- **Plan check.** Requests for a team without API access answer `403` `api_access_not_in_plan`, and its webhooks stop delivering until the team is back on a plan with it.
- **Deprecation headers.** The 18 operations above send `Deprecation` and `X-YoPrint-Successor`.
- **A key can't manage itself.** Reading, creating or resetting your key through the API answers `403` `self_credential`. Manage it in **Profile**.
- **Purchase orders for Zapier.** `GET /v1/api/store/{team_slug}/purchase_order/{hash_id}` [Get a purchase order](https://developer.yoprint.com/reference/purchase-orders/v1-purchase-order-show.md) and `PUT /v1/api/store/{team_slug}/purchase_order/{hash_id}/status` [Change a purchase order's status](https://developer.yoprint.com/reference/purchase-orders/v1-purchase-order-change-status.md) work again at their v1 paths.
- **Payments and credit.** An `amount` with decimals on a payment, a refund or any customer credit call answers `422` `validation_failed` instead of `500`. Nothing is recorded.
- **Customers and contacts.** Creating, updating or upserting a customer or a contact ignores `is_external` and `external_type`, so a value read back and sent again can't make a record read-only.
- **Customer assignment.** Assigning a user who isn't a member of the team answers `422` (`error.fields.user_id`). Unassigning someone who isn't assigned changes nothing and answers `200` with the list.
- **Customer export.** The customer CSV export leaves out deleted contacts.
- **Profile.** The **API Access** card shows when your key was last used, and a first request to copy.
