Skip to main content

Overview

Better Data accepts data via a REST import API. All imports are:
  • Async - each request returns a jobId; poll GET /api/import/status/[jobId] for completion
  • Idempotent - re-running an import with the same external reference IDs will not create duplicates
  • Partial-success - row-level errors are reported per record; a single bad row does not fail the whole batch

Import Order

Always import in this sequence. Later resources depend on earlier ones.
1
1. Suppliers
2
No dependencies. Import your supplier master first. -> Suppliers field reference
3
2. Catalog
4
No dependencies. Import products and SKUs. -> Catalog field reference
5
3. Inventory
6
Requires: Catalog + Locations (locations are configured in account setup). -> Inventory field reference
7
4. Purchase Orders
8
Requires: Suppliers + Catalog + Locations. -> Purchase Orders field reference
9
5. Orders
10
Requires: Catalog + Locations. -> Orders field reference
11
6. Demand History
12
Requires: Catalog + Locations. Week start dates must be Mondays. -> Demand History field reference
Locations are configured during account setup and are not imported via the API. Contact support to add or modify locations.

Quick Start

Download a CSV template, fill it in, and upload via the API or the in-app importer.

Authentication

All import endpoints require an API key in the x-api-key header.
curl -X POST https://api.betterdata.co/api/import/catalog \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "products": [...] }'
Generate API keys at: apps.betterdata.co -> Settings -> API Keys

Checking Import Status

curl https://api.betterdata.co/api/import/status/job_abc123 \
  -H "x-api-key: YOUR_API_KEY"
Response:
{
  "jobId": "job_abc123",
  "status": "COMPLETED",
  "rowCount": 142,
  "processedCount": 142,
  "failedCount": 0,
  "errors": [],
  "completedAt": "2026-03-01T10:00:04Z"
}
Status values: PENDING -> PROCESSING -> COMPLETED | FAILED