What is it?
A public API that lets developers create, manage, and ingest data into HubSpot Data Studio programmatically — no UI required. Two datasource types are supported:
- - FILE — upload a CSV, XLS, XLSX, or TSV file to create a datasource
- - JSON — define a schema and push structured data directly via API, with an incremental
data-pushendpoint for ongoing updates
All operations are accessible via standard OAuth.
Link to API doc here: https://developers.hubspot.com/docs/api-reference/2026-09-beta/data-studio/datasource-ingestion/guide
Full API surface:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Why does it matter?
This API unlocks a more flexible, developer-friendly pathway for getting tabular data into HubSpot's Data Studio without needing to commit to CRM objects.
The CRM Imports API has strict requirements: data must map to CRM objects, and there's no incremental update path. Developers who want to push raw or custom data — not CRM records — are left without a clean option.
The Data Source Ingestion API is schema-agnostic. Data doesn't need to map to any HubSpot object type. Developers define the schema, ingest data via file upload or JSON, and it lands in Data Studio immediately available for datasets, reports, and activation across segments, workflows, and lists.
The data-push endpoint enables lightweight, ongoing ingestion for recurring data updates (partner enrichment feeds, operational snapshots, agent-generated outputs) without managing file uploads each time.
How does it work?
Creating a FILE datasource
Upload a CSV, XLS, XLSX, or TSV file as a multipart POST alongside a schema definition (column names and types). Ingestion is async — poll GET for lastIngestionStatus: SUCCESSFUL. Use PUT to replace the entire dataset with a new file.
POST /data-studio/data-source/2026-09-betaContent-Type: multipart/form-data file: sample-data.csv request: { "datasourceName": "Sample Data", "datasourceType": "FILE", "config": { "file": { "headerRowIndex": 1, "columns": [ { "name": "email", "type": "STRING" }, { "name": "revenue", "type": "DECIMAL" } ] } } }
Creating a JSON datasource
Define the schema (column names and types) in the request body — no file required. Optionally include initial rows at creation time, or create schema-only and push data later. Optionally set a recordId field for deduplication. Ingestion is async — poll GET for lastIngestionStatus: SUCCESSFUL before pushing more data.
POST /data-studio/data-source/2026-09-beta { "datasourceName": "Customer Snapshot", "datasourceType": "JSON", "config": { "json": { "columns": [ { "name": "email", "type": "STRING" }, { "name": "customer_id", "type": "INTEGER" }, { "name": "spend", "type": "DECIMAL" } ], "recordId": "customer_id" } } }
Pushing rows incrementally (JSON only)
Once a JSON datasource is activated, push new rows without replacing the entire dataset:
POST /data-studio/data-source/2026-09-beta/{datasourceId}/data-push { "data": [ { "email": "alice@example.com", "customer_id": 1, "spend": 450.00 }, { "email": "bob@example.com", "customer_id": 2, "spend": 125.00 } ] }
Who gets it?
Smart CRM Professional, Data Hub Professional