canonical: https://jentic.com/apis/hubspot.com/hubspot-crm-exports

# HubSpot CRM Exports

The HubSpot CRM Exports API kicks off asynchronous bulk exports of CRM data - contacts, companies, deals, tickets, custom objects, or saved views - and returns the resulting file as XLSX or CSV. It exposes one endpoint to start an export task and a second to poll its status, which is the right pattern for pulling tens or hundreds of thousands of records without paginating the search API. Exports respect HubSpot property selection and filter criteria, so agents can specify exactly which columns and which records to include.

## For AI agents

Kick off asynchronous CRM exports of contacts, deals, companies, tickets, or custom objects to XLSX or CSV and poll for completion via /crm/v3/exports.

## Scope

Does not transform data, run scheduled syncs, or push results to external systems - use for kicking off async HubSpot exports and retrieving the resulting file only.

## Capabilities

- Start an asynchronous export task with POST /crm/v3/exports/export/async
- Poll an export task's status and download URL via GET /crm/v3/exports/export/async/tasks/{taskId}/status
- Export a saved CRM view rather than building filter criteria inline
- Choose property columns explicitly so the export contains only the fields a downstream system needs
- Export custom objects as well as standard contact, company, deal, and ticket data

## Use cases

### Data Warehouse Loads

Export full or filtered CRM tables on a schedule (nightly, weekly) to land them in a data warehouse like Snowflake or BigQuery. The async export endpoint accepts a list of properties and filter groups so the resulting file matches the warehouse schema, and the status endpoint returns a signed download URL once HubSpot finishes preparing the file. This is the recommended path for moving large slices of CRM data - search-based pagination is too slow above a few thousand records.

Example prompt: Start a contact export with type CONTACT, format CSV, and filterGroups limiting createdate to 2026, then poll GET /crm/v3/exports/export/async/tasks/{taskId}/status until status is COMPLETE.

### Stakeholder Spreadsheet Pulls

Generate ad-hoc XLSX exports of saved views for stakeholders who need a snapshot rather than live data - for example, exec teams reviewing the quarterly pipeline. The export endpoint can target a saved view ID directly, so analysts do not have to rebuild filters in API calls. Status polling typically completes within a minute for views under 50,000 records.

Example prompt: Start an export with type DEAL, format XLSX, and the saved view ID for 'Q2 Pipeline', then return the download URL once status is COMPLETE.

### Compliance Data Pulls

Run a one-time export of all contacts matching a compliance request (for example, a GDPR data subject request limited to one email address) so the records can be reviewed and redacted offline. The async pattern keeps the call non-blocking, and HubSpot's exported file includes every selected property and history. Pair with HubSpot's privacy delete endpoints once review is complete.

Example prompt: Start an export filtered to contact email equals 'subject@example.com' with all properties selected, poll until COMPLETE, and return the download URL.

### Agent-Driven Bulk Pulls via Jentic

An AI analyst building a one-off report needs every deal closed last quarter as a CSV. Through Jentic the agent searches for the start-export operation, executes it with the right filter, then chains the status poll until the file is ready. The whole flow uses Jentic-managed credentials and returns the structured download URL for the next step.

Example prompt: Use Jentic to search 'start a HubSpot async export', execute POST /crm/v3/exports/export/async with type DEAL and filter dealstage equals closedwon, then chain the status poll until COMPLETE.

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| POST | /crm/v3/exports/export/async | Start an asynchronous export task |
| GET | /crm/v3/exports/export/async/tasks/{taskId}/status | Poll an export task and retrieve the download URL when complete |

## Key resources

- **Public Exports** — Start asynchronous exports and poll their status to retrieve the resulting file

## Why Jentic

- **Setup:** Wiring the HubSpot Exports API by hand means handling its OAuth 2.0 authorization-code flow or a private app token, targeting api.hubapi.com, and coding the async start plus status polling yourself. Through Jentic you install once, import HubSpot Exports from the API Directory, store the token once, and your agent calls it.
- **Permission scoping:** HubSpot gates this API with per-object OAuth scopes, so you grant only the scopes your agent needs and you choose which operations it may call: you can allow starting an export and checking its status and nothing more, since those are the only operations in this API.
- **Credential handling:** Your HubSpot OAuth token or private app token is stored once, encrypted, by your own Jentic One instance and injected at execution time. It never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'start a HubSpot export' or 'check an export task status', and Jentic returns the matching exports operation with its input schema so the agent calls the right endpoint without browsing the reference docs.

## Related APIs

- **HubSpot Contacts** — Read-modify contacts before or after a bulk export
- **HubSpot Deals** — Search deals when an export is overkill for a small slice
- **HubSpot CRM Properties** — Discover the property names to include in export columns
- **Salesforce** — Salesforce Bulk API offers similar large-volume exports in Sales Cloud

## FAQ

### What authentication does the HubSpot CRM Exports API use?

Exports accepts OAuth 2.0 access tokens with the relevant object read scopes (e.g., crm.objects.contacts.read for contact exports) and HubSpot private app API keys passed in the private-app header. Through Jentic the credential lives in your Jentic One instance and is injected at execution time so it never enters the agent's context.

### Can I export custom objects with this API?

Yes. Pass the custom object's fully-qualified type or object type ID in the export request alongside the properties array, and HubSpot will produce the file in the same way as a standard object export. Use the Properties API to discover available property names first.

### What are the rate limits for the HubSpot CRM Exports API?

Each export task counts as a single API call, so request rate is rarely the constraint - HubSpot caps the number of concurrent export jobs per account and the per-export row count instead. Poll the status endpoint at a reasonable interval (every 10-30 seconds) rather than tight loops.

### How do I run an export through Jentic?

Run jentic.search('start a HubSpot async export'), load the schema for POST /crm/v3/exports/export/async, and execute it with the export type, format, and filter criteria. Then chain GET /crm/v3/exports/export/async/tasks/{taskId}/status until status is COMPLETE to retrieve the download URL.

### Is the resulting file delivered synchronously?

No. The start endpoint returns a task ID immediately and the file is prepared asynchronously. Poll the status endpoint until status is COMPLETE - the response then includes a temporary download URL. Large exports can take several minutes.

### Can I export based on a saved view rather than ad-hoc filters?

Yes. Pass the publicCrmSearchRequest with a savedViewId on POST /crm/v3/exports/export/async to mirror exactly what a user sees in a saved CRM view. This avoids rebuilding the same filter logic in API calls.

### Can I limit what my agent is allowed to do with the HubSpot CRM Exports API?

Yes. Because Jentic One is self-hosted, your own rules decide which operations and credentials the agent may use, so you can allow only the two operations this API exposes: starting an async export with POST /crm/v3/exports/export/async and polling its status with GET /crm/v3/exports/export/async/tasks/{taskId}/status. Since HubSpot gates access with per-object OAuth scopes, you grant only the scopes the agent needs, such as crm.objects.contacts.read for contact exports, and withhold the rest. The token stays in your instance and is injected at execution time, so the agent can call only what you have permitted.
