> ## Documentation Index
> Fetch the complete documentation index at: https://razorpay-881012b3.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Cancel an Invoice

> Cancel an invoice using this endpoint.

<div style={{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"0.35rem 0.9rem",border:"1px solid rgba(128,128,128,0.28)",borderRadius:"0.5rem",padding:"0.45rem 0.75rem",margin:"0 0 1.25rem",fontSize:"0.875rem"}}>
  <span style={{fontWeight:600}}>Available in</span>
  <span>🇮🇳 India</span>
  <span>🇸🇬 Singapore</span>
  <span>🇺🇸 United States</span>
</div>

Use this endpoint to cancel an invoice. Invoices in the `paid` state cannot be cancelled.

<RequestExample>
  ```bash Curl theme={null}
  curl -u [YOUR_KEY_ID]:[YOUR_KEY_SECRET]

  -X POST https://api.razorpay.com/v1/invoices/inv_JqVZyyKWjCs9cY/cancel \
  ```

  ```java Java theme={null}
  RazorpayClient razorpay = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]");

  String invoiceId = "inv_DC2XAh2fOFuU15";

  Invoice invoice = razorpay.invoices.cancel(invoiceId);
  ```

  ```python Python theme={null}
  import razorpay
  client = razorpay.Client(auth=("YOUR_ID", "YOUR_SECRET"))

  client.invoice.cancel(invoiceId)
  ```

  ```ruby Ruby theme={null}
  require "razorpay"
  Razorpay.setup('YOUR_KEY_ID', 'YOUR_SECRET')

  Razorpay::Invoice.cancel(invoiceId)
  ```

  ```php PHP theme={null}
  $api = new Api($key_id, $secret);

  $api->invoice->fetch($invoiceId)->cancel();
  ```

  ```go Go theme={null}
  import ( razorpay "github.com/razorpay/razorpay-go" )
  client := razorpay.NewClient("YOUR_KEY_ID", "YOUR_SECRET")

  body, err := client.Invoice.Cancel("<invoiceId>", nil, nil)
  ```

  ```javascript Node.js theme={null}
  var instance = new Razorpay({ key_id: 'YOUR_KEY_ID', key_secret: 'YOUR_SECRET' })

  instance.invoices.cancel(invoiceId)
  ```

  ```csharp .NET theme={null}
  RazorpayClient client = new RazorpayClient("[YOUR_KEY_ID]", "[YOUR_KEY_SECRET]
  ");

  string invoiceId = "inv_DAweOiQ7amIUVd";

  Invoice invoice = client.Invoice.Fetch(invoiceId).Cancel();
  ```

  ```bash CLI theme={null}
  razorpay invoices cancel inv_ABC123
  ```
</RequestExample>

