---
title: "How to Export Data from QuickBooks Online: API Limits & Audit Gaps"
slug: how-to-export-data-from-quickbooks-online-api-limits-audit-gaps
date: 2026-05-06
author: Raaj
categories: [QuickBooks]
excerpt: "QBO's native export drops the audit log, attachments, and recurring templates. Learn what each export method returns and where the API's rate limits and query caps bite."
tldr: "A full QuickBooks Online export requires at least four separate jobs: reports, audit log, attachments, and paginated API pulls — the native tool alone misses critical data."
canonical: https://clonepartner.com/blog/how-to-export-data-from-quickbooks-online-api-limits-audit-gaps/
---

# How to Export Data from QuickBooks Online: API Limits & Audit Gaps


**No single QuickBooks Online tool exports a complete copy of your financial data.** The native "Export Data" feature gives you a ZIP of Excel files — reports and lists only. It silently drops the audit log, attachments, recurring transaction templates, and bank rules. The REST API lets you extract everything programmatically, but caps queries at 1,000 records, throttles you to 500 requests per minute, and drops TLS connections when you try to pull thousands of invoice PDFs.

If you are exporting QBO data for an ERP migration, a data warehouse load, or a compliance archive, you need to understand exactly what each export path returns — and what it quietly omits. This guide covers the native tool, the API, and the gaps between them. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-articles/export-reports-lists-and-more/00/239728?utm_source=openai))

For a broader pre-migration planning framework before touching any export button, see our [Accounting Data Migration Checklist](https://clonepartner.com/blog/blog/accounting-data-migration-checklist-the-10-point-plan/).

## What the Native "Export Data" Tool Actually Returns

QuickBooks Online's built-in export lives under **Gear icon → Tools → Export Data**. It bundles reports and lists into a single `.zip` file containing `.xlsx` workbooks. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-articles/export-reports-lists-and-more/00/239728?utm_source=openai))

Here is what it includes:

- **Reports:** P&L, Balance Sheet, General Ledger, A/R and A/P Aging, Trial Balance, and roughly 20 other standard reports — all scoped to a date range you set.
- **Lists:** Customers, Vendors/Suppliers, and Employees — basic contact fields only.

Here is what it **does not include**:

- **Audit Log** — completely excluded
- **Attachments** (receipts, uploaded PDFs) — separate workflow required
- **Recurring transaction templates** — excluded
- **Bank rules** — excluded
- **Time tracking activities** — excluded
- **Custom fields** (Advanced plan) — not reliably captured
- **Voided payments and bill payments by check** — silently dropped

> [!WARNING]
> The native export is a reporting snapshot, not a migration-ready extract. Treating it as a complete backup is one of the most common mistakes in financial data migrations. See [7 Costly Mistakes to Avoid When Migrating Financial Data](https://clonepartner.com/blog/blog/financial-data-migration-mistakes-to-avoid/) for the full list.

The practical mistake is treating the exported XLSX or ZIP as the source of truth. QBO's report exports are presentation-friendly. Migration work needs object IDs, references, attachment links, change history, and enough structure to rebuild parent-child relationships. In practice, that means combining reports for reconciliation with API pulls for actual record movement. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/workflows/run-reports))

## The Audit Log Gap: Why Your Compliance Data Doesn't Export

The **QuickBooks Online Audit Log** records every change made to your books — who modified a transaction, when, and what the original values were. It is the backbone of SOX compliance, fraud detection, and year-end auditor reviews.

It is **entirely excluded** from the native Export Data tool. You cannot get it as part of the ZIP download. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-articles/export-reports-lists-and-more/00/239728?utm_source=openai))

To export the audit log:

1. Navigate to **Gear icon → Audit Log** (or **Reports → Audit Log**). Only users with **admin or master admin roles** can access this page.
2. Apply date range and user filters as needed. The page displays 150 records at a time.
3. Click the **"Export to CSV"** button in the upper-right corner.

This produces a flat CSV containing the date changed, user, event type, and a brief description. Detailed before/after field comparisons require clicking into each entry individually within the QBO interface — they are not captured in the CSV export.

> [!NOTE]
> The QuickBooks Online API does not provide a dedicated endpoint for the company-level audit log. The Intuit developer docs that reference "audit logs" describe changes to apps in the Developer Portal, not who edited books inside a customer company. Treat the company audit log as a UI-only export. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/develop/troubleshooting/audit-logs?utm_source=openai))

