{"openapi":"3.1.0","info":{"title":"Hubshop public catalogue API","version":"1.0.0","summary":"Read-only API of hubshop.fr: search performance and maintenance car parts, prices, availability and shop information.","description":"Hubshop (hubshop.fr) is a French online store for performance and maintenance car parts (JDM Distribution, Pessac, France). This read-only JSON API lets AI agents and developers search the catalogue, read prices in EUR including VAT, real-time availability and expected shipping dates, browse categories and brands, and read the shop identity and policies.\n\n**When to use**: a user looks for a car part (by name, manufacturer part number, brand or vehicle model), wants its price, availability or delivery estimate in France or the EU, or asks about the Hubshop seller. Orders, carts, customer accounts and B2B prices are not part of the API: give the product `url` to the user, who orders on hubshop.fr.\n\n**Authentication**: none. **Rate limit**: per client IP address, announced on every response with the `RateLimit-Policy` and `RateLimit` headers (draft-ietf-httpapi-ratelimit-headers) and `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`; a `429` response carries `Retry-After` (seconds).\n\n**Errors**: `application/problem+json` (RFC 9457) with a stable `code`, a `detail` message and a `hint` telling how to fix the request.\n\n**Languages**: `lang` parameter (fr, en, es, it, de); names, descriptions and URLs follow the language. Every page of hubshop.fr is also available as Markdown with `Accept: text/markdown`.","termsOfService":"https://hubshop.fr/content/conditions-generales-de-vente-3","contact":{"name":"Hubshop support","email":"support@hubshop.fr","url":"https://hubshop.fr/developers"}},"externalDocs":{"description":"Hubshop API and AI agents guide","url":"https://hubshop.fr/developers"},"servers":[{"url":"https://hubshop.fr/public-api/v1","description":"Production"}],"security":[],"tags":[{"name":"Products","description":"Product search and product details."},{"name":"Catalogue","description":"Categories, brands and their products."},{"name":"Shop","description":"Seller identity, contact details and policies."},{"name":"Meta","description":"API entry point and health."}],"paths":{"/products":{"get":{"operationId":"searchProducts","tags":["Products"],"summary":"Search the Hubshop catalogue","description":"Full-text search over the Hubshop catalogue of performance and maintenance car parts, using the same engine as the search box of hubshop.fr. Accepts part names, manufacturer part numbers (e.g. \"50.1133.80\"), brands (e.g. \"Eibach\", \"Scorpion\") and vehicle models (e.g. \"Golf 7 GTI\", \"Clio 4 RS\"). Results are ranked by relevance; an exact part-number match comes first. Prices are public prices in EUR including French VAT. Use getProduct for full details, then give the product `url` to the user: orders are placed on hubshop.fr, not through this API.","parameters":[{"$ref":"#/components/parameters/q"},{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/lang"}],"responses":{"200":{"description":"Success.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResult"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/products/{productId}":{"get":{"operationId":"getProduct","tags":["Products"],"summary":"Get one product with price, availability and details","description":"Returns one product: name, manufacturer part number, EAN, brand, price in EUR including VAT (and regular price when discounted), availability with the expected shipping date, plain-text description, technical features, variants (sizes, lengths, colours) with their own price and URL, category path, images and the public product page URL. Availability is computed in real time from the supplier stock, like on the product page.","parameters":[{"$ref":"#/components/parameters/productId"},{"$ref":"#/components/parameters/lang"}],"responses":{"200":{"description":"Success.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/categories":{"get":{"operationId":"listCategories","tags":["Catalogue"],"summary":"List product categories","description":"Lists the active categories under a parent category (default: the top level of the catalogue, e.g. Engine, Exhaust, Suspension, Brakes, Vehicles, Brand corner). Use parent_id to walk down the tree and listCategoryProducts to read the products of a category.","parameters":[{"$ref":"#/components/parameters/parent_id"},{"$ref":"#/components/parameters/lang"}],"responses":{"200":{"description":"Success.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryList"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/categories/{categoryId}/products":{"get":{"operationId":"listCategoryProducts","tags":["Catalogue"],"summary":"List the products of a category","description":"Paginated list of the online products of a category and of its subcategories (what the category page of hubshop.fr shows): products filed directly in the category first, in the shop order, then the newest. Each item has the same shape as a search result.","parameters":[{"$ref":"#/components/parameters/categoryId"},{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/lang"}],"responses":{"200":{"description":"Success.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductList"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/brands":{"get":{"operationId":"listBrands","tags":["Catalogue"],"summary":"List brands","description":"Lists the brands (manufacturers) sold on Hubshop that have at least one product online, with their page URL and product count.","parameters":[{"$ref":"#/components/parameters/lang"}],"responses":{"200":{"description":"Success.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandList"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/brands/{brandId}/products":{"get":{"operationId":"listBrandProducts","tags":["Catalogue"],"summary":"List the products of a brand","description":"Paginated list of the online products of one brand, newest first.","parameters":[{"$ref":"#/components/parameters/brandId"},{"$ref":"#/components/parameters/page"},{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/lang"}],"responses":{"200":{"description":"Success.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductList"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/shop":{"get":{"operationId":"getShopInfo","tags":["Shop"],"summary":"Get shop identity, contact details and policies","description":"Company identity (JDM Distribution, Pessac, France), customer service contact and opening hours, languages and currency of the shop, and links to the terms of sale, delivery, returns, privacy and legal notice pages. Use it to answer questions about the seller or to check that Hubshop is a legitimate business.","parameters":[{"$ref":"#/components/parameters/lang"}],"responses":{"200":{"description":"Success.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Shop"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/health":{"get":{"operationId":"getHealth","tags":["Meta"],"summary":"Check that the API is available","description":"Returns {\"status\": \"ok\"} when the API and its database are available.","parameters":[],"responses":{"200":{"description":"Success.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}},"/":{"get":{"operationId":"getApiIndex","tags":["Meta"],"summary":"List the API resources","description":"Entry point of the API: version, documentation and OpenAPI links, list of operations.","parameters":[],"responses":{"200":{"description":"Success.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"q":{"name":"q","in":"query","required":true,"description":"Search text: part name, manufacturer part number, brand or vehicle model (2 to 100 characters).","schema":{"type":"string","minLength":2,"maxLength":100},"example":"golf 7 gti downpipe"},"limit":{"name":"limit","in":"query","required":false,"description":"Number of items to return (1 to 24).","schema":{"type":"integer","minimum":1,"maximum":24,"default":10}},"page":{"name":"page","in":"query","required":false,"description":"Page number, starting at 1.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":1}},"lang":{"name":"lang","in":"query","required":false,"description":"Language of names, descriptions and URLs.","schema":{"type":"string","enum":["fr","en","es","it","de"],"default":"fr"}},"parent_id":{"name":"parent_id","in":"query","required":false,"description":"Parent category id; omit for the top level of the catalogue.","schema":{"type":"integer","minimum":1}},"productId":{"name":"productId","in":"path","required":true,"description":"Product id (the `id` of a search result, also the number at the end of a hubshop.fr product URL).","schema":{"type":"integer","minimum":1},"example":14400},"categoryId":{"name":"categoryId","in":"path","required":true,"description":"Category id (from listCategories).","schema":{"type":"integer","minimum":1},"example":820},"brandId":{"name":"brandId","in":"path","required":true,"description":"Brand id (from listBrands).","schema":{"type":"integer","minimum":1},"example":27}},"headers":{"RateLimit-Policy":{"description":"Quota policy (draft-ietf-httpapi-ratelimit-headers): q = requests allowed per window, w = window in seconds.","schema":{"type":"string"},"example":"\"default\";q=60;w=60"},"RateLimit":{"description":"Current state (draft-ietf-httpapi-ratelimit-headers): r = remaining requests, t = seconds until the quota resets.","schema":{"type":"string"},"example":"\"default\";r=59;t=42"},"RateLimit-Limit":{"description":"Requests allowed per window (older draft name).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window (older draft name).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets (older draft name).","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110).","schema":{"type":"integer"}}},"responses":{"BadRequest":{"description":"Invalid parameter.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://hubshop.fr/developers#error-invalid_parameter","title":"Invalid parameter","status":400,"code":"invalid_parameter","detail":"limit must be an integer between 1 and 24.","hint":"Fix the parameters listed in errors and retry.","errors":[{"parameter":"limit","message":"must be an integer between 1 and 24"}]}}}},"NotFound":{"description":"Unknown resource.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://hubshop.fr/developers#error-product_not_found","title":"Product not found","status":404,"code":"product_not_found","detail":"No online product has the id 999999.","hint":"Find product ids with searchProducts (GET /products?q=...)."}}}},"TooManyRequests":{"description":"Rate limit exceeded.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://hubshop.fr/developers#error-rate_limited","title":"Too many requests","status":429,"code":"rate_limited","detail":"The limit of 60 requests per 60 seconds for your address is reached.","hint":"Wait for the number of seconds given by Retry-After, then retry."}}}},"ServerError":{"description":"Unexpected server error.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"},"example":{"type":"https://hubshop.fr/developers#error-internal_error","title":"Internal error","status":500,"code":"internal_error","detail":"The request could not be completed.","hint":"Retry later; if the error persists, write to support@hubshop.fr with the request_id."}}}}},"schemas":{"Problem":{"type":"object","description":"Error (RFC 9457 problem details) with a stable machine-readable code.","required":["type","title","status","code","detail"],"properties":{"type":{"type":"string","format":"uri","description":"Documentation of the error."},"title":{"type":"string","description":"Short summary of the error type."},"status":{"type":"integer","description":"HTTP status code."},"code":{"type":"string","enum":["invalid_parameter","route_not_found","product_not_found","category_not_found","brand_not_found","method_not_allowed","rate_limited","service_unavailable","internal_error","unauthorized"],"description":"Stable error code."},"detail":{"type":"string","description":"What went wrong for this request."},"hint":{"type":"string","description":"How to fix the request."},"instance":{"type":"string","description":"Requested path."},"request_id":{"type":"string","description":"Identifier to quote when contacting support."},"errors":{"type":"array","description":"Invalid parameters.","items":{"type":"object","required":["parameter","message"],"properties":{"parameter":{"type":"string"},"message":{"type":"string"}}}}}},"Price":{"type":"object","description":"Public price for one unit, in EUR, French VAT included.","required":["amount","currency","tax_included"],"properties":{"amount":{"type":"number","description":"Price to pay, discounts applied.","examples":[314.28]},"currency":{"type":"string","description":"ISO 4217 currency code.","const":"EUR"},"tax_included":{"type":"boolean","description":"Always true: prices include French VAT (20 %)."},"regular_amount":{"type":["number","null"],"description":"Price before discount, null when not discounted."},"discount_percent":{"type":["integer","null"],"description":"Discount in percent, null when not discounted."}}},"Availability":{"type":"object","required":["status","schema_org"],"properties":{"status":{"type":"string","enum":["in_stock","backorder","out_of_stock"],"description":"in_stock: ships the same day before the cut-off time or the next working day; backorder: can be ordered, ships from ships_from; out_of_stock: cannot be ordered now."},"ships_from":{"type":["string","null"],"format":"date","description":"Expected shipping date for backorders (YYYY-MM-DD)."},"schema_org":{"type":"string","format":"uri","description":"schema.org ItemAvailability value."}}},"BrandRef":{"type":"object","required":["id","name"],"properties":{"id":{"type":"integer"},"name":{"type":"string"}}},"Link":{"type":"object","required":["name","url"],"properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"}}},"ProductSummary":{"type":"object","required":["id","name","url","price","availability"],"properties":{"id":{"type":"integer","description":"Product id (use with getProduct)."},"name":{"type":"string"},"reference":{"type":["string","null"],"description":"Manufacturer part number."},"brand":{"oneOf":[{"$ref":"#/components/schemas/BrandRef"},{"type":"null"}]},"url":{"type":"string","format":"uri","description":"Public product page, where the user can order."},"image":{"type":["string","null"],"format":"uri"},"price":{"$ref":"#/components/schemas/Price"},"availability":{"$ref":"#/components/schemas/Availability"}}},"Product":{"type":"object","required":["id","name","url","price","availability","images","features","variants"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"reference":{"type":["string","null"],"description":"Manufacturer part number."},"ean13":{"type":["string","null"],"description":"EAN-13 barcode when valid."},"brand":{"oneOf":[{"$ref":"#/components/schemas/BrandRef"},{"type":"null"}]},"url":{"type":"string","format":"uri"},"image":{"type":["string","null"],"format":"uri"},"images":{"type":"array","items":{"type":"string","format":"uri"}},"price":{"$ref":"#/components/schemas/Price"},"availability":{"$ref":"#/components/schemas/Availability"},"summary":{"type":"string","description":"Short description, plain text."},"description":{"type":"string","description":"Full description, plain text (at most 5000 characters)."},"category":{"oneOf":[{"$ref":"#/components/schemas/Link"},{"type":"null"}],"description":"Main category."},"breadcrumb":{"type":"array","items":{"$ref":"#/components/schemas/Link"}},"features":{"type":"array","description":"Technical features.","items":{"type":"object","required":["name","value"],"properties":{"name":{"type":"string"},"value":{"type":"string"}}}},"variants":{"type":"array","description":"Variants (combinations), empty for a simple product.","items":{"type":"object","required":["id","name","price","url"],"properties":{"id":{"type":"integer"},"name":{"type":"string","description":"Attributes, e.g. \"Length: 70mm\"."},"reference":{"type":["string","null"]},"price":{"$ref":"#/components/schemas/Price"},"url":{"type":"string","format":"uri"}}}},"rating":{"oneOf":[{"type":"object","required":["value","count"],"properties":{"value":{"type":"number"},"count":{"type":"integer"}}},{"type":"null"}]}}},"PageInfo":{"type":"object","required":["number","size","total_items","total_pages"],"properties":{"number":{"type":"integer"},"size":{"type":"integer"},"total_items":{"type":"integer"},"total_pages":{"type":"integer"}}},"ProductList":{"type":"object","required":["data","page","links"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductSummary"}},"page":{"$ref":"#/components/schemas/PageInfo"},"links":{"type":"object","properties":{"self":{"type":"string","format":"uri"},"next":{"type":["string","null"],"format":"uri"},"prev":{"type":["string","null"],"format":"uri"}}}}},"SearchResult":{"type":"object","required":["query","total","data"],"properties":{"query":{"type":"string"},"total":{"type":"integer","description":"Number of matching products (at most 3000)."},"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductSummary"}},"search_url":{"type":"string","format":"uri","description":"The same search on hubshop.fr."}}},"Category":{"type":"object","required":["id","name","url","has_children","product_count"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"parent_id":{"type":"integer"},"has_children":{"type":"boolean"},"product_count":{"type":"integer","description":"Online products in this category and its subcategories."}}},"CategoryList":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}},"Brand":{"type":"object","required":["id","name","url","product_count"],"properties":{"id":{"type":"integer"},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"product_count":{"type":"integer"}}},"BrandList":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Brand"}}}},"Shop":{"type":"object","required":["name","url","contact","address","policies"],"properties":{"name":{"type":"string"},"legal_name":{"type":"string"},"description":{"type":"string"},"url":{"type":"string","format":"uri"},"founded":{"type":"string"},"contact":{"type":"object","properties":{"email":{"type":"string","format":"email"},"phone":{"type":"string"},"contact_form":{"type":"string","format":"uri"},"opening_hours":{"type":"array","items":{"type":"string"},"description":"schema.org openingHours ranges, Europe/Paris time."}}},"address":{"type":"object","properties":{"street":{"type":"string"},"postal_code":{"type":"string"},"city":{"type":"string"},"country":{"type":"string","description":"ISO 3166-1 alpha-2."}}},"languages":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","format":"uri"}}}},"currency":{"type":"string"},"return_window_days":{"type":["integer","null"],"description":"Days to return a product (terms of sale)."},"policies":{"type":"object","additionalProperties":{"type":"string","format":"uri"},"description":"URLs of the terms of sale, delivery, privacy, legal notice and about pages."},"social":{"type":"array","items":{"type":"string","format":"uri"}}}},"Health":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["ok"]},"time":{"type":"string","format":"date-time"}}},"ApiIndex":{"type":"object","required":["name","version","openapi","documentation","operations"],"properties":{"name":{"type":"string"},"version":{"type":"string"},"openapi":{"type":"string","format":"uri"},"documentation":{"type":"string","format":"uri"},"operations":{"type":"array","items":{"type":"object","properties":{"operationId":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"summary":{"type":"string"}}}}}}}}}