### GET Dispute Request Example Source: https://tiendanube.github.io/api-documentation/resources/disputes This example shows how to make a GET request to retrieve a specific dispute's details using its ID. Ensure you replace the placeholder IDs with actual values from your store and order. ```bash GET https://api.tiendanube.com/2025-03/1020559/orders/1612216732/transactions/02aaa5c6-080a-40e9-a61f-90ca2150d6a2/disputes/67654a1d7f0000f100f03533 ``` -------------------------------- ### Example GET Request Proxy Source: https://tiendanube.github.io/api-documentation/guides/storefront-app-proxy Illustrates how an original GET request to a storefront is proxied to your app's server, including the transformation of the URL and the addition of storefront-specific headers. ```http GET /apps/my-app/foo/filter?page=1&order=asc HTTP/1.1 Host: www.example.com ``` ```http GET /proxy/foo/filter?page=1&order=asc HTTP/1.1 Host: my-app.com X-Store-Id: 12345 X-Customer-Id: 9876 X-Language-Code: es_AR X-Country-Code: AR X-Forwarded-For: 172.18.0.1 X-Request-Id: e7787124-5bb2-40ae-b014-afcba92299bf X-Linkedstore-HMAC-SHA256: 7308863cde00bb4365ef5a8f226cccb8871b57a4054aa6d3d49c5b6f78b1e306 ``` -------------------------------- ### GET /locations Response Example Source: https://tiendanube.github.io/api-documentation/resources/location This example shows the structure of a successful response when retrieving a list of locations. It includes details about each location's ID, name, priority, address, and timestamps. ```json [ { "id": "01HTMFDH09VC6E2Q8KGTGP44D3", "name": { "es_AR": "Nombre en espanol", "pt_BR": "Nome em português", "en_US": "Name in english" }, "store_id": "12345", "priority": 0, "address": { "zipcode": "12910802", "street": "St Louis", "number": "01", "floor": "Floor", "locality": "Locality", "city": "São Paulo", "province": { "code": "SP", "name": "São Paulo" }, "region": { "code": "SE", "name": "São Paulo" }, "country": { "code": "BR", "name": "São Paulo" }, "reference": "tiendanube's close", "between_streets": "St Mark Third", "verified_at": "1997-07-16T19:20:30+01:00" }, "is_default": true, "created_at": "1997-07-16T19:20:30+01:00", "updated_at": "1997-07-16T19:20:30+01:00" }, { "id": "01HTMFFHWXRC8TRS40M43XGQFB", "name": { "es_AR": "Nombre en espanol", "pt_BR": "Nome em português", "en_US": "Name in english" }, "store_id": "12345", "priority": 1, "address": { "zipcode": "12910802", "street": "St Louis", "number": "01", "floor": "Floor", "locality": "Locality", "city": "São Paulo", "province": { "code": "SP", "name": "São Paulo" }, "region": { "code": "SE", "name": "São Paulo" }, "country": { "code": "BR", "name": "São Paulo" }, "reference": "tiendanube's close", "between_streets": "St Mark Third", "verified_at": "1997-07-17T19:20:30+01:00" }, "is_default": true, "created_at": "1997-07-17T19:20:30+01:00", "updated_at": "1997-07-17T19:20:30+01:00" } ] ``` -------------------------------- ### Get Category with Internationalization Source: https://tiendanube.github.io/api-documentation Example of fetching a category, demonstrating how localized properties like 'name', 'description', and 'handle' are returned as objects. ```bash curl -H 'Authorization: Bearer ACCESS_TOKEN' \ -H 'User-Agent: MyApp (name@email.com)' \ -D - \ https://api.tiendanube.com/2025-03/123456/categories/1234 ``` ```http HTTP/1.1 200 OK Date: Thu, 05 Sep 2013 18:18:22 GMT Content-Type: application/json; charset=UTF-8 Content-Length: 376 x-main-language: es ``` ```json { "id": 1234, "name": { "es": "Nombre de la Categoría", "pt": "Nome da Categoria" }, "description": { "es": "", "pt": "" }, "handle": { "es": "nombre-de-la-categoria", "pt": "nome-da-categoria" }, "parent": null, "subcategories": [ ], "created_at": "2013-09-05T17:59:19+0000", "updated_at": "2013-09-05T17:59:19+0000" } ``` -------------------------------- ### GET /store Response Example Source: https://tiendanube.github.io/api-documentation/resources/store This JSON object represents a successful response when retrieving a single store's details. It includes various properties like address, contact information, country, languages, and theme. ```json { "address": null, "admin_language": "pt", "blog": null, "business_id": null, "business_name": null, "business_address": null, "contact_email": "contact@pokestore.com", "country": "BR", "created_at": "2013-01-01T05:12:51-03:00", "customer_accounts": "optional", "description": { "en": "", "es": "", "pt": "" }, "domains": [ "www.pokestore.com", "www.another.com" ], "email": "owner@pokestore.com", "facebook": "http://www.facebook.com/pokestore", "google_plus": "http://plus.google.com/+pokestore", "id": 1234, "instagram": "http://www.instagram.com/pokestore", "languages": { "en": { "currency" : "USD", "active": true }, "es": { "currency" : "ARS", "active": false }, "pt": { "currency" : "BRL", "active": true } }, "logo": "//d26lpennugtm8s.cloudfront.net/stores/046/themes/common/logo-ff622335866ee56df3bceed2e9d41469.png", "main_currency": "BRL", "current_theme": "luxury", "main_language": "pt", "name": { "en": "Poké Store", "es": "Poké Tienda", "pt": "Poké Loja" }, "original_domain" : "pokeloja.nuvemshop.com.br", "phone": null, "whatsapp_phone_number": null, "pinterest": "http://www.pinterest.com/pokestore", "plan_name": "Business", "type": null, "twitter": "http://www.twitter.com/pokestore", "features": [ "fulfillment-orders", "inventory-levels" ] } ``` -------------------------------- ### Product Attributes Example Source: https://tiendanube.github.io/api-documentation/resources/product This example shows how to define attributes for a product. A product can have a maximum of 3 attributes, and each attribute name must be unique. ```json "attributes": [ { "en": "Color" }, { "en": "Size" }, { "en": "Gender" } ] ``` -------------------------------- ### Category Visibility Example Source: https://tiendanube.github.io/api-documentation/resources/category This example demonstrates the structure of category objects, including their IDs, subcategories, and visibility states (visible, hidden, soft-hidden). ```json [ { "id": 123456, "subcategories": [ 111222, 555666 ], "visibility": "visible" }, { "id": 111222, "subcategories": [], "visibility": "visible" }, { "id": 555666, "subcategories": [ 999888 ], "visibility": "hidden" }, { "id": 999888, "subcategories": [], "visibility": "soft-hidden" } ] ``` -------------------------------- ### Create Product with Multi-language Name Source: https://tiendanube.github.io/api-documentation Example of creating a product, showing how to provide localized names by sending a JSON object with language codes as keys. ```bash curl -H 'Authorization: Bearer ACCESS_TOKEN' \ -H 'Content-Type: application/json' \ -H 'User-Agent: MyApp (name@email.com)' \ -d '{ "name": {"es": "Ejemplo", "pt": "Exemplo"} }' \ https://api.tiendanube.com/2025-03/123456/products ``` -------------------------------- ### Create Product with Single-language Name Source: https://tiendanube.github.io/api-documentation Example of creating a product, demonstrating how to provide a single string value for the name, which will be applied to all active languages. ```bash curl -H 'Authorization: Bearer ACCESS_TOKEN' \ -H 'Content-Type: application/json' \ -H 'User-Agent: MyApp (name@email.com)' \ -d '{ "name": "Example" }' \ https://api.tiendanube.com/2025-03/123456/products ``` -------------------------------- ### Example API Request with Pagination Source: https://tiendanube.github.io/api-documentation This example demonstrates how to make an API request to retrieve products, specifying a page number and items per page. It includes authorization and user-agent headers. ```curl curl -H 'Authorization: Bearer ACCESS_TOKEN' \ -H 'User-Agent: MyApp (name@email.com)' \ 'https://api.tiendanube.com/2025-03/123456/products?page=2&per_page=100' ``` -------------------------------- ### Get Product Variants Source: https://tiendanube.github.io/api-documentation/assets/files/postman-ba7586d4928534ef30020acd47387f24.json Retrieve a list of all product variants for a given product. This endpoint is available starting from API version `v1`. ```http GET https://{{api_url}}/{{api_version}}/{{store_id}}/products/{{product_id}}/variants Authorization: Bearer {{app_token}} User-Agent: Your App Name ({{app_id}}) ``` -------------------------------- ### Create a Promotion Source: https://tiendanube.github.io/api-documentation/assets/files/postman-ba7586d4928534ef30020acd47387f24.json This snippet demonstrates how to create a new promotion. It includes the request body with promotion details and the expected successful response. ```json { "name": "50% off in the second unit", "allocation_type": "line_item", "description": "Taking two pay 50 percent on the second unit", "disclaimer": "Deal only valid for Buenos Aires city", "active": true, "translations": [ { "lang": "es-ar", "name": "50% off in the second unit", "description": "Taking two pay 50 percent on the second unit", "disclaimer": "Deal only valid for Buenos Aires city" }, { "lang": "es-ar", "name": "50% off in the second unit", "description": "Taking two pay 50 percent on the second unit", "disclaimer": "Deal only valid for Buenos Aires city" } ] } ``` ```json { "data": { "id": "e855b201-be35-496c-8aed-28c6f1de840d" } } ``` -------------------------------- ### Get a list of customers since a specific ID Source: https://tiendanube.github.io/api-documentation/assets/files/postman-ba7586d4928534ef30020acd47387f24.json Retrieve a list of customers, starting from a specified customer ID. This is useful for pagination. ```http GET /{{api_version}}/{{store_id}}/customers?since_id=105 HTTP/1.1 Host: {{api_url}} Authorization: Bearer {{app_token}} User-Agent: Your App Name ({{app_id}}) ``` -------------------------------- ### Create Plan Response Example Source: https://tiendanube.github.io/api-documentation/resources/billing This is an example of a successful response when creating a new plan using the POST /plans endpoint. It includes the generated ID and other plan details. ```json { "id": "string", "code": "string", "external_reference": "string", "description": "string", "default": "boolean" } ``` -------------------------------- ### Get Script by ID Response Source: https://tiendanube.github.io/api-documentation/resources/script Example response for retrieving a specific script's details by its ID. Includes all associated information including versions and parameters. ```json { "id": 12345, "name": "Script name", "event": "onfirstinteraction", "location": "store", "created_at": "2024-09-11T20:19:29.000Z", "updated_at": "2024-09-11T20:20:19.000Z", "is_auto_install": false, "status": "active", "params": { "paramA": 1 }, "current_version": { "id": 22435, "src": "https://apps-scripts.tiendanube.com/app-handle/script-name/2.js?versionId=Dbd4FeTBY9ssDVnDaBeaOmXX8a7raJGS", "version": 2 }, "draft_version": { "id": 22437, "src": "https://apps-scripts.tiendanube.com/app-handle/script-name/3.js?versionId=RYH33gaBY9ssDVnDaBeaOmXX8ABDAS3g", "version": 3 } } ``` -------------------------------- ### Get All Products Source: https://tiendanube.github.io/api-documentation/assets/files/postman-ba7586d4928534ef30020acd47387f24.json Retrieves a list of all products for a given store. Requires an authorization token and a user-agent header. ```http GET https://{{api_url}}/{{api_version}}/{{store_id}}/products Host: {{api_url}} Authorization: Bearer {{app_token}} User-Agent: Your App Name ({{app_id}}) ``` -------------------------------- ### Requesting Full Fulfillment Information Source: https://tiendanube.github.io/api-documentation/guides/multi-inventory/access-order This example shows how to make a GET request to the `/orders/{id}` endpoint with the `aggregates=fulfillment_orders` parameter to include complete fulfillment object details in the response. ```http GET /orders/{id}?aggregates=fulfillment_orders ``` -------------------------------- ### Create New Product Source: https://tiendanube.github.io/api-documentation/assets/files/postman-ba7586d4928534ef30020acd47387f24.json Adds a new product to the store with specified images, names, and variants. ```json { "images": [ { "src": "http://images1.wikia.nocookie.net/__cb20101106022321/pokemon/images/f/f1/UltraBallArt.png" } ], "name": { "en": "Ultra Ball", "es": "Ultra Ball", "pt": "Ultra Ball" }, "variants": [ { "price": "10.00", "stock_management": true, "stock": 12, "weight": "2.00" } ] } ``` -------------------------------- ### GET /products?created_at_min - Filter Products by Creation Date Source: https://tiendanube.github.io/api-documentation/resources/product Retrieves products created after a specified date. This example demonstrates filtering by `created_at_min` and selecting specific fields like `id` and `name`. ```json [ { "id": 1234, "name": { "en": "Master Ball", "es": "Master Ball", "pt": "Master Ball" } } ] ``` -------------------------------- ### GET /products - Retrieve All Products Source: https://tiendanube.github.io/api-documentation/resources/product Fetches a list of all products. The response includes detailed information for each product, such as attributes, categories, descriptions, images, and variants. ```json [ { "attributes": [ { "en": "Size" } ], "categories": [ { "created_at": "2013-01-03T09:11:51-03:00", "description": { "en": "", "es": "", "pt": "" }, "handle": { "en": "poke-balls", "es": "poke-balls", "pt": "poke-balls" }, "id": 4567, "name": { "en": "Poké Balls", "es": "Poké Balls", "pt": "Poké Balls" }, "parent": null, "subcategories": [], "google_shopping_category": null, "updated_at": "2013-03-11T09:14:11-03:00" } ], "created_at": "2013-01-03T09:11:51-03:00", "description": { "en": "
The best Ball with the ultimate level of performance. It will catch any wild Pokémon without fail.
", "es": "La mejor Bola con el nivel máximo de desempeño. Atrapará cualquier Pokémon sin fallar.
", "pt": "A melhor Bola com o nível máximo de desempenho. Ele vai pegar qualquer Pokémon selvagem sem falhar.
" }, "handle": { "en": "master-ball", "es": "master-ball", "pt": "master-ball" }, "id": 1234, "images": [ { "id": 101, "src": "http://d26lpennugtm8s.cloudfront.net/stores/001/234/products/servine-640-0.jpg", "position": 1, "product_id": 1234 }, { "id": 112, "src": "http://d26lpennugtm8s.cloudfront.net/stores/001/234/products/onyx-640-0.jpg", "position": 2, "product_id": 1234 }, { "id": 123, "src": "http://d26lpennugtm8s.cloudfront.net/stores/001/234/products/stoutland-640-0.jpg", "position": 3, "product_id": 1234 } ], "name": { "en": "Master Ball", "es": "Master Ball", "pt": "Master Ball" }, "brand": null, "video_url": "https://www.youtube.com/watch?v=57aG16_gQcU", "seo_title": "Master Ball", "seo_description": "The best Ball with the ultimate level of performance. It will catch any wild Pokémon without fail.", "published": true, "free_shipping": false, "updated_at": "2013-03-11T09:14:11-03:00", "variants": [ { "id": 101, "promotional_price": "19.00", "created_at": "2013-01-03T09:11:51-03:00", "depth": null, "height": null, "values": [ { "en": "Small" } ], "price": "25.00", "product_id": 1234, "stock_management": true, "stock": 5, "sku": "BSG1234A", "updated_at": "2013-03-11T09:14:11-03:00", "weight": "2.00", "width": null, "cost": null }, { "id": 112, "promotional_price": "19.00", "created_at": "2013-01-03T09:11:51-03:00", "depth": null, "height": null, "values": [ { "en": "Medium" } ], "price": "25.00", "product_id": 1234, "stock_management": true, "stock": 5, "sku": "BSG1234B", "updated_at": "2013-03-11T09:14:11-03:00", "weight": "2.25", "width": null, "cost": null }, { "id": 133, "promotional_price": "19.00", "created_at": "2013-01-03T09:11:51-03:00", "depth": null, "height": null, "values": [ { "en": "Large" } ], "price": "25.00", "product_id": 1234, "stock_management": true, "stock": 5, "sku": "BSG1234C", "updated_at": "2013-03-11T09:14:11-03:00", "weight": "2.50", "width": null, "cost": "10.99" } ], "tags": "Brinquedos, pokeball, oferta, colecionismo" } ] ``` -------------------------------- ### Example POST Request Proxy Source: https://tiendanube.github.io/api-documentation/guides/storefront-app-proxy Demonstrates how an original POST request with a JSON body is proxied to your app. Note that the method might change to GET in the proxied request, and relevant headers like Content-Type are preserved. ```http POST /foo/new HTTP/1.1 Host: www.example.com Content-Type: application/json Content-Length: 41 {"name": "Alice", "job": "App developer"} ``` ```http GET /proxy/foo/new HTTP/1.1 Host: my-app.com X-Store-Id: 12345 X-Customer-Id: 9876 X-Language-Code: es_AR X-Country-Code: AR X-Forwarded-For: 172.18.0.1 X-Request-Id: 7eba2c1e-7c21-4c4c-a670-4d6cb75f6c98 X-Linkedstore-HMAC-SHA256: 6d5ab84f3a83e3cc50b8726011a2ec335c9fbbc36a30b6df9308b80524a5900b Content-Type: application/json Content-Length: 41 {"name": "Alice", "job": "App developer"} ``` -------------------------------- ### Transparent Card Payment Configuration Source: https://tiendanube.github.io/api-documentation/resources/checkout This example demonstrates how to configure a transparent card payment option. It includes setting the payment option ID, version, specific fields like birth date, and defining onLoad, onDataChange, and onSubmit event handlers. The onSubmit handler shows how to process the payment using `Checkout.processPayment` and handle errors with `Checkout.showErrorCode`. ```APIDOC ## TransparentCard Payment Configuration ### Description Configure a transparent card payment option with specific fields and event handlers. ### Method `PaymentOptions.Transparent.CardPayment(config)` ### Parameters #### Configuration Object (`config`) - **id** (string) - Required - The unique identifier for the payment option (e.g., `"acme_transparent_card"`). - **version** (string) - Required - The integration version (e.g., `"v2"`). - **fields** (object) - Optional - Object containing extra input fields to render. - **card_holder_birth_date** (boolean) - Optional - Renders the card holder's birth date field. - **onLoad** (function) - Optional - Function invoked after the script loads. - **onDataChange** (function) - Optional - Function invoked when checkout data changes. Debounced by default. - **onSubmit** (function) - Required - Function invoked when the consumer submits the checkout. Must call `Checkout.processPayment()` and handle errors. ### Request Example ```javascript LoadCheckoutPaymentContext(function (Checkout, PaymentOptions) { var TransparentCard = PaymentOptions.Transparent.CardPayment({ id: "acme_transparent_card", version: 'v2', fields: { card_holder_birth_date: true, }, onLoad: function () { // Do something after the script loads. }, onDataChange: Checkout.utils.throttle(function () { // Do something when the input form data changes. }, 700), onSubmit: function (callback) { const extraCartData = {}; Checkout.processPayment(extraCartData) .then(function(responseData) { // Handle payment request response. }).catch(function(error) { // Handle potential errors. Checkout.showErrorCode(error.response.data.message); }); }, }); Checkout.addPaymentOption(TransparentCard); }); ``` ### Response N/A (This is a configuration function) ### Error Handling Errors during payment processing are handled within the `onSubmit` function using `Checkout.showErrorCode()`. ``` -------------------------------- ### Setting Installments Source: https://tiendanube.github.io/api-documentation/resources/checkout Allows partners to define the available installment plans for a checkout process. Each installment object specifies the quantity, amount per installment, total amount, and CFT (Custo Efetivo Total). ```APIDOC ## Checkout.setInstallments ### Description Sets the available installment options for the checkout. ### Parameters #### Path Parameters None #### Query Parameters None #### Request Body - **installments** (array) - Required - An array of installment objects. - **quantity** (number) - Required - The number of installments. - **installmentAmount** (number) - Required - The amount for each installment. - **totalAmount** (number) - Required - The total amount for the given quantity of installments. - **cft** (string) - Required - The effective total cost (Custo Efetivo Total) for the installments. ### Request Example ```javascript Checkout.setInstallments([ { quantity: 1, installmentAmount: 25, totalAmount: 25, cft: "0,00%", }, { quantity: 2, installmentAmount: 13, totalAmount: 26, cft: "199,26%", }, { quantity: 3, installmentAmount: 10, totalAmount: 30, cft: "196,59%", }, ]); ``` ### Response None explicitly documented. ``` -------------------------------- ### Create Product - Successful Request Source: https://tiendanube.github.io/api-documentation/resources/product Example of a successful POST request to create a product with images, variants, and categories. This results in a 201 Created response. ```json { "images": [ { "src": "http://images1.wikia.nocookie.net/__cb20101106022321/pokemon/images/f/f1/UltraBallArt.png" } ], "name": { "en": "Ultra Ball", "es": "Ultra Ball", "pt": "Ultra Ball" }, "video_url": "https://www.youtube.com/watch?v=57aG16_gQcU", "variants": [ { "price": "10.00", "stock_management": true, "stock": 12, "weight": "2.00", "cost": "10.99" } ], "categories": [11654304, 11654305] } ``` -------------------------------- ### Set Checkout Installments Source: https://tiendanube.github.io/api-documentation/resources/checkout Configures the available installment options for the checkout process. Each option specifies quantity, installment amount, total amount, and CFT. ```javascript Checkout.setInstallments([ { quantity: 1, installmentAmount: 25, totalAmount: 25, cft: "0,00%", }, { quantity: 2, installmentAmount: 13, totalAmount: 26, cft: "199,26%", }, { quantity: 3, installmentAmount: 10, totalAmount: 30, cft: "196,59%", }, ]); ``` -------------------------------- ### Request Body Example Source: https://tiendanube.github.io/api-documentation/assets/files/postman-ba7586d4928534ef30020acd47387f24.json Example of a request body containing error details. ```json { "error": { "status": 403, "code": "ForbiddenException", "detail": "Forbidden resource" } } ``` -------------------------------- ### Create Product - Successful Response Source: https://tiendanube.github.io/api-documentation/resources/product Example of a 201 Created response after successfully creating a product. Includes details of the created product, its categories, images, and variants. ```json { "attributes": [], "categories": [ { "created_at": "2013-01-03T09:11:51-03:00", "description": { "en": "", "es": "", "pt": "" }, "handle": { "en": "poke-balls", "es": "poke-balls", "pt": "poke-balls" }, "id": 4567, "name": { "en": "Poké Balls", "es": "Poké Balls", "pt": "Poké Balls" }, "parent": null, "subcategories": [], "google_shopping_category": null, "updated_at": "2013-03-11T09:14:11-03:00" } ], "created_at": "2013-06-01T12:15:11-03:00", "description": { "en": "", "es": "", "pt": "" }, "handle": { "en": "ultra-ball", "es": "ultra-ball", "pt": "ultra-ball" }, "id": 2435, "images": [ { "id": 231, "src": "http://d26lpennugtm8s.cloudfront.net/stores/001/234/products/UltraBallArt.jpg", "position": 1, "product_id": 2435 } ], "name": { "en": "Ultra Ball", "es": "Ultra Ball", "pt": "Ultra Ball" }, "brand": null, "video_url": "https://www.youtube.com/watch?v=57aG16_gQcU", "seo_title": "Ultra Ball", "seo_description": "", "published": true, "free_shipping": false, "created_at": "2013-06-01T12:15:11-03:00", "variants": [ { "id": 101, "promotional_price": null, "created_at": "2013-06-01T12:15:11-03:00", "depth": null, "height": null, "values": [], "price": "10.00", "product_id": 1234, "stock_management": true, "stock": 12, "sku": null, "updated_at": "2013-03-11T09:14:11-03:00", "weight": "2.00", "width": null, "cost": "10.99" } ], "tags": "" } ``` -------------------------------- ### Create Dispute Request Example Source: https://tiendanube.github.io/api-documentation/resources/disputes This example demonstrates how to construct a POST request to create a new dispute. Ensure the Authorization header contains a valid Bearer token and the Content-Type is set to application/json. ```HTTP POST https://api.tiendanube.com/2025-03/1020559/orders/1612216732/transactions/02aaa5c6-080a-40e9-a61f-90ca2150d6a2/disputes ``` ```JSON { "Authorization": "Bearer 12b2617c3362d9805cdf89079c4c99f928504eda", "Content-Type": "application/json" } ``` -------------------------------- ### Example Webhook Payload Source: https://tiendanube.github.io/api-documentation/resources/webhook An example of the JSON payload structure for a webhook notification. ```APIDOC ## Example webhook content ### Request Example { "store_id":123, "event":"product/created", "id":1948209 } ``` -------------------------------- ### Pagination Example Source: https://tiendanube.github.io/api-documentation This example demonstrates how to paginate through API results using the `page` and `per_page` parameters. It also shows how to include an authorization token and a user agent in the request headers. ```APIDOC ## GET /products?page=2&per_page=100 ### Description Retrieves a paginated list of products. Allows specifying the page number and the number of items per page. ### Method GET ### Endpoint `/products?page=