> For the complete documentation index, see [llms.txt](https://developer.esw.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.esw.com/shopify/shopify-native/integration-workflow/product-catalog-integration.md).

# Product Catalog Integration

### 1. Shopify Webhooks

The app subscribes to Shopify product creation and update events.

<table data-view="cards"><thead><tr><th align="center"></th><th align="center"></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-cover-dark data-type="image">Cover image (dark)</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><h2><i class="fa-webhook" style="color:$primary;">:webhook:</i></h2><h4>Shopify Webhook</h4></td><td align="center"><code>products/create</code></td><td><a href="/files/d7XJa1US1IBoAfj6XJMT">/files/d7XJa1US1IBoAfj6XJMT</a></td><td><a href="/files/ZL04KZjR6xCeHBD20H1Y">/files/ZL04KZjR6xCeHBD20H1Y</a></td><td><a href="https://shopify.dev/docs/api/admin-rest/latest/resources/webhook#event-topics-products-create">https://shopify.dev/docs/api/admin-rest/latest/resources/webhook#event-topics-products-create</a></td></tr><tr><td align="center"><h2><i class="fa-webhook" style="color:$primary;">:webhook:</i> </h2><h4>Shopify Webhook</h4></td><td align="center"><code>products/update</code></td><td><a href="/files/rLLdWJqjrcS1EayWHFXi">/files/rLLdWJqjrcS1EayWHFXi</a></td><td><a href="/files/IKsGMbeQQmDgTeBCiTeD">/files/IKsGMbeQQmDgTeBCiTeD</a></td><td><a href="https://shopify.dev/docs/api/admin-rest/latest/resources/webhook#event-topics-products-update">https://shopify.dev/docs/api/admin-rest/latest/resources/webhook#event-topics-products-update</a></td></tr></tbody></table>

### 2. API Integration

After receiving the product data, the app calls the ESW Catalog API endpoint

{% hint style="info" %}

#### **ESW API**

Product data from Shopify is posted to ESW using the ESW Catalog API.
{% endhint %}

## POST /api/v2/RetailerCatalog

> Allows a retailer to upload a catalog that will be subject to validation processing.

```json
{"openapi":"3.0.4","info":{"title":"Customs.Catalog.Api","version":"2.0.1432.0"},"servers":[{"url":"https://logistics-customscatalog-api.sandbox.eshopworld.com/"}],"security":[{"Bearer":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","description":"Please insert JWT with Bearer into field","name":"Authorization","in":"header"}},"schemas":{"Customs.Catalog.Domain.Pkg.Models.DTO.RetailerCatalogProduct":{"required":["countryOfOrigin","description","material","name","productCode"],"type":"object","properties":{"productCode":{"minLength":1,"type":"string","description":"(Required) The brand's unique master identifier or SKU (Stock Keeping Unit)."},"name":{"minLength":1,"type":"string","description":"(Required) The name of the product."},"description":{"minLength":1,"type":"string","description":"(Required) The short description of the product."},"material":{"minLength":1,"type":"string","description":"(Required) A description of the material that the product is made of."},"countryOfOrigin":{"$ref":"#/components/schemas/Customs.Catalog.Common.Pkg.Product.CountryIso"},"hsCode":{"type":"string","description":"The brand’s HSCode of the product.This should be a minimum of 6 digits.","nullable":true},"hsCodeRegion":{"$ref":"#/components/schemas/Customs.Catalog.Common.Pkg.Product.Region"},"parentProductCode":{"type":"string","description":"SKU for a group of products that come in different versions (variants).","nullable":true},"category":{"$ref":"#/components/schemas/Customs.Catalog.Common.Pkg.Product.Category"},"categoryDesc":{"type":"string","description":"eShopWorld category description for the product.","nullable":true,"readOnly":true},"gender":{"$ref":"#/components/schemas/Customs.Catalog.Common.Pkg.Product.Gender"},"ageGroup":{"$ref":"#/components/schemas/Customs.Catalog.Common.Pkg.Product.AgeGroup"},"size":{"type":"string","description":"(Optional) The size of the product.","nullable":true},"weight":{"type":"number","description":"(Optional*) The weight of the product in the associated WeightUnit.\n*This field is mandatory if you specify a weight unit.","format":"double","nullable":true},"weightUnit":{"$ref":"#/components/schemas/Customs.Catalog.Common.Pkg.Product.WeightUnit"},"url":{"type":"string","description":"(Optional*) The product’s landing page.\n*This field is mandatory when Shipping to Russia and Japan.","nullable":true},"imageUrl":{"type":"string","description":"(Optional) The URL of the product’s main image thumbnail.","nullable":true},"unitPrice":{"$ref":"#/components/schemas/Customs.Catalog.Domain.Pkg.Models.DTO.RetailerPrice"},"dangerousGoods":{"type":"boolean","description":"(Optional) Indicates if the product is classified a DangerousGood or Hazardous Material (HazMat).","nullable":true},"isCustomized":{"type":"boolean","description":"(Optional) Indicates if the product has been customized in any way from its Original Design.","nullable":true},"additionalProductCode":{"type":"string","description":"(Optional) An additional product code, or unique identifier,\nsuch as the manufacturer’s product code or SKU (Stock Keeping Unit),\nthat may be on or attached to the product.","nullable":true},"variantProductCode":{"type":"string","description":"(Optional) Another version of the brand's unique master identifier or SKU (Stock Keeping Unit).","nullable":true},"restrictions":{"type":"array","items":{"$ref":"#/components/schemas/Customs.Catalog.Domain.Pkg.Models.DTO.RestrictionDto"},"description":"(Optional) Identifies when a product should be Restricted from Sale in Certain Countries.","nullable":true},"isRestricted":{"type":"boolean","description":"(Optional) Identifies restriction on a product regardless of what country it's being sold to or any other product attributes.","nullable":true},"mid":{"type":"string","description":"(Optional) Identifies the Manufacturer ID.","nullable":true},"midAddressZip":{"type":"string","description":"(Optional) Identifies the Manufacturer's ZipCode","nullable":true},"additionalInformation":{"type":"string","description":"(Optional) Any other additional information about the product.","nullable":true},"categoryInformation":{"type":"string","description":"(Optional) Any other additional information about the product category.","nullable":true},"isSubscription":{"type":"boolean","description":"(Optional) Identifies if the product is a Subscription based product.","nullable":true},"eccn":{"type":"string","description":"ECCN","nullable":true},"ean":{"pattern":"^\\d{8}$|^\\d{13}$","type":"string","description":"(Optional) EAN","nullable":true},"upc":{"pattern":"^\\d{8}$|^\\d{12}$","type":"string","description":"(Optional) UPC","nullable":true}},"additionalProperties":false,"description":"Retailer Product Object"},"Customs.Catalog.Common.Pkg.Product.CountryIso":{"enum":["AD","AE","AF","AG","AI","AL","AM","AN","AO","AQ","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CS","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","XK","YE","YT","ZA","ZM","ZW","TP"],"type":"string"},"Customs.Catalog.Common.Pkg.Product.Region":{"enum":["AD","AE","AL","AM","AU","AZ","BA","BY","BH","CA","CH","CL","CN","CO","EG","EU","GE","GI","HK","ID","IS","IL","IN","JP","KR","KW","KZ","LI","MA","MD","ME","MK","MX","MY","NO","NZ","PH","PR","QA","RS","RU","SA","SG","SM","TH","TL","TR","TW","UA","US","VN","XROW","ZA","XK","BR","MM","MO","PY","SK","AR","PE","DO","JO","KG","OM","BO","AF","AG","AI","AN","AO","AS","AW","BB","BD","BM","BZ","CR","CS","DZ","EC","ET","IO","IQ","FJ","JM","KE","KH","LA","LK","LR","LS","LY","MF","ML","MN","MQ","MR","MS","MV","MW","MZ","NA","NF","NG","NI","NP","NR","NU","PA","PK","PS","RW","SN","SO","SR","SS","SV","SX","TG","TT","TZ","UG","UY","UZ","VE","VU","WF","WS","YE","ZM","ZW","GB","TP","GW","JE","GT","KY","BN","TC","GP","GF","DM","GD","RE","LC","HN","KN","BF","BJ","BS","BW","CF","CG","CK","CM","CW","DJ","GA","GG","GH","GL","HT","LB","MU","NC","PG","SC","VC","VG","YT","CV","KM","SZ","VI","GY","BG","BI","CI","CU","EE","GM","HR","HU","LT","LV","MG","MT","NE","PL","SB","SI","SL","TD","TJ","TN","TO","CD","GN","VA","FK","MC","ST","AQ","AX","BL","BQ","BT","BV","CC","CX","EH","ER","FM","FO","GQ","GS","GU","HM","IM","IR","KI","KP","MH","MP","PF","PM","PN","PW","SH","SJ","SY","TF","TK","TM","TV","UM","IC"],"type":"string"},"Customs.Catalog.Common.Pkg.Product.Category":{"enum":["AnimalsPetSupplies","ApparelAccessories","ArtsEntertainment","BabyToddler","BusinessIndustrial","CamerasOptics","Electronics","FoodBeveragesTobacco","Furniture","Hardware","HealthBeauty","HomeGarden","LuggageBags","Mature","Media","OfficeSupplies","ReligiousCeremonial","Software","SportingGoods","ToysGames","VehiclesParts","PerfumeryCosmeticToiletPreparations","SoapPolishCandlesEtc","AlbuminoidalSubstances","ExplosivesEtc","PhotographicCinematographicGoods","MiscellaneousChemicalProducts","Plastics","Rubber","RawHidesAndSkins","ArticlesOfLeather","FurskinsAndArtificialFur","Wood","Cork","ManufacturesOfStrawBasketwareAndWickerwork","PulpOfWoodScrapPaperPaperboard","PaperAndPaperboard","PrintedBooksNewspapers","Silk","WoolAndAnimalHair","Cotton","OtherVegetableTextileFibres","ManMadeFilaments","ManMadeStapleFibres","WaddingSpecialYarnsTwine","CarpetsAndFloorCoverings","SpecialWovenFabrics","IndustrialTextileFabricsAndTextileArticles","KnittedCrochetedFabrics","ApparelClothingKnitted","ApparelClothingNotKnitted","OtherMadeupWornTextileArticles","Footwear","Headgear","UmbrellasAndWalkingSticks","FeathersAndDownArticlesAndArtificialFlowers","ArticlesOfStone","CeramicProducts","GlassAndGlassware","PreciousStonesMetalsAndJewelry","IronAndSteel","ArticlesOfIronSteel","CopperAndArticlesThereof","NickelAndArticlesThereof","AluminumAndArticlesThereof","LeadAndArticlesThereof","ZincAndArticlesThereof","TinAndArticlesThereof","OtherBaseMetalsAndArticlesThereof","ToolsImplementsCutlery","MiscellaneousArticlesOfBaseMetal","NuclearReactorsBoilersMachinery","ElectricalMachinerySoundAndTv","RailwayTramwayLocomotivesRollingStock","VehiclesOtherThanRailwayTramwayRollingStock","AircraftSpacecraft","ShipsBoatsAndFloatingStructures","OpticalPhotographicCinematographicMeasuringMedicalInstruments","ClocksAndWatches","MusicalInstruments","ArmsAndAmmunition","FurnitureAndFurnishings","ToysGamesAndSports","MiscellaneousManufacturedArticles","WorksOfArtAndAntiques","CompleteIndustrialPlant","SpecialCombinedNomenclatureCodes","Digital","ReturnsLabels","DigitalGiftCard"],"type":"string"},"Customs.Catalog.Common.Pkg.Product.Gender":{"enum":["Male","Female","Unisex"],"type":"string"},"Customs.Catalog.Common.Pkg.Product.AgeGroup":{"enum":["Newborn","Infant","Toddler","Kids","Adult","OlderKids","Teen"],"type":"string"},"Customs.Catalog.Common.Pkg.Product.WeightUnit":{"enum":["Lb","Kg"],"type":"string"},"Customs.Catalog.Domain.Pkg.Models.DTO.RetailerPrice":{"type":"object","properties":{"amount":{"type":"number","description":"Amount","format":"double","nullable":true},"currency":{"$ref":"#/components/schemas/Customs.Catalog.Common.Pkg.Product.CurrencyIso"}},"additionalProperties":false,"description":"(Optional *) Price of the product.\n*This field is mandatory if you specify a unitPriceCurrencyIso."},"Customs.Catalog.Common.Pkg.Product.CurrencyIso":{"enum":["ARS","AUD","AZN","BHD","BDT","BBD","BYR","BYN","BZD","BMD","BOB","BRL","BGN","KHR","CAD","CLP","CNY","COP","CRC","HRK","CZK","DKK","DOP","EGP","EUR","GIP","GTQ","HNL","HKD","HUF","INR","IDR","ILS","JMD","JPY","JOD","KZT","KWD","LVL","LTL","MYR","MVR","MXN","MDL","TWD","NZD","NIO","NOK","OMR","PKR","PAB","PYG","PEN","PHP","PLN","GBP","QAR","ROL","RON","RUB","SAR","SGD","ZAR","KRW","LKR","SEK","CHF","THB","TRY","UAH","AED","USD","VEF","VND","RSD","DZD","MOP","NGN","KES","MKD","BAM","ISK","AMD","ALL","GEL"],"type":"string"},"Customs.Catalog.Domain.Pkg.Models.DTO.RestrictionDto":{"type":"object","properties":{"type":{"type":"string","description":"Type of restriction.","nullable":true},"criteria":{"type":"string","description":"Criteria.","nullable":true},"countries":{"type":"array","items":{"type":"string"},"description":"List of countries or \"ALL\" marker restriction to be applied. For example: [\"ALL\"], [\"AU\", \"CH\"]","nullable":true}},"additionalProperties":false,"description":"(Optional) Identifies when a product should be Restricted from Sale in Certain Countries."},"Customs.Catalog.Domain.Pkg.Models.DTO.Error":{"type":"object","properties":{"message":{"type":"string","description":"Error message","nullable":true},"code":{"type":"integer","description":"Error code","format":"int32"}},"additionalProperties":false,"description":"Error information."}}},"paths":{"/api/v2/RetailerCatalog":{"post":{"tags":["RetailerCatalog"],"summary":"Allows a retailer to upload a catalog that will be subject to validation processing.","operationId":"api/v2/RetailerCatalog_POST","requestBody":{"description":"","content":{"application/json-patch+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Customs.Catalog.Domain.Pkg.Models.DTO.RetailerCatalogProduct"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Customs.Catalog.Domain.Pkg.Models.DTO.RetailerCatalogProduct"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Customs.Catalog.Domain.Pkg.Models.DTO.RetailerCatalogProduct"}}},"application/*+json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Customs.Catalog.Domain.Pkg.Models.DTO.RetailerCatalogProduct"}}}}},"responses":{"202":{"description":"Accepted"},"400":{"description":"Bad Request","content":{"text/plain":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Customs.Catalog.Domain.Pkg.Models.DTO.Error"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Customs.Catalog.Domain.Pkg.Models.DTO.Error"}}},"text/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Customs.Catalog.Domain.Pkg.Models.DTO.Error"}}}}}}}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://developer.esw.com/shopify/shopify-native/integration-workflow/product-catalog-integration.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