**Retention is a constraint.** Intuit's audit log documentation references a **two-year** retention window for audit events. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-article/audit-log/use-audit-log-quickbooks-online/L2WoVnW6I_US_en_US?uid=lwa7derg&utm_source=openai)) Some secondary sources reference a longer window, but we cannot confirm this applies to all account tiers. If compliance requires indefinite retention, export the audit log CSV on a regular schedule — quarterly at minimum — and store it outside of QBO. If you wait until late in a migration project to capture it, older history may already be gone.

## Missing Records: Attachments, Recurring Transactions, and Bank Rules

Beyond the audit log, the standard QBO export silently drops several critical operational datasets. If you rely on [Using CSVs for SaaS Data Migrations](https://clonepartner.com/blog/blog/csv-saas-data-migration/), you will quickly discover that flat files cannot handle binary attachments or complex recurring schedules.

### Attachments

Receipts, scanned invoices, and uploaded documents attached to QBO transactions do not appear anywhere in the native export. To download them: ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-article/list-management/export-reports-lists-data-quickbooks-online/L1xleDrLp_US_en_US?msockid=0a4e09a755d668bb2d7b1f98549869ec))

1. Go to **Gear icon → Attachments**.
2. Select the files you want (checkboxes).
3. Click **Batch actions → Export** to download a ZIP file.

The Attachments page **displays a maximum of 300 files per page**. If you have thousands of attachments, you must paginate through multiple pages and run the batch export on each page separately. There is no "select all across all pages" option, no date range filter, and no way to filter by vendor or transaction type from this view.

The exported ZIP organizes files into folders like `Unattached`, `Bill`, `Expense`, and `Invoice` — useful for archiving, but the **link between attachments and their parent transactions is lost**. You get the raw files with no metadata mapping them back to specific invoices, bills, or expenses. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/global/manage-suppliers-and-expenses/can-we-export-the-files-attached-in-expenses/00/1115375?utm_source=openai))

To preserve exact transaction-to-file linkage, you must use the API. Attachments are modeled as **Attachable** metadata objects. You query `AttachableRef` to map each file back to its parent entity, then request a temporary download URL — which **expires after 15 minutes**. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/workflows/attach-images-and-notes?utm_source=openai))

```sql
SELECT Id FROM Attachable
WHERE AttachableRef.EntityRef.Type = 'Purchase'
  AND AttachableRef.EntityRef.value = '611';
```

Supported file types for attachments include PDF, JPEG, PNG, DOC, XLSX, CSV, TIFF, GIF, and XML. Filenames cannot contain special characters. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-article/list-management/export-reports-lists-data-quickbooks-online/L1xleDrLp_US_en_US?msockid=0a4e09a755d668bb2d7b1f98549869ec))

### Recurring Transactions

**Recurring transaction templates are excluded from the standard data export.** These are the scheduled, reminder, and unscheduled templates that automate invoices, bills, journal entries, and other transaction types.

The Recurring Transactions list lives under **Gear icon → Lists → Recurring Transactions**, but there is no native export button on that page. A workaround: navigate to **Reports → Custom Reports → Recurring List** and export from there. The resulting output contains only template metadata (name, type, interval, next date) — not the full transaction body.

If you are migrating to a new ERP and rely on recurring billing templates, plan to **recreate them manually** in the target system. No migration tool we have encountered natively transfers QBO recurring templates as executable objects.

### Bank Rules

Bank rules — the auto-categorization logic you have built for bank feed transactions — also do not export through the standard tool. They have their own **Rules → Export rules** workflow. Intuit supports up to 2,000 bank rules and up to 5 conditions per rule. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-article/list-management/export-reports-lists-data-quickbooks-online/L1xleDrLp_US_en_US?msockid=0a4e09a755d668bb2d7b1f98549869ec)) These are configuration rather than financial history, but they matter if your target ERP or new QBO company needs the same categorization behavior.

## QuickBooks Online API Limits: Throttling and Pagination

The QBO REST API is the only path to a programmatic, migration-grade extract. But it enforces **multiple layers of rate limiting simultaneously**. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/learn/rest-api-features))

| Limit | Value | Scope |
|-------|-------|-------|
| **General API requests** | 500 per minute | Per realm ID (company) |
| **Concurrent requests** | 10 per second | Per realm ID and app |
| **Batch endpoint** | 40 per minute | Per realm ID |
| **Report endpoints** | 200 per minute | Per realm ID |
| **OAuth access token TTL** | 60 minutes | Per token |
| **Request timeout** | 120 seconds | Per request |

