---
title: "Save invoices"
method: POST
path: "/v6/invoicing/invoices"
tags: ["Invoicing - Invoices"]
---

# Save invoices

`POST /v6/invoicing/invoices`

Save new (or update existing) invoices

## Request body

- MultiParamInvoicePostDto
  - `data` InvoicePostDto[], required
    - `id` string — Id of the invoice, required when updating an existing invoice
    - `name` string — Name of the invoice
    - `invoiceNo` integer — Invoice number
    - `status` 'ACTIVE' | 'INACTIVE' | 'REMOVED' — Status of the invoice
    - `invoiceStatus` 'DRAFT' | 'SCHEDULED' | 'OPEN' | 'CLOSED' | 'CANCELLED' | 'REFUNDED' — Invoice status
    - `date` string, date — Date of the invoice
    - `pdfUrl` string — URL of the generated invoice PDF
    - `customerInvoiceKey` string — Unique key used in the customer-facing invoice URL
    - `notes` string — Notes to include on the invoice
    - `customerId` string — Id of the customer associated with the invoice
    - `apiName` 'BOX' | 'CLOVER' | 'STRIPE' | 'PLAID' | 'KNOX' | 'UBER' | 'FRESHBOOKS' | 'HARVEST' | 'KW' | 'FRESHBOOKS2' | 'CAPITAL_ONE' | 'SQUARE' | 'DOTLOOP' | 'REALOGY' | 'UPWORK' | 'SHOPIFY' | 'DEDUCTR' | 'ENTERPRISE' | 'MOXIWORKS' | 'APPDIRECT' | 'LONEWOLF' | 'LONEWOLF_TRANSACTIONDESK' | 'SAMPLE_BANK' | 'TAXBOT' | 'GUSTO' | 'XERO' | 'UNIT' | 'MOOV' | 'QBO' | 'QUALPAY' | 'BENCH' | 'PARTNER_IMPLEMENTATION' | 'CHECK' | 'RUTTER' | 'WAVE' | 'MANUAL_ENTRY' | 'CSV_IMPORT' | 'ADYEN' | 'PAYABLI' — API name of the source
    - `apiSourceId` string — API source id
    - `recurrence` InvoiceRecurrencePostDto — Recurrence settings for the invoice
      - `updateType` 'SINGLE_RECURRENCE' | 'FUTURE_ONLY' | 'ALL_IN_SERIES' — Scope of the recurrence update
      - `frequency` 'ONE_TIME' | 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'YEARLY' — Frequency of the recurrence
      - `interval` integer — Number of steps between occurrences
      - `endDate` string, date — Date the recurrence ends
    - `lineItems` object[]
      - `id` string — Id of the invoice line item, required when updating an existing line item
      - `description` string — Description of the line item
      - `amount` integer — Amount of the line item (in cents)
      - `quantity` string — Quantity of the line item
      - `price` string — Unit price of the line item
      - `salesTax` SalesTaxPostDto — Sales tax applied to the invoice item template
        - `value` string — The sales tax value
        - `type` 'AMOUNT' | 'PERCENT' — The type of the sales tax value
      - `apiItemId` string — API item id associated with the line item
      - `glAccountId` string — Id of the GL account associated with the line item
    - `discount` DiscountPostDto — Discount applied to the invoice
      - `value` string — The discount value
      - `type` 'AMOUNT' | 'PERCENT' — The type of the discount value
      - `calculateBeforeSalesTax` boolean — Whether to calculate the discount before sales tax
    - `salesTax` SalesTaxPostDto — Sales tax applied to the invoice item template
      - `value` string — The sales tax value
      - `type` 'AMOUNT' | 'PERCENT' — The type of the sales tax value
    - `collectionInfo` InvoiceCollectionInfoPostDto — Collection and payment settings for the invoice
      - `paymentMethods` string[] — Accepted payment methods for the invoice
      - `term` InvoiceTermPostDto — Default invoice payment term
        - `type` 'NET_10' | 'NET_15' | 'NET_30' | 'NET_60' | 'OTHER' — The payment term type
        - `dueDate` string, date — The due date for payment
      - `sendEmail` boolean — Whether to send the invoice by email
      - `reminderRecurrence` ReminderRecurrence — Default invoice reminder recurrence
        - `frequency` 'ONE_TIME' | 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'YEARLY' — Frequency of the reminder
        - `interval` integer — Number of steps between occurrences
    - `installments` object[]
      - `id` string — Id of the installment
      - `name` string — Name of the installment
      - `dueDate` string, date — Due date of the installment
      - `balance` integer — Balance of the installment (in cents)
      - `amountDue` AmountDuePostDto — Amount due for the installment
        - `value` string — The amount due value
        - `type` 'AMOUNT' | 'PERCENT' — The type of the amount due value
    - `customData` JsonNode, nullable — Custom JSON in which you can store any data with max length of 2000 characters
      - `empty` boolean
      - `array` boolean
      - `null` boolean
      - `object` boolean
      - `float` boolean
      - `string` boolean
      - `number` boolean
      - `missingNode` boolean
      - `valueNode` boolean
      - `nodeType` 'ARRAY' | 'BINARY' | 'BOOLEAN' | 'MISSING' | 'NULL' | 'NUMBER' | 'OBJECT' | 'POJO' | 'STRING'
      - `pojo` boolean
      - `integralNumber` boolean
      - `floatingPointNumber` boolean
      - `short` boolean
      - `int` boolean
      - `long` boolean
      - `double` boolean
      - `bigDecimal` boolean
      - `bigInteger` boolean
      - `textual` boolean
      - `boolean` boolean
      - `binary` boolean
      - `container` boolean
      - `embeddedValue` boolean

