Product feed endpoints are available only to an installed sales-channel app token whose release declares a product feed. Start from GET /channel-feed/targets: each target is one country, language and currency the store really sells in, with English names, the country's own currency and whether the store charges it, and the feed unit already serving it. Create one unit per target you need, choose its schedule, and generate it; the platform serves the latest generation at the unit's public_url, https://{store domain}/feeds/{unit id}.xml, which channels fetch and revalidate by ETag. Field mappings let merchants choose where each feed field comes from within the release's reviewed sources. Generation jobs report how many items were sent or left out, and diagnostics explain each omission. To keep a channel current between generations, push products as they change: render them with GET /channel-feed/units/{unitId}/items, which returns exactly what the feed holds, when product, stock or publication webhooks arrive. Converted prices also move with exchange rates: after currencies/rates_updated or currencies/update, ask GET /channel-feed/units/{unitId}/price-changes which products changed since the rate and rounding rule you last priced with, then render those.
Endpoints#
Get channel feed contract
Read the installed release's product-feed mappings.
Returns the immutable field schema and defaults, the installation's sparse merchant overrides, and the resulting effective mappings. A field without merchant_mapping is managed by the reviewed app release and cannot be overridden. Product inclusion is controlled only by sales-channel publication.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
Set channel feed mappings
Replace this installation's merchant mapping overrides.
The body is a complete sparse override document. Omit a field to use its reviewed default. Unknown fields, release-managed fields, disallowed sources, invalid registry references, and metafields outside the current store or owner type are rejected. The mutation and one aggregate audit entry commit atomically.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
mapping_overrides
required
|
object |
Complete sparse map of editable feed field names to reviewed source mappings. Send an empty object to restore every default. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
-
400INVALID_INPUTThe override document, selected metafield, or source configuration is invalid.
-
400APP_FEED_SPEC_DEFAULT_MAPPING_FIELD_INVALIDAn override targets an unknown or release-managed field.
-
400APP_FEED_SPEC_DEFAULT_MAPPING_SOURCE_INVALIDThe selected source or source configuration is not allowed for that field.
-
400CHANNEL_FEED_TARGET_INVALIDThe selected country, language, and currency are not an active storefront target.
-
400CHANNEL_FEED_UNIT_INVALIDThe feed format, schedule, catalog context, or unit id is invalid.
-
404CHANNEL_FEED_UNIT_MISSINGThe feed data source does not exist for this installation.
-
409CHANNEL_FEED_UNIT_EXISTSThe exact feed data source already exists.
-
409CHANNEL_FEED_GENERATION_ACTIVEA generation is already queued or running for the feed data source.
List channel feed targets
List exact country, language, currency, domain, and URL tuples this installation may use.
Targets use the storefront's canonical market precedence, resolved country currency, country-specific language coverage, and domain assignment. A country-pinned domain wins for that country; otherwise the primary domain is canonical. Unpinned aliases do not create duplicate targets. Apps must use these tuples exactly and must not construct localized storefront paths. country_name, language_name and currency_name are English display names; show them instead of naming codes yourself. local_currency_code is the country's own currency from Unicode CLDR, and currency_is_local is false when the store's market charges that country in another currency; ad channels such as Google commonly reject those prices, so warn the merchant and link them to Markets. Countries without a legal tender, such as Antarctica, are never targets. home_country marks the store's own country and primary_market the store's main market. Targets are ordered for people: the home country first, then targets in their local currency, then the rest, each by country and language name. unit_id names the feed unit already serving a target; creating a second one is rejected.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
List channel feed units
List this installation's configured feed units.
Each unit has an immutable address tuple. Change a country, language, currency, catalog context, or format by replacing the unit. public_url is https://{domain}/feeds/{unit id}.{format} on the store's own domain; it always serves the unit's latest successful generation (revalidate with its ETag) and returns 404 while the unit is disabled or before it first generates.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
Create channel feed unit
Create one feed generation unit from an eligible target.
The country, locale, and currency must exactly match one current target; the platform stores that target's canonical domain. The format must belong to the reviewed release. Duplicate addresses are rejected, including units without a catalog context.
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
country_code
required
|
string |
Exact target country code. |
locale
required
|
string |
Exact target locale. |
currency_code
required
|
string |
Exact target currency. |
format
required
|
string |
Product feeds use XML. |
schedule
required
|
string |
manual, hourly, or daily. |
catalog_context_id
|
uuid |
Optional installed channel catalog context. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
-
400INVALID_INPUTThe override document, selected metafield, or source configuration is invalid.
-
400APP_FEED_SPEC_DEFAULT_MAPPING_FIELD_INVALIDAn override targets an unknown or release-managed field.
-
400APP_FEED_SPEC_DEFAULT_MAPPING_SOURCE_INVALIDThe selected source or source configuration is not allowed for that field.
-
400CHANNEL_FEED_TARGET_INVALIDThe selected country, language, and currency are not an active storefront target.
-
400CHANNEL_FEED_UNIT_INVALIDThe feed format, schedule, catalog context, or unit id is invalid.
-
404CHANNEL_FEED_UNIT_MISSINGThe feed data source does not exist for this installation.
-
409CHANNEL_FEED_UNIT_EXISTSThe exact feed data source already exists.
-
409CHANNEL_FEED_GENERATION_ACTIVEA generation is already queued or running for the feed data source.
Update channel feed unit
Enable, disable, or reschedule a feed unit.
Address fields are immutable and are not accepted by this endpoint. Disabling a unit removes its public feed file; after it is enabled again, the next generation publishes it.
Path parameters
| Name | Type | Description |
|---|---|---|
unitId
required
|
uuid |
Feed unit id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Body parameters
| Name | Type | Description |
|---|---|---|
is_enabled
required
|
boolean |
Whether generation is enabled. |
schedule
required
|
string |
manual, hourly, or daily. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
-
400INVALID_INPUTThe override document, selected metafield, or source configuration is invalid.
-
400APP_FEED_SPEC_DEFAULT_MAPPING_FIELD_INVALIDAn override targets an unknown or release-managed field.
-
400APP_FEED_SPEC_DEFAULT_MAPPING_SOURCE_INVALIDThe selected source or source configuration is not allowed for that field.
-
400CHANNEL_FEED_TARGET_INVALIDThe selected country, language, and currency are not an active storefront target.
-
400CHANNEL_FEED_UNIT_INVALIDThe feed format, schedule, catalog context, or unit id is invalid.
-
404CHANNEL_FEED_UNIT_MISSINGThe feed data source does not exist for this installation.
-
409CHANNEL_FEED_UNIT_EXISTSThe exact feed data source already exists.
-
409CHANNEL_FEED_GENERATION_ACTIVEA generation is already queued or running for the feed data source.
Delete channel feed unit
Delete a feed unit and its generation history.
Deletion is installation-scoped, removes the public feed file, and cascades jobs, diagnostics, and artifact records.
Path parameters
| Name | Type | Description |
|---|---|---|
unitId
required
|
uuid |
Feed unit id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
-
400INVALID_INPUTThe override document, selected metafield, or source configuration is invalid.
-
400APP_FEED_SPEC_DEFAULT_MAPPING_FIELD_INVALIDAn override targets an unknown or release-managed field.
-
400APP_FEED_SPEC_DEFAULT_MAPPING_SOURCE_INVALIDThe selected source or source configuration is not allowed for that field.
-
400CHANNEL_FEED_TARGET_INVALIDThe selected country, language, and currency are not an active storefront target.
-
400CHANNEL_FEED_UNIT_INVALIDThe feed format, schedule, catalog context, or unit id is invalid.
-
404CHANNEL_FEED_UNIT_MISSINGThe feed data source does not exist for this installation.
-
409CHANNEL_FEED_UNIT_EXISTSThe exact feed data source already exists.
-
409CHANNEL_FEED_GENERATION_ACTIVEA generation is already queued or running for the feed data source.
Generate channel feed
Queue one durable generation for an enabled unit.
Only one queued or generating job may exist per unit. Generation uses the exact reviewed mapping, publication version, locale, currency, identity, availability, and canonical URL contracts.
Path parameters
| Name | Type | Description |
|---|---|---|
unitId
required
|
uuid |
Feed unit id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
-
400INVALID_INPUTThe override document, selected metafield, or source configuration is invalid.
-
400APP_FEED_SPEC_DEFAULT_MAPPING_FIELD_INVALIDAn override targets an unknown or release-managed field.
-
400APP_FEED_SPEC_DEFAULT_MAPPING_SOURCE_INVALIDThe selected source or source configuration is not allowed for that field.
-
400CHANNEL_FEED_TARGET_INVALIDThe selected country, language, and currency are not an active storefront target.
-
400CHANNEL_FEED_UNIT_INVALIDThe feed format, schedule, catalog context, or unit id is invalid.
-
404CHANNEL_FEED_UNIT_MISSINGThe feed data source does not exist for this installation.
-
409CHANNEL_FEED_UNIT_EXISTSThe exact feed data source already exists.
-
409CHANNEL_FEED_GENERATION_ACTIVEA generation is already queued or running for the feed data source.
List channel feed items
Render chosen products for one feed unit, exactly as the unit's feed holds them.
Renders up to 50 products with the same code that generates the unit's feed: the effective mappings, publication version, locale, identity, availability, canonical URL and prices. Prices are what the cart charges for one unit in the unit's currency: the price set in that currency, or the base price converted at the store's current rate and rounded by the currency's rule, with active sales and quantity pricing applied. Use it to send products to a channel one by one as they change instead of fetching the whole feed. items holds one entry per offer, keyed by your release's feed field names. omitted lists offers left out with the same stable codes as generation diagnostics. unpublished_product_ids lists requested products that are not currently published to your channel; remove them from the channel. conversion_rate and rounding_mode are what the prices used; keep them and pass them to the price-changes read later. Nothing is generated or recorded.
Path parameters
| Name | Type | Description |
|---|---|---|
unitId
required
|
uuid |
Feed unit id. |
Query parameters
| Name | Type | Description |
|---|---|---|
product_ids
required
|
string |
Comma-separated product ids, 1 to 50. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
-
400INVALID_INPUTThe product ids, rate, rounding rule, cursor or limit are invalid.
-
400CHANNEL_FEED_UNIT_INVALIDThe unit id is invalid.
-
404CHANNEL_FEED_UNIT_MISSINGThe feed unit does not exist for this installation or is disabled.
-
400CHANNEL_FEED_TARGET_INVALIDThe unit's country, language and currency are no longer a storefront target.
-
503CURRENCY_EXCHANGE_RATE_UNAVAILABLEAutomatic rates are on and no current market rate exists, so prices in this currency cannot be computed.
List channel feed price changes
List products whose price in a unit changed since a given rate and rounding rule.
Compares, for every product published to your channel, the converted one-unit price at since_rate and since_rounding_mode with the price at the store's current rate and rounding rule, and returns the products where the regular or current price differs. Prices set explicitly in the unit's currency never change with rates and are never listed; a unit in the base currency lists nothing. Pass the conversion_rate and rounding_mode an earlier items or price-changes read returned, then render the listed products with the items read. Call it after currencies/rates_updated or currencies/update. Pages are ordered by product id; pass next_after as after until it is null. The response's conversion_rate and rounding_mode are the current values to keep.
Path parameters
| Name | Type | Description |
|---|---|---|
unitId
required
|
uuid |
Feed unit id. |
Query parameters
| Name | Type | Description |
|---|---|---|
since_rate
required
|
string |
The rate the channel's prices were last computed at, as a positive decimal. |
since_rounding_mode
required
|
string |
The rounding rule they used: none, up, down, nearest_1, nearest_50, nearest_95 or nearest_99. |
after
|
integer |
Exclusive product id cursor. |
limit
|
integer |
1 to 500; default 200. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
-
400INVALID_INPUTThe product ids, rate, rounding rule, cursor or limit are invalid.
-
400CHANNEL_FEED_UNIT_INVALIDThe unit id is invalid.
-
404CHANNEL_FEED_UNIT_MISSINGThe feed unit does not exist for this installation or is disabled.
-
400CHANNEL_FEED_TARGET_INVALIDThe unit's country, language and currency are no longer a storefront target.
-
503CURRENCY_EXCHANGE_RATE_UNAVAILABLEAutomatic rates are on and no current market rate exists, so prices in this currency cannot be computed.
List channel feed jobs
List generation history newest first.
Platform generation state is distinct from provider-side ingestion state.
Query parameters
| Name | Type | Description |
|---|---|---|
limit
|
integer |
1 to 200; default 20. |
before
|
datetime |
Exclusive RFC3339 created-at cursor. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
List channel feed diagnostics
List product-level generation diagnostics for one job.
Diagnostics are stable-code, actionable omissions. Missing required values are never filled from another locale, currency, identity, or field.
Path parameters
| Name | Type | Description |
|---|---|---|
jobId
required
|
uuid |
Generation job id. |
Query parameters
| Name | Type | Description |
|---|---|---|
limit
|
integer |
1 to 200; default 50. |
after
|
integer |
Exclusive diagnostic id cursor. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.
Get channel feed artifact
Get immutable artifact metadata.
A failed generation never replaces a unit's current artifact. ETag and SHA-256 identify exact content. Fetch the current feed through the unit's stable public_url; artifact ids are generation internals and are not public feed addresses.
Path parameters
| Name | Type | Description |
|---|---|---|
artifactId
required
|
uuid |
Artifact id. |
Headers
| Name | Type | Description |
|---|---|---|
Authorization
required
|
string |
Bearer Store API token. |
Errors
-
401UNAUTHORIZEDMissing or invalid token.
-
401CHANNEL_FEED_APP_TOKEN_REQUIREDThe caller is not an installed app token.
-
404CHANNEL_FEED_INSTALLATION_MISSINGThe app has no ready product-feed sales-channel installation in this store.