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

POST /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

ParameterTypeDefaultDescription
typestringfullExtract type: full (re-fetch from Shopify) or regenerate (re-apply transformations only).
feed_idstringOptional. 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

StatusCodeDescription
409export_in_progressAn extract is already running. Wait for it to complete before starting another.
422no_feedNo feed has been configured for this shop.
422invalid_paramInvalid extract type. Must be full or regenerate.

List extracts

GET /v1/extracts

Returns a paginated list of extracts, most recent first.

Required scope: read_exports

Parameters

ParameterTypeDefaultDescription
pageinteger1Page number.
per_pageinteger25Results 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

FieldTypeDescription
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

StatusDescription
pendingExtract is queued and waiting to start.
runningExtract is currently fetching products from Shopify.
completedExtract finished successfully. All feeds have been regenerated.
failedExtract encountered an error. See error_details.
cancelledExtract was stopped before completion.

Get an extract

GET /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

StatusCodeDescription
404resource_not_foundNo extract found with the given ID.

Get latest extract

GET /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

StatusCodeDescription
404resource_not_foundNo extracts have been created yet.

Download source CSV

GET /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
  }
}
FieldTypeDescription
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

StatusCodeDescription
404resource_not_foundNo extract found with the given ID.
404no_downloadThis extract does not have a downloadable source CSV.