Skip to main content
All routes require:
The caller must be able to access that store. A key with store scope SELECTED must include that store. Access mode FULL skips the scope list and still requires dashboard permission manageProducts. Access mode RESTRICTED must include the scope on the route and that same permission. import:write also satisfies import:read.
apiKey in the preview and start bodies is the source platform credential, 8–2048 characters. It is not a Join Markt key. The path storeId selects the destination store. A storeId property in the JSON body is discarded. Jobs are stored in memory on the server process that accepted POST /import. A restart, or a request handled by another process, returns 404.

Platforms

GET /import/platforms returns { "platforms": [ ... ] }. The list does not depend on store data. Auth still requires the store id.
string
sellauth, sellhub, shoppex, komerza, sellapp, or shoppy.
string
Display name.
string
Vendor API docs URL.
string[]
Resource ids this platform can supply, in this order when present: products, orders, reviews, categories, groups, coupons.
boolean
true when the source API expects a shop identifier besides the API key.
string
Label for that identifier.
string
Hint for the source credential.
The live platforms array contains all six rows in the table, in that order.

Preview

POST /import/preview returns the resolved shop and per-resource counts. Counts cover resources from that platform. A count is a number, or null when the source did not return one.
string
Platform id from the request.
string
Platform display name.
string
Shop id resolved by the source adapter.
string | null
Shop name from the source, or null.
string[]
Resource ids that platform can supply.
object
Map of those resource ids to a number or null.

Import job

POST /import returns { "jobId": "<uuid>" } with status 201. GET /import/jobs/{jobId} returns the job. jobId is a UUID. The job is visible only to the user who created it, and only for the store in the path.
string
Job UUID. Same value as jobId from the start response.
string
Destination store record id.
string
User id of the API key that started the job.
string
Platform id.
string
queued, running, completed, or failed. The job is stored as queued, then moved to running, then to completed or failed.
string | null
Present when the run fails. The message is the thrown error message, or Migration failed.
number
Unix time in milliseconds.
number
Unix time in milliseconds.
object[]
One row per resource that was both requested and supported by the platform. Order is categories, groups, products, orders, reviews, coupons.
POST /import does not wait for the run. Poll GET /import/jobs/{jobId}.

List platforms

Scope: import:read. No body and no query parameters.
string
required
Store record id.

Preview import

Scope: import:write. JSON object.
string
required
Store record id.
string
required
One of sellauth, sellhub, shoppex, komerza, sellapp, shoppy.
string
required
Source platform credential, 8–2048 characters.
string | null
Source shop identifier, trimmed, max 200 characters. Optional. See requiresShopId and shopIdLabel on the platform.
Validation errors are 400. error is the Zod issues joined with ; , with the field path prefixed (platform: ...).

Start import

Scope: import:write. Status 201. Body matches preview, plus resources.
string
required
Store record id.
string
required
Platform id. Same enum as preview.
string
required
Source platform credential, 8–2048 characters.
string | null
Source shop identifier, trimmed, max 200 characters. Optional.
string[]
required
One to six of products, orders, reviews, categories, groups, coupons. Ids the platform does not support are dropped. If none remain, the status is 400 and error is No importable resources selected.

Get import job

Scope: import:read. No body and no query parameters.
string
required
Store record id. A job stored for another store returns 404.
string
required
Job UUID from the start response.
404 with error Migration job not found when the id is unknown, belongs to another user, or belongs to another store.

Errors

Failed responses use { "success": false, "error": "...", "code": "..." }. A 500 also includes errorId. A thrown error that includes a string code uses that value. Other failures use the code for the HTTP status. Upstream 401 and 403 are returned as HTTP 400. Other upstream HTTP errors are returned as HTTP 502.