Exporting resources
How to bulk export resources and their relationships
Commerce Layer lets you export resources in JSON (default) or CSV formats. To do that, you need to create a new export resource, specify the resource_type
you want to export, and the format
of the exported file. Optionally, you can also specify the relationships you want to include, apply some filters to narrow the exported data, and decide to skip some redundant attributes.
The process is asynchronous and you can poll the status
attribute to check the export progress. As soon as an export is created you can check the number of items that are going to be exported by inspecting the records_count
attribute. If you try to export a resource with records_count = 0
, an error is returned.
Attachment URL
Once the export process is completed, the results are compressed (gzip) and uploaded to an external storage service (currently Amazon S3). You can download the exported data using the link exposed in the attachment_url
attribute.
Export limits
Maximum export size
There is no limit on the total number of resources you can export, but the single batches are subject to some soft limits: the records_count
must be a maximum of 10000 records, otherwise the export will be rejected at the time of creation.
Concurrent exports
The maximum number of concurrent exports (i.e. exports whose status is pending
or in_progess
) allowed per organization is 10.
Supported resources
At the moment, exports are available for almost all of the resources exposed via API. Please find some examples of how to export them here below.
Importing resourcesIncluding associations
It's possible to include one or more relationships of the exported resource using the includes
attribute. Relationships will be exported as an object if singular (has_one
or belongs_to
), or as an array of objects if multiple (has_many
) — check Commerce Layer API data model for more information on how resources relate to each other.
If you use the CSV format to export your data the output will have the relationship attributes flattened together with the parent resource ones. As a result, you'll find the resource attributes repeated on multiple lines, with relationship ones appended at the end. When exporting tags together with a tagged resource the cells belonging to the tags.id
and tags.name
columns contain a string with the list of IDs/names, comma separated. In general, using CSV is fine for simple exports (resources with a few attributes and no relationship included), otherwise we strongly recommend using JSON.
When including associations, multiple levels of relationships are supported. You just need to append the more specific using the use the dot notation .
(e.g. line item options for orders, or price tiers for SKUs).
CSV format
supports only one level of relationship (e.g. if you try to include line_items.line_item_options
when exporting orders, only the line items will be exported).
Supported associations
All of the valid resource relationships can be included when exporting. Please refer to the specific resource page in the Core API reference to check which relationships you can include when exporting it.
In case you specify an invalid include for the exported resource, an error is raised before creating (and starting) the export.
Selecting fields
When exporting resources, you can select the resource fields to be exported in advance by specifying the fields
attribute as an array of values.
For the main exported resource you can pass fields using the plain attribute names. For any related association's attribute use the dot notation (the same used when including associations), i.e. .
followed by the field name.
For example, if you want to export SKUs with their code and name plus some specific fields of the associated prices and stock items and all the fields of the associated shipping category, use a field
array like this:
...
"fields": [
"code",
"name",
"prices.amount_cents",
"prices.price_list.name",
"stock_items.stock_location.code",
"shipping_category.*"
...
]
Some attributes which are potentially sensible (e.g. any kind of credentials) will not be included in the exported file also if you explicitly specify them in the fields
array.
Fields vs. includes
Specifying includes
is completely redundant when using fields
since any association's related attribute listed among the fields automatically includes the related resource. This also means that:
If you specify a field using an invalid related association, an error is raised before creating (and starting) the export.
If you include an association that has no corresponding related field, its data will not be exported.
Filtering exported data
When exporting resources, you can fine-tune the data to be exported by applying some filters (both to the resources and their relationships) using the filters
attribute:
...
"filters": {
"{{predicate}}": {{value}},
...
}
To compose the filter predicate you just need to follow the same syntax you use when filtering a collection of resources — {{attributes}}_{{matcher}}
. You must specify filtering rules as a valid JSON object. List values for the *_in
matcher need to be expressed as arrays (as in this example).
Skipping redundant attributes
You might want to compact exported data by removing some redundant attributes from the final JSON or CSV output. To do that, set the dry_data
specific boolean attribute to true
— the following attributes and values will be skipped:
The main resource IDs.
The timestamp attributes (
created_at
andupdated_at
).Any empty or
null
attribute value (working when exporting in the JSON format only).All the formatted amounts other than cents (e.g. for prices, orders, etc.).
Examples
Exporting some fields of a filtered list of addresses (JSON)
The following request creates an export of a list of addresses in JSON
format, filtered by country code and city, fetching just the full_name
and full_address
fields:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "addresses",
"fields": [ "full_name", "full_address" ],
"filters": {
"country_code_eq": "IT",
"city_in": [ "Rome", "Milan", "Prato" ]
}
}
}
}'
Exporting a filtered list of bundles with SKU lists and SKU list items (CSV)
The following request creates an export of a list of bundles and their associated SKU lists and SKU list items in CSV format, filtered by SKU list name:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "bundles",
"format": "csv",
"includes": [ "sku_list", "sku_list_items" ],
"filters": {
"sku_list_name_in": [ "6 pack", "12 pack" ]
}
}
}
}'
Exporting a list of coupons (JSON)
The following request creates an export of a list of coupons in JSON format, skipping the redundant attributes:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "coupons",
"dry_data": true
}
}
}'
Exporting some fields a filtered list of customer addresses with addresses and customers (JSON)
The following request creates an export of a list of customer addresses in JSON format, filtered by customer's email, fetching just the associated customer email
and address full_address
fields:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "customer_addresses",
"format": "json",
"fields": [ "address.full_address", "customer.email" ],
"filters": {
"customer_email_end": ".com"
}
}
}
}'
Exporting a filtered list of customer subscriptions with customers (CSV)
The following request creates an export of a list of customer subscriptions and their associated customers in CSV format filtered by email:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "customer_subscriptions",
"format": "csv",
"includes": [ "customer" ],
"filters": {
"customer_email_matches": "%gmail.com"
}
}
}
}'
Exporting some fields of a filtered list of customers with customer subscriptions (JSON)
The following request creates an export of a list of customers in JSON format filtered by email, fetching all the customer attributes and just the customer subscription reference
field:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "customers",
"format": "json",
"fields": [ "*", "customer_subscriptions.reference" ],
"filters": {
"email_end": ".com"
}
}
}
}'
Exporting a filtered list of gift cards (CSV)
The following request creates an export of a list of gift cards in CSV format, filtered by the date and time at which they were created:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "gift_cards",
"format": "csv",
"filters": {
"created_at_gteq": "2018-01-01T12:00:00.000Z"
}
}
}
}'
Exporting a filtered list of orders with customer, addresses, line items, line item options, payment method, and refunds (JSON)
The following request creates an export of a list of orders dry data with the associated customer, addresses, line items, line item options, payment method, and refunds in JSON format, filtered by status, country code, and the date and time at which they were placed:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "orders",
"includes": [
"customer",
"shipping_address",
"billing_address",
"line_items.line_item_options",
"payment_method",
"refunds"
],
"filters": {
"status_in": [ "placed", "approved" ],
"placed_at_gteq": "2018-01-01T12:00:00.000Z",
"country_code_eq": "IT"
},
"dry_data": true
}
}
}'
Exporting a filtered list of order subscriptions with order subscription items and customer payment source (JSON)
The following request creates an export of a list of order subscriptions with the associated order subscription items and customer payment source in JSON format (skipping the redundant attributes), filtered by customer email:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "order_subscriptions",
"format": "json",
"includes": [ "order_subscription_items", "customer_payment_source" ],
"filters": {
"customer_email_eq": "[email protected]"
},
"dry_data": true
}
}
}'
Exporting some fields of a filtered list of prices with price tiers (CSV)
The following request creates an export of a list of prices with associated SKUs and price tiers in CSV format, fetching just the price's amount_cents
and the associated SKU's code
, price tier's type
and price_amount_cents
fields, filtered by the associated price list's currency code:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "prices",
"format": "csv",
"fields": [ "amount_cents", "sku.code", "price_tiers.type", "price_tiers.price_amount_cents" ],
"filters": {
"price_list_currency_code_eq": "USD"
},
"dry_data": true
}
}
}'
Exporting a filtered list of SKU lists with SKU list items (JSON)
The following request creates an export of a list of SKU lists with associated SKU list items in JSON format, filtered SKU list type (manual):
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "sku_lists",
"includes": [ "sku_list_items" ],
"filters": {
"manual_true": true
}
}
}
}'
Exporting a filtered list of SKUs with prices, price tiers, stock items, and tax categories (JSON)
The following request creates an export with a list of SKUs, with the associated prices, price tiers, stock items, and tax categories in JSON format (skipping the redundant attributes), filtered by SKU name:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "skus",
"includes": [ "prices.price_tiers", "stock_items", "tax_categories" ],
"filters": {
"name_cont": "FW"
},
"dry_data": true
}
}
}'
Exporting some fields of a filtered list of stock items with SKUs and stock location (CSV)
The following request creates an export of a list of stock items and the associated SKUs and stock location in CSV format (skipping the redundant attributes), filtered by stock item quantity, fetching just the stock item's quantity
, and the associated SKU's code
and stock location's name
fields:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "stock_items",
"format": "csv",
"fields": [ "quantity", "sku.code", "stock_location.name" ],
"filters": {
"quantity_gteq": 1
},
"dry_data": true
}
}
}'
Exporting some fields of a filtered list of stock transfers with SKUs and stock locations (CSV)
The following request creates an export of a list of stock transfers (filtered by their quantity) with the associated stock locations and SKUs in CSV format (skipping the redundant attributes), fetching just the stock transfer's quantity
, the origin and destination stock location name
, and all the SKU's fields:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "stock_transfers",
"format": "csv",
"fields": [ "quantity", "sku.*", "origin_stock_location.name, "destination_stock_location.name" ],
"filters": {
"quantity_gteq": 1
},
"dry_data": true
}
}
}'
Exporting all the tags (CSV)
The following request creates an export of all the tags you created for your organization in CSV format:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "tags",
"format": "csv"
}
}
}'
Exporting some fields of all the SKUs tagged with at least one of two tags (JSON)
The following request creates an export of all the SKU associated with the tag identified by the "geJmexflJQ" ID or by the "XEqZPxfPam" ID, fetching just the code
and tag name
fields, in JSON format:
curl -g -X POST \
'https://yourdomain.commercelayer.io/api/exports' \
-H 'Accept: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token' \
-H 'Content-Type: application/vnd.api+json' \
-d '{
"data": {
"type": "exports",
"attributes": {
"resource_type": "skus",
"fields": [ "code", "tags.name" ],
"filters": {
"tags_id_in": [ "geJmexflJQ", "XEqZPxfPam" ]
}
}
}
}'
Exporting more than 10K orders using the CLI
The following command exports all the approved orders whose amount is over $1000 (including the associated customer, line items, and tags) in JSON format into a single file and saves it to a specified path:
commercelayer exports:all -t orders -i customer,line_items,tags -w status_eq=approved -w currency_code_eq=USD -w total_amount_cents_gt=100000 -X ./exports/orders
Checking the export status
You can inspect the status of a specific export by fetching the single export by ID and looking at the status
attribute.
curl -g -X GET \
'https://yourdomain.commercelayer.io/api/exports/PmjlkIJzRA' \
-H 'Content-Type: application/vnd.api+json' \
-H 'Authorization: Bearer your-access-token'
If an export gets stuck in the in_progress
status for any reason, you can mark it as interrupted
by patching it with the _interrupt
trigger attribute set to true
. In case an export fails instead, it is automatically moved to the interrupted
status and the errors_log
attribute gets filled with the runtime error that caused the interruption.
Webhooks for exports
You can also leverage Commerce Layer real-time webhooks mechanism, listen to exports.create
, exports.start
, exports.complete
, exports.interrupt
, or exports.destroy
and react properly.
Last updated