## Response `200`

Success

- ResponseListMultiResponseInvoiceGetDto
  - `result` 'SUCCESS' | 'FAILURE' — The result of the action performed.
  - `data` MultiResponseInvoiceGetDto[] — The data generated by the action performed.
    - `result` 'SUCCESS' | 'FAILURE' — The result of the action performed.
    - `statusCode` 200 | 400 | 401 | 403 | 404 | 500 — The HTTP status code for the action performed.
    - `data` InvoiceGetDto — The data generated by the action performed.
      - `id` string, required — Id of the invoice
      - `name` string, nullable, required — Name of the invoice
      - `invoiceNo` integer, nullable, required — Invoice number
      - `status` 'ACTIVE' | 'INACTIVE' | 'REMOVED', required — Status of the invoice
      - `invoiceStatus` 'DRAFT' | 'SCHEDULED' | 'OPEN' | 'CLOSED' | 'CANCELLED' | 'REFUNDED', nullable, required — Invoice status
      - `date` string, date, nullable, required — Date of the invoice
      - `totals` InvoiceTotals, nullable, required — Computed totals for the invoice
        - `subtotal` integer, nullable, required — Subtotal of the invoice before discounts and taxes (in cents)
        - `discountedTotal` integer, nullable, required — Total after discounts but before taxes (in cents)
        - `salesTax` integer, nullable, required — Sales tax amount (in cents)
        - `total` integer, nullable, required — Total amount including discounts and taxes (in cents)
        - `paidAmount` integer, nullable, required — Amount already paid (in cents)
        - `balance` integer, nullable, required — Remaining balance due (in cents)
      - `pdfUrl` string, nullable, required — URL of the generated invoice PDF
      - `customerInvoiceKey` string, nullable, required — Unique key used in the customer-facing invoice URL
      - `notes` string, nullable, required — Notes to include on the invoice
      - `customer` CustomerExpanded, nullable, required — Customer associated with this time entry
        - `id` string, required — Id of the customer
        - `name` string — Name of the customer
        - `email` string — Email of the customer
      - `apiName` 'BOX' | 'CLOVER' | 'STRIPE' | 'PLAID' | 'KNOX' | 'UBER' | 'FRESHBOOKS' | 'HARVEST' | 'KW' | 'FRESHBOOKS2' | 'CAPITAL_ONE' | 'SQUARE' | 'DOTLOOP' | 'REALOGY' | 'UPWORK' | 'SHOPIFY' | 'DEDUCTR' | 'ENTERPRISE' | 'MOXIWORKS' | 'APPDIRECT' | 'LONEWOLF' | 'LONEWOLF_TRANSACTIONDESK' | 'SAMPLE_BANK' | 'TAXBOT' | 'GUSTO' | 'XERO' | 'UNIT' | 'MOOV' | 'QBO' | 'QUALPAY' | 'BENCH' | 'PARTNER_IMPLEMENTATION' | 'CHECK' | 'RUTTER' | 'WAVE' | 'MANUAL_ENTRY' | 'CSV_IMPORT' | 'ADYEN' | 'PAYABLI', nullable, required — API name of the source
      - `apiSourceId` string, nullable, required — API source id
      - `recurrence` InvoiceRecurrenceGetDto, nullable, required — Recurrence settings for the invoice
        - `frequency` 'ONE_TIME' | 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'YEARLY', nullable, required — Frequency of the recurrence
        - `interval` integer, nullable, required — Number of steps between occurrences
        - `endDate` string, date, nullable, required — Date the recurrence ends
      - `lineItems` InvoiceLineItemGetDto[]
        - `id` string, required — Id of the invoice line item
        - `description` string, nullable, required — Description of the line item
        - `amount` integer, nullable, required — Amount of the line item (in cents)
        - `quantity` string, nullable, required — Quantity of the line item
        - `price` string, nullable, required — Unit price of the line item
        - `salesTax` SalesTax, nullable, required — Sales tax applied to the invoice item template
          - `value` string, required — The sales tax value
          - `type` 'AMOUNT' | 'PERCENT', required — The type of the sales tax value
        - `apiItemId` string, nullable, required — API item id associated with the line item
        - `glAccount` GlAccountExpanded, required — GL account details
          - `id` string, required — Id of the GL account
          - `name` string — Name of the GL account
          - `accountNo` string — Number of the GL account
          - `type` 'ASSET' | 'LIABILITY' | 'EQUITY' | 'INCOME' | 'COGS' | 'EXPENSE' | 'OTHER_INCOME' | 'OTHER_EXPENSE' | 'SUSPENSE' — Type the GL account
          - `iconUrl` string — Icon URL of the GL account
          - `displayName` string — Display name of the GL account
      - `discount` Discount, nullable, required — Discount applied to the invoice
        - `value` string, nullable, required — The discount value
        - `type` 'AMOUNT' | 'PERCENT', nullable, required — The type of the discount value
        - `calculateBeforeSalesTax` boolean, nullable, required — Whether to calculate the discount before sales tax
      - `salesTax` SalesTax, nullable, required — Sales tax applied to the invoice item template
        - `value` string, required — The sales tax value
        - `type` 'AMOUNT' | 'PERCENT', required — The type of the sales tax value
      - `collectionInfo` InvoiceCollectionInfoGetDto, nullable, required — Collection and payment settings for the invoice
        - `paymentUrl` string, nullable, required — URL for the customer to view and pay the invoice
        - `paymentMethods` string[]
        - `term` InvoiceTerm, nullable, required — Default invoice payment term
          - `type` 'NET_10' | 'NET_15' | 'NET_30' | 'NET_60' | 'OTHER', nullable, required — The payment term type
          - `dueDate` string, date, nullable, required — The due date for payment
        - `sendEmail` boolean, nullable, required — Whether to send the invoice by email
        - `lastViewedDatetime` string, date-time, nullable, required — Date and time the invoice was last viewed by the customer
        - `reminderRecurrence` ReminderRecurrence, required — Default invoice reminder recurrence
          - `frequency` 'ONE_TIME' | 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'YEARLY' — Frequency of the reminder
          - `interval` integer — Number of steps between occurrences
        - `emailSentDatetime` string, date-time, nullable, required — Date and time the invoice email was sent
        - `emailStatus` 'SENDING' | 'NOT_SENT' | 'SENT' | 'FAILURE_BOUNCED', nullable, required — Status of the invoice email
        - `emailErrors` JsonNode, nullable, required — Custom JSON in which you can store any data with max length of 2000 characters
          - `empty` boolean
          - `array` boolean
          - `null` boolean
          - `object` boolean
          - `float` boolean
          - `string` boolean
          - `number` boolean
          - `missingNode` boolean
          - `valueNode` boolean
          - `nodeType` 'ARRAY' | 'BINARY' | 'BOOLEAN' | 'MISSING' | 'NULL' | 'NUMBER' | 'OBJECT' | 'POJO' | 'STRING'
          - `pojo` boolean
          - `integralNumber` boolean
          - `floatingPointNumber` boolean
          - `short` boolean
          - `int` boolean
          - `long` boolean
          - `double` boolean
          - `bigDecimal` boolean
          - `bigInteger` boolean
          - `textual` boolean
          - `boolean` boolean
          - `binary` boolean
          - `container` boolean
          - `embeddedValue` boolean
      - `installments` InstallmentGetDto[]
        - `id` string, required — Id of the installment
        - `name` string, nullable, required — Name of the installment
        - `dueDate` string, date, nullable, required — Due date of the installment
        - `balance` integer, nullable, required — Balance of the installment (in cents)
        - `amountDue` AmountDue, nullable, required — Amount due for the installment
          - `value` string, nullable, required — The amount due value
          - `type` 'AMOUNT' | 'PERCENT', nullable, required — The type of the amount due value
      - `customData` JsonNode, nullable — Custom JSON in which you can store any data with max length of 2000 characters
        - `empty` boolean
        - `array` boolean
        - `null` boolean
        - `object` boolean
        - `float` boolean
        - `string` boolean
        - `number` boolean
        - `missingNode` boolean
        - `valueNode` boolean
        - `nodeType` 'ARRAY' | 'BINARY' | 'BOOLEAN' | 'MISSING' | 'NULL' | 'NUMBER' | 'OBJECT' | 'POJO' | 'STRING'
        - `pojo` boolean
        - `integralNumber` boolean
        - `floatingPointNumber` boolean
        - `short` boolean
        - `int` boolean
        - `long` boolean
        - `double` boolean
        - `bigDecimal` boolean
        - `bigInteger` boolean
        - `textual` boolean
        - `boolean` boolean
        - `binary` boolean
        - `container` boolean
        - `embeddedValue` boolean
    - `error` ErrorItem[]
      - `type` 'UNKNOWN_ERROR' | 'INVALID_TOKEN' | 'EXPIRED_TOKEN' | 'FORBIDDEN' | 'BAD_REQUEST' | 'JSON_ERROR' | 'DUPLICATE' | 'REQUIRED' | 'INVALID_VALUE' | 'NOT_MODIFIABLE' | 'INVALID_FORMAT' | 'NOT_FOUND' — The type of the error. Safe for programmatic use.
      - `message` string — A human-readable message providing more details about the error. Safe for displaying to a user.
      - `param` string — If the error is parameter-specific, the parameter related to the error. This can be used to display a message near the correct form field.
  - `error` ErrorItem[]
    - `type` 'UNKNOWN_ERROR' | 'INVALID_TOKEN' | 'EXPIRED_TOKEN' | 'FORBIDDEN' | 'BAD_REQUEST' | 'JSON_ERROR' | 'DUPLICATE' | 'REQUIRED' | 'INVALID_VALUE' | 'NOT_MODIFIABLE' | 'INVALID_FORMAT' | 'NOT_FOUND' — The type of the error. Safe for programmatic use.
    - `message` string — A human-readable message providing more details about the error. Safe for displaying to a user.
    - `param` string — If the error is parameter-specific, the parameter related to the error. This can be used to display a message near the correct form field.

## Other responses

- `207` — Some invoices failed to save. See response body for error details.
- `400` — All invoices failed to save.
- `401` — Not authenticated
- `403` — Not authorized
- `404` — Endpoint not found
- `500` — Internal server error

---

[API](https://skmtc.net/tight/apis/tight-api.md) · [All operations](https://skmtc.net/tight/apis/tight-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/tight/tight-api/revisions/e9f0790a89af/schema)
