Feeds

List feeds, get feed status, and browse transformed feed products with applied rules and mappings.

A feed is an independently configured product data output. Each feed has its own rules, settings, column mappings, and published URL. Every shop starts with a primary feed and can create additional feeds for different languages or markets.

Feed types

TypeDescription
primaryThe default feed created when you install the app. Every shop has exactly one.
languageA translation feed for a specific locale (e.g., French, German). Uses Shopify’s translation data.
marketA feed targeting a specific market with independent product selection and configuration.

List feeds

GET /v1/feeds

Returns all active feeds for your shop.

Required scope: read_feeds

Request

curl https://app.simpleproductfeeds.com/v1/feeds \
  -H "Authorization: Bearer spf_live_sk_your_key_here"

Response

{
  "data": [
    {
      "id": "feed_1",
      "object": "feed",
      "feed_type": "primary",
      "locale": null,
      "display_name": "Primary",
      "feed_url": "https://feeds.simpleproductfeeds.com/abc123/gmcfeed.txt",
      "product_count": 1482,
      "last_run_at": "2026-03-09T14:30:00Z",
      "created_at": "2026-01-10T08:00:00Z"
    },
    {
      "id": "feed_2",
      "object": "feed",
      "feed_type": "language",
      "locale": "fr",
      "display_name": "French",
      "feed_url": "https://feeds.simpleproductfeeds.com/abc123/gmcfeed-fr.txt",
      "product_count": 1482,
      "last_run_at": "2026-03-09T14:30:00Z",
      "created_at": "2026-02-15T10:00:00Z"
    },
    {
      "id": "feed_3",
      "object": "feed",
      "feed_type": "market",
      "locale": null,
      "display_name": "Canada Feed",
      "feed_url": "https://feeds.simpleproductfeeds.com/abc123/gmcfeed-canada-feed.txt",
      "product_count": 850,
      "last_run_at": "2026-03-09T14:30:00Z",
      "created_at": "2026-03-01T12:00:00Z"
    }
  ]
}

Response fields

FieldTypeDescription
id string Unique identifier with feed_ prefix.
object string Always "feed".
feed_type string Feed type: "primary", "language", or "market".
locale string | null ISO locale code for language feeds (e.g., "fr", "de"). Null for primary and market feeds.
display_name string Human-readable name for the feed.
feed_url string | null Public URL of the feed output file. Null if never generated.
product_count integer Number of products in this feed.
last_run_at string | null ISO 8601 timestamp of the last successful run.
created_at string ISO 8601 timestamp when the feed was created.

Get a feed

GET /v1/feeds/:id

Returns a feed’s current status, product count, public feed URL, and last generation details.

Required scope: read_feeds

Request

curl https://app.simpleproductfeeds.com/v1/feeds/feed_1 \
  -H "Authorization: Bearer spf_live_sk_your_key_here"

The feed_ prefix is optional — both feed_1 and 1 are accepted.

Response

The detail view is a superset of the list shape, adding the feed-scoped status and configuration fields.

{
  "data": {
    "id": "feed_1",
    "object": "feed",
    "feed_type": "primary",
    "locale": null,
    "display_name": "Primary",
    "feed_url": "https://feeds.simpleproductfeeds.com/abc123/gmcfeed.txt",
    "product_count": 1482,
    "last_run_at": "2026-03-09T14:30:00Z",
    "created_at": "2026-01-10T08:00:00Z",
    "status": "fresh",
    "target_market": null,
    "product_selection_mode": "all",
    "scope_count": 1482,
    "last_run_id": "run_567"
  }
}

Response fields

FieldTypeDescription
id string Unique identifier with feed_ prefix.
object string Always "feed".
feed_type string Feed type: "primary", "language", or "market".
locale string | null ISO locale code for language feeds. Null otherwise.
display_name string Human-readable name for the feed.
feed_url string | null Public URL of the feed output file. Null if never generated.
product_count integer Number of products in the feed.
last_run_at string | null ISO 8601 timestamp of the last successful run.
created_at string ISO 8601 timestamp when the feed was created.
status string Feed-scoped status: "fresh", "generating", or "never_generated".
target_market string | null Market code for market feeds (e.g. "GB"). Null otherwise.
product_selection_mode string Product selection: "all", "collection", or "manual".
scope_count integer | null Total variant count from the feed's scope snapshot. Null if not yet computed. See Get feed scope counts for the full breakdown.
last_run_id string | null ID of the last successful run (with run_ prefix). Null if never run.

Feed status values

StatusDescription
freshThe feed is up to date. No extract is running.
generatingAn extract is currently in progress.
never_generatedNo extracts have been created yet.

Errors

StatusCodeDescription
404resource_not_foundNo feed found with the given ID.

Create a feed

POST /v1/feeds

Creates a market or language feed. The new feed inherits the primary feed’s column mapping, parsing settings, and per-feed configuration; customize it afterward with rules, mappings, and settings. The primary feed is created at install and cannot be created via the API.

Creating additional feeds requires a paid plan (Growth or Premium). Free and Starter plans return 403 plan_upgrade_required.

