openapi: 3.0.3 info: title: Nuvemshop / Tiendanube Admin Categories Scripts 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: Scripts description: Custom JavaScript injected into the storefront. paths: /scripts: get: operationId: listScripts tags: - Scripts summary: List scripts description: Retrieve a list of script-store associations with pagination. responses: '200': description: A list of scripts. content: application/json: schema: type: array items: $ref: '#/components/schemas/Script' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createScript tags: - Scripts summary: Create a script association description: Create a script-store association for a non-autoinstallable script. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ScriptInput' responses: '201': description: The created script association. content: application/json: schema: $ref: '#/components/schemas/Script' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /scripts/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getScript tags: - Scripts summary: Get a script description: Retrieve details for a specific script association by id. responses: '200': description: The requested script association. content: application/json: schema: $ref: '#/components/schemas/Script' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: operationId: updateScript tags: - Scripts summary: Update a script description: Modify an existing script-store association. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ScriptInput' responses: '200': description: The updated script association. content: application/json: schema: $ref: '#/components/schemas/Script' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: operationId: deleteScript tags: - Scripts summary: Delete a script description: Remove a script association with the store. 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 schemas: Error: type: object properties: code: type: integer message: type: string description: type: string additionalProperties: true ScriptInput: type: object required: - src - event properties: src: type: string format: uri description: URL of the JavaScript file to inject. event: type: string description: When to load the script (e.g. onload). where: type: string description: Where to inject the script (e.g. store, checkout). additionalProperties: true Script: allOf: - type: object properties: id: type: integer format: int64 - $ref: '#/components/schemas/ScriptInput' 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.'