---
title: "Issue Invoice"
method: POST
path: "/invoices/{id}/issue"
tags: ["Invoices"]
---

# Issue Invoice

`POST /invoices/{id}/issue`

## Request

- Base URL: `https://api.whop.com/api/v1`
- URL: `https://api.whop.com/api/v1/invoices/{id}/issue`
- Auth: HTTP bearer

Resolves final tax and opens a draft invoice without emailing it. An invoice with a `payment_method_id` is charged to it off-session, as `POST /payments` charges a saved payment method: at `charge_at` if given, otherwise on `due_at` while it is still ahead, otherwise right away (see `scheduled_charge_at`). With a future `due_at` and no `charge_at`, the customer is charged on the due date without being emailed first. Issuing an open invoice again retains its totals and charges nothing.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `charge_at` string, date-time, nullable: When to charge the draft's `payment_method_id`, as an ISO 8601 timestamp in the future. Only for a draft with a `payment_method_id` and a total above zero. Omit to charge on `due_at` if it is still ahead, or right away otherwise.

## Response `200`

invoice issued

- Invoice
  - `account_id` string, required
  - `amount_due` Money, required
    - `amount` string, required: The amount in major units, as an exact decimal string — `"10.00"` is ten dollars. A string so no float rounds it in transit.
    - `currency` string, required: Three-letter ISO 4217 currency code, lowercase.
    - `decimals` integer, required: How many decimal places the amount CARRIES — the precision the charge itself runs at.
    - `display_decimals` integer, required: How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
  - `billing_address` PaymentAddress, required
    - `city` string, nullable, required: The city.
    - `country` string, nullable, required: The ISO 3166-1 alpha-2 country code.
    - `line1` string, nullable, required: The first street address line.
    - `line2` string, nullable, required: The second street address line.
    - `name` string, nullable, required: The name on the address.
    - `postal_code` string, nullable, required: The postal or ZIP code.
    - `state` string, nullable, required: The state, province or region.
  - `buyer_fee_amount` Money, required
    - `amount` string, required: The amount in major units, as an exact decimal string — `"10.00"` is ten dollars. A string so no float rounds it in transit.
    - `currency` string, required: Three-letter ISO 4217 currency code, lowercase.
    - `decimals` integer, required: How many decimal places the amount CARRIES — the precision the charge itself runs at.
    - `display_decimals` integer, required: How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
  - `buyer_fee_percentage` number, required
  - `checkout_link` string, nullable, required: A signed link that opens this invoice in a checkout session so the buyer can pay it: pass it as `link` to `POST /checkout_sessions`. Present while the invoice is open; null in any other status, for an invoice billed to a business buyer or whose membership was canceled, and unless you have `payment:charge`, or `invoice:create` or `invoice:update` on an invoice with no `payment_method_id`.
  - `created_at` string, required
  - `customer_name` string, nullable, required
  - `due_at` string, nullable, required
  - `email_address` string, nullable, required
  - `id` string, required
  - `invoice_prefix` string, nullable, required
  - `line_items` InvoiceLineItem[], required
    - `discount_amount` Money, required
      - `amount` string, required: The amount in major units, as an exact decimal string — `"10.00"` is ten dollars. A string so no float rounds it in transit.
      - `currency` string, required: Three-letter ISO 4217 currency code, lowercase.
      - `decimals` integer, required: How many decimal places the amount CARRIES — the precision the charge itself runs at.
      - `display_decimals` integer, required: How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
    - `id` string, nullable, required: Line item ID, prefixed `li_`. Null when the payment predates item snapshots and the item is read from the payment's variant.
    - `label` string, nullable, required: The item's name as shown at checkout — the product title, else the variant title.
    - `product_id` string, nullable, required: The product the variant belongs to, prefixed `prod_`. Null for a variant with no product.
    - `quantity` number, required: How many units were bought.
    - `subtotal` Money, required
      - `amount` string, required: The amount in major units, as an exact decimal string — `"10.00"` is ten dollars. A string so no float rounds it in transit.
      - `currency` string, required: Three-letter ISO 4217 currency code, lowercase.
      - `decimals` integer, required: How many decimal places the amount CARRIES — the precision the charge itself runs at.
      - `display_decimals` integer, required: How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
    - `tax_amount` Money, required
      - `amount` string, required: The amount in major units, as an exact decimal string — `"10.00"` is ten dollars. A string so no float rounds it in transit.
      - `currency` string, required: Three-letter ISO 4217 currency code, lowercase.
      - `decimals` integer, required: How many decimal places the amount CARRIES — the precision the charge itself runs at.
      - `display_decimals` integer, required: How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
    - `unit_amount` Money, required
      - `amount` string, required: The amount in major units, as an exact decimal string — `"10.00"` is ten dollars. A string so no float rounds it in transit.
      - `currency` string, required: Three-letter ISO 4217 currency code, lowercase.
      - `decimals` integer, required: How many decimal places the amount CARRIES — the precision the charge itself runs at.
      - `display_decimals` integer, required: How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
    - `variant_id` string, nullable, required: The variant bought, prefixed `plan_`. Null when the variant has since been deleted.
  - `mailing_address_id` string, nullable, required
  - `member_id` string, nullable, required
  - `metadata` object, required
  - `number` string, required
  - `object` 'invoice', required
  - `overdue` boolean, required
  - `paid_at` string, nullable, required
  - `payment_method_id` string, nullable, required
  - `recipient_emails` string[], required
  - `scheduled_charge_at` string, nullable, required: When the invoice's saved payment method will be charged, as an ISO 8601 timestamp: the `charge_at` it was sent or issued with, or `due_at` when an invoice with a `payment_method_id` is sent or issued before it is due without one. On a draft, the `charge_at` of its scheduled send. `null` otherwise, once the charge starts, and once the invoice is paid, void, or uncollectible.
  - `scheduled_send_at` string, nullable, required
  - `status` 'draft' | 'open' | 'authorized' | 'paid' | 'pending' | 'uncollectible' | 'unresolved' | 'void', required
  - `subtotal` Money, required
    - `amount` string, required: The amount in major units, as an exact decimal string — `"10.00"` is ten dollars. A string so no float rounds it in transit.
    - `currency` string, required: Three-letter ISO 4217 currency code, lowercase.
    - `decimals` integer, required: How many decimal places the amount CARRIES — the precision the charge itself runs at.
    - `display_decimals` integer, required: How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
  - `tax_amount` Money, required
    - `amount` string, required: The amount in major units, as an exact decimal string — `"10.00"` is ten dollars. A string so no float rounds it in transit.
    - `currency` string, required: Three-letter ISO 4217 currency code, lowercase.
    - `decimals` integer, required: How many decimal places the amount CARRIES — the precision the charge itself runs at.
    - `display_decimals` integer, required: How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
  - `total` Money, required
    - `amount` string, required: The amount in major units, as an exact decimal string — `"10.00"` is ten dollars. A string so no float rounds it in transit.
    - `currency` string, required: Three-letter ISO 4217 currency code, lowercase.
    - `decimals` integer, required: How many decimal places the amount CARRIES — the precision the charge itself runs at.
    - `display_decimals` integer, required: How many decimal places to SHOW. Usually equal to `decimals`, and deliberately not always: COP is charged in centavos but written in whole pesos, so it is `2` and `0`. Format the number in your own locale using this.
  - `totals_status` 'estimated' | 'final', required
  - `updated_at` string, required

