---
title: "Bulk Create Invoices"
method: POST
path: "/coa/api/v1/invoice/bulk-create"
tags: ["Accounts Receivable"]
---

# Bulk Create Invoices

`POST /coa/api/v1/invoice/bulk-create`

Create multiple invoices atomically in a single transaction.

    All invoices are created within a single database transaction. If any invoice creation fails,
    all invoices are rolled back and no invoices are created.

    This endpoint validates all invoices before creating any of them, ensuring data integrity.

## Request body

- BulkCreateInvoices — Serializer for bulk invoice creation. Accepts a list of invoice data.
  - `invoices` object[], required — List of invoice data dictionaries matching AccountingInvoiceSerializer structure

## Response `201`

- AccountingInvoice[]
  - `id` integer, required
  - `lines` AccountingInvoiceLine[], required
    - `id` integer, required
    - `invoice` integer
    - `product_name` string, required
    - `product_bundle_name` string, required
    - `stripe_product_id` string, required
    - `product_is_taxable` boolean, required
    - `anrok_item_id` string, required
    - `sphere_item_id` string, required
    - `service_date` string, date, nullable
    - `tags` object[], required
    - `department_name` string, required
    - `department_code` string, required
    - `withholding_tax_rate_name` string, required
    - `withholding_tax_rate_value` number, double, nullable, required — Sum of the selected withholding rate's component rates, for line-level preview.
    - `description` string, nullable
    - `quantity` number, double
    - `rate` number, double
    - `currency` string
    - `amount` number, double
    - `tax` number, double
    - `tax_description` string, nullable
    - `entity_use_code` string, nullable — Avalara entity/use code for line-level tax exemptions
    - `discount` number, double — Discount amount in currency
    - `discount_percentage` number, double — Discount percentage (0-100)
    - `discount_amount` number, double — Discount amount calculated from percentage
    - `tag_ids` integer[]
    - `tag_group_ids` integer[]
    - `created_at` string, date-time, required
    - `last_modified_at` string, date-time, required
    - `customer` integer, required
    - `product` integer, nullable
    - `product_bundle` integer, nullable
    - `withholding_tax_rate` integer, nullable — Marks this line as subject to withholding; used for preview only. Null = not subject.
    - `department` integer, nullable
  - `emails` object[], required
  - `payments` AccountingInvoicePayment[], required
    - `id` integer, required
    - `credit_memo` string, required
    - `payment_transaction_bank_description` string, required
    - `payment_journal_entry_order` string, required
    - `payment_intercompany_journal` string, required
    - `voided_journal_entry_order` string, required
    - `withheld_amount` number, double, nullable, required — Tax withheld on this payment: sum of the payment's own withholding GL legs. Summed over the payment's legs (not the invoice's withholding records) so a voided payment still shows what it originally withheld.
    - `currency` string
    - `amount` number, double
    - `payment_date` string, date, nullable
    - `created_at` string, date-time, required
    - `voided_date` string, date, nullable
    - `source` union
      - 'STRIPE' | 'MANUAL' — * `STRIPE` - Stripe * `MANUAL` - Manual
      - ''
      - unknown
    - `payment_type` union, required — Type of payment: credit memo application, bank transaction, or manual transaction * `CREDIT_MEMO` - Credit Memo * `BANK_TRANSACTION` - Bank Transaction * `MANUAL_TRANSACTION` - Manual Transaction
      - 'CREDIT_MEMO' | 'BANK_TRANSACTION' | 'MANUAL_TRANSACTION' — * `CREDIT_MEMO` - Credit Memo * `BANK_TRANSACTION` - Bank Transaction * `MANUAL_TRANSACTION` - Manual Transaction
      - unknown
    - `external_id` string, nullable, required — Stable upstream identifier for this payment (e.g. Stripe balance transaction 'btxn_...', Stripe credit note 'cn_...', or the mart's event external_id for customer-balance applications). Used as the natural dedup/idempotency key. Null for manually-entered payments.
    - `last_modified_at` string, date-time, required
    - `customer` integer, required
    - `invoice` integer, required
    - `payment_journal_entry` integer, nullable
    - `payment_transaction` integer, nullable
    - `fx_gain_loss_realized_transaction` integer, nullable
    - `payment_term_discount_transaction` integer, nullable
    - `voided_journal_entry` integer, nullable
    - `payment_transactions` integer[]
  - `related_journal_entries` AccountingInvoiceJournalEntry[], required
    - `id` integer, required
    - `journal_entry` integer, required
    - `journal_entry_order` string, required
    - `journal_entry_date` string, date, required
    - `journal_entry_memo` string, required
    - `type` 'reclassification' | 'adjustment' | 'dispute' | 'refund' | 'refund_failure' | 'fx_loss' | 'recoverables', required — * `reclassification` - Reclassification * `adjustment` - Adjustment * `dispute` - Dispute * `refund` - Refund * `refund_failure` - Refund Failure * `fx_loss` - FX Loss * `recoverables` - Recoverables
    - `created_at` string, date-time, required
  - `payment_journal_entries` integer[], required
  - `journal_entry_intercompany` string, required
  - `client_name` string, required
  - `client_campfire_id` string, nullable, required
  - `client_email` string, required
  - `anrok_customer_id` string, required
  - `client_invoice_message` string, required
  - `client_use_stripe_auto_bill` boolean, required
  - `public_invoice_payment_url` string, nullable, required
  - `status` string, required
  - `past_due_days` integer, nullable, required
  - `entity_name` string, required
  - `entity_currency` string, required
  - `entity_invoice_message` string, nullable, required
  - `total_amount` number, double, required
  - `amount_paid` number, double, required
  - `amount_due` number, double, required
  - `withholding_info` object, nullable, required — Withholding context for the invoice's entity. ``estimated_withholding_amount`` covers only the remaining amount due (null once fully paid); ``withheld_to_date`` is the signed sum of posted withholding, so actuals replace the estimate as receipts come in. Certificate-based schemes estimate from the entity certificate's rate (falling back to the scheme default); rules-based schemes sum each line's selected rate over the line amount, scaled by the remaining-due proportion.
  - `contract_name` string, required
  - `attachments` File[], required
    - `id` integer, required
    - `customer` integer, required
    - `created_at` string, date-time, required
    - `created_by` integer, nullable, required
    - `created_by_name` string, required
    - `created_by_email` string, required
    - `last_modified_at` string, date-time, required
    - `name` string, required
    - `url` string, required
    - `s3_content_type` string, nullable
    - `s3_content_length` integer, nullable
    - `s3_path` string, required
    - `object_id` integer, nullable
    - `app` string, required
    - `model` string, required
    - `is_deleted` boolean, required
    - `deleted_at` string, date-time, nullable, required
  - `invoice_number` string
  - `stripe_connection_name` string, required
  - `stripe_connection_entity` integer, required
  - `stripe_connection_billing_portal_enabled` boolean, required
  - `avalara_connection_name` string, required
  - `avalara_connection_company` string, required
  - `tax_rate_name` string, required
  - `tax_rate_value` number, double, required
  - `payment_term_name` string, required
  - `revenue_transactions` integer[]
  - `item_date` string, date, nullable
  - `migrated_journal_id` integer, nullable
  - `voided_journal_entry_order` integer, nullable, required
  - `contract_custom_fields` object[], required
  - `department` integer, nullable
  - `department_name` string, nullable
  - `tags` integer[]
  - `last_modified_at` string, date-time, required
  - `is_deleted` boolean, required
  - `deleted_at` string, date-time, nullable, required
  - `chat_uuid` string, uuid
  - `search_vector` string, nullable, required
  - `search_text` string, nullable, required
  - `auto_send_invoice` boolean, nullable
  - `auto_send_invoice_at` string, date, nullable
  - `auto_sent_at` string, date-time, nullable, required
  - `reminder_sent_dates` unknown
  - `pre_due_reminder_sent_dates` unknown
  - `billing_address` string, nullable
  - `billing_addressee` string, nullable
  - `shipping_address` string, nullable
  - `shipping_addressee` string, nullable
  - `terms` union
    - 'custom' | 'net_5' | 'net_7' | 'net_10' | 'net_15' | 'net_20' | 'net_30' | 'net_40' | 'net_45' | 'net_60' | 'net_90' | 'net_105' | 'net_120' | 'due_on_receipt' — * `custom` - Custom * `net_5` - Net 5 * `net_7` - Net 7 * `net_10` - Net 10 * `net_15` - Net 15 * `net_20` - Net 20 * `net_30` - Net 30 * `net_40` - Net 40 * `net_45` - Net 45 * `net_60` - Net 60 * `net_90` - Net 90 * `net_105` - Net 105 * `net_120` - Net 120 * `due_on_receipt` - Due on Receipt
    - ''
    - unknown
  - `ref_number` string, nullable
  - `purchase_order_number` string, nullable
  - `invoice_date` string, date, required
  - `due_date` string, date, required
  - `shipping_date` string, date, nullable
  - `paid_date` string, date, nullable
  - `uncollectible_date` string, date, nullable
  - `sent_date` string, date, nullable, required
  - `period_start` string, date, nullable
  - `period_end` string, date, nullable
  - `location_of_sale` string, nullable
  - `message_on_invoice` string, nullable
  - `ita_allocation_number` string, nullable
  - `payment_status` union
    - 'draft' | 'open' | 'sent' | 'partial' | 'paid' | 'uncollectible' | 'voided' — * `draft` - Draft * `open` - Open * `sent` - Sent * `partial` - Partially Paid * `paid` - Paid * `uncollectible` - Uncollectible * `voided` - Voided
    - ''
    - unknown
  - `anrok_transaction_id` string, nullable — ID of the transaction in Anrok (set when transaction is created)
  - `warning_message` string, nullable
  - `created_at` string, date-time, required
  - `currency` string
  - `exchange_rate` number, double, nullable
  - `exchange_rate_book` number, double, nullable
  - `last_sent_at` string, date-time, nullable, required
  - `integration_id` string, nullable
  - `integration_context` unknown
  - `vat_number` string, nullable
  - `discount` number, double, nullable — Discount amount for the invoice
  - `payment_term_applied_discount` number, double, nullable — Discount amount applied based on payment term early payment discount
  - `use_stripe_auto_bill` boolean, nullable
  - `stripe_payment_link_id` string, nullable
  - `stripe_payment_intent_id` string, nullable
  - `stripe_invoice_id` string, nullable
  - `stripe_pdf_url` string, nullable
  - `stripe_payment_link` string, nullable
  - `source` string, nullable
  - `source_id` string, nullable
  - `is_migrated` boolean — True for invoices imported via opening balance migration (no finalization JE).
  - `voided_date` string, date, nullable
  - `invoice_labels` unknown
  - `invoice_language` string, nullable
  - `chat_id` integer, nullable
  - `customer` integer, required
  - `entity` integer, required
  - `client` integer, nullable
  - `payment_term` integer, nullable
  - `bad_debt_journal_entry` integer, nullable, required
  - `journal_entry` integer, nullable, required
  - `ar_account` integer, nullable, required — Accounts Receivable account for this invoice. Populated for single-AR and migrated invoices. NULL for multi-AR invoices (aging uses ChartTransactions instead).
  - `voided_journal_entry` integer, nullable, required
  - `entity_transfer_journal_entry` integer, nullable, required
  - `contract` integer, nullable
  - `avalara_connection` integer, nullable
  - `sphere_connection` integer, nullable
  - `anrok_connection` integer, nullable
  - `tax_rate` integer, nullable
  - `stripe_connection` integer, nullable
  - `source_file` integer, nullable

## Other responses

- `400` — No response body

---

[API](https://skmtc.net/campfire/apis/campfire-developer-apis.md) · [All operations](https://skmtc.net/campfire/apis/campfire-developer-apis/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/campfire/campfire-developer-apis/versions/6945ebc3180e/schema)
