openapi: 3.0.3 info: title: Nuvemshop / Tiendanube Admin Categories Product Images API description: 'Store-scoped REST Admin API for the Nuvemshop (Tiendanube) e-commerce platform. This document models a grounded, representative subset of the public API - products, product variants, product images, categories, orders, customers, coupons, webhooks, scripts, and store - as documented at https://tiendanube.github.io/api-documentation/. Every path is relative to a per-store base that embeds the store id, for example `https://api.tiendanube.com/2025-03/{store_id}`. The Brazilian mirror `https://api.nuvemshop.com.br/2025-03/{store_id}` serves the same API, and the long-standing `v1` path (`https://api.tiendanube.com/v1/{store_id}`) remains available as the legacy equivalent. Authentication is OAuth 2 (authorization code grant). The resulting non-expiring access token is sent in a NON-STANDARD header named `Authentication` with a lowercase `bearer` prefix (`Authentication: bearer ACCESS_TOKEN`) - using `Authorization` or a different case returns 401. Every request must also send a descriptive `User-Agent` header identifying the app and a contact (name/email or URL); omitting it returns 400. NOTE ON MODELING: endpoint paths, methods, and the auth/header/rate-limit behavior below are grounded in the live documentation. Request and response body schemas are simplified representative models (marked with additionalProperties) rather than the provider''s full field-level schema.' version: 2025-03 contact: name: Nuvemshop / Tiendanube Developers url: https://tiendanube.github.io/api-documentation/ license: name: MIT (documentation) url: https://github.com/TiendaNube servers: - url: https://api.tiendanube.com/2025-03/{store_id} description: Tiendanube (Spanish-speaking markets) variables: store_id: default: '0' description: The numeric store id (user_id) returned during OAuth authorization. - url: https://api.nuvemshop.com.br/2025-03/{store_id} description: Nuvemshop (Brazil) variables: store_id: default: '0' description: The numeric store id (user_id) returned during OAuth authorization. security: - authenticationHeader: [] tags: - name: Product Images description: Images attached to a product. paths: /products/{product_id}/images: parameters: - $ref: '#/components/parameters/ProductId' get: operationId: listProductImages tags: - Product Images summary: List product images description: Receive a list of all images for a given product. responses: '200': description: A list of images. content: application/json: schema: type: array items: $ref: '#/components/schemas/Image' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createProductImage tags: - Product Images summary: Create a product image description: Attach a new image to a product, by URL or base64 attachment. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ImageInput' responses: '201': description: The created image. content: application/json: schema: $ref: '#/components/schemas/Image' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /products/{product_id}/images/{id}: parameters: - $ref: '#/components/parameters/ProductId' - $ref: '#/components/parameters/Id' get: operationId: getProductImage tags: - Product Images summary: Get a product image description: Receive a single product image. responses: '200': description: The requested image. content: application/json: schema: $ref: '#/components/schemas/Image' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: operationId: updateProductImage tags: - Product Images summary: Update a product image description: Modify an existing product image. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ImageInput' responses: '200': description: The updated image. content: application/json: schema: $ref: '#/components/schemas/Image' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: operationId: deleteProductImage tags: - Product Images summary: Delete a product image description: Remove an image from a product. responses: '200': description: Deletion confirmation (empty object). content: application/json: schema: type: object '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' components: parameters: Id: name: id in: path required: true description: The numeric resource id. schema: type: integer format: int64 ProductId: name: product_id in: path required: true description: The numeric product id. schema: type: integer format: int64 schemas: Image: allOf: - type: object properties: id: type: integer format: int64 product_id: type: integer format: int64 src: type: string format: uri - $ref: '#/components/schemas/ImageInput' Error: type: object properties: code: type: integer message: type: string description: type: string additionalProperties: true ImageInput: type: object properties: src: type: string format: uri description: Public URL of the image to import. attachment: type: string description: Base64-encoded image data (alternative to src). filename: type: string position: type: integer additionalProperties: true responses: ValidationError: description: The request payload failed validation. content: application/json: schema: $ref: '#/components/schemas/Error' Unauthorized: description: Missing or malformed `Authentication` header, or invalid token. content: application/json: schema: $ref: '#/components/schemas/Error' NotFound: description: The requested resource was not found. content: application/json: schema: $ref: '#/components/schemas/Error' securitySchemes: authenticationHeader: type: apiKey in: header name: Authentication description: 'NON-STANDARD auth header. Send the OAuth 2 access token as `Authentication: bearer ACCESS_TOKEN` - the header name must be `Authentication` (not `Authorization`) and the `bearer` prefix must be lowercase, or the API returns 401. A descriptive `User-Agent` header is also required on every request.'