CSV imports and exports

Run the same CSV imports and exports as Store Admin through the Store API and connected tools: upload a file, review the preview, confirm, follow the job, download exports.

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

GET Depends on `type` Admin tokens only

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

POST Depends on `type` Admin tokens only

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 GET /imports/types.

Allowed values
productsproduct_sales_baselinescategoriesattributestagsvendorsbrandscustomersgift_cardsreviewsordersstock_levelsinventory_groupslocationsmenusredirectstax_ratestranslations
Example: products
resource string

Translations only: the translated resource, as in the import's resource option.

Example: product
items required array<object>

Exactly one file: original_filename ending in .csv, mime_type text/csv and size_bytes.

Example: [{"original_filename":"products.csv","mime_type":"text/csv","size_bytes":2400000}]

Errors

  • 400 CSV_JOB_TYPE_UNKNOWN

    type is not one of the listed types.

  • 400 CSV_JOB_OPTION_INVALID

    A mode or option is not valid for the type; the error lists the allowed values.

  • 400 CSV_JOB_OPTION_REQUIRED

    A required option (such as market_id, resource or locale) is missing.

  • 403 CSV_JOB_SCOPE_REQUIRED

    The token lacks a scope this type needs.

  • 400 STORE_API_BODY_PROPERTY_UNKNOWN

    The body has a property this request does not accept. The message and error.details.properties list the allowed and required properties (nested for each object or list of objects).

  • 400 STORE_API_BODY_PROPERTY_INVALID

    A body property has the wrong type (error.details.expected_type). The message and error.details.properties list the allowed and required properties.

Finalize an import upload

POST Depends on `type` Admin tokens only

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 GET /imports/types.

Allowed values
productsproduct_sales_baselinescategoriesattributestagsvendorsbrandscustomersgift_cardsreviewsordersstock_levelsinventory_groupslocationsmenusredirectstax_ratestranslations
Example: products
intent_ids required array<uuid>

The intent from the create step.

Example: ["0b2f6c1e-7d4a-4c3b-9e5f-1a2b3c4d5e6f"]

Errors

  • 400 CSV_JOB_TYPE_UNKNOWN

    type is not one of the listed types.

  • 400 CSV_JOB_OPTION_INVALID

    A mode or option is not valid for the type; the error lists the allowed values.

  • 400 CSV_JOB_OPTION_REQUIRED

    A required option (such as market_id, resource or locale) is missing.

  • 403 CSV_JOB_SCOPE_REQUIRED

    The token lacks a scope this type needs.

  • 400 STORE_API_BODY_PROPERTY_UNKNOWN

    The body has a property this request does not accept. The message and error.details.properties list the allowed and required properties (nested for each object or list of objects).

  • 400 STORE_API_BODY_PROPERTY_INVALID

    A body property has the wrong type (error.details.expected_type). The message and error.details.properties list the allowed and required properties.

Check an import upload

POST Depends on `type` Admin tokens only

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 GET /imports/types.

Allowed values
productsproduct_sales_baselinescategoriesattributestagsvendorsbrandscustomersgift_cardsreviewsordersstock_levelsinventory_groupslocationsmenusredirectstax_ratestranslations
Example: products
intent_ids required array<uuid>

The intent from the create step.

Example: ["0b2f6c1e-7d4a-4c3b-9e5f-1a2b3c4d5e6f"]

Errors

  • 400 CSV_JOB_TYPE_UNKNOWN

    type is not one of the listed types.

  • 400 CSV_JOB_OPTION_INVALID

    A mode or option is not valid for the type; the error lists the allowed values.

  • 400 CSV_JOB_OPTION_REQUIRED

    A required option (such as market_id, resource or locale) is missing.

  • 403 CSV_JOB_SCOPE_REQUIRED

    The token lacks a scope this type needs.

  • 400 STORE_API_BODY_PROPERTY_UNKNOWN

    The body has a property this request does not accept. The message and error.details.properties list the allowed and required properties (nested for each object or list of objects).

  • 400 STORE_API_BODY_PROPERTY_INVALID

    A body property has the wrong type (error.details.expected_type). The message and error.details.properties list the allowed and required properties.

Create an import

POST Depends on `type` Admin tokens only

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 CSV_JOB_REQUEST_KEY_CONFLICT.

Example: catalog-sync-2026-10-27

Body parameters

