List accounting exports
The exports.list operation: GET /api/v1/exports in the REST API and the exports_list tool in the MCP server.
GET
/api/v1/exportsLists the legal entity's accounting exports in the mode of the request, newest first. Filter by status (one or
several, comma-separated); paginate with limit (1–100, default 10) and starting_after.
At a glance
- REST:
GET /api/v1/exports - MCP tool:
exports_list - Operation ID:
exports.list - Scope: Legal entity
- Permission:
ledger:read - Risk tier:
read - Dry run: Not supported
- Idempotency: Not needed (read only)
- Modes: Test and live
- Pagination:
limit(at most 100) andstarting_after - Authentication: API key with the
ledger:readscope - Since: M8
Request
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
status | array of one of queued, running, ready, expired, failed | No | |
limit | integer (1 to 100) | No | |
starting_after | exp_… ID | No | The next_cursor of the previous page. |
Response
200 OK with a JSON object, a page of the list (newest first):
| Field | Type | Description |
|---|---|---|
object | "list" | |
data | array of object | |
data[].id | exp_… ID | |
data[].object | "data_export" | |
data[].livemode | boolean | |
data[].entityId | ent_… ID | |
data[].kind | one of accounting, organization | |
data[].status | one of queued, running, ready, expired, failed | queued, then running, then ready (files downloadable for 30 days, then expired) or failed. |
data[].from | string | The first day covered, in the entity's time zone. |
data[].to | string | The last day covered (included). |
data[].timeZone | string | |
data[].requestedBy | object | |
data[].requestedBy.type | string | |
data[].requestedBy.id | string | |
data[].glMappingVersion | integer or null | The general-ledger mapping used (0: none was set). |
data[].files | array of object | |
data[].files[].part | one of journal, invoices, credit_notes | |
data[].files[].fileId | file_… ID | |
data[].files[].filename | string | |
data[].files[].contentType | string | |
data[].files[].size | integer | |
data[].files[].sha256 | string | |
data[].files[].rows | integer | Data rows (without the header). |
data[].summary | object or null | |
data[].failure | object or null | |
data[].readyAt | date-time or null | |
data[].expiresAt | date-time or null | |
data[].createdAt | date-time | |
data[].updatedAt | date-time | |
data[].version | integer | |
has_more | boolean | |
next_cursor | exp_… ID or null |
Examples
The latest export
HTTP
GET /api/v1/exports?limit=1
Authorization: Bearer or_test_…
Response (200):
JSON
{
"object": "list",
"data": [
{
"id": "exp_01m4tx5nj8emwbyf7y9vcf4aaa",
"object": "data_export",
"livemode": false,
"entityId": "ent_01m4tx5nj8emwbyf7y9vcf47zm",
"kind": "accounting",
"status": "ready",
"from": "2026-07-01",
"to": "2026-09-30",
"timeZone": "Europe/Zagreb",
"requestedBy": {
"type": "user",
"id": "usr_01m4tx5nj8emwbyf7y9vcf47zk"
},
"glMappingVersion": 3,
"files": [
{
"part": "journal",
"fileId": "file_01m4tx5nj8emwbyf7y9vcf4aab",
"filename": "acme-hr-journal-2026-07-01-to-2026-09-30.csv",
"contentType": "text/csv; charset=utf-8",
"size": 421888,
"sha256": "9f2c1d5e7a3b4c6d8e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d",
"rows": 412
},
{
"part": "invoices",
"fileId": "file_01m4tx5nj8emwbyf7y9vcf4aac",
"filename": "acme-hr-invoice-register-2026-07-01-to-2026-09-30.csv",
"contentType": "text/csv; charset=utf-8",
"size": 98304,
"sha256": "9f2c1d5e7a3b4c6d8e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d",
"rows": 96
},
{
"part": "credit_notes",
"fileId": "file_01m4tx5nj8emwbyf7y9vcf4aad",
"filename": "acme-hr-credit-note-register-2026-07-01-to-2026-09-30.csv",
"contentType": "text/csv; charset=utf-8",
"size": 3072,
"sha256": "9f2c1d5e7a3b4c6d8e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d",
"rows": 3
}
],
"summary": {
"journal": {
"transactions": 180,
"rows": 412,
"totals": [
{
"currency": "EUR",
"debit": "48210000000",
"credit": "48210000000"
}
],
"unmappedAccounts": [],
"unmappedCount": 0
},
"invoices": {
"count": 96,
"totals": [
{
"currency": "EUR",
"net": "18400000000",
"tax": "4600000000",
"gross": "23000000000",
"count": 96
}
]
},
"creditNotes": {
"count": 3,
"totals": [
{
"currency": "EUR",
"net": "160000000",
"tax": "40000000",
"gross": "200000000",
"count": 3
}
]
}
},
"failure": null,
"readyAt": "2026-10-02T08:00:21.000Z",
"expiresAt": "2026-11-01T08:00:21.000Z",
"createdAt": "2026-10-02T08:00:00.000Z",
"updatedAt": "2026-10-02T08:00:21.000Z",
"version": 3
}
],
"has_more": false,
"next_cursor": null
}
Errors
| Code | HTTP status | When | What to do |
|---|---|---|---|
validation_failed | 400 | A filter or pagination value is invalid. | Fix the fields listed in details.issues and send the request again. |
scope_required | 400 | The request names no legal entity (an org key without Ownrecord-Entity, or a brand key: exports belong to the entity). | Call the operation with credentials or a target at its level: an organization, a legal entity, a brand or the platform (details.required_scope). |
permission_denied | 403 | You can't read this entity's ledger (ledger:read; brand-scoped members never see it). | Ask an organization owner or admin for a role or scope that allows this action. |
livemode_not_allowed | 403 | You have no live-mode access, so you can't use live exports. | Use test mode, or credentials for the target's mode. Developers need live access granted by an organization owner or admin. |
It can also return these common errors: api_version_unsupported, authentication_required, api_key_invalid, resource_not_found, dry_run_not_supported, rate_limited, internal_error.