> ## Documentation Index
> Fetch the complete documentation index at: https://partner-api.xenda.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Empujar opciones (sabores)

> Alta, modificación o baja de opciones, en lote. El `grupo` (ej. "Sabores")
se crea automáticamente la primera vez que aparece. Mismas reglas de
idempotencia, orden de eventos y errores por ítem que los productos.




## OpenAPI

````yaml /openapi-pos.yaml post /v1/catalog/options
openapi: 3.1.0
info:
  title: Xenda POS Bridge
  version: 1.0.0
  description: >
    Bridge entre tu sistema de punto de venta y el módulo de pedidos por
    WhatsApp de

    Xenda. Tu POS empuja el catálogo, consulta los pedidos que toma el bot e
    informa

    los cambios de estado. Todo el tráfico lo origina tu sistema; la key es por

    sucursal.
servers:
  - url: https://api.automationhub.one/api:07fkGLk_
    description: Producción (sandbox = misma URL con key de la sucursal demo)
security:
  - ApiKeyAuth: []
paths:
  /v1/catalog/options:
    post:
      summary: Empujar opciones (sabores)
      description: >
        Alta, modificación o baja de opciones, en lote. El `grupo` (ej.
        "Sabores")

        se crea automáticamente la primera vez que aparece. Mismas reglas de

        idempotencia, orden de eventos y errores por ítem que los productos.
      operationId: pushCatalogOptions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CatalogOptionsRequest'
            example:
              event_id: pos-evt-20260730-002
              occurred_at: '2026-07-30T13:05:00-03:00'
              action: upsert
              options:
                - codigo: S01
                  nombre: Dulce de leche
                  grupo: Sabores
                  deshabilitado: false
      responses:
        '200':
          description: Resultado del lote.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IngestResponse'
        '403':
          $ref: '#/components/responses/AccessDenied'
components:
  schemas:
    CatalogOptionsRequest:
      type: object
      required:
        - event_id
        - occurred_at
        - options
      properties:
        event_id:
          type: string
        occurred_at:
          type: string
          format: date-time
        store_id:
          type: integer
        action:
          type: string
          enum:
            - upsert
            - delete
          default: upsert
        options:
          type: array
          items:
            $ref: '#/components/schemas/CatalogOption'
    IngestResponse:
      type: object
      properties:
        duplicate:
          type: boolean
          description: >-
            `true` si el `event_id` ya se había procesado (no se reprocesó
            nada).
        accepted:
          type: integer
        skipped_stale:
          type: integer
          description: Ítems descartados por ser más viejos que lo ya aplicado.
        rejected:
          type: array
          items:
            type: object
            properties:
              codigo:
                type: string
              error:
                type: string
    CatalogOption:
      type: object
      required:
        - codigo
      properties:
        codigo:
          type: string
          description: Tu ID estable de la opción. `nombre` es obligatorio en `upsert`.
        nombre:
          type: string
        grupo:
          type: string
          default: Sabores
          description: Grupo al que pertenece. Se crea automáticamente si no existe.
        deshabilitado:
          type: boolean
          default: false
        precio_adicional:
          type: number
          default: 0
        orden:
          type: integer
          description: Orden de presentación (opcional).
    Error:
      type: object
      properties:
        code:
          type: string
        message:
          type: string
        payload: {}
  responses:
    AccessDenied:
      description: Key inválida, inactiva o `store_id` que no corresponde a la key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: ERROR_CODE_ACCESS_DENIED
            message: Invalid API key.
            payload: ''
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: Key por sucursal provista por Xenda (formato `xnd_...`).

````