<ResponseExample>
  ```json Success theme={null}
  {
    "amount": 20000,
    "amount_due": null,
    "amount_paid": null,
    "billing_end": null,
    "billing_start": null,
    "cancelled_at": 1657203958,
    "comment": "Fresh sea weed mowed this morning",
    "created_at": 1657203943,
    "currency": "SGD",
    "currency_symbol": "<currency_symbol>",
    "customer_details": {
      "billing_address": null,
      "contact": "<phone>",
      "customer_contact": "<phone>",
      "customer_email": "<email>",
      "customer_name": "<name>",
      "email": "<email>",
      "gstin": null,
      "id": "cust_DtHaBuooGHTuyZ",
      "name": "<name>",
      "shipping_address": null
    },
    "customer_id": "cust_DtHaBuooGHTuyZ",
    "date": 1588076279,
    "description": "Domestic invoice for Gaurav Kumar.",
    "email_status": "pending",
    "entity": "invoice",
    "expire_by": 1924991999,
    "expired_at": null,
    "first_payment_min_amount": null,
    "gross_amount": 20000,
    "group_taxes_discounts": false,
    "id": "inv_JqVZyyKWjCs9cY",
    "idempotency_key": null,
    "invoice_number": "Receipt No. 123234",
    "issued_at": null,
    "line_items": [
      {
        "amount": 20000,
        "currency": "SGD",
        "description": "Crate of sea weed.",
        "gross_amount": 20000,
        "hsn_code": null,
        "id": "li_JqVZyzHIx1exXC",
        "item_id": null,
        "name": "Crate of sea weed",
        "net_amount": 20000,
        "quantity": 1,
        "ref_id": null,
        "ref_type": null,
        "sac_code": null,
        "tax_amount": 0,
        "tax_inclusive": false,
        "tax_rate": null,
        "taxable_amount": 20000,
        "taxes": [],
        "type": "invoice",
        "unit": null,
        "unit_amount": 20000
      }
    ],
    "notes": {
      "notes_key_1": "Tea, Earl Grey, Hot",
      "notes_key_2": "Tea, Earl Grey… decaf."
    },
    "order_id": null,
    "paid_at": null,
    "partial_payment": true,
    "payment_id": null,
    "receipt": "Receipt No. 123234",
    "reminder_status": null,
    "short_url": null,
    "sms_status": "pending",
    "status": "cancelled",
    "subscription_status": null,
    "supply_state_code": null,
    "tax_amount": 0,
    "taxable_amount": 20000,
    "terms": "No Returns; No Refunds",
    "type": "invoice",
    "user_id": null,
    "view_less": true
  }
  ```

  ```json Failure theme={null}
  {
    "error": {
      "code": "BAD_REQUEST_ERROR",
      "description": "Operation not allowed for Invoice in cancelled status.",
      "source": "business",
      "step": "payment_initiation",
      "reason": "input_validation_failed",
      "metadata": {}
    }
  }
  ```
</ResponseExample>

## Path Parameters

<ParamField path="id" type="string" required>
  The unique identifier of the invoice.
</ParamField>

## Response Parameters

<ResponseField name="id" type="string">
  The unique identifier of the invoice.
</ResponseField>

<ResponseField name="entity" type="string">
  Indicates the type of entity. Here, it is `invoice`.
</ResponseField>

<ResponseField name="type" type="string">
  Here, it should be `invoice`.
</ResponseField>

<ResponseField name="invoice_number" type="string">
  Unique number you added for internal reference. The minimum character length is 1 and maximum is 40.
</ResponseField>

<ResponseField name="customer_id" type="string">
  The unique identifier of the customer. You can create `customer_id` using the [Customers API](/docs/sg/api/customers). Alternatively, you can pass the customer object described in the below fields.
</ResponseField>

<ResponseField name="customer_details" type="object">
  Details of the customer.
</ResponseField>

<ResponseField name="id" type="string">
  Unique identifier of the customer. For example, `cust_1Aa00000000004`.
</ResponseField>

<ResponseField name="name" type="string">
  Customer's name. Alphanumeric, with period (.), apostrophe (') and parentheses allowed. The name must be between 3-50 characters in length. For example, `Gaurav Kumar`.
</ResponseField>

<ResponseField name="email" type="string">
  The customer's email address. A maximum length of 64 characters. For example, `gaurav.kumar@example.com`.
</ResponseField>

<ResponseField name="contact" type="string">
  The customer's phone number. A maximum length of 15 characters including country code. For example, `+919876543210`.
</ResponseField>

<ResponseField name="billing_address" type="object">
  Details of the customer's billing address.
</ResponseField>

<ResponseField name="id" type="string">
  The unique identifier generated for the customer's billing address.
</ResponseField>

<ResponseField name="type" type="string">
  The customer address type. Here it is `billing_address`.
</ResponseField>

<ResponseField name="primary" type="boolean">
  Defines if this is the primary address.

  * `true`: It is the customer's primary address.
  * `false`: It is not the customer's primary address.
</ResponseField>

<ResponseField name="line1" type="string">
  The first line of the customer's address.
</ResponseField>

<ResponseField name="line2" type="string">
  The second line of the customer's address.
</ResponseField>

<ResponseField name="city" type="string">
  The city.
</ResponseField>

