---
title: "Finalize Order"
method: POST
path: "/v1/orders/{id}/finalize"
tags: ["orders", "public"]
---

# Finalize Order

`POST /v1/orders/{id}/finalize`

Finalize a draft order and synchronously attempt an off-session charge.

On success, the order transitions to `paid` and benefit grants fire
before the response returns. On failure (decline, missing payment method,
SCA challenge), the order stays in `draft` and a 4xx error is returned.

The request fails with 412 if the order is not in `draft` status.

**Scopes**: `orders:write`

## Path parameters

- `id` string, uuid4, required — The order ID.

## Request body

- OrderFinalize — Schema to finalize a draft order and trigger an off-session charge.
  - `payment_method_id` string, uuid4, nullable — ID of the payment method to charge. Must belong to the order's customer. Falls back to the customer's default payment method when unset.

## Response `200`

Successful Response

- Order — unresolved $ref

## Other responses

- `402` — The charge failed, or requires customer authentication (e.g. a 3DS challenge) that can't be completed off-session.
- `403` — Off-session charges are not enabled for this organization, or its account can't currently accept payments.
- `404` — Order not found.
- `412` — The order is not in `draft` status.
- `422` — Validation Error

## Changes

- **2026-08-14** `77e4ef94fcc3` — 1 warning
  - added the new `subscription_meter_cycle` enum value to the `billing_reason` response property for the response status `200`
- **2026-08-10** `f9688fd328d6` — 1 info
  - added the required property `customer/first_user_event_at` to the response with the `200` status
- **2026-07-31** `8ae937367e87` — 4 info
  - added the required property `discount/anyOf[subschema #1: OrderDiscount]/oneOf[subschema #1: DiscountFixedOnceForeverDurationBase]/max_redemptions_per_customer` to the response with the `200` status
  - added the required property `discount/anyOf[subschema #1: OrderDiscount]/oneOf[subschema #2: DiscountFixedRepeatDurationBase]/max_redemptions_per_customer` to the response with the `200` status
  - added the required property `discount/anyOf[subschema #1: OrderDiscount]/oneOf[subschema #3: DiscountPercentageOnceForeverDurationBase]/max_redemptions_per_customer` to the response with the `200` status
  - added the required property `discount/anyOf[subschema #1: OrderDiscount]/oneOf[subschema #4: DiscountPercentageRepeatDurationBase]/max_redemptions_per_customer` to the response with the `200` status

[Change history](https://skmtc.dev/polar/apis/polar-api/changes/v1/orders/:id/finalize/post.md)

---

[API](https://skmtc.dev/polar/apis/polar-api.md) · [All operations](https://skmtc.dev/polar/apis/polar-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/polar/polar-api/revisions/77e4ef94fcc3/schema)
