{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-developer-portal/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown","redocly_category":"Development","owner":"MB"},"seo":{"title":"Consuming a Norce Commerce Product Feed","description":"How to build a Norce Commerce Product Feed receiver service — triggering exports, polling for readiness, and consuming feed data.","keywords":"technical, products, guide, storm-feed, front-end, common-practice"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"consuming-a-norce-commerce-product-feed"},"children":["Consuming a Norce Commerce Product Feed"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A Product Feed Receiver is a service that triggers product exports from Norce Commerce, waits for them to be ready, downloads the data, and delivers it to your target system (such as a search engine or marketplace)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before building a receiver, make sure you have:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A configured feed channel with a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Channel key"]}," — see ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/app-development/configuring-product-feed-channels"},"children":["Configuring Product Feed Channels"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["An understanding of which feed types to use and when — see ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/app-development/product-feed-types-and-scheduling"},"children":["Product Feed Types and Scheduling"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"receiver-responsibilities"},"children":["Receiver responsibilities"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The receiver is responsible for:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Triggering feed creation via the Norce Product Feed API"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Polling for feed readiness (or listening for the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ExportDeliveredEvent"]},")"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Downloading the feed data from Azure storage"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Applying mappings and business logic, then delivering to the target system"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Handling errors and monitoring feed status"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"the-export-process"},"children":["The export process"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/fetching-data-from-an-https-endpoint-new.0c65aae6095ceb05b64ec023d64ba15d61e9b6e50e86b150c37e48381cb5c69f.afe294b5.png","alt":"Feed receiver process"},"children":[]}]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The receiver triggers a feed export via the API.",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The response includes a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["JobKey"]}," and a status code:",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Success"]}," — the feed is being created."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["AlreadyInProgress"]}," — a feed of the same type is already running; this request is ignored."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["NoData"]}," — no products or changes were found; no feed is created."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Failed"]}," — an internal error occurred. Check logs in the admin for details."]}]}]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The feed is created in Azure storage. The receiver polls ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/api-reference/feed/productfeed/openapi/jobs/paths/~1api~1v1~1jobs~1job/get"},"children":["ChannelService/api/v1/jobs/job"]}," until the status changes to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CompletedInExportFeed"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The receiver downloads the feed data from the HTTP(s) endpoint in Azure. See the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://learn.microsoft.com/en-us/rest/api/storageservices/file-service-rest-api"},"children":["Azure File Service REST API"]}," for details."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The receiver applies mappings and business logic, then creates or updates the target system."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["(Optional) Store the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["JobKey"]}," in your own logs — feed data is accessible for 90 days."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"ExportDeliveredEvent"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Instead of polling in step 2, the receiver can listen to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ExportDeliveredEvent"]}," from Norce Commerce Event."," ","See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/system-integration/using-norceevent"},"children":["Using Norce Event"]}," for details."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"triggering-a-full-export"},"children":["Triggering a full export"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Call ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/api-reference/feed/productfeed/openapi/exports/paths/~1api~1v1~1exports~1product/post"},"children":["ChannelService/api/v1/exports/product"]}]}," or ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/api-reference/feed/productfeed/openapi/exports/paths/~1api~1v1~1exports~1productstatus/post"},"children":["ChannelService/api/v1/exports/productstatus"]}]}," without ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["deltaFromDate"]}," (or with it set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["null"]},"):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"channelId\": \"[the channel key]\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The result is a snapshot of the full catalog at the time of export. When importing a full feed into the target system, deactivate all existing products first and repopulate from the new feed."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"triggering-a-delta-export"},"children":["Triggering a delta export"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["deltaFromDate"]}," to request only products changed since that timestamp (UTC):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"channelId\": \"[the channel key]\",\n  \"deltaFromDate\": \"2020-10-01T14:43:19.210Z\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Only the changed products are returned. Update these in the target system without touching the rest of the catalog."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Whenever possible, use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ProductStatus"]}," delta feeds — the smaller payload means faster processing."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"accessing-feed-data"},"children":["Accessing feed data"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Feed files are available for 90 days after creation:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Lab/test:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://stoexporttest.blob.core.windows.net/exports/[JobKey]"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Production:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://stoexport.blob.core.windows.net/exports/[JobKey]"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is useful for reviewing past exports and debugging historical data issues."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"product-contracts"},"children":["Product contracts"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/api-reference/schemas/channelfeed"},"children":["Product schema"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/api-reference/schemas/channelfeed#productstatus"},"children":["ProductStatus schema"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["An example feed is provided at:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://stoexporttest.blob.core.windows.net/exports/bfc68a64-1956-46ba-8320-6bf052a8a756"},"children":["Product feed example"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"developing-and-testing"},"children":["Developing and testing"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["During development, use the example feed URL above for quick access to sample data."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When working with real client data, set up a channel, trigger a feed, and find the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["JobKey"]}," in the admin log to access the output directly."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"further-reading"},"children":["Further Reading"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/app-development/configuring-product-feed-channels"},"children":["Configuring Product Feed Channels"]}," — channel settings, included data, and delta change tracking setup"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/app-development/product-feed-types-and-scheduling"},"children":["Product Feed Types and Scheduling"]}," — feed types and recommended trigger frequencies"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/developer-portal/app-development/working-with-products-and-search-using-norce-product-feed"},"children":["Working with Products and Search using Norce Commerce Product Feed"]}," — architectural patterns for external search integration"]}]}]},"headings":[{"value":"Consuming a Norce Commerce Product Feed","id":"consuming-a-norce-commerce-product-feed","depth":1},{"value":"Receiver responsibilities","id":"receiver-responsibilities","depth":2},{"value":"The export process","id":"the-export-process","depth":2},{"value":"Triggering a full export","id":"triggering-a-full-export","depth":2},{"value":"Triggering a delta export","id":"triggering-a-delta-export","depth":2},{"value":"Accessing feed data","id":"accessing-feed-data","depth":2},{"value":"Product contracts","id":"product-contracts","depth":2},{"value":"Developing and testing","id":"developing-and-testing","depth":2},{"value":"Further Reading","id":"further-reading","depth":2}],"frontmatter":{"seo":{"title":"Consuming a Norce Commerce Product Feed","description":"How to build a Norce Commerce Product Feed receiver service — triggering exports, polling for readiness, and consuming feed data.","keywords":"technical, products, guide, storm-feed, front-end, common-practice"},"metadata":{"redocly_category":"Development","owner":"MB"},"redirects":{"/developer-portal/app-development/building-a-storm-channel-feed-receiver/":{},"/developer-portal/app-development/building-a-norce-product-feed-receiver/":{}}},"lastModified":"2026-07-10T06:04:35.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/developer-portal/app-development/consuming-a-product-feed","userData":{"isAuthenticated":false,"teams":["anonymous"]}}