---
title: "Export invoices to a spreadsheet"
method: POST
path: "/companies/{company}/invoices/export/excel"
tags: ["Invoices"]
---

# Export invoices to a spreadsheet

`POST /companies/{company}/invoices/export/excel`

## Request

- Base URL: `https://api.factuarea.com/v1`
- URL: `https://api.factuarea.com/v1/companies/{company}/invoices/export/excel`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Export a selection of invoices to `xlsx` or `csv` and stream it back as an attachment.
- Filter by `invoice_ids`, `client_id`, `series_id`, `status`, dates or `search`; `format` is `SUMMARY` or `ITEMS`.
- Capped at 5,000 invoices: 422 `export_limit_exceeded`.

## Path parameters

- `company` string, uuid, required

## Headers

- `Idempotency-Key` string, required
- `Factuarea-Version` string, date

## Request body

- ExportInvoicesExcelV1Request: Export invoices to a spreadsheet. `format` selects the content layout (`SUMMARY` one row per invoice, `ITEMS` one row per line) and `file_format` the file type (`xlsx` or `csv`). Narrow the selection with `date_from`/`date_to`, `client_id`, `series_id` or `invoice_ids`, or omit them to export everything.
  - `invoice_ids` string[], nullable: List of invoice IDs (UUID v7 values) to export. If omitted, exports the set matching the filters.
  - `status` 'draft' | 'scheduled' | 'issued' | 'paid' | 'cancelled' | 'overdue' | 'annulled' | 'null', nullable: Invoice status to filter by (`draft`, `scheduled`, `issued`, `paid`, `cancelled`, `overdue`, `annulled`). `sent` is accepted as an alias of `issued` in every API version.
  - `date_from` string, date-time, nullable: Start of the issue-date range (inclusive).
  - `date_to` string, date-time, nullable: End of the issue-date range (inclusive).
  - `client_id` string, uuid, nullable: Client ID (UUID v7 value) to filter invoices by.
  - `series_id` string, nullable: Series ID (UUID v7 value) to filter invoices by.
  - `search` string, nullable: Free-text search term (number, recipient, series).
  - `format` 'SUMMARY' | 'ITEMS' | 'null', nullable: Content layout: SUMMARY (one row per invoice) or ITEMS (one row per line).
  - `file_format` 'xlsx' | 'csv' | 'null', nullable: File format: `xlsx` or `csv`.

## Response `200`

## Other responses

- `400`: `parameter_unknown` with `subcode` `retired_active_profile_header`: the retired `X-Active-Profile` header was sent; the company goes in the path. `parameter_invalid_format` on `Factuarea-Version`: the header is not a `YYYY-MM-DD` date. `unsupported_api_version`: the `Factuarea-Version` date is not a supported version.
- `401`: Missing or invalid API key.
- `403`: The request is authenticated but not allowed: the API key lacks the required scope (`insufficient_scope`), the plan does not include the public API or this feature (`addon_not_active`, `feature_not_available_in_plan`), or the module is not available with a test key (`module_not_available_in_sandbox`).
- `404`: The requested resource does not exist or belongs to another company. `profile_not_found`: the company in the path does not exist, is not in the API key scope or belongs to the other environment (live or test).
- `413`: The packaged download you asked for is too large to build, so nothing was generated and no file was left on the server. Two catalog codes carry this status, both with `error.type: invalid_request_error`: `export_document_cap_exceeded` (the request covers more documents than the cap for that artifact allows — narrow the date range or export in batches) and `export_byte_cap_exceeded` (the artifact would weigh more than the byte cap; `error.subcode` says whether it was rejected up front from the size estimate, `before_writing`, or aborted mid-packaging, `while_writing`, in which case the partial file was deleted and nothing is served). Retrying the same request unchanged returns the same error — ask for less, do not wait. A third, unrelated code shares this status on every write operation: `payload_too_large`, raised when the REQUEST body exceeds the 1 MB limit, which is about what you send and not about the size of what you asked to build.
- `422`: Validation failed, or the invoice cannot undergo the requested state transition (e.g. marking an already-paid invoice as paid, or editing an issued invoice — use a corrective instead). The `error.param` field identifies which input is invalid, if any. Issuing or annulling an invoice can also be rejected with `verifactu_not_eligible`: either a field of the invoice does not fit its billing record, or — only when the company has VeriFactu enabled in NO VERI*FACTU mode — it has no usable signing certificate (`error.subcode: signing_certificate_unavailable`; `error.param` is `certificate`, `representation` or `system_certificate`, depending on what is missing); in both cases the invoice stays exactly as it was.
- `429`: Rate limit exceeded. Retry after the duration in `Retry-After`.
- `500`: Unexpected server error.

---

[API](https://skmtc.dev/factuarea/apis/factuarea-public-api.md) · [All operations](https://skmtc.dev/factuarea/apis/factuarea-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/factuarea/apis/factuarea-public-api/revisions/718e77934422?raw)
