Every CSV import and export that Store Admin offers runs through one contract, so large data sets travel as files instead of inside requests. Admin tokens only (Store Admin API tokens and connected tools); each request needs the scopes of its type, listed by GET /imports/types and GET /exports/types.
Import: create an upload intent for the type, PUT the file to its URL, finalize it, then POST /imports with the ready file_id. The import is analyzed exactly like the Store Admin wizard and returned in preview: counts of creates, updates, unchanged rows, skips and errors, file warnings such as ignored columns, and can_confirm. Read row errors with GET /imports/{importId}/errors. Nothing changes until POST /imports/{importId}/confirm, which starts the same job as Start import; follow it with GET /imports/{importId}. A preview lasts 24 hours. Imports can be discarded before confirmation and cancelled while running; historical order imports can be undone with a confirmation token, under the same rules as Store Admin.
Export: POST /exports starts the same export as the Export button; GET /exports/{exportId} returns a signed download_url (valid 5 minutes) once it is completed. Export files use the import columns, so an edited export can be imported again, except Gift Cards: their export is a listing (no Amount or Reason, only the last 4 code characters) and their import only issues new cards. See Bulk changes with CSV imports for the full workflow.
Translation CSV resources include message_template (one SMS or WhatsApp message type and channel; content), email_template (one email editor text per row; content), order_status (one custom status; name), file and product_media (alt_text). Email text_id is the template UUID followed by : and the exact text_key from the export: subject, preview_text, preheader, a reachable block text or a code-mode text run. Keep these identifiers, source columns and headers unchanged; edit only translated columns. Email translations change text, preserving layout and template syntax. Message and email translations must keep every {{ ... }} value and {% ... %} tag. Blank cells keep stored translations; __CLEAR__ clears one. System order statuses are supplied by Tringify and cannot be translated. The preview, row errors, file limits and job progress are the same as other translation CSVs.
Endpoints#
Import types
List the CSV imports this store offers, with their modes and options.
Every import Store Admin offers, with its modes (the first is the default), options, the scopes it needs to run (write_scopes) and read (read_scopes), and whether it can be cancelled or undone. partial imports apply the valid rows and skip rows with errors; the others need an error-free file. A translation import also needs its resource's owner scope (for example write_products for product).
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Create an import upload
Get an upload URL for an import CSV.
Step 1 of an import. Send the import type and one item describing the file; the response carries an intent with an upload URL. PUT the file there, then finalize the intent. The file's size, row and column limits are the type's Store Admin limits, checked at upload. The token needs the scopes of the request's type (see GET /imports/types and GET /exports/types); a missing one returns 403 CSV_JOB_SCOPE_REQUIRED naming it.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
type
required
|
string |
Import type: one of
Allowed values
productsproduct_sales_baselinescategoriesattributestagsvendorsbrandscustomersgift_cardsreviewsordersstock_levelsinventory_groupslocationsmenusredirectstax_ratestranslations |
resource
|
string |
Translations only: the translated resource, as in the import's |
items
required
|
array<object> |
Exactly one file: |
Errors
-
400CSV_JOB_TYPE_UNKNOWNtypeis not one of the listed types. -
400CSV_JOB_OPTION_INVALIDA mode or option is not valid for the type; the error lists the allowed values.
-
400CSV_JOB_OPTION_REQUIREDA required option (such as
market_id,resourceorlocale) is missing. -
403CSV_JOB_SCOPE_REQUIREDThe token lacks a scope this type needs.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Finalize an import upload
Finalize an uploaded import CSV.
Step 2: after the PUT, finalize the intent with the same type. The intent keeps the resource given at the create step, so a translation upload is not told it again. The file is checked (CSV, size, row and column counts); poll the status endpoint until the intent is ready, then pass its file_id to POST /imports.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
type
required
|
string |
Import type: one of
Allowed values
productsproduct_sales_baselinescategoriesattributestagsvendorsbrandscustomersgift_cardsreviewsordersstock_levelsinventory_groupslocationsmenusredirectstax_ratestranslations |
intent_ids
required
|
array<uuid> |
The intent from the create step. |
Errors
-
400CSV_JOB_TYPE_UNKNOWNtypeis not one of the listed types. -
400CSV_JOB_OPTION_INVALIDA mode or option is not valid for the type; the error lists the allowed values.
-
400CSV_JOB_OPTION_REQUIREDA required option (such as
market_id,resourceorlocale) is missing. -
403CSV_JOB_SCOPE_REQUIREDThe token lacks a scope this type needs.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Check an import upload
Check whether an uploaded import CSV is ready.
Returns the intent's state; once it is ready, its file_id creates the import.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
type
required
|
string |
Import type: one of
Allowed values
productsproduct_sales_baselinescategoriesattributestagsvendorsbrandscustomersgift_cardsreviewsordersstock_levelsinventory_groupslocationsmenusredirectstax_ratestranslations |
intent_ids
required
|
array<uuid> |
The intent from the create step. |
Errors
-
400CSV_JOB_TYPE_UNKNOWNtypeis not one of the listed types. -
400CSV_JOB_OPTION_INVALIDA mode or option is not valid for the type; the error lists the allowed values.
-
400CSV_JOB_OPTION_REQUIREDA required option (such as
market_id,resourceorlocale) is missing. -
403CSV_JOB_SCOPE_REQUIREDThe token lacks a scope this type needs.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Create an import
Analyze an uploaded CSV and return what the import would change, without changing anything.
Step 3. Runs the same analysis as the Store Admin import wizard and returns the import in preview: row counts (creates, updates, unchanged, skips, errors), file warnings such as ignored columns, and can_confirm. Nothing is written until POST /imports/{importId}/confirm. Read row errors with GET /imports/{importId}/errors. The preview expires after 24 hours (expires_at). status is ready when the import can be confirmed and blocked when the file's errors stop it (fix the rows, upload the file again and create a new import). A large file can take up to 25 seconds to analyze; a busy service returns 503 and the request can be repeated with the same Idempotency-Key. The token needs the scopes of the request's type (see GET /imports/types and GET /exports/types); a missing one returns 403 CSV_JOB_SCOPE_REQUIRED naming it.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Idempotency-Key
|
string |
Optional key, up to 255 characters, that makes this create safe to retry. Repeating the request with the same key and body within 24 hours returns the original import or export instead of starting another; the same key with a different body returns |
Body parameters
| Name | Type | Description |
|---|---|---|
type
required
|
string |
Import type: one of
Allowed values
productsproduct_sales_baselinescategoriesattributestagsvendorsbrandscustomersgift_cardsreviewsordersstock_levelsinventory_groupslocationsmenusredirectstax_ratestranslations |
file_id
required
|
uuid |
The |
mode
|
string |
One of the type's |
options
|
object |
The type's options, e.g. |
Errors
-
400CSV_JOB_TYPE_UNKNOWNtypeis not one of the listed types. -
400CSV_JOB_OPTION_INVALIDA mode or option is not valid for the type; the error lists the allowed values.
-
400CSV_JOB_OPTION_REQUIREDA required option (such as
market_id,resourceorlocale) is missing. -
403CSV_JOB_SCOPE_REQUIREDThe token lacks a scope this type needs.
-
409IMPORT_EXPORT_PREVIEW_ALREADY_ACTIVEAnother file of this type is waiting to be confirmed (here or in Store Admin); discard it first.
-
409CSV_JOB_REQUEST_KEY_CONFLICTIdempotency-Keywas already used with a different request. -
400TRANSLATION_CSV_JOB_IN_PROGRESSTranslations only: one translation CSV import or export runs per store at a time, whatever its resource or language, and an analyzed import waiting to be confirmed holds that slot too; the message names the one holding it (e.g. the Brands export). Start this one after it finishes, or confirm or discard the waiting import.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
List imports
List recent imports created through the API, newest first.
Imports created through the Store API or a connected tool whose type this token can read, newest first. Paged by cursor. Each import and export carries status_display and type_display, its status and type as shown in Tringify (type_display is the type's label from the types list), in English; an import's job carries status_display too.
Query parameters
| Name | Type | Description |
|---|---|---|
type
|
string |
Only this type. |
limit
|
integer |
Page size, 1-50. |
cursor
|
string |
|
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Get an import
Read an import's preview counts, status and result.
Before confirmation status is ready, blocked or expired, and confirming while the job is being started. After it, status is the job's: validating, processing, completed, failed or cancelled, and job carries progress and result counts (processed_rows, succeeded, failed, skipped). An attributes import counts attributes in total_rows and processed_rows (a file row is one option of an attribute) and reports the file's option rows in job.option_rows (total, processed); other import types omit it. Poll until completed, failed or cancelled. Each import and export carries status_display and type_display, its status and type as shown in Tringify (type_display is the type's label from the types list), in English; an import's job carries status_display too.
Path parameters
| Name | Type | Description |
|---|---|---|
importId
required
|
uuid |
Import id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
404CSV_IMPORT_NOT_FOUNDNo such import in this store, or its type needs a scope this token lacks.
List import errors
Read an import's row errors, one page at a time.
Before confirmation these are the preview's row errors; after it, the rows the job could not apply. Each error names the CSV row, the field when known, a code and a message. A job keeps its first row_error_limit row errors; total counts them all.
Path parameters
| Name | Type | Description |
|---|---|---|
importId
required
|
uuid |
Import id. |
Query parameters
| Name | Type | Description |
|---|---|---|
page
|
integer |
Page, from 1. |
limit
|
integer |
Page size, 1-100. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
404CSV_IMPORT_NOT_FOUNDNo such import in this store, or its type needs a scope this token lacks.
Confirm an import
Run a previewed import.
Starts the job for the previewed file, exactly as Start import in Store Admin, and returns the import with status validating or processing. Confirm only after reviewing the preview counts and errors with the merchant. Repeating it returns CSV_IMPORT_ALREADY_CONFIRMED. The token needs the scopes of the request's type (see GET /imports/types and GET /exports/types); a missing one returns 403 CSV_JOB_SCOPE_REQUIRED naming it.
Path parameters
| Name | Type | Description |
|---|---|---|
importId
required
|
uuid |
Import id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
404CSV_IMPORT_NOT_FOUNDNo such import in this store, or its type needs a scope this token lacks.
-
409CSV_IMPORT_PREVIEW_EXPIREDThe preview is older than 24 hours; create the import again.
-
400IMPORT_EXPORT_PREVIEW_REQUIREDThe preview was replaced (the same file was analyzed again) or discarded; create the import again.
-
409CSV_IMPORT_NOTHING_TO_IMPORTThe file's errors block the import.
-
409CSV_IMPORT_ALREADY_CONFIRMEDThe import already ran or is running.
-
400IMPORT_EXPORT_JOB_IN_PROGRESSAnother import or export of this resource is running.
-
400TRANSLATION_CSV_JOB_IN_PROGRESSTranslations only: one translation CSV import or export runs per store at a time, whatever its resource or language, and an analyzed import waiting to be confirmed holds that slot too; the message names the one holding it (e.g. the Brands export). Start this one after it finishes, or confirm or discard the waiting import.
Discard an import
Drop an import that was not confirmed.
Deletes the preview without changing anything, like Discard in the Store Admin wizard. A store keeps one active preview per type for reviews, tags, historical orders, sales baselines and tax rates, so discard an unwanted one before creating another. The token needs the scopes of the request's type (see GET /imports/types and GET /exports/types); a missing one returns 403 CSV_JOB_SCOPE_REQUIRED naming it.
Path parameters
| Name | Type | Description |
|---|---|---|
importId
required
|
uuid |
Import id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
404CSV_IMPORT_NOT_FOUNDNo such import in this store, or its type needs a scope this token lacks.
-
409CSV_IMPORT_ALREADY_CONFIRMEDThe import was confirmed; cancel it instead.
Cancel an import
Stop a running import.
Cancels a confirmed import that hasn't finished, like Cancel in Store Admin's bulk jobs. Rows already applied stay applied. Translation imports can't be cancelled. The token needs the scopes of the request's type (see GET /imports/types and GET /exports/types); a missing one returns 403 CSV_JOB_SCOPE_REQUIRED naming it.
Path parameters
| Name | Type | Description |
|---|---|---|
importId
required
|
uuid |
Import id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
404CSV_IMPORT_NOT_FOUNDNo such import in this store, or its type needs a scope this token lacks.
-
409CSV_IMPORT_NOT_CONFIRMEDThe import was never confirmed, so nothing runs.
-
400CSV_JOB_CANCEL_UNSUPPORTEDThis type can't be cancelled.
Undo an import
Delete the orders a finished historical order import created.
Historical order imports only, with the same rules as Undo import in Store Admin: orders that have since changed (paid, fulfilled, refunded, edited) are kept and counted in blocked. The first call returns 409 CONFIRMATION_REQUIRED with the impact (orders_in_batch, deletable, blocked) and a single-use confirmation_token; show it to the merchant and repeat the call with confirmed: true and the token. One call deletes a bounded batch; while remaining is above 0, repeat the confirmation round. The token needs the scopes of the request's type (see GET /imports/types and GET /exports/types); a missing one returns 403 CSV_JOB_SCOPE_REQUIRED naming it.
Path parameters
| Name | Type | Description |
|---|---|---|
importId
required
|
uuid |
Import id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
confirmed
|
boolean |
Set true only when repeating after |
confirmation_token
|
string |
Single-use token returned by |
Errors
-
404CSV_IMPORT_NOT_FOUNDNo such import in this store, or its type needs a scope this token lacks.
-
400CSV_IMPORT_UNDO_UNSUPPORTEDOnly historical order imports can be undone.
-
409CONFIRMATION_REQUIREDConfirm the impact and repeat with the token.
-
409ORDER_IMPORT_BATCH_NOT_FINISHEDThe import is still running.
-
409ORDER_IMPORT_BATCH_NOTHING_TO_UNDONo order from this import can be deleted.
-
409ORDER_IMPORT_BATCH_CONFIRMATION_INVALIDThe confirmation token expired (5 minutes) or was already used.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
Export types
List the CSV exports this store offers, with their options.
Every export Store Admin offers, with its options (filters) and the scopes it needs. A translation export also needs its resource's owner read scope.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Start an export
Export records to a CSV file in the background.
Starts the same export as Store Admin's Export button and returns it with status processing. Poll GET /exports/{exportId}; when status is completed it carries a short-lived download_url. The file uses the import columns, so an edited export can be imported again (for translations: export, translate the file, then import it with the same resource and locale). A Gift Cards export is a listing only: its import issues new cards and cannot update existing ones. The token needs the scopes of the request's type (see GET /imports/types and GET /exports/types); a missing one returns 403 CSV_JOB_SCOPE_REQUIRED naming it.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Idempotency-Key
|
string |
Optional key, up to 255 characters, that makes this create safe to retry. Repeating the request with the same key and body within 24 hours returns the original import or export instead of starting another; the same key with a different body returns |
Body parameters
| Name | Type | Description |
|---|---|---|
type
required
|
string |
Export type: one of
Allowed values
productscategoriesattributestagsvendorsbrandscustomerssubscribersgift_cardsreviewsordersstock_levelsstock_historyinventory_groupslocationsmenusredirectstax_ratestax_rate_referencetax_zonestax_classestranslations |
options
|
object |
The type's options (filters), e.g. |
Errors
-
400CSV_JOB_TYPE_UNKNOWNtypeis not one of the listed types. -
400CSV_JOB_OPTION_INVALIDA mode or option is not valid for the type; the error lists the allowed values.
-
400CSV_JOB_OPTION_REQUIREDA required option (such as
market_id,resourceorlocale) is missing. -
403CSV_JOB_SCOPE_REQUIREDThe token lacks a scope this type needs.
-
400IMPORT_EXPORT_JOB_IN_PROGRESSAn export of this resource is already running.
-
400IMPORT_EXPORT_NOTHING_TO_EXPORTThere is nothing to export.
-
400TRANSLATION_CSV_JOB_IN_PROGRESSTranslations only: one translation CSV import or export runs per store at a time, whatever its resource or language, and an analyzed import waiting to be confirmed holds that slot too; the message names the one holding it (e.g. the Brands export). Start this one after it finishes, or confirm or discard the waiting import.
-
400STORE_API_BODY_PROPERTY_UNKNOWNThe body has a property this request does not accept. The message and
error.details.propertieslist the allowed and required properties (nestedfor each object or list of objects). -
400STORE_API_BODY_PROPERTY_INVALIDA body property has the wrong type (
error.details.expected_type). The message anderror.details.propertieslist the allowed and required properties.
List exports
List recent exports created through the API, newest first.
Exports created through the Store API or a connected tool whose type this token can read, newest first. Paged by cursor. A download_url is only on GET /exports/{exportId}. Each import and export carries status_display and type_display, its status and type as shown in Tringify (type_display is the type's label from the types list), in English; an import's job carries status_display too.
Query parameters
| Name | Type | Description |
|---|---|---|
type
|
string |
Only this type. |
limit
|
integer |
Page size, 1-50. |
cursor
|
string |
|
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Get an export
Read an export's status and, once it is done, its download link.
status is processing, completed, failed or cancelled. A completed export has download_url, a signed link valid for 5 minutes (download_expires_at); read the export again for a fresh link. Each import and export carries status_display and type_display, its status and type as shown in Tringify (type_display is the type's label from the types list), in English; an import's job carries status_display too.
Path parameters
| Name | Type | Description |
|---|---|---|
exportId
required
|
uuid |
Export id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
404CSV_EXPORT_NOT_FOUNDNo such export in this store, or its type needs a scope this token lacks.
Cancel an export
Stop a running export.
Cancels an export that hasn't finished. Newsletter subscriber and translation exports can't be cancelled.
Path parameters
| Name | Type | Description |
|---|---|---|
exportId
required
|
uuid |
Export id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
404CSV_EXPORT_NOT_FOUNDNo such export in this store, or its type needs a scope this token lacks.
-
400CSV_JOB_CANCEL_UNSUPPORTEDThis type can't be cancelled.