<ResponseField name="zipcode" type="string">
  The zipcode.
</ResponseField>

<ResponseField name="state" type="string">
  The state.
</ResponseField>

<ResponseField name="country" type="string">
  The country.
</ResponseField>

<ResponseField name="shipping_address" type="object">
  Details of the customer's shipping address.
</ResponseField>

<ResponseField name="id" type="string">
  The unique identifier generated for the customer's shipping address.
</ResponseField>

<ResponseField name="type" type="string">
  The customer address type. Here it is `shipping_address`.
</ResponseField>

<ResponseField name="primary" type="boolean">
  Defines if this is the primary address.

  * `true`: It is the customer's primary address.
  * `false`: It is not the customer's primary address.
</ResponseField>

<ResponseField name="line1" type="string">
  The first line of the customer's address.
</ResponseField>

<ResponseField name="line2" type="string">
  The second line of the customer's address.
</ResponseField>

<ResponseField name="city" type="string">
  The city.
</ResponseField>

<ResponseField name="zipcode" type="string">
  The zipcode.
</ResponseField>

<ResponseField name="state" type="string">
  The state.
</ResponseField>

<ResponseField name="country" type="string">
  The country.
</ResponseField>

<ResponseField name="order_id" type="string">
  The unique identifier of the order associated with the invoice.
</ResponseField>

<ResponseField name="line_items" type="object">
  Details of the line item that is billed in the invoice. Maximum of 50 line items.
</ResponseField>

<ResponseField name="id" type="string">
  Unique identifier that is generated if a new item has been created while creating the invoice.
</ResponseField>

<ResponseField name="item_id" type="string">
  Unique identifier of the item generated using Items API that has been billed in the invoice.
</ResponseField>

<ResponseField name="name" type="string">
  The item's name.
</ResponseField>

<ResponseField name="description" type="string">
  A brief description of the item.
</ResponseField>

<ResponseField name="amount" type="integer">
  The price of the item.
</ResponseField>

