> ## 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.

# Issue an Invoice

> Issue 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 issue invoices to your customers. Only an invoice in the `draft` state can be issued.

<RequestExample>
  ```bash Curl theme={null}
  curl -u [YOUR_KEY_ID]:[YOUR_KEY_SECRET] \
  -X POST  https://api.razorpay.com/v1/invoices/inv_DAweOiQ7amIUVd/issue
  ```

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

  String invoiceId = "inv_DAweOiQ7amIUVd";

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

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

  client.invoice.issue(invoiceId)
  ```

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

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

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

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

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

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

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

  instance.invoices.issue(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).Issue();
  ```

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

<ResponseExample>
  ```json Success theme={null}
  {
    "id": "inv_DAweOiQ7amIUVd",
    "entity": "invoice",
    "receipt": "#0961",
    "invoice_number": "#0961",
    "customer_id": "cust_DAtUWmvpktokrT",
    "customer_details": {
      "id": "cust_DAtUWmvpktokrT",
      "name": "<name>",
      "email": "<email>",
      "contact": "<phone>",
      "gstin": null,
      "billing_address": {
        "id": "addr_DAtUWoxgu91obl",
        "type": "billing_address",
        "primary": true,
        "line1": "318 C-Wing, Suyog Co. Housing Society Ltd.",
        "line2": "T.P.S Road, Vazira, Borivali",
        "zipcode": "400092",
        "city": "Mumbai",
        "state": "Maharashtra",
        "country": "in"
      },
      "shipping_address": null,
      "customer_name": "<name>",
      "customer_email": "<email>",
      "customer_contact": "<phone>"
    },
    "order_id": "order_DBG3P8ZgDd1dsG",
    "line_items": [
      {
        "id": "li_DAweOizsysoJU6",
        "item_id": null,
        "name": "Book / English August - Updated name and quantity",
        "description": "150 points in Quidditch",
        "amount": 400,
        "unit_amount": 400,
        "gross_amount": 400,
        "tax_amount": 0,
        "taxable_amount": 400,
        "net_amount": 400,
        "currency": "USD",
        "type": "invoice",
        "tax_inclusive": false,
        "hsn_code": null,
        "sac_code": null,
        "tax_rate": null,
        "unit": null,
        "quantity": 1,
        "taxes": []
      },
      {
        "id": "li_DAwjWQUo07lnjF",
        "item_id": null,
        "name": "Book / A Wild Sheep Chase",
        "description": null,
        "amount": 200,
        "unit_amount": 200,
        "gross_amount": 200,
        "tax_amount": 0,
        "taxable_amount": 200,
        "net_amount": 200,
        "currency": "USD",
        "type": "invoice",
        "tax_inclusive": false,
        "hsn_code": null,
        "sac_code": null,
        "tax_rate": null,
        "unit": null,
        "quantity": 1,
        "taxes": []
      }
    ],
    "payment_id": null,
    "status": "issued",
    "expire_by": 1567103399,
    "issued_at": 1566974805,
    "paid_at": null,
    "cancelled_at": null,
    "expired_at": null,
    "sms_status": null,
    "email_status": null,
    "date": 1566891149,
    "terms": null,
    "partial_payment": false,
    "gross_amount": 600,
    "tax_amount": 0,
    "taxable_amount": 600,
    "amount": 600,
    "amount_paid": 0,
    "amount_due": 600,
    "currency": "USD",
    "currency_symbol": "<currency_symbol>",
    "description": "This is a test invoice.",
    "notes": {
      "updated-key": "An updated note."
    },
    "comment": null,
    "short_url": "https://rzp.io/i/K8Zg72C",
    "view_less": true,
    "billing_start": null,
    "billing_end": null,
    "type": "invoice",
    "group_taxes_discounts": false,
    "created_at": 1566906474,
    "idempotency_key": null
  }
  ```

  ```json Failure theme={null}
  {
    "error": {
      "code": "BAD_REQUEST_ERROR",
      "description": "The api key provided is invalid",
      "source": "NA",
      "step": "NA",
      "reason": "NA",
      "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/us/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/us/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/us/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/us/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>

## Errors

<AccordionGroup>
  <Accordion
    title="The API `<key/secret>
` provided is invalid."
  >
    **Code:** `400`

    There is a mismatch between the API credentials passed in the API call and those generated on the Dashboard.

    **Solution:**

    * Ensure that the API Keys are active and entered correctly.
    * There should be no whitespaces before or after the keys.
  </Accordion>

  <Accordion title="line_items is required.">
    **Code:** `400`

    Items and customer details are missing.

    **Solution:** Add items and customer details.
  </Accordion>

  <Accordion title="Operation not allowed for Invoice in issued status.">
    **Code:** `400`

    You are trying to issue an invoice that is already issued.

    **Solution:** Issue an invoice in the draft state.
  </Accordion>

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

    There is an error in the invoice id. It may be incorrect or invalid.

    **Solution:** Check that you have entered a valid invoice id.
  </Accordion>

  <Accordion title="customer is required.">
    **Code:** `400`

    The invoice does not have a customer attached. An invoice cannot be issued without customer details.

    **Solution:** Update the invoice first to add a `customer_id` or a `customer` object before issuing.
  </Accordion>

  <Accordion title="expire_by should be at least 15 minutes after current time.">
    **Code:** `400`

    The invoice has an `expire_by` value that is in the past or less than 15 minutes from the current server time. An invoice cannot be issued with an immediate or past expiry.

    **Solution:** Update the invoice's `expire_by` to a timestamp at least 15 minutes in the future before issuing.
  </Accordion>
</AccordionGroup>