Exceeding any of these returns **HTTP 429** (Too Many Requests). Intuit recommends waiting 60 seconds before retrying.

> [!NOTE]
> Intuit's docs phrase the concurrency constraint as "10 requests per second per realm ID and app." Ecosystem documentation from Zapier and other integrations often describes this as "10 concurrent requests." ([help.zapier.com](https://help.zapier.com/hc/en-us/articles/8495935103885-How-to-get-started-with-QuickBooks-Online-on-Zapier)) The practical takeaway is the same: cap parallelism and never let workers fan out unbounded.

### Pagination: The 1,000-Record Hard Stop

The QBO API uses a proprietary SQL-like query language, not standard REST filtering. A typical query:

```sql
SELECT * FROM Invoice WHERE TxnDate >= '2024-01-01' STARTPOSITION 1 MAXRESULTS 1000
```

**The maximum value of `MAXRESULTS` is 1,000.** The default is 100. If your query matches more than 1,000 records, the response silently returns only the first 1,000 — no warning, no `hasMore` flag in the response body. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/learn/explore-the-quickbooks-online-api/data-queries))

To page through all records:

1. Run a `SELECT COUNT(*) FROM Invoice` query to get the total.
2. Loop through pages by incrementing `STARTPOSITION` by your page size (e.g., 1, 1001, 2001).
3. Stop when the returned set is smaller than `MAXRESULTS`.

```sql
SELECT COUNT(*) FROM Invoice;
SELECT * FROM Invoice STARTPOSITION 1 MAXRESULTS 1000;
SELECT * FROM Invoice STARTPOSITION 1001 MAXRESULTS 1000;
SELECT * FROM Invoice STARTPOSITION 2001 MAXRESULTS 1000;
```

> [!CAUTION]
> `STARTPOSITION` is a **record offset**, not a page number. Incrementing by 1 instead of by `MAXRESULTS` causes near-total record duplication. One documented case produced **5,000+ duplicate time entries** from this single-digit bug.

The query language is stripped down: no projections, no `OR` in `WHERE`, no `GROUP BY`, no `JOIN`, and `LIKE` wildcard support is limited to `%`. That is fine for enumerating records. It is bad for clever one-shot extraction queries. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/learn/explore-the-quickbooks-online-api/data-queries))

### Batch Operations

Developers often use the `/batch` endpoint to bundle multiple queries into a single HTTP request. Intuit throttles batch operations to **40 requests per minute** — far more restrictive than the general 500 req/min limit.

There is a documentation conflict worth noting: Intuit's batch page says you can send up to **10 payloads** in a single batch operation, while the throttling page recommends a maximum of **30 payloads**. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/learn/explore-the-quickbooks-online-api/batch)) When vendor docs disagree, the conservative engineering answer: keep batches small, measure latency, and optimize for retry safety rather than theoretical max throughput.

### Change Data Capture

If you are exporting for an ongoing warehouse sync rather than a one-time migration, the Change Data Capture (CDC) endpoint helps — but it is not unlimited. CDC responses can contain a maximum of 1,000 objects, and Intuit recommends shorter time windows so changes are not missed. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/learn/explore-the-quickbooks-online-api/change-data-capture))

### Reports API Caveats

The Reports API has its own limit of **200 requests per minute**. Intuit recommends limiting report date ranges to six months and notes that report rows use **transaction compliance dates** rather than always reflecting raw transaction dates. Reports are excellent for reconciliation and finance checks. They are not a substitute for object-level export when you need exact record history or re-importable entities. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/workflows/run-reports))

## The Hidden Danger of Bulk PDF Extraction via API

One of the most common export needs — downloading every invoice as a PDF — has no official bulk solution. QuickBooks Online has no "Download All Invoices" button. The API offers a per-invoice PDF endpoint (`/v3/company/<realmId>/invoice/<invoiceId>/pdf`), which returns the raw `application/pdf` byte stream.

Generating PDFs is resource-intensive on Intuit's servers. When developers attempt to loop through thousands of invoices and download PDFs programmatically, they encounter problems that Intuit does not document:

