Extracts
Trigger product data extractions from Shopify, check extract status, and download source CSV files.
An extract pulls your product data from Shopify. This shared source data is then transformed independently by each of your feeds. When an extract completes, every active feed automatically generates a new run with its own rules and settings applied.
A full extract re-fetches all products from Shopify and regenerates every feed. A regenerate extract re-applies transformations to existing product data without re-fetching from Shopify.
Trigger an extract
/v1/extracts Starts a new extract. Returns 202 Accepted — the extract runs asynchronously. Poll the returned extract ID or use webhooks to check progress.
Required scope: write_exports
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
type | string | full | Extract type: full (re-fetch from Shopify) or regenerate (re-apply transformations only). |
feed_id | string | — | Optional. For regenerate type, specify a feed ID to regenerate only that feed. |
Request
curl -X POST https://app.simpleproductfeeds.com/v1/extracts \
-H "Authorization: Bearer spf_live_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{"type": "full"}'
Response
{
"data": {
"id": "ext_568",
"object": "extract",
"status": "pending",
"progress": 10,
"product_count": 0,
"excluded_count": 0,
"started_at": null,
"completed_at": null,
"failed_at": null,
"error_details": null,
"has_source_csv": false,
"created_at": "2026-03-09T15:00:00Z"
}
}
Errors
| Status | Code | Description |
|---|---|---|
| 409 | export_in_progress | An extract is already running. Wait for it to complete before starting another. |
| 422 | no_feed | No feed has been configured for this shop. |
| 422 | invalid_param | Invalid extract type. Must be full or regenerate. |
List extracts
/v1/extracts Returns a paginated list of extracts, most recent first.
Required scope: read_exports
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number. |
per_page | integer | 25 | Results per page (maximum 100). |
Request
curl "https://app.simpleproductfeeds.com/v1/extracts?page=1&per_page=10" \
-H "Authorization: Bearer spf_live_sk_your_key_here"
Response
{
"data": [
{
"id": "ext_568",
"object": "extract",
"status": "completed",
"progress": 100,
"product_count": 1482,
"excluded_count": 23,
"started_at": "2026-03-09T15:00:05Z",
"completed_at": "2026-03-09T15:05:30Z",
"failed_at": null,
"error_details": null,
"has_source_csv": true,
"created_at": "2026-03-09T15:00:00Z"
},
{
"id": "ext_567",
"object": "extract",
"status": "failed",
"progress": 25,
"product_count": 0,
"excluded_count": 0,
"started_at": "2026-03-09T12:00:00Z",
"completed_at": null,
"failed_at": "2026-03-09T12:01:30Z",
"error_details": "Shopify API rate limit exceeded",
"has_source_csv": false,
"created_at": "2026-03-09T12:00:00Z"
}
],
"meta": {
"page": 1,
"per_page": 10,
"total": 45,
"total_pages": 5,
"has_more": true
}
}
Extract response fields
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier with ext_ prefix. |
object | string | Always "extract". |
status | string | Extract status: "pending", "running", "completed", "failed", or "cancelled". |
progress | integer | Progress percentage (10=scheduled, 25=fetching, 50=fetched, 75=merging, 100=complete). |
product_count | integer | Number of product rows extracted. |
excluded_count | integer | Number of products excluded by rules during transformation. |
started_at | string | null | ISO 8601 timestamp when the extract started processing. |
completed_at | string | null | ISO 8601 timestamp when the extract completed. |
failed_at | string | null | ISO 8601 timestamp if the extract failed. |
error_details | string | null | Error message if the extract failed. |
has_source_csv | boolean | Whether a downloadable source CSV is available. |
created_at | string | ISO 8601 timestamp when the extract was created. |
Extract status values
| Status | Description |
|---|---|
pending | Extract is queued and waiting to start. |
running | Extract is currently fetching products from Shopify. |
completed | Extract finished successfully. All feeds have been regenerated. |
failed | Extract encountered an error. See error_details. |
cancelled | Extract was stopped before completion. |
Get an extract
/v1/extracts/:id Returns a single extract by ID.
Required scope: read_exports
Request
curl https://app.simpleproductfeeds.com/v1/extracts/ext_568 \
-H "Authorization: Bearer spf_live_sk_your_key_here"
The ext_ prefix is optional — both ext_568 and 568 are accepted.
Response
Returns a single extract object wrapped in data.
Errors
| Status | Code | Description |
|---|---|---|
| 404 | resource_not_found | No extract found with the given ID. |
Get latest extract
/v1/extracts/latest Returns the most recent extract.
Required scope: read_exports
Request
curl https://app.simpleproductfeeds.com/v1/extracts/latest \
-H "Authorization: Bearer spf_live_sk_your_key_here"
Response
Returns a single extract object wrapped in data.
Errors
| Status | Code | Description |
|---|---|---|
| 404 | resource_not_found | No extracts have been created yet. |
Download source CSV
/v1/extracts/:id/download Returns a temporary presigned URL to download the source CSV for an extract. This is the raw product data before any feed transformations are applied.
Required scope: read_exports
Request
curl https://app.simpleproductfeeds.com/v1/extracts/ext_568/download \
-H "Authorization: Bearer spf_live_sk_your_key_here"
Response
{
"data": {
"download_url": "https://s3.amazonaws.com/...",
"filename": "source_products_568.csv",
"expires_in": 300
}
}
| Field | Type | Description |
|---|---|---|
download_url | string | Presigned S3 URL. Valid for the duration specified in expires_in. |
filename | string | Suggested filename for the download. |
expires_in | integer | Number of seconds until the download URL expires (300). |
Errors
| Status | Code | Description |
|---|---|---|
| 404 | resource_not_found | No extract found with the given ID. |
| 404 | no_download | This extract does not have a downloadable source CSV. |