Required scope: write_feeds

Parameters

ParameterTypeRequiredDescription
feed_typestringYesmarket or language.
display_namestringYesHuman label for the feed; also produces the feed slug.
target_marketstringNoMarket code for a market feed, e.g. GB (uppercased).
localestringNoLanguage code for a language feed, e.g. fr. Requires translation scopes.
product_selection_modestringNoall (default), collection, or manual.
selected_collection_titlestringConditionalRequired when product_selection_mode is collection; must match a real collection in your store.
selected_collection_idstringNoThe Shopify collection GID, when scoping by collection.

Request

curl -X POST https://app.simpleproductfeeds.com/v1/feeds \
  -H "Authorization: Bearer spf_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"feed_type": "market", "display_name": "UK Feed", "target_market": "GB"}'

Response

Returns the created feed (same shape as Get a feed) with status 201 Created.

Errors

StatusCodeDescription
400label_requireddisplay_name is missing or blank.
400locale_invalidlocale is not a valid language code.
403plan_upgrade_requiredYour plan does not allow additional feeds.
409slug_conflictA feed with the same name (slug) already exists.
422invalid_feed_typefeed_type is not market or language.
422collection_not_foundThe collection title does not match a collection in your store.

Update a feed

PATCH /v1/feeds/:id

Updates a non-primary feed’s editable metadata. locale, product_selection_mode, and feed_type are set at creation and cannot be changed afterward. The primary feed cannot be edited.

Required scope: write_feeds

Parameters

ParameterTypeDescription
display_namestringNew label for the feed.
target_marketstringNew market code (uppercased).
target_countrystringNew target country.

Request

curl -X PATCH https://app.simpleproductfeeds.com/v1/feeds/feed_3 \
  -H "Authorization: Bearer spf_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"display_name": "UK Products", "target_market": "GB"}'

Response

Returns the updated feed (same shape as Get a feed).

Errors

StatusCodeDescription
403primary_feed_immutableThe primary feed cannot be edited.
404resource_not_foundNo feed found with the given ID.
422no_updatable_fieldsNo editable fields were provided.

Get feed scope counts

GET /v1/feeds/:id/scope

Returns the feed’s product-variant partition — how many variants are included vs. excluded by the feed’s rules and product selection. Counts come from a cached snapshot computed in the background.

Required scope: read_feeds

Request

curl https://app.simpleproductfeeds.com/v1/feeds/feed_1/scope \
  -H "Authorization: Bearer spf_live_sk_your_key_here"

Response

{
  "data": {
    "feed_id": "feed_1",
    "status": "fresh",
    "included_count": 1482,
    "excluded_count": 56,
    "total_count": 1538,
    "computed_at": "2026-03-09T14:30:00Z"
  }
}

Scope status values

StatusDescription
freshCounts reflect the current feed and rules.
refreshingThe feed changed since the last computation; cached counts are returned while a refresh runs in the background. Poll until fresh.
computingNo snapshot exists yet; counts are null while the first computation runs. Poll until fresh.

List feed products

GET /v1/feeds/:id/products

Returns transformed feed products with all rules, mappings, and transformations applied. This shows exactly what appears in your published feed, including excluded products and exclusion reasons.

Required scope: read_products

Parameters

ParameterTypeDefaultDescription
pageinteger1Page number (minimum 1).
per_pageinteger25Results per page (maximum 100).
searchstringSearch transformed product data.
sortstringColumn name to sort by.
orderstringascSort direction: asc or desc.

Request

curl "https://app.simpleproductfeeds.com/v1/feeds/feed_1/products?page=1&per_page=5" \
  -H "Authorization: Bearer spf_live_sk_your_key_here"

Response

{
  "data": [
    {
      "object": "feed_product",
      "excluded": false,
      "excluded_reason": null,
      "fields": {
        "id": "shopify_US_8012345678901_44012345678901",
        "title": "Blue T-Shirt - Medium",
        "description": "A comfortable blue cotton t-shirt.",
        "link": "https://my-store.myshopify.com/products/blue-t-shirt?variant=44012345678901",
        "image_link": "https://cdn.shopify.com/s/files/1/example/shirt-blue.jpg",
        "price": "29.99 USD",
        "sale_price": "29.99 USD",
        "availability": "in_stock",
        "brand": "My Brand",
        "google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops"
      }
    },
    {
      "object": "feed_product",
      "excluded": true,
      "excluded_reason": "Out of stock",
      "fields": {
        "id": "shopify_US_8012345678902_44012345678902",
        "title": "Red T-Shirt - Large",
        "availability": "out_of_stock"
      }
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 5,
    "total": 1482,
    "total_pages": 297,
    "has_more": true
  }
}

Response fields

FieldTypeDescription
object string Always "feed_product".
excluded boolean Whether this product is excluded from the feed by a rule.
excluded_reason string | null Reason for exclusion, if excluded.
fields object All feed column values for this product after transformations are applied.

Errors

StatusCodeDescription
404resource_not_foundNo feed found with the given ID.
422no_feedNo feed data has been generated for this feed yet.