## Other responses

- `400`: Invalid Parameters
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Resource not found
- `409`: Conflict

## Changes

> 203 revisions in range; 1 not diffed.

- **2026-10-28** `d966f39fe728`: 1 info
  - added optional request body
- **2026-10-27** `cd08fdc98b50`: 1 info
  - added the required property `scheduled_charge_at` to the response with the `200` status
- **2026-10-27** `3f9894af7679`: 1 breaking, 1 info
  - removed the required property `line_items/items/plan_id` from the response with the `200` status
  - added the required property `line_items/items/variant_id` to the response with the `200` status
- **2026-10-26** `9b1e53f04d60`: 3 info
  - the security scope `payment:charge` was added to the endpoint's security scheme `bearerAuth`
  - the security scope `invoice:update` was removed from the endpoint's security scheme `bearerAuth`
  - added the required property `scheduled_send_at` to the response with the `200` status
- **2026-10-24** `a381d9678d36`: 1 info
  - added the required property `checkout_link` to the response with the `200` status

[Operation history](https://skmtc.dev/whop/apis/whop-api/changes/invoices/:id/issue/post.md)

---

[API](https://skmtc.dev/whop/apis/whop-api.md) - [All operations](https://skmtc.dev/whop/apis/whop-api/llms.txt) - [OpenAPI document](https://skmtc.dev/whop/apis/whop-api/revisions/9993d9eaebc8?raw)
