For data & BI teams
The sync API (/api/v1) exposes a workspace's packaging register so an integrator can load it incrementally into a warehouse with standard ELT tooling. We ship no bespoke per-warehouse connector — you wire one together in your own tool from the recipes below. A register:write-scoped key also opens the other direction: upserting item types, items and attributes back in from your ERP or PLM, keyed by your own external reference.
The same /api/v1 also powers an MCP server, so Claude or any other MCP-capable agent can read and write your register directly — see connecting an agent.
Eight read-only GET resources, one per register entity, sharing an identical query, pagination and error contract.
| GET /item-types | Packaging item types (e.g. Box, Pallet) with embedded external refs. |
| GET /attributes | Attribute definitions, incl. select options, with external refs. |
| GET /items | Packaging items, with external refs. Accepts ?q= to find one by name or article number. |
| GET /item-attribute-values | One row per (item, attribute) pair; select choices in selectedOptions. |
| GET /item-attribute-scoped-values | Per-selection sub-attribute values (e.g. weight per chosen material). |
| GET /bom-lines | Bill-of-materials lines: component quantity within a parent item. |
| GET /external-references | The flat, authoritative external-reference join table to your ERP/PLM. |
| GET /compliance | Materialized per-(item, profile) compliance status, incl. which requirements are open. |
Every record carries the full audit set (createdAt, updatedAt, deletedAt and their …By counterparts). A register:write-scoped key additionally unlocks a growing set of upsert endpoints — see the OpenAPI document for the complete, authoritative field inventory.
A workspace admin or owner creates a key under Workspace settings → "API access", scoped to register:read. The key resolves its own workspace — there is no tenant parameter to widen it.
Page with an opaque nextCursor until hasMore is false, then resume future runs from the response watermark — not your own max updatedAt — passed back as updated_since.
A register:write-scoped key unlocks upsert-by-external-reference endpoints: idempotent, keyed by your own reference rather than a Packregister id, so a repeated call never creates a duplicate.
| PUT /item-types/external/{system}/{identifierType}/{externalId} | Upsert an item type keyed by your own external reference. Once linked, further calls are a partial update. |
| PUT /items/external/{system}/{identifierType}/{externalId} | Upsert an item; its item type is resolved via that item type’s own external reference, not an internal id. |
| PUT /attributes/external/{system}/{identifierType}/{externalId} | Upsert an attribute definition. |
| PUT /attribute-options/external/{system}/{identifierType}/{externalId} | Upsert a select option on an existing attribute. |
| PUT /items/{id}/attribute-values | Set attribute values on an item by our internal id — no external reference needed. |
For an initial load of 1,000-10,000+ items, use POST /items/bulk instead of one request per item — up to 20,000 entries per call. It answers 202 Accepted immediately with a jobId, then processes each item as its own background job. Poll GET /items/bulk/{jobId} for the aggregate counts and a per-item ok / retrying / failed / pending result — a job is never all-or-nothing, and a permanently failed item stays visible rather than silently dropped.
Each recipe is copy-pasteable and requires only a register:read key.
A declarative Connector Builder manifest — paste it in as-is, or commit it as a low-code connector. Uses DatetimeBasedCursor with a lookback window to approximate the watermark model.
version: 6.44.0
type: DeclarativeSource
check:
type: CheckStream
stream_names:
- itemsA rest_api pipeline definition covering all eight resources, cursored on updatedAt with a 30-second safety lag, merging by id into any dlt destination.
RESOURCE_PATHS = [
"item-types",
"attributes",
"items",
"item-attribute-values",
"item-attribute-scoped-values",
"bom-lines",
"external-references",
"compliance",
]REST Copy Activity pagination rules, plus a Web-activity pattern to capture the watermark a Copy Activity itself never exposes.
"paginationRules": {
"QueryParameters.cursor": "$.nextCursor",
"EndCondition:$.hasMore": "Const:false"
}The recommended route is a report off the warehouse a prior recipe already loaded, not the API directly — incremental state and cursor paging are ELT-tool work, not Power Query work.
Packregister /api/v1 --(Airbyte | dlt | ADF/Fabric)--> Warehouse --> Power BI
register:read key (Fabric, (DirectQuery
Snowflake, or Import)
BigQuery, ...)One more read-only endpoint answers a different kind of question: GET /item-types/{id}/attribute-schema returns everything about one item type's attributes — type, unit, valid select options, sub-attribute relations — in a single call, instead of joining /item-types and /attributes yourself to know how to fill one in.
Deletes are soft: pass include_deleted=true on incremental runs and drop rows with a set deletedAt. Delivery is at-least-once, so always upsert by id, never blind-insert.
Page size defaults to 100, max 1000. Rate limit is 600 requests per 60-second window per key — sequence the eight resources rather than syncing them in parallel. external-references is the join key back to your ERP or PLM: package- and API-sourced references are unique per workspace and safe to join on; hand-made ones are not.
For an item that was never linked to an external reference at all — one created by hand in the register, or one you just found with ?q= — PUT /items/{id}/attribute-values sets its attribute values by that internal id instead. It's a full desired-set write, not a merge, so read the item's current values first and send the whole set back with your change included. Every write through this path lands the item in Draft status, with its prior state saved so it can be rolled back — the same review step as an edit made by hand.