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.
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
import:read. No body and no query parameters.
string
required
Store record id.
Preview import
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.400. error is the Zod issues joined with ; , with the field path prefixed (platform: ...).
Start import
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
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.

