Transferring a catalogue as a file — with review notes before it is taken overAll articles

Transferring a catalogue as a file — with review notes before it is taken over

Not every dealer has a development team, but every dealer has an export file. This case shows how a catalogue arrives as a file and still is not taken over unchecked.

Published: 2026-09-12Reading time: 4 mintapinomahub API & workflows
API & processesAPIERP & inventoryPricing & valuation

A dealer exports their item stock from the ERP as CSV once a month. An API integration is not planned, and for that rhythm it would be overkill. The risk lies elsewhere: one shifted column in a file with ten thousand rows turns prices into item numbers.

Transferring a catalogue as a file — with review notes before it is taken overInput: a catalogue file as CSV, XML or JSON, without your own API development 1. Create the transfer (POST /commerce/v1/catalog-transfers): direction import or export, serialization csv, xml or json 2. Read the state (GET /commerce/v1/catalog-transfers/{transferId}): state and counts with read, changed, rejected and conflicted 3. Read the review notes (GET /commerce/v1/catalog-transfers/{transferId}/issues): severity, code, pointer and, where present, recordNumber per note 4. Decide (POST /commerce/v1/catalog-transfers/{transferId}/approval): decision approve or reject against the reviewed previewRevision 5. Collect the result file (GET /commerce/v1/catalog-transfers/{transferId}/artifact): artifactToken, checksum and expiresAt Output: a catalogue taken over only after approval against the reviewed preview Preview without productive channel changes. recordNumber, where present, traces a note back to the record in the file.Transferring a catalogue as a file — with review notesbefore it is taken overInput: a catalogue file as CSV, XML or JSON, without your own API development01Create the transferPOST /commerce/v1/catalog-transfersdirection import or export, serialization csv, xml or json02Read the stateGET /commerce/v1/catalog-transfers/{transferId}state and counts with read, changed, rejected and conflicted03Read the review notesGET /commerce/v1/catalog-transfers/{transferId}/issuesseverity, code, pointer and, where present, recordNumber per note04DecidePOST /commerce/v1/catalog-transfers/{transferId}/approvaldecision approve or reject against the reviewed previewRevision05Collect the result fileGET /commerce/v1/catalog-transfers/{transferId}/artifactartifactToken, checksum and expiresAtOutput: a catalogue taken over only after approval against the reviewed previewPreview without productive channel changes. recordNumber, where present, traces a note back to the record in thefile.
Five calls from the file to the result. The decision is made against the reviewed preview, not against the file.

The catalogue transfer therefore treats the file like a sync run: first a preview with counts and review notes is produced, then a decision is made against exactly that preview. According to the contract, the transfer is created in the canonical Commerce model; whether the review differs by format is not specified by the contract.

SurfaceRoles
CommerceParts trading, Vehicle trading, Software vendor

What this case requires

  • An uploaded file with a token. The transfer references the file via artifactToken; the token is only written, never returned.
  • The right format. serialization knows csv, xml and json.
  • Optionally a connection. connectionId is optional and references a connection; the contract does not describe what effect it has on the transfer.
  • Someone who reads the notes. Approval is only as good as the review before it.

The sequence

The table names the responsible call per stage and what exists afterwards. The reasoning for why a stage cannot be skipped follows below it.

The call chain of this use case
StageCallWhat exists afterwards
Create the transferPOST /commerce/v1/catalog-transfersdirection import or export, serialization csv, xml or json
Read the stateGET /commerce/v1/catalog-transfers/{transferId}state and counts with read, changed, rejected and conflicted
Read the review notesGET /commerce/v1/catalog-transfers/{transferId}/issuesseverity, code, pointer and, where present, recordNumber per note
DecidePOST /commerce/v1/catalog-transfers/{transferId}/approvaldecision approve or reject against the reviewed previewRevision
Collect the result fileGET /commerce/v1/catalog-transfers/{transferId}/artifactartifactToken, checksum and expiresAt

Why each stage is needed

  1. Create the transfer. POST /commerce/v1/catalog-transfers takes direction with import or export, serialization and artifactToken. The response carries transferId, state and the first counts — nothing is taken over yet.
  2. Read the state. GET /commerce/v1/catalog-transfers/{transferId} returns state and counts with read, changed, rejected and conflicted. The four figures are the first sanity check: ten thousand read and ten thousand changed is rarely right for a monthly file.
  3. Read the review notes. GET /commerce/v1/catalog-transfers/{transferId}/issues lists per note severity, code, message, pointer and, where present, recordNumber. With recordNumber you find the row in your own file instead of interpreting an error message.
  4. Decide. POST /commerce/v1/catalog-transfers/{transferId}/approval takes decision with approve or reject, plus previewRevision and expectedRevision. What is approved is the reviewed preview — if the state has changed in the meantime, the revision no longer matches.
  5. Collect the result file. GET /commerce/v1/catalog-transfers/{transferId}/artifact returns artifactToken, checksum and expiresAt. checksum is a string of 64 hexadecimal characters; the contract does not specify the algorithm or what it is computed over. expiresAt gives the expiry time.
Create a CSV file as a catalogue import
curl -X POST \
  -H 'X-Api-Key: <API_KEY>' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: katalog-import-2026-09' \
  -d '{"direction":"import","serialization":"csv","artifactToken":"<artifactToken>","connectionId":"<connectionId>"}' \
  'https://commerce-preview.invalid/commerce/v1/catalog-transfers'

What you end up with

What remains is a catalogue taken over only after approval against the reviewed preview, and a result file with a checksum. The contract does not enforce that anyone has read the counts and review notes before approval; it requires previewRevision and expectedRevision — which is why someone who reads the notes is among the prerequisites. A shifted column can be noticed before approval if the preview’s counts or review notes show it.

Where to find this in the documentation

The binding field lists, error codes and sample responses live in this surface’s OpenAPI contract at docs.tapinomahub.com (tapinoma-commerce). All use cases arranged by surface and role: overview of the use cases.

Frequently asked

Which file formats work?

csv, xml and json — the values of serialization.

Is the file taken over immediately?

No. First counts and review notes are produced; takeover happens only after approval against the reviewed preview.

How do I find the faulty row?

Via recordNumber in the review note, where present. It points to the record in your file.