Name Type Description
type required string

Import type: one of GET /imports/types.

Allowed values
productsproduct_sales_baselinescategoriesattributestagsvendorsbrandscustomersgift_cardsreviewsordersstock_levelsinventory_groupslocationsmenusredirectstax_ratestranslations
Example: products
file_id required uuid

The file_id of the ready upload intent.

Example: 5d3a1c7e-2f4b-4a6c-8e9d-0b1c2d3e4f5a
mode string

One of the type's modes; defaults to the first. create_only adds new records, update_only changes existing ones matched by id or handle.

Example: create_only
options object

The type's options, e.g. {"market_id": "…"} for tax rates or {"resource": "product", "locale": "fr"} for translations.

Example: {"create_redirects":true}

Errors

  • 400 CSV_JOB_TYPE_UNKNOWN

    type is not one of the listed types.

  • 400 CSV_JOB_OPTION_INVALID

    A mode or option is not valid for the type; the error lists the allowed values.

  • 400 CSV_JOB_OPTION_REQUIRED

    A required option (such as market_id, resource or locale) is missing.

  • 403 CSV_JOB_SCOPE_REQUIRED

    The token lacks a scope this type needs.

  • 409 IMPORT_EXPORT_PREVIEW_ALREADY_ACTIVE

    Another file of this type is waiting to be confirmed (here or in Store Admin); discard it first.

  • 409 CSV_JOB_REQUEST_KEY_CONFLICT

    Idempotency-Key was already used with a different request.

  • 400 TRANSLATION_CSV_JOB_IN_PROGRESS

    Translations 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.

  • 400 STORE_API_BODY_PROPERTY_UNKNOWN

    The body has a property this request does not accept. The message and error.details.properties list the allowed and required properties (nested for each object or list of objects).

  • 400 STORE_API_BODY_PROPERTY_INVALID

    A body property has the wrong type (error.details.expected_type). The message and error.details.properties list the allowed and required properties.

List imports

GET Depends on `type` Admin tokens only

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.

Default: 20
cursor string

next_cursor of the previous page.

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Get an import

GET Depends on `type` Admin tokens only

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.

Example: 3f0c9a1e-6b2d-4e8f-9a7c-1d2e3f4a5b6c

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 404 CSV_IMPORT_NOT_FOUND

    No such import in this store, or its type needs a scope this token lacks.

List import errors

GET Depends on `type` Admin tokens only

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.

Example: 3f0c9a1e-6b2d-4e8f-9a7c-1d2e3f4a5b6c

Query parameters

Name Type Description
page integer

Page, from 1.

Default: 1
limit integer

Page size, 1-100.

Default: 50

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 404 CSV_IMPORT_NOT_FOUND

    No such import in this store, or its type needs a scope this token lacks.

Confirm an import

POST Depends on `type` Admin tokens only

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.

Example: 3f0c9a1e-6b2d-4e8f-9a7c-1d2e3f4a5b6c

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 404 CSV_IMPORT_NOT_FOUND

    No such import in this store, or its type needs a scope this token lacks.

  • 409 CSV_IMPORT_PREVIEW_EXPIRED

    The preview is older than 24 hours; create the import again.

  • 400 IMPORT_EXPORT_PREVIEW_REQUIRED

    The preview was replaced (the same file was analyzed again) or discarded; create the import again.

  • 409 CSV_IMPORT_NOTHING_TO_IMPORT

    The file's errors block the import.

  • 409 CSV_IMPORT_ALREADY_CONFIRMED

    The import already ran or is running.

  • 400 IMPORT_EXPORT_JOB_IN_PROGRESS

    Another import or export of this resource is running.

  • 400 TRANSLATION_CSV_JOB_IN_PROGRESS

    Translations 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

POST Depends on `type` Admin tokens only

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.

Example: 3f0c9a1e-6b2d-4e8f-9a7c-1d2e3f4a5b6c

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 404 CSV_IMPORT_NOT_FOUND

    No such import in this store, or its type needs a scope this token lacks.

  • 409 CSV_IMPORT_ALREADY_CONFIRMED

    The import was confirmed; cancel it instead.

Cancel an import

POST Depends on `type` Admin tokens only

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.

