> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tellen.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Actualizar un producto

> Envía solo los campos que quieras cambiar. Las existencias no se editan
aquí: se mueven a través del kardex, así que `stock_quantity` no es
modificable e `initial_stock` se ignora.




## OpenAPI

````yaml /api-reference/openapi.yaml patch /api/v1/accounts/{account_id}/products/{id}
openapi: 3.1.0
info:
  title: Tellen API
  version: 1.0.0
  description: |
    API REST de Tellen para facturación electrónica en Ecuador.

    Autentícate con un token de API (`Authorization: Bearer tellen_tk_...`) que
    generas desde tu cuenta de Tellen. Todas las solicitudes actúan sobre una
    cuenta, indicada por su identificador en la ruta:
    `/api/v1/accounts/{account_id}/...`.

    Normalmente ese identificador es el de tu propia cuenta. Si administras
    varias cuentas, usa el identificador de cada una para operar sobre ella. Si
    intentas acceder a una cuenta que no administras, la API responde `404`.
servers:
  - url: https://dashboard.tellen.app
    description: Producción
security:
  - bearerAuth: []
tags:
  - name: Cuentas
    description: Tu cuenta y, si administras varias, las cuentas que gestionas.
  - name: Certificados
    description: >-
      Certificados de firma electrónica (.p12) usados para firmar documentos
      ante el SRI.
  - name: Contactos
    description: Clientes y proveedores de la cuenta.
  - name: Establecimientos
    description: Establecimientos (sucursales) de la cuenta, sincronizados desde el SRI.
  - name: Puntos de emisión
    description: >-
      Puntos de emisión por establecimiento, desde donde se emiten los
      comprobantes.
  - name: Productos
    description: >
      Catálogo de productos y servicios de la cuenta, con su configuración de

      impuestos e inventario.


      **Variantes.** Cada producto tiene al menos una variante interna. Un

      producto de un solo SKU se representa de forma plana (su variante por

      defecto es un detalle de implementación y no aparece en la respuesta), por

      lo que `variants` llega vacío. El arreglo `variants` solo lista variantes

      **con nombre** (talla, color, etc.), cuando existen.


      **Inventario.** El stock vive en las variantes, no en el producto; el
      campo

      `stock` es un consolidado de solo lectura sobre las variantes vendibles.

      Es `null` cuando el producto no controla inventario (todos los servicios,
      y

      los bienes con el control desactivado), lo que permite distinguir "no

      controla stock" de "controla stock, con 0 existencias".


      **El stock no se edita directamente.** Las existencias se mueven a través

      del kardex (entradas y salidas registradas por documentos autorizados,

      compras o ajustes), nunca escribiendo `stock_quantity`. Al **crear** un

      producto puedes fijar las existencias iniciales con `initial_stock`, que
      se

      registra como una entrada en el kardex. En una **actualización**,

      `initial_stock` se ignora.
  - name: Facturas
    description: Facturas de venta (comprobante electrónico 01).
paths:
  /api/v1/accounts/{account_id}/products/{id}:
    parameters:
      - name: account_id
        in: path
        required: true
        description: Identificador de la cuenta.
        schema:
          type: string
          format: uuid
      - name: id
        in: path
        required: true
        description: Identificador del producto.
        schema:
          type: string
          format: uuid
    patch:
      tags:
        - Productos
      summary: Actualizar un producto
      description: |
        Envía solo los campos que quieras cambiar. Las existencias no se editan
        aquí: se mueven a través del kardex, así que `stock_quantity` no es
        modificable e `initial_stock` se ignora.
      operationId: updateProduct
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProductUpdateRequest'
      responses:
        '200':
          description: El producto actualizado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductEnvelope'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
components:
  schemas:
    ProductUpdateRequest:
      type: object
      required:
        - product
      properties:
        product:
          type: object
          description: >-
            Envía solo los campos que quieras cambiar. Las existencias no se
            editan aquí; se mueven a través del kardex.
          properties:
            name:
              type: string
            code:
              type: string
            secondary_code:
              type: string
            gtin:
              type: string
            product_type:
              type: string
              enum:
                - bien
                - servicio
            description:
              type: string
            iva:
              type: string
              enum:
                - '0'
                - '5'
                - '8'
                - '12'
                - '15'
                - no_objeto_iva
                - exento_iva
            unit_of_measurement:
              type: string
            price_before_tax:
              type: number
            catalog_ice_tax_id:
              type: string
              format: uuid
            track_stock:
              type: boolean
            low_stock_threshold:
              type: number
    ProductEnvelope:
      type: object
      required:
        - product
      properties:
        product:
          $ref: '#/components/schemas/Product'
    Product:
      allOf:
        - $ref: '#/components/schemas/ProductSummary'
        - type: object
          properties:
            secondary_code:
              type:
                - string
                - 'null'
            gtin:
              type:
                - string
                - 'null'
            description:
              type:
                - string
                - 'null'
            unit_of_measurement:
              type:
                - string
                - 'null'
            has_ice:
              type: boolean
            ice_rate:
              type:
                - number
                - 'null'
              description: Porcentaje de ICE, o `null` si no aplica.
            stock:
              type:
                - object
                - 'null'
              description: Inventario del producto, o `null` si no controla stock.
              required:
                - total
              properties:
                total:
                  type: number
                  description: Existencias actuales sumadas sobre las variantes vendibles.
                status:
                  type:
                    - string
                    - 'null'
                  enum:
                    - in_stock
                    - low_stock
                    - out_of_stock
                    - 'null'
                  description: >
                    Estado consolidado de las variantes vendibles, o `null` si

                    ninguna reporta estado (p. ej. un producto que controla
                    stock

                    pero sin variantes vendibles activas).
            variants:
              type: array
              description: Variantes con nombre. Vacío para un producto de un solo SKU.
              items:
                type: object
                required:
                  - id
                  - code
                  - name
                  - price_before_tax
                properties:
                  id:
                    type: string
                    format: uuid
                  code:
                    type: string
                  name:
                    type: string
                  price_before_tax:
                    type: number
                  stock_quantity:
                    type: number
                    description: Existencias de la variante, si controla stock.
            created_at:
              type: string
              format: date-time
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Mensaje de error descriptivo, en español.
    ProductSummary:
      type: object
      required:
        - id
        - name
        - product_type
        - price_before_tax
        - iva
        - iva_rate
        - track_stock
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        code:
          type:
            - string
            - 'null'
          description: Código interno, único por cuenta.
        product_type:
          type: string
          enum:
            - bien
            - servicio
        price_before_tax:
          type: number
          description: Precio unitario sin impuestos.
        iva:
          type: string
          enum:
            - '0'
            - '5'
            - '8'
            - '12'
            - '15'
            - no_objeto_iva
            - exento_iva
        iva_rate:
          type: number
          description: Porcentaje de IVA aplicado.
        track_stock:
          type: boolean
          description: Si el producto controla inventario.
  responses:
    Unauthorized:
      description: >-
        Falta el token, o es inválido o está inactivo. Verifica el encabezado
        `Authorization`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: Tu cuenta no tiene el acceso a la API habilitado.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: La cuenta no existe o no la administras.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ValidationError:
      description: Los datos enviados no son válidos.
      content:
        application/json:
          schema:
            type: object
            required:
              - errors
            properties:
              errors:
                type: array
                items:
                  type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: |
        Token de API enviado como `Authorization: Bearer tellen_tk_...`. Genera
        tu token desde tu cuenta de Tellen. Tu cuenta debe tener el acceso a la
        API habilitado.

````