- **TLS/SSL connection resets** when downloading hundreds or thousands of PDFs in sequence. The endpoint appears to be rate-sensitive beyond the documented 500 req/min limit.
- **Silent failures** where the PDF endpoint returns a 200 status but delivers a zero-byte or truncated file.
- **OAuth token expiry mid-batch** — with a 60-minute token TTL, a bulk download of thousands of invoices can easily span multiple token cycles.

A December 2025 field report from a developer who built a large-scale invoice PDF exporter describes these exact patterns: the 1,000-record query ceiling combined with random SSL/TLS failures during high-volume PDF download runs. ([medium.com](https://medium.com/%40mandeep_53569/i-needed-to-export-all-quickbooks-invoices-as-pdfs-so-i-built-what-intuit-never-gave-us-373ed71d0dc8))

The workaround requires purpose-built retry infrastructure:

1. **Exponential backoff:** If a connection drops, wait 2 seconds, then 4, then 8, before retrying the specific invoice ID.
2. **State management:** Log every successfully downloaded `invoiceId` to a local database (SQLite or Redis) so that if the script crashes, it can resume exactly where it left off without re-downloading files.
3. **Connection pooling adjustments:** Force your HTTP client to close connections after a set number of requests rather than keeping a single long-lived connection open, which Intuit's servers are likely to terminate.
4. **Token refresh automation:** Monitor the OAuth token's remaining lifespan. If it is within 5 minutes of expiration, pause the queue, hit the OAuth endpoint with the `refresh_token` to obtain a new access token, update headers, and resume. QBO access tokens expire exactly 60 minutes after issuance. Failing to handle this gracefully is the primary reason DIY extraction scripts fail on large datasets.

For attachment exports specifically, refresh temporary download URLs just before the file fetch so you do not waste retries on expired links — Intuit's attachment URLs expire after 15 minutes. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/workflows/attach-images-and-notes?utm_source=openai))

If your migration or compliance requirement includes PDF copies of all invoices, bills, and receipts, budget for custom scripting or hire a team that has already solved this problem.

## Comparing QBO Export Methods: Native vs. Third-Party vs. API

| Capability | Native Export Tool | SaasAnt Transactions | Coupler.io | Custom API Script |
|---|---|---|---|---|
| **Reports & Lists** | ✅ ZIP of Excel files | ✅ All entity types | ✅ Selected entities | ✅ Full control |
| **Audit Log** | ❌ | ❌ | ❌ | ⚠️ Not API-accessible; manual CSV only |
| **Attachments** | ❌ (separate batch) | ❌ | ❌ | ✅ Via Attachable endpoint |
| **Recurring Templates** | ❌ | ✅ Export metadata | ❌ | ⚠️ Limited API support |
| **Invoice PDFs** | ❌ One at a time | ❌ | ❌ | ✅ Per-invoice endpoint |
| **Relational Integrity** | ❌ Flat files | ⚠️ Partial | ⚠️ Partial | ✅ You control joins |
| **Pagination Handling** | N/A | Managed | Managed | You build it |
| **Rate Limit Management** | N/A | Managed | Managed | You build it |
| **Best For** | Quick snapshots | Bulk spreadsheet exports | Ongoing syncs to BI tools | Full-fidelity migration extract |

**SaasAnt Transactions** handles filtering, date range selection, and multiple entity types from a single interface. It is a solid choice for spreadsheet-oriented bulk exports and auditor requests. But it does not extract PDFs, attachments, or the audit log, and it flattens data into CSVs. When migrating to a complex ERP like NetSuite or Dynamics 365, flattening relational data destroys the parent-child linkages required by the target system. ([saasant.com](https://www.saasant.com/blog/export-data-from-quickbooks-online/))

**Coupler.io** automates recurring data syncs from QBO to spreadsheets, BigQuery, or BI tools. It is built for ongoing reporting, not one-time historical extraction. It does not handle bulk PDF or attachment downloads. ([blog.coupler.io](https://blog.coupler.io/how-to-export-quickbooks-data/amp/))

**Custom API scripts** give you full control but require you to engineer pagination, rate limiting, OAuth token management, retry logic, and error handling from scratch. For teams without QuickBooks API experience, this is a multi-week project with real risk of data loss from pagination bugs or silent truncation. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/learn/explore-the-quickbooks-online-api/data-queries))

If your goal is analytics, choose the path that keeps data fresh. If your goal is migration, choose the path that preserves meaning. Those are not the same requirement.

## How to Get a Complete QBO Extract

A migration-ready QuickBooks Online extract is not a single export — it is a coordinated set of operations:

1. **API extraction** of all transactional entities (Invoices, Bills, Payments, Journal Entries, Customers, Vendors, Accounts) with proper pagination and rate-limit handling.
2. **Separate audit log export** via the CSV button in the QBO UI, covering the full retention window.
3. **Attachment download** via the API's Attachable endpoint, with parent-transaction mapping preserved.
4. **Invoice PDF generation** via per-invoice API calls, with TLS retry logic and token refresh management.
5. **Recurring template documentation** — metadata export via Reports or manual capture.
6. **Bank rule documentation** — export from the Rules screen or manual notation before decommissioning.
7. **Reconciliation** — compare report totals, entity counts, and file counts before anyone signs off on cutover.

Each step has its own failure modes. The API pagination bug alone has caused thousands of duplicate records in production systems. Token expiry during long-running extracts causes silent data gaps. And the 500 req/min limit means a QBO company with 50,000 invoices takes a minimum of 100 minutes just to page through the invoice list — before downloading a single PDF.

> [!CAUTION]
> Do not flatten QBO into one CSV too early. Pull object data, attachments, and audit/configuration exports separately, then reconcile counts and balances after extraction. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-article/list-management/export-reports-lists-data-quickbooks-online/L1xleDrLp_US_en_US?msockid=0a4e09a755d668bb2d7b1f98549869ec))

At ClonePartner, we have built the engineering to handle every one of these constraints. Our extraction scripts manage `STARTPOSITION` pagination, respect all layers of QBO rate limits simultaneously, automate OAuth token refresh across multi-hour runs, and handle TLS connection resets during bulk PDF downloads with intelligent retry logic. We preserve the exact relational hierarchy of your data — linking every attachment, line item, and payment back to its source — so your new ERP receives clean, structured, audit-ready data. The result is a complete extract delivered in days, not weeks.

If your current plan is "we'll just export CSVs," read [Using CSVs for SaaS Data Migrations: Pros and Cons](https://clonepartner.com/blog/blog/csv-saas-data-migration/) and [7 Costly Mistakes to Avoid When Migrating Financial Data](https://clonepartner.com/blog/blog/financial-data-migration-mistakes-to-avoid/) before you lock the approach.

> Need to extract your complete QuickBooks Online data for an ERP migration, compliance archive, or data warehouse load? Our engineers have done this hundreds of times. Book a 30-minute call and we'll scope it out.
>
> [Talk to us](https://cal.com/clonepartner/meet?duration=30)

## Frequently asked questions

### Can I export all data from QuickBooks Online in one click?

No. The main Export Data tool covers core reports and some lists. Attachments, recurring templates, bank rules, and audit history each sit in separate workflows. A migration-grade extract requires combining multiple export methods. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-articles/export-reports-lists-and-more/00/239728))

### How do I export the audit log from QuickBooks Online?

Navigate to Gear icon → Audit Log (admin access required), apply date and user filters, and click the 'Export to CSV' button. The audit log is entirely excluded from the standard Export Data tool and has no dedicated API endpoint. Intuit's documentation references a two-year retention window, so export before older events age out. ([quickbooks.intuit.com](https://quickbooks.intuit.com/learn-support/en-us/help-article/audit-log/use-audit-log-quickbooks-online/L2WoVnW6I_US_en_US?uid=lwa7derg))

### How do I export attachments from QuickBooks Online in bulk?

Go to Gear icon → Attachments, select files (max 300 visible per page), and click Batch actions → Export to download a ZIP. You must paginate through multiple pages manually. The ZIP does not map files back to parent transactions — preserving that linkage requires the API's Attachable endpoint, where download URLs expire after 15 minutes.

### What are the QuickBooks Online API rate limits?

Intuit enforces 500 requests per minute per realm ID, 10 requests per second per realm ID and app, 40 batch requests per minute, and 200 report requests per minute. OAuth access tokens expire after 60 minutes. Exceeding any limit returns HTTP 429. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/learn/rest-api-features))

### Why do my QuickBooks API queries stop at 1,000 records?

The QBO API hard-caps MAXRESULTS at 1,000 (default 100). If your query matches more records, the response silently truncates — no warning, no hasMore flag. You must implement STARTPOSITION-based pagination, incrementing the offset by your page size on each iteration. ([developer.intuit.com](https://developer.intuit.com/app/developer/qbo/docs/learn/explore-the-quickbooks-online-api/data-queries))
