openapi: 3.0.3 info: title: Nuvemshop / Tiendanube Admin Categories Webhooks 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: Webhooks description: Event notification subscriptions. paths: /webhooks: get: operationId: listWebhooks tags: - Webhooks summary: List webhooks description: Receive a list of all webhook subscriptions. responses: '200': description: A list of webhooks. content: application/json: schema: type: array items: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createWebhook tags: - Webhooks summary: Create a webhook description: Subscribe to an event. The `event` field accepts values such as order/created, order/paid, order/cancelled, product/created, product/updated, product/deleted, customer/created, category/updated, app/uninstalled, and many more (see the Webhook documentation). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WebhookInput' responses: '201': description: The created webhook. content: application/json: schema: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /webhooks/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getWebhook tags: - Webhooks summary: Get a webhook description: Receive a single webhook subscription. responses: '200': description: The requested webhook. content: application/json: schema: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: operationId: updateWebhook tags: - Webhooks summary: Update a webhook description: Modify an existing webhook subscription. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WebhookInput' responses: '200': description: The updated webhook. content: application/json: schema: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: operationId: deleteWebhook tags: - Webhooks summary: Delete a webhook description: Delete a webhook subscription. 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: Webhook: allOf: - type: object properties: id: type: integer format: int64 created_at: type: string format: date-time - $ref: '#/components/schemas/WebhookInput' Error: type: object properties: code: type: integer message: type: string description: type: string additionalProperties: true WebhookInput: type: object required: - url - event properties: url: type: string format: uri description: HTTPS endpoint that will receive the event POST. event: type: string description: The event to subscribe to, e.g. order/created. example: order/created 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.'