<ResponseField name="currency" type="string">
  The currency associated with the item. Default is `INR`. Know about the [list of supported international currencies](/docs/sg/payments/international-payments#supported-currencies).
</ResponseField>

<ResponseField name="type" type="string">
  Here, it is `invoice`.
</ResponseField>

<ResponseField name="quantity" type="integer">
  The quantity of the item billed in the invoice. Defaults to `1`.
</ResponseField>

<ResponseField name="payment_id" type="string">
  Unique identifier of a payment made against this invoice.
</ResponseField>

<ResponseField name="status" type="string">
  The status of the invoice. Know more about [Invoice States](/docs/sg/payments/invoices/states). Possible values:

  * `draft`
  * `issued`
  * `partially_paid`
  * `paid`
  * `cancelled`
  * `expired`
  * `deleted`
</ResponseField>

<ResponseField name="expire_by" type="integer">
  Timestamp, in Unix format, at which the invoice will expire.
</ResponseField>

<ResponseField name="issued_at" type="integer">
  Timestamp, in Unix format, at which the invoice was issued to the customer.
</ResponseField>

<ResponseField name="paid_at" type="integer">
  Timestamp, in Unix format, at which the payment was made.
</ResponseField>

<ResponseField name="cancelled_at" type="integer">
  Timestamp, in Unix format, at which the invoice was cancelled.
</ResponseField>

<ResponseField name="expired_at" type="integer">
  Timestamp, in Unix format, at which the invoice expired.
</ResponseField>

<ResponseField name="sms_status" type="string">
  The delivery status of the SMS notification for the invoice sent to the customer. Possible values:

  * `pending`
  * `sent`
</ResponseField>

<ResponseField name="email_status" type="string">
  The delivery status of the email notification for the invoice sent to the customer. Possible values:

  * `pending`
  * `sent`
</ResponseField>

<ResponseField name="partial_payment" type="boolean">
  Indicates whether the customer can make a partial payment on the invoice. Possible values:

  * `true`:  The customer can make partial payments.
  * `false` (default): The customer cannot make partial payments.
</ResponseField>

<ResponseField name="amount" type="integer">
  Amount to be paid using the invoice. Must be in the smallest unit of the currency. For example, if the amount to be received from the customer is , pass the value as `30000`.
</ResponseField>

<ResponseField name="amount_paid" type="integer">
  Amount paid by the customer against the invoice.
</ResponseField>

<ResponseField name="amount_due" type="integer">
  The remaining amount to be paid by the customer for the issued invoice.
</ResponseField>

<ResponseField name="currency" type="string">
  The currency associated with the invoice. You must mandatorily pass this parameter if accepting international payments. If you have passed `currency` as a sub-parameter in the `line_item` object, you must ensure that the same currency is passed in both places. Know about the [list of supported international currencies.](/docs/sg/payments/international-payments#supported-currencies)
</ResponseField>

<ResponseField name="description" type="string">
  A brief description of the invoice. The maximum character length is 2048.
</ResponseField>

<ResponseField name="notes" type="object">
  Any custom notes added to the invoice. Maximum of 2048 characters.
</ResponseField>

<ResponseField name="short_url" type="string">
  The short URL that is generated. Share this link with customers to accept payments.
</ResponseField>

<ResponseField name="date" type="integer">
  Timestamp, in Unix format, that indicates the issue date of the invoice.
</ResponseField>

<ResponseField name="terms" type="string">
  Any terms to be included in the invoice. Maximum of 2048 characters.
</ResponseField>

<ResponseField name="comment" type="string">
  Any comments to be added in the invoice. Maximum of 2048 characters.
</ResponseField>

<ResponseField name="ref_num" type="string">
  A unique reference number for the invoice, used for internal tracking and reconciliation.
</ResponseField>

<ResponseField name="user_id" type="string">
  Unique identifier of the user associated with this invoice.
</ResponseField>

<ResponseField name="first_payment_min_amount" type="integer">
  The first payment min amount for this invoice, in the smallest currency unit (paise for INR).
</ResponseField>

<ResponseField name="receipt" type="string">
  A unique receipt number that you can provide for the invoice, for your internal reference.
</ResponseField>

<ResponseField name="currency_symbol" type="string">
  For example, `₹`.
</ResponseField>

<ResponseField name="idempotency_key" type="string">
  A unique key used to ensure idempotency of the invoice creation request, preventing duplicate invoices.
</ResponseField>

<ResponseField name="subscription_id" type="string">
  Unique identifier of the subscription this invoice was generated for. `null` for one-off invoices.
</ResponseField>

## Errors

<AccordionGroup>
  <Accordion title="Operation not allowed for Invoice in {cancelled|paid|partially_paid|expired} status.">
    **Code:** `400`

    Cancellation is only allowed on invoices in the `draft` or `issued` state. The error message echoes the invoice's actual current status. For example, `Operation not allowed for Invoice in paid status.` if the invoice has already been paid.

    **Solution:** Verify the invoice's current status using the Fetch Invoice API. Only invoices in `draft` or `issued` state can be cancelled.
  </Accordion>

  <Accordion title="Invoice cannot be cancelled as payment for it has happened.">
    **Code:** `400`

    The invoice was in the `issued` state at the time of the cancel request but a payment was already in progress against it.

    **Solution:** Fetch the invoice and confirm its current state. Once the payment finalises, the invoice will move to `paid` or `partially_paid` and can no longer be cancelled.
  </Accordion>

  <Accordion title="The api {key/secret} provided is invalid.">
    **Code:** `4xx`

    The API credentials passed in the API call differ from the ones generated on the Dashboard.

    **Solution:** The API keys must be active and entered correctly with no whitespace before or after.
  </Accordion>

  <Accordion title="The id provided does not exist.">
    **Code:** `400`

    The invoice id passed in the URL does not exist or does not belong to the requesting merchant.

    **Solution:** Use a valid invoice id returned from `POST /v1/invoices`. Confirm by fetching the invoice before retrying.
  </Accordion>
</AccordionGroup>