Example: 3f0c9a1e-6b2d-4e8f-9a7c-1d2e3f4a5b6c

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 404 CSV_IMPORT_NOT_FOUND

    No such import in this store, or its type needs a scope this token lacks.

  • 409 CSV_IMPORT_NOT_CONFIRMED

    The import was never confirmed, so nothing runs.

  • 400 CSV_JOB_CANCEL_UNSUPPORTED

    This type can't be cancelled.

Undo an import

POST Depends on `type` Admin tokens only

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.

Example: 3f0c9a1e-6b2d-4e8f-9a7c-1d2e3f4a5b6c

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_REQUIRED.

Example: true
confirmation_token string

Single-use token returned by CONFIRMATION_REQUIRED.

Example: confirm_...

Errors

  • 404 CSV_IMPORT_NOT_FOUND

    No such import in this store, or its type needs a scope this token lacks.

  • 400 CSV_IMPORT_UNDO_UNSUPPORTED

    Only historical order imports can be undone.

  • 409 CONFIRMATION_REQUIRED

    Confirm the impact and repeat with the token.

  • 409 ORDER_IMPORT_BATCH_NOT_FINISHED

    The import is still running.

  • 409 ORDER_IMPORT_BATCH_NOTHING_TO_UNDO

    No order from this import can be deleted.

  • 409 ORDER_IMPORT_BATCH_CONFIRMATION_INVALID

    The confirmation token expired (5 minutes) or was already used.

  • 400 STORE_API_BODY_PROPERTY_UNKNOWN

    The body has a property this request does not accept. The message and error.details.properties list the allowed and required properties (nested for each object or list of objects).

  • 400 STORE_API_BODY_PROPERTY_INVALID

    A body property has the wrong type (error.details.expected_type). The message and error.details.properties list the allowed and required properties.

Export types

GET Depends on `type` Admin tokens only

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

POST Depends on `type` Admin tokens only

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 CSV_JOB_REQUEST_KEY_CONFLICT.

Example: catalog-sync-2026-10-27

Body parameters

Name Type Description
type required string

Export type: one of GET /exports/types.

Allowed values
productscategoriesattributestagsvendorsbrandscustomerssubscribersgift_cardsreviewsordersstock_levelsstock_historyinventory_groupslocationsmenusredirectstax_ratestax_rate_referencetax_zonestax_classestranslations
Example: products
options object

The type's options (filters), e.g. {"status": "active"} for products or {"resource": "product", "locale": "fr"} for translations.

Example: {"status":"active"}

Errors

  • 400 CSV_JOB_TYPE_UNKNOWN

    type is not one of the listed types.

  • 400 CSV_JOB_OPTION_INVALID

    A mode or option is not valid for the type; the error lists the allowed values.

  • 400 CSV_JOB_OPTION_REQUIRED

    A required option (such as market_id, resource or locale) is missing.

  • 403 CSV_JOB_SCOPE_REQUIRED

    The token lacks a scope this type needs.

  • 400 IMPORT_EXPORT_JOB_IN_PROGRESS

    An export of this resource is already running.

  • 400 IMPORT_EXPORT_NOTHING_TO_EXPORT

    There is nothing to export.

  • 400 TRANSLATION_CSV_JOB_IN_PROGRESS

    Translations 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.

  • 400 STORE_API_BODY_PROPERTY_UNKNOWN

    The body has a property this request does not accept. The message and error.details.properties list the allowed and required properties (nested for each object or list of objects).

  • 400 STORE_API_BODY_PROPERTY_INVALID

    A body property has the wrong type (error.details.expected_type). The message and error.details.properties list the allowed and required properties.

List exports

GET Depends on `type` Admin tokens only

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.

Default: 20
cursor string

next_cursor of the previous page.

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Get an export

GET Depends on `type` Admin tokens only

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.

Example: 8a7b6c5d-4e3f-4a2b-9c1d-0e1f2a3b4c5d

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 404 CSV_EXPORT_NOT_FOUND

    No such export in this store, or its type needs a scope this token lacks.

Cancel an export

POST Depends on `type` Admin tokens only

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.

Example: 8a7b6c5d-4e3f-4a2b-9c1d-0e1f2a3b4c5d

Headers

Name Type Description
Authorization required string

Bearer Store API token.

Errors

  • 404 CSV_EXPORT_NOT_FOUND

    No such export in this store, or its type needs a scope this token lacks.

  • 400 CSV_JOB_CANCEL_UNSUPPORTED

    This type can't be cancelled.