Skip to content

Instantly share code, notes, and snippets.

@mems
Last active January 28, 2025 13:33
Show Gist options
  • Save mems/38e023b650ace0c25f9b368769d2b49a to your computer and use it in GitHub Desktop.
Save mems/38e023b650ace0c25f9b368769d2b49a to your computer and use it in GitHub Desktop.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://www.fnac.com/json-schema/digital-data/custom-ceddl-01",
"allOf": [
{
"$comment": "http://www.w3c.org/json-schema/custexpdata/digital-data/ceddl-01",
"$ref": "https://www.fnac.com/json-schema/digital-data/ceddl-01"
},
{
"type": "object",
"required": ["pageInstanceID", "page", "user"],
"properties": {
"pageInstanceID": {
"type": "string",
"description": "This must include the following components: environment, siteID, marketID, language and pageID. Could be either a hash or a plain string.",
"examples": ["production-fnaccom-fr-fr-FR-h1", "mFjY29tLWZyL"]
},
"page": {
"$ref": "#/definitions/page"
},
"product": {
"type": "array",
"description": "If applicable (product page), describe the product(s)",
"items": {
"$ref": "#/definitions/product"
}
},
"user": {
"type": "array",
"items": {
"$ref": "#/definitions/user"
}
},
"cart": {
"description": "If applicable (cart page), describe the cart content",
"$ref": "#/definitions/cart"
},
"transaction": {
"description": "If applicable (order complete page), describe the complete order(s) transaction. If it's a complete multipart order, the field order is also required",
"$ref": "#/definitions/transaction"
},
"order": {
"title": "Orders",
"description": "If applicable (order complete page), describe the complete orders (multipart order)",
"$comment": "Note: CEEDL recommendation doesn't provide a way to support multipart transaction with differents combinations of shipping addresses, separate cancellation scheme, etc.",
"type": "array",
"items": {
"$ref": "#/definitions/order"
}
},
"subscriptionPlans": {
"title": "Available subscription plans",
"type": "array",
"items": {
"$ref": "#/definitions/subscription-plan"
},
"examples": [
[
{
"subscriptionName": "Carte Fnac+",
"subscriptionType": "fnacplus",
"subscriptionOffer": "paid",
"subscriptionPrice": {
"basePrice": 12.49,
"currency": "EUR",
"priceWithTax": 14.99,
"taxRate": 0.2
},
"descriptionURL": "https://www.fnac.com/a14876194"
},
{
"subscriptionName": "Carte Fnac",
"subscriptionType": "fnac",
"subscriptionOffer": "paid",
"subscriptionPrice": {
"basePrice": 10,
"currency": "EUR",
"priceWithTax": 12,
"taxRate": 0.2
},
"descriptionURL": "https://www.fnac.com/a2022505"
}
]
]
}
}
}
],
"definitions": {
"page-info": {
"type": "object",
"required": ["breadCrumbs", "pageName", "version", "pageID", "sysEnv"],
"properties": {
"breadCrumbs": {
"title": "Bread crumbs",
"description": "Page hierarchy, including the page itself (FnacDirect.Nav.Services.Implementations.BreadCrumbService, post.Space and Ancestors name, SearchQuery.Result.FullArborescenceList or T(\"Search.BreadCrumb.AllProduct\"), etc.). Home should be included",
"$comment": "Breacdcumb is not history https://www.smashingmagazine.com/2009/03/breadcrumbs-in-web-design-examples-and-best-practices/",
"type": "array",
"items": {
"type": "string"
},
"defaultValue": [],
"examples": [
[
"Accueil",
"Smartphones et Objets Connectés",
"Accessoire Téléphone",
"Accessoire par Type",
"Coques",
"Coques iPhone",
"Coques iPhone X"
],
[
"Accueil",
"Livre",
"Livre Jeunesse",
"Meilleures ventes livres Jeunesse"
],
["Accueil", "Tous les produits"]
]
},
"pageName": {
"type": "string",
"title": "Page Name",
"description": "Page title, based on the main entity (product name, post title, node name, maker name, editor name, search term, etc.). It could be different from the entity name: decorated, based on the path, etc. It should reflect the page H1 tag. See also digitalData.page.attributes.entityName",
"examples": [
"Home Accueil",
"Livre",
"Harry Potter",
"Prix littéraires 2008 - 2009",
"Harry Potter, I : Harry Potter à l'école des sorciers",
"La minute Fip à la Fnac : Herbie Hancock"
]
},
"version": {
"type": "string",
"title": "Version of the application (or the part of it) that generate this page",
"description": "Recommendation: use the build version from FnacVersion.json. Or use something like the commit hash / git tag / changeset ID of the application source",
"examples": ["20.1.20134.12"]
},
"pageID": {
"type": "string",
"title": "Page identifier",
"description": "entityID or the path ID (pid) with it prefix or the shortest slug/canonical url (but not localized) of the resource. See the UrlManager.config and FnacDirect.Front.WebBusiness.UrlDecoration.*.",
"$comment": "Search ignore some chars and dont make difference between charcase, the canonical version should be something like: ' harry $ potter ' and 'HaRrY PoTtEr' -> 'harry potter' -> 'r/harry%20potter'",
"pattern": "^[a-z][0-9a-z]*([-/]([0-9a-z]|%[a-z]{2})*)*$",
"examples": [
"home",
"a10516511",
"a10516511/avis",
"a10516511/offers",
"pr4fea4f1fc327a093eaef25ab70b467c5e225ec7378e6259e",
"srefBF4D2EBF-2625-B582-5F82-B24679D099CF",
"mp27532583",
"sh258373",
"shi48966",
"shi417599",
"nsh417593",
"n307028",
"n374288",
"s573",
"si149",
"ia835839",
"f170",
"sa102445",
"ta96048",
"ia302511",
"i/ia302511/dvd",
"cp47890",
"ix338561/la",
"r/harry%20potter",
"f1235",
"l440006",
"lm246323",
"o7394518",
"e58124",
"c36874",
"m8766",
"p12",
"se5",
"cp23975",
"ct1234",
"cl176",
"cc598",
"cart",
"index/p/image-et-son-6/10"
]
},
"author": {
"title": "Main content author name",
"description": "If available, the name of the main content author (page, post, recommendation, review, etc.)",
"type": "string"
},
"sysEnv": {
"title": "Server identifier",
"description": "Server machine name",
"type": "string",
"examples": ["FCS1WPWEBFR8"]
}
}
},
"category": {
"title": "Category",
"properties": {
"primaryCategoryID": {
"type": "string",
"title": "Main category identifier",
"description": "If applicable, the main category identifier",
"pattern": "[0-9]+",
"examples": ["9468374"]
},
"virtualPrimaryCategoryId": {
"type": "string",
"title": "Main virtual category identifier",
"description": "If applicable, the main virtual category identifier",
"pattern": "-?[0-9]+",
"examples": ["-1", "-2", "9468374"]
},
"primaryCategory": {
"type": "string",
"title": "Main category",
"description": "If applicable, the main category",
"examples": [
"Livres, BD",
"Informatique",
"Rayons",
"Téléphonie",
"Enfant, Jouet",
"Ebooks",
"Musique",
"Maison"
]
},
"subCategory1": {
"type": "string",
"title": "Secondary category",
"description": "If applicable, the secondary category",
"examples": [
"Livre enfant",
"Littérature",
"Roman policier",
"Ordinateur portable"
]
},
"subCategory1ID": {
"type": "string",
"title": "Secondary category identifier",
"description": "If applicable, the secondary category identifier",
"pattern": "[0-9]+",
"examples": ["9468374"]
},
"virtualSubCategory1Id": {
"type": "string",
"title": "Secondary virtual category identifier",
"description": "If applicable, the secondary virtual category identifier",
"pattern": "-?[0-9]+",
"examples": ["9468374"]
},
"subCategory2": {
"type": "string",
"title": "Tertiary category",
"description": "If applicable, the tertiary category",
"examples": [
"Livre enfant",
"Littérature",
"Roman policier",
"Ordinateur portable"
]
},
"subCategory2ID": {
"type": "string",
"title": "Secondary category identifier",
"description": "If applicable, the tertiary category identifier",
"pattern": "[0-9]+",
"examples": ["9468374"]
},
"virtualSubCategory2Id": {
"type": "string",
"title": "Secondary virtual category identifier",
"description": "If applicable, the tertiary virtual category identifier",
"pattern": "-?[0-9]+",
"examples": ["9468374"]
},
"subCategory3": {
"type": "string",
"title": "Quaternary category",
"description": "If applicable, the quaternary category",
"examples": [
"Livre enfant",
"Littérature",
"Roman policier",
"Ordinateur portable"
]
},
"subCategory3ID": {
"type": "string",
"title": "Secondary category identifier",
"description": "If applicable, the quaternary category identifier",
"pattern": "[0-9]+",
"examples": ["9468374"]
},
"virtualSubCategory3Id": {
"type": "string",
"title": "Secondary virtual category identifier",
"description": "If applicable, the quaternary virtual category identifier",
"pattern": "-?[0-9]+",
"examples": ["9468374"]
}
}
},
"page": {
"type": "object",
"required": ["pageInfo", "attributes", "category"],
"properties": {
"pageInfo": {
"$ref": "#/definitions/page-info"
},
"attributes": {
"type": "object",
"required": [
"deviceType",
"siteID",
"marketID",
"environment",
"statusCode",
"statusText"
],
"properties": {
"deviceType": {
"title": "Client device",
"description": "Device the visitor use, for which the page is rendered",
"type": "string",
"enum": [
"desktop-web",
"mobile-web",
"mobile-app",
"mobile-app-webview"
]
},
"siteID": {
"title": "Site identifier",
"description": "SiteContext FnacSites",
"type": "string",
"enum": ["fnaccom", "fnacpro"]
},
"marketID": {
"title": "Market identifier",
"description": "SiteContext FnacMarket ID (which is not the country code)",
"type": "string",
"enum": ["fr", "be", "ch", "es", "pt"]
},
"environment": {
"title": "Environment",
"description": "SiteContext Environment",
"type": "string",
"enum": ["production", "integration", "dev"]
},
"trafficSource": {
"title": "Traffic source",
"description": "Traffic aquisition source like utm_source or ORIGIN URL params or cookies",
"type": "string",
"defaultValue": "direct",
"examples": ["google", "facebook.com", "unknown"]
},
"trafficCampaign": {
"title": "Traffic campaign",
"description": "Traffic aquisition campaign like utm_campaign URL param",
"type": "string",
"examples": ["spring_sale"]
},
"trafficMedium": {
"title": "Traffic medium",
"description": "Traffic aquisition medium like utm_medium URL param",
"type": "string",
"examples": [
"organic",
"cpc",
"ppc",
"paidsearch",
"social",
"paidsocial",
"email",
"affiliate",
"referral",
"cpv",
"cpa",
"cpp",
"display",
"cpm",
"banner"
]
},
"entityID": {
"title": "Page main entity identifier",
"type": "string",
"description": "If applicable, the page main entity identifier: product ID (catalog + PRID), node ID (NID), post ID, collection ID, editor ID, series ID, contributor ID, or anything like \"id\" from HttpContext.Current.Request.RequestContext.RouteData. The entity could be a facet of an object, where this object is primary category. Example: a book chapter (one webpage per chapter) is the main entity, the book is the category. It is the case for tabs navigation, one page per tab, each represent a different facet of the same object.",
"examples": ["1-1234", "3-1234", "47890", "ipad12"]
},
"entityAltID": {
"title": "Page main entity alternative identifier",
"type": "string",
"description": "If applicable, the page main entity alternative identifier. Something more useful for tracking",
"examples": ["1761ILYTR1"]
},
"entityName": {
"title": "Page main entity name",
"type": "string",
"description": "If applicable, the main entity name: product name, node name, post title, collection name, category label, etc.",
"examples": ["47890"]
},
"subentityID": {
"type": "array",
"items": {
"type": "string",
"description": "The subentity identifier. See `page.attributes.entityID`"
},
"title": "Page subentity identifier",
"description": "If applicable, the subentity identifiers of an entity made of parts, a larger entity. Example: for a product list page, the list is the entity, products are subentities.",
"$comment": "If subentity details are needed, a dedicated root property is needed like `cart.item[]`, `order.item[]`, `product[].linkedProduct[]`, etc.",
"examples": [
["1-1234", "3-3456"],
["1234", "3456"]
]
},
"statusCode": {
"type": "integer",
"title": "Server response HTTP status code",
"minimum": 100,
"exclusiveMaximum": 600,
"defaultValue": 200,
"examples": [404, 500]
},
"statusText": {
"type": "string",
"title": "Server response HTTP status text",
"defaultValue": "OK",
"examples": ["Not Found", "Internal Server Error"]
},
"authorID": {
"type": "string",
"title": "Main content author identifier",
"description": "If available, the identifier of the main content author (page, post, recommendation, review, etc.)",
"examples": ["1"]
},
"pageIndex": {
"type": "integer",
"title": "The page index",
"description": "If applicable, the index of a page of paginated items. Aka current page.",
"minimum": 1,
"examples": [1]
},
"totalPages": {
"type": "integer",
"title": "The number of pages",
"description": "If applicable, the number of a page of paginated items",
"minimum": 1,
"examples": [980]
},
"pageSize": {
"type": "integer",
"title": "The number of items per pages",
"description": "If applicable, the number of items per page of paginated items",
"minimum": 1,
"examples": [20]
},
"totalCount": {
"type": "integer",
"title": "The total of items",
"description": "If applicable, the total of paginated items",
"minimum": 1,
"examples": [1286]
},
"sortingMethod": {
"type": "string",
"title": "Sorting method",
"description": "If applicable, the sorting method of paginated items",
"examples": ["0", "5", "500", "relevance"]
},
"userAgent": {
"type": "string",
"title": "User agent used to display the page",
"description": "The UA of user's own device, a proxy, a delegate, etc.",
"$comment": "See also https://groups.google.com/a/chromium.org/g/blink-dev/c/-2JIRNMWJ7s/m/yHe4tQNLCgAJ?pli=1",
"examples": [
"Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0",
"Entreprise/6.5.0.177 CFNetwork/758.4.3 Darwin/15.5.0"
]
},
"clientIP": {
"title": "Client IP address",
"description": "The IP address of the client or behind a privacy proxy, a VPN, a router that request the page.",
"oneOf": [
{
"type": "string",
"format": "ipv4"
},
{
"type": "string",
"format": "ipv6"
}
]
},
"refiner": {
"title": "Refiners",
"description": "Aka filters, configurable refiners used for refinement of subentities. Categories are also refiners, but have dedicated properties: `page.category.primaryCategory`, `page.category.subCategory1`, etc. See also `page.attributes.subentityID`.",
"$comment": "If refiners aren't configurable, that means they are an integrative part of the main entity itself. The value of `page.attributes.entityID` should reflect it instead of using `page.attributes.refiner`",
"type": "array",
"items": {
"title": "Refiner",
"type": "object",
"required": ["refinerID", "refinerValue"],
"properties": {
"refinerID": {
"type": "string",
"title": "Refiner identifier"
},
"refinerName": {
"type": "string",
"title": "Refiner name",
"examples": ["Prix", "Etat", "Vendeur"]
},
"refinerValue": {
"title": "Refiner values",
"type": "array",
"items": {
"type": "string",
"title": "Refiner value",
"description": "Refiner value can be an exact attribute value (ex: color), date or date range, price or price range, pattern, etc.",
"$comment": "Some values are range (price, date, color, etc.) and need a special treatment to retrieve both indexes. For date range example, ISO 8601 provide a way to define a time interval with solidus or double hyphen. See https://en.wikipedia.org/wiki/ISO_8601#Time_intervals. See also `dateTime.ToBinary()`",
"examples": [
"900_337100",
"900.0_337100.0",
"2007-03-01T13:00:00Z/2008-05-11T15:30:00Z"
]
}
},
"refinerValueLabel": {
"title": "Refine value associated labels",
"description": "Some values can have an additional label",
"type": "array",
"items": {
"type": ["string", "null"],
"title": "Refiner value associated label"
}
}
}
},
"examples": [
[
{
"refinerID": "23",
"refinerName": "Marque",
"refinerValue": ["33959", "368496"],
"refinerValueLabel": ["On Earz Mobile Gear", "Temium"]
},
{
"refinerID": "9",
"refinerName": "Prix",
"refinerValue": ["900_337100"],
"refinerValueLabel": ["De 9 à 3 371 €"]
}
]
]
},
"variant": {
"type": "string",
"title": "Page variant",
"description": "Containing the page data to identify which variant is used",
"minimum": 1,
"examples": ["{hash}_{versionNumber}"]
}
}
},
"category": {
"allOf": [
{
"$ref": "#/definitions/category"
},
{
"type": "object",
"required": ["pageTemplate", "pageType"],
"properties": {
"pageTemplate": {
"title": "Page template",
"description": "View identifier (aka codePage). It's the virual path of the page template. For MVC: `webPageBase.VirtualPath`. For WebForms: `page.AppRelativeVirtualPath`",
"type": "string",
"pattern": "^~(/[A-Z-a-z0-9_.-])+$",
"examples": [
"~/Nav/Core/Views/Article/Index.cshtml",
"~/Guides/Tv/GuideHomecinema/lexique-home-cinema.aspx",
"~/UnknownPageTemplate.cshtml"
]
},
"pageType": {
"title": "Page type",
"description": "Identify the page purpose without implementation detail. More human readable, but less reliable than `pageTemplate`. Recommendation: Use the same mechanism than SEOPatternsPages config to define it, based on `pageTemplate`",
"type": "string",
"pattern": "^[a-z][0-9a-z]*(-[a-z][0-9a-z]*)*$",
"enum": [
"unknown-page-type",
"error",
"homepage",
"category",
"product-listing",
"product-page",
"customer-reviews",
"offer-listing",
"customer-profile",
"product-configurator",
"index",
"blogpost",
"blog-contributor-listing",
"blog-contributor-profile",
"blog-posts",
"search",
"storelocator",
"store-infos",
"store-category",
"seller-profile",
"participant-listing",
"participant-profile",
"serie-profile",
"report-abuse",
"guide",
"maintenance",
"cart",
"checkout-shipping",
"checkout-payment",
"checkout-csc-verification",
"checkout-onepage",
"order-complete",
"order-error",
"account",
"signin",
"signup"
]
},
"pathID": {
"type": "string",
"title": "The page path identifier",
"description": "Some entities can have multiple path/routes. This identify which one is used. Aka PID and `w3TreeNode.TreePath.Id`",
"minimum": 0,
"examples": ["30145"]
}
}
}
]
}
}
},
"profile-info": {
"type": "object",
"required": ["profileID", "userName"],
"properties": {
"profileID": {
"type": "string",
"title": "User identifier",
"description": "UID start with 1 if the user is identified else 0",
"examples": ["155C88289-6411-407B-BBF1-9C2257525019"]
},
"profileHash": {
"type": "string",
"title": "User identifier hashed",
"description": "encrypted with AES",
"examples": [
"KvMRqvh3aMem0AQhSTnC3WAZg60WwRvEFwt5sm26x2+LGBUUcpLCSH1pazaV3dnl"
]
},
"userName": {
"type": "string",
"examples": ["Sylvain Joly", "Pierre Dupond"]
},
"email": {
"title": "Email",
"description": "User email",
"$comment": "For CRM matching it could be useful to use a hash instead of the email value using algorithm like bcrypt, SHA-2 (512 or 256 bits) or MD5 (not recommended).\nFor that case, use the Web Crypto API client side to compute the hashed value https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest\n\nSee also `w3Customer.MD5EMail`.\n\nEmail hash shouldn't be considered as pseudonymised data: https://freedom-to-tinker.com/2018/04/09/four-cents-to-deanonymize-companies-reverse-hashed-email-addresses/\n\nFacebook, Twitter, Google Ads customer matching use SHA256:\n- https://developers.facebook.com/docs/marketing-api/audiences/guides/custom-audiences#hash\n- https://business.twitter.com/en/help/campaign-setup/campaign-targeting/custom-audiences/lists.html#how-do-i-prehash-my-file\n- https://support.google.com/google-ads/answer/7474263?hl=en\n\nCriteo use MD5 then SHA256:\n- https://support.criteo.com/s/article?article=Advanced-tag-settings&language=en_US\n- https://support.criteo.com/s/article?article=360001186049-Offline-sales-onboarding-flat-file-feed-integration&language=en_US\n\nLiveRamp use SHA-256, MD5, or SHA-1:\n- https://docs.liveramp.com/connect/en/formatting-identifiers.html\n\nGravatar use MD5:\n- https://en.gravatar.com/site/implement/hash/",
"type": "string",
"format": "idn-email"
},
"emailHash": {
"title": "Email Hashed",
"description": "User email Hashed with SHA-256",
"type": "string"
}
}
},
"profile": {
"type": "object",
"required": ["profileInfo", "attributes"],
"properties": {
"profileInfo": {
"allOf": [
{
"$ref": "#/definitions/profile-info"
},
{
"type": "object",
"required": ["type"],
"properties": {
"type": {
"title": "User identification",
"type": "string",
"enum": ["identified", "unidentified"]
}
}
}
]
},
"attributes": {
"type": "object",
"required": ["authState"],
"properties": {
"authState": {
"title": "User authentication",
"description": "Is an authenticated user?",
"type": "string",
"enum": ["authenticated", "unauthenticated"]
},
"gender": {
"title": "Gender",
"description": "User gender (or biological sex if aligned)",
"type": "string",
"enum": ["male", "female", "other", "unknown", "not-applicable"]
}
}
}
}
},
"user": {
"type": "object",
"required": ["profile", "segment"],
"properties": {
"profile": {
"type": "array",
"items": {
"$ref": "#/definitions/profile"
}
},
"segment": {
"$comment": "A Fnac+ member (adhérent) need to pay a subscription fee annually or for 3 years (triennalement). See also: https://english.stackexchange.com/questions/10071/what-is-the-difference-between-subscription-and-membership",
"type": "object",
"required": [
"subscriptionType",
"subscriptionStatus",
"subscriptionOffer"
],
"properties": {
"subscriptionType": {
"title": "User subscription type",
"description": "Current subscription. See `FnacDirect.Membership.Model.Constants.SubscriptionType`",
"$ref": "#/definitions/subscription-type"
},
"subscriptionStatus": {
"title": "User subscription status",
"description": "Status of the current subscription. Based on `w3subscription.SubscriptionStatus`. See `FnacDirect.Front.WebBusiness.SubscriptionStatusType`",
"type": "string",
"enum": ["not-applicable", "active", "expired"]
},
"subscriptionOffer": {
"title": "User subscription offer",
"description": "Offer of the current subscription. Based on `w3subscription.SubscriptionStatus`. See `FnacDirect.Front.WebBusiness.SubscriptionStatusType`",
"type": "string",
"$ref": "#/definitions/subscription-offer"
},
"subscriptionStartDate": {
"title": "User subscription start date",
"description": "See `subscription.StartDate`",
"type": "string",
"format": "date"
},
"subscriptionEndDate": {
"title": "User subscription end date",
"description": "See `subscription.EndDate`",
"type": "string",
"format": "date"
},
"segmentCodes": {
"title": "User segment codes",
"description": "All active segments. See `customer.Segments`.",
"type": "array",
"items": {
"$ref": "#/definitions/user-segment-code"
}
}
}
},
"featureCodes": {
"type": "array",
"items": {
"$ref": "#/definitions/user-feature-code"
}
}
}
},
"product-info": {
"title": "Product Info",
"type": "object",
"required": ["productID", "productName"],
"properties": {
"productID": {
"title": "Product identifier",
"description": "Product PRID (don't use product ID)",
"type": "string"
},
"productName": {
"type": "string"
},
"description": {
"type": "string"
},
"productURL": {
"type": "string",
"format": "uri"
},
"productImage": {
"type": "string",
"format": "uri"
},
"productThumbnail": {
"type": "string",
"format": "uri"
},
"manufacturer": {
"type": "string"
},
"sku": {
"type": "string",
"description": "Product SKU"
},
"color": {
"type": "string"
},
"gtin": {
"type": "string",
"description": "Product GTIN, same as: EAN/IAN, ISBN with prefix 978 or 979, some UPC, ISMN, ISSN"
},
"mpn": {
"type": "string",
"description": "Product MPN, Manufacturer Part Numbers"
},
"size": {
"type": "string"
}
},
"examples": [
{
"productID": "11027877",
"productName": "Harry Potter - Tome 1 : Harry Potter, I : Harry Potter à l'école des sorciers",
"description": "De toutes nouvelles couvertures pour la saga de J.K. Rowling en Folio Junior.",
"productURL": "https://www.fnac.com/a11027877/Harry-Potter-Tome-1-Harry-Potter-I-Harry-Potter-a-l-ecole-des-sorciers-J-K-Rowling",
"sku": "749930",
"gtin": "9782070584628"
}
]
},
"product": {
"title": "Product",
"type": "object",
"required": ["productInfo", "price"],
"properties": {
"productInfo": {
"title": "Product Info",
"description": "This object describes the product.",
"$ref": "#/definitions/product-info"
},
"category": {
"title": "Product categories",
"$ref": "#/definitions/category",
"examples": [
{
"primaryCategory": "Livre",
"primaryCategoryID": "-1",
"subCategory1": "Livre Jeunesse",
"subCategory2": "Meilleures ventes livres Jeunesse"
}
]
},
"linkedProduct": {
"title": "Product linked products",
"description": "List of products linked to this product.",
"type": "array",
"items": {
"$ref": "#/definitions/product"
}
},
"price": {
"title": "Product price",
"$ref": "#/definitions/price"
},
"attributes": {
"title": "Product attributes",
"description": "This object provides extensibility to the product object. Any additional dimensions related to the product can be provided.",
"type": "object",
"properties": {
"catalog": {
"$ref": "#/definitions/catalog"
},
"type": {
"type": "string",
"enum": ["good", "service"]
},
"nature": {
"type": "string",
"$comment": "https://en.wikipedia.org/wiki/Intangible_good",
"enum": ["physical", "digital"]
},
"format": {
"type": "string",
"enum": ["cd", "dvd", "blu-ray", "audiobook", "e-book"]
},
"offer": {
"title": "Offers",
"type": "array",
"items": {
"$ref": "#/definitions/offer"
}
},
"offerID": {
"$ref": "#/definitions/offer-identifier"
},
"sellerType": {
"$ref": "#/definitions/seller-type"
},
"seller": {
"$ref": "#/definitions/seller-name"
},
"sellerID": {
"$ref": "#/definitions/seller-identifier"
},
"condition": {
"$ref": "#/definitions/item-condition"
},
"availabilityID": {
"$ref": "#/definitions/availability-identifier"
},
"availabilityType": {
"$ref": "#/definitions/availability-type"
},
"availability": {
"$ref": "#/definitions/availability"
},
"salesCategory": {
"$ref": "#/definitions/sales-category"
},
"userRating": {
"$ref": "#/definitions/user-rating"
},
"labRating": {
"$ref": "#/definitions/lab-rating"
},
"fulfillment": {
"$ref": "#/definitions/fulfillment"
}
}
}
}
},
"offer": {
"title": "Offer",
"description": "See https://schema.org/Offer",
"type": "object",
"required": ["seller", "sellerID"],
"properties": {
"offerID": {
"$ref": "#/definitions/offer-identifier"
},
"sellerType": {
"$ref": "#/definitions/seller-type"
},
"seller": {
"$ref": "#/definitions/seller-name"
},
"sellerID": {
"$ref": "#/definitions/seller-identifier"
},
"condition": {
"$ref": "#/definitions/item-condition"
},
"availabilityID": {
"$ref": "#/definitions/availability-identifier"
},
"availabilityType": {
"$ref": "#/definitions/availability-type"
},
"availability": {
"$ref": "#/definitions/availability"
},
"price": {
"title": "Offer price",
"$ref": "#/definitions/price"
},
"offerURL": {
"title": "Offer URL",
"type": "string",
"format": "uri"
}
}
},
"price": {
"title": "Price",
"type": "object",
"required": ["basePrice", "currency", "priceWithTax"],
"properties": {
"basePrice": {
"description": "Should be the price before applicable discounts, shipping charges, and tax.",
"type": "number",
"minimum": 0
},
"currency": {
"description": "Use ISO 4217 format.",
"type": "string",
"enum": ["EUR", "CHF", "XAU", "XTS", "XXX"]
},
"taxRate": {
"type": "number",
"description": "Tax rate. Ex: 0.2 for 20%",
"minimum": 0
},
"discount": {
"type": "number",
"description": "Discount rate. Ex: 0.5 for 50% discount",
"minimum": 0
},
"shipping": {
"type": "number",
"minimum": 0
},
"shippingMethod": {
"title": "Shipping method name",
"description": "It's the human localized text version of `payment-method-identifier`. See `ShippingMethod.Label`",
"type": "string"
},
"shippingMethodID": {
"title": "Shipping method identifier",
"description": "Shipping method identifier of a shipping combination: location (from like: retail store or warehouse, multi-origin), zone (to: local, domestic, international), product type/weight (letter, parcel, container), carrier (for mail, freight, parcel service), delivery speed, use drop shipping, etc. See `ShippingMethod.MethodId`",
"type": "string"
},
"priceWithTax": {
"description": "Price with all tax included",
"type": "number",
"minimum": 0
},
"voucherCode": {
"description": "See `AdvantageCode`",
"type": "string",
"examples": ["7GH42K6"]
},
"voucherDiscount": {
"type": "number"
}
}
},
"cart": {
"type": "object",
"required": ["cartID", "price", "item"],
"properties": {
"cartID": {
"title": "Cart identifier",
"description": "An identifier for a particular shopping cart.",
"type": "string",
"example": ["253cfbb5-542c-4eae-9d55-e6464311aa50"]
},
"price": {
"allOf": [
{
"$ref": "#/definitions/price"
},
{
"type": "object",
"required": ["cartTotal"],
"properties": {
"cartTotal": {
"title": "Cart total",
"description": "The total price inclusive of all discounts, charges, and tax",
"type": "number",
"minimum": 0,
"examples": [125.23]
}
}
}
]
},
"item": {
"type": "array",
"items": {
"allOf": [
{
"$ref": "#/definitions/product"
},
{
"$ref": "#/definitions/quantifiable-item"
},
{
"type": "object",
"required": ["quantity"]
}
]
}
}
}
},
"address": {
"title": "Address",
"$comment": "Extends CEDDL address",
"type": "object",
"required": ["line1", "city", "postalCode", "country"],
"properties": {
"name": {
"title": "Recipient or addressee name",
"description": "The recipient who receives the letter or email. The addressee, for a letter or email is addressed to. Natural person or organization.",
"type": "string"
}
},
"examples": [
{
"name": "FNAC DIRECT",
"line1": "9 RUE DES BATEAUX LAVOIRS",
"city": "IVRY SUR SEINE",
"postalCode": "94768 CEDEX",
"country": "France métropolitaine",
"specialInstruction": "Code 1234 A droite en sortant de l'ascenseur"
},
{
"line1": "10 RUE DE LA LIBERTE",
"line2": "Bâtiment A Appartement 123",
"city": "VILLENOUVELLE",
"postalCode": "99123",
"country": "France métropolitaine"
}
]
},
"purchaser-profile": {
"title": "Purchaser profile",
"description": "A profile for information about the purchaser, typically associated with a registered user.",
"type": "object",
"required": ["profileInfo"],
"properties": {
"profileInfo": {
"title": "Purchaser informations",
"description": "An extensible object for providing information about the purchaser.",
"$ref": "#/definitions/profile-info"
},
"address": {
"title": "Billing address",
"description": "An extensible object for providing (billing) address information for the purchaser.",
"$ref": "#/definitions/address"
},
"shippingAddress": {
"title": "Shipping address",
"description": "As for address, but for the shipping address",
"$ref": "#/definitions/address"
}
}
},
"payable-item": {
"title": "Payable item",
"$comment": "Possible add for `paymentMethod` basic-card and additional field paymentNetwork like visa, mastercard, amex, cartebancaire, etc. see https://www.w3.org/Payments/card-network-ids. How to descide which is the main payment method?",
"properties": {
"paymentMethod": {
"$ref": "#/definitions/payment-method"
},
"paymentMethodID": {
"$ref": "#/definitions/payment-method-identifier"
},
"paymentMethodStorage": {
"$ref": "#/definitions/payment-method-details-storage"
},
"splitPaymentMethods": {
"type": "array",
"minLength": 1,
"items": {
"type": "object",
"properties": {
"paymentMethod": {
"$ref": "#/definitions/payment-method"
},
"paymentMethodID": {
"$ref": "#/definitions/payment-method-identifier"
},
"paymentMethodStorage": {
"$ref": "#/definitions/payment-method-details-storage"
}
}
}
}
}
},
"quantifiable-item": {
"title": "Quantifiable item",
"properties": {
"quantity": {
"description": "Quantity of this particular item.",
"type": "integer",
"minimum": 1
}
}
},
"shippable-item": {
"title": "Shippable item",
"properties": {
"shipmentID": {
"description": "An identifier for a particular shipment. It could represent a hash of tracking number or master tracking number in case of multiple packages.",
"type": "string"
}
}
},
"transaction": {
"type": "object",
"required": ["transactionID", "total", "attributes", "item"],
"properties": {
"transactionID": {
"title": "Transaction identifier",
"description": "Same as `MainOrderUserReference`",
"type": "string",
"example": ["CDRIW4Y3AAHMBG"]
},
"profile": {
"$ref": "#/definitions/purchaser-profile"
},
"total": {
"allOf": [
{
"$ref": "#/definitions/price"
},
{
"type": "object",
"required": ["transactionTotal"],
"properties": {
"transactionTotal": {
"title": "Transaction total",
"description": "The `transactionTotal` should be the total price inclusive of all discounts, charges, and tax.",
"type": "number",
"minimum": 0,
"examples": [125]
}
}
}
]
},
"attributes": {
"allOf": [
{
"$ref": "#/definitions/payable-item"
},
{
"type": "object",
"required": ["cartID"],
"properties": {
"transactionDate": {
"title": "Transaction date",
"type": "string",
"format": "date-time",
"examples": ["2014-09-20T00:00:00.000Z"]
},
"cartID": {
"title": "Cart identifier",
"description": "Cart identifier",
"example": ["253cfbb5-542c-4eae-9d55-e6464311aa50"]
}
}
}
]
},
"item": {
"description": "List of items in the transaction.",
"type": "array",
"items": {
"allOf": [
{
"$ref": "#/definitions/product"
},
{
"$ref": "#/definitions/quantifiable-item"
},
{
"required": ["quantity"]
},
{
"attributes": {
"allOf": [
{
"$ref": "#/definitions/shippable-item"
}
]
}
}
]
}
}
}
},
"order": {
"type": "object",
"required": ["orderID", "total", "attributes", "item"],
"properties": {
"orderID": {
"title": "Order identifier",
"description": "Same as `logisticLineGroup.OrderUserReference`",
"type": "string",
"example": ["95PECL5RAZ32K"]
},
"profile": {
"allOf": [
{
"$ref": "#/definitions/purchaser-profile"
},
{
"type": "object",
"required": ["address"],
"properties": {
"address": {
"title": "Billing address",
"type": "object"
}
}
}
]
},
"total": {
"allOf": [
{
"$ref": "#/definitions/price"
},
{
"type": "object",
"required": ["orderTotal"],
"properties": {
"orderTotal": {
"title": "Order total",
"description": "The `orderTotal` should be the total price inclusive of all discounts, charges, and tax.",
"type": "number",
"minimum": 0,
"examples": [125]
}
}
}
]
},
"attributes": {
"allOf": [
{
"$ref": "#/definitions/payable-item"
},
{
"required": ["status", "transactionID"],
"type": "object",
"properties": {
"orderDate": {
"title": "Order date",
"type": "string",
"format": "date-time",
"examples": ["2014-09-20T00:00:00.000Z"]
},
"status": {
"title": "Order status",
"type": "string",
"$comment": "See https://schema.org/OrderStatus, https://docs.woocommerce.com/document/managing-orders/#section-2 https://docs.woocommerce.com/wp-content/uploads/2013/08/woocommerce-zapier-order-status-life-cycle.png and `FnacDirect.Front.AccountMVC.Business.Model.OrderDetailStatus` (simplified)",
"pattern": "^[a-z][0-9a-z]*(-[a-z][0-9a-z]*)*$",
"enum": [
"unapprouved",
"cancelled",
"delivered",
"in-transit",
"payment-due",
"pickup-available",
"problem",
"processing",
"returned"
]
},
"transactionID": {
"title": "Transaction identifier",
"description": "Same as `MainOrderUserReference`",
"type": "string",
"example": ["CDRIW4Y3AAHMBG"]
}
}
}
]
},
"item": {
"description": "List of items in the order.",
"type": "array",
"items": {
"allOf": [
{
"$ref": "#/definitions/product"
},
{
"$ref": "#/definitions/quantifiable-item"
},
{
"required": ["quantity"]
},
{
"attributes": {
"allOf": [
{
"$ref": "#/definitions/shippable-item"
}
]
}
}
]
}
}
}
},
"payment-method": {
"title": "Payment method",
"description": "It's the human localized text version of `payment-method-identifier`",
"type": "string",
"examples": [
"PayPal",
"Tarjeta de crédito",
"Ledenaccount",
"Chèque-cadeaux fnac.be",
"Telefoon"
]
},
"payment-method-identifier": {
"title": "Payment method identifier",
"description": "Provide a payment method payment combination: payment mean (credit card, digital wallet, direct carrier billing, collect on delivery, cash, etc.), gateway (paypal, pay by phone), charge fee, currency, pre-authorization, credit card network, etc.",
"type": "string",
"examples": ["1048576-44", "1-0", "4"]
},
"payment-method-details-storage": {
"title": "Payment method details storage",
"description": "Provide the information about the user authorization given for details like Cardholder Data (CHD, like 16-digit PAN, expiration date, and cardholder name; but not the Sensitive Account Data / SAD) to be stored (unlike Sensitive Authentication Data / SAD). Ex: for recuring payment (tacit agreement). See Payment Card Industry Data Security Standard (PCI-DSS) requirements.",
"type": "string",
"enum": ["stored", "authorized", "unauthorized"]
},
"offer-identifier": {
"type": "string",
"example": [
"00000000-0000-0000-0000-000000000000",
"abdf9052-d3ce-2951-2ef1-eb0ab2e1e817"
]
},
"seller-name": {
"type": "string",
"example": ["Fnac", "BourseAuxLivres"]
},
"seller-identifier": {
"type": "string",
"example": ["0", "150400", "250903"]
},
"item-condition": {
"title": "Item condition",
"type": "string",
"enum": [
"damaged",
"new",
"refurbished",
"used",
"like-new",
"very-good",
"good",
"acceptable"
]
},
"catalog": {
"type": "string",
"description": "The catalog ID of the product. See `FnacDirect.Contracts.Online.Model.ArticleCatalog`",
"$comment": "newref = 1P (fnacdirect), metacat = 3P (markeplace)",
"enum": ["newref", "metacat"]
},
"availability": {
"title": "Availability",
"description": "The availability of the item. It's the human localized text version of `availability-identifier`",
"$comment": "See https://schema.org/ItemAvailability. Mapping to availability IDs is not possible. Use the `AvailabilityService`",
"type": "string",
"enum": [
"discontinued",
"in-stock",
"limited-availability",
"online-only",
"out-of-stock",
"pre-order",
"pre-sale",
"sold-out"
]
},
"availability-type": {
"title": "Availability type",
"description": "The availability of the item. Relevant only for the first party (FnacDirect / newref catalog). For example In stock, Out of stock, Pre-order, etc. More human readable, but less reliable than `availability-identifier`",
"$comment": "See https://schema.org/ItemAvailability. Mapping to `availability-identifier` is not possible. Use the `AvailabilityService`",
"type": "string",
"enum": [
"discontinued",
"in-stock",
"limited-availability",
"online-only",
"out-of-stock",
"pre-order",
"pre-sale",
"sold-out"
]
},
"availability-identifier": {
"title": "Availability identifier",
"description": "Provide a availability combination: delay, in stock, still selled, etc.",
"type": "string",
"examples": ["3", "99"]
},
"seller-type": {
"title": "Seller type",
"type": "string",
"enum": ["fnaccom", "fnacstore", "professionel", "private"]
},
"user-segment-code": {
"title": "User segment code",
"description": "See `tbl_AccountSegment.fld_as_code`. This include fake codes from `FidelityProg`",
"type": "string",
"examples": [
"Member",
"Member3Years",
"Customer",
"FirstOrder",
"FuturMember",
"FuturMember3Years",
"Gamer",
"MemberOne",
"FnacPlus",
"MemberXYears",
"FuturMemberXYears",
"MemberAmex",
"MemberAmexPlus",
"MemberOneAmex",
"UnlimitedSubscription",
"MemberTryCard",
"EssaiPlus",
"EssaiPlusNonConverti",
"ExpressPlus",
"ExpressPlusNonRenouvele",
"NonAbonneExpressPlus",
"TRCBExpressPlus",
"EligibleEssaiExpressPlus",
"PushRenouvellementExpressPlus",
"DartyPlus",
"EssaiDartyPlus",
"FuturFnacPlus",
"Personnel",
"Retraites",
"OPAdherent",
"RecrutOPAdherent",
"RenouvOPAdherent",
"RenouvFnac",
"RenouvFnacPlus",
"RenouvFnacFnacPlus",
"RenouvOnePlus",
"RenouvOneOnePlus",
"SouscrireOnePlus",
"RenouvOne",
"SouscrireFnacPlus",
"FusionCommuneBelge",
"FnacPlusCPlay",
"BetaSDC"
]
},
"user-feature-code": {
"title": "User active feature code",
"description": "list of active feature for user",
"type": "string",
"examples": ["ab_artist_similar_EB", "ab_search_google"]
},
"sales-category": {
"description": "Provide an product animation information : 1, 2, 3, 4, 5, 8 (list reserved for the web), 9 (end of life / product no longer available on the market), all other (List open to all (store and web))",
"type": "string"
},
"user-rating": {
"description": "Average rating of customer reviews, rating between 0 and 5 or null (no reviews)",
"type": "number"
},
"lab-rating": {
"description": "Provide the Fnac Labo note value, note between 0 and 5 or null (no note)",
"type": "number"
},
"fulfillment": {
"description": "Provide the product's shipper",
"type": "string"
},
"subscription-type": {
"description": "See `FnacDirect.Membership.Model.Constants.SubscriptionType`",
"type": "string",
"enum": ["none", "fnac", "fnacplus", "fnacone", "fnaconeplus"]
},
"subscription-offer": {
"type": "string",
"enum": ["none", "free-trial", "paid"]
},
"subscription-plan": {
"title": "Subscription plan",
"properties": {
"subscriptionName": {
"title": "Subscription plan name",
"type": "string"
},
"subscriptionType": {
"title": "Subscription plan type",
"$ref": "#/definitions/subscription-type"
},
"subscriptionOffer": {
"title": "Subscription plan offer",
"$ref": "#/definitions/subscription-offer"
},
"price": {
"title": "Subscription plan price",
"$ref": "#/definitions/price"
},
"descriptionURL": {
"title": "Link to subscription plan page",
"type": "string",
"format": "uri"
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment