> ## 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.

# Consultar pedidos (polling)

> Pedidos de la sucursal de la key, por estado. Pensado para polling cada 1-2
minutos con `status=pendiente`. Las líneas vienen con **tus códigos**
(los del catálogo que empujaste), congelados al momento del pedido.




## OpenAPI

````yaml /openapi-pos.yaml get /v1/orders
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/orders:
    get:
      summary: Consultar pedidos (polling)
      description: >
        Pedidos de la sucursal de la key, por estado. Pensado para polling cada
        1-2

        minutos con `status=pendiente`. Las líneas vienen con **tus códigos**

        (los del catálogo que empujaste), congelados al momento del pedido.
      operationId: listOrders
      parameters:
        - name: status
          in: query
          schema:
            type: string
            enum:
              - pendiente
              - en_preparacion
              - listo
              - asignado
              - en_camino
              - entregado
              - rechazado
              - cancelado
            default: pendiente
        - name: since
          in: query
          description: Solo pedidos creados después de este timestamp (ISO 8601).
          schema:
            type: string
            format: date-time
        - name: page
          in: query
          schema:
            type: integer
            default: 1
      responses:
        '200':
          description: Página de pedidos (20 por página, más viejos primero).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrdersResponse'
        '403':
          $ref: '#/components/responses/AccessDenied'
components:
  schemas:
    OrdersResponse:
      type: object
      properties:
        orders:
          type: array
          items:
            $ref: '#/components/schemas/Order'
        page:
          type: integer
        per_page:
          type: integer
        total:
          type: integer
          description: >
            Cantidad total de pedidos en ese estado (no solo los de esta
            página).

            Si es mayor que `per_page`, hay más para traer.
        has_more:
          type: boolean
          description: >
            `true` si queda al menos una página más. Pedila con `page=2`,
            `page=3`, etc.

            Los pedidos vienen del más viejo al más nuevo, así que la página 1
            siempre

            trae los más urgentes.
    Order:
      type: object
      properties:
        order_id:
          type: integer
        created_at:
          type: integer
          description: Epoch millis (para cálculos).
        created_at_iso:
          type: string
          description: >-
            La misma fecha en ISO 8601 con zona del local (ej.
            "2026-08-04T11:05:36-03:00").
        status:
          type: string
        delivery_type:
          type: string
          enum:
            - pick_up
            - delivery
        delivery_address:
          type: string
          nullable: true
          description: Domicilio completo en una línea (respaldo del objeto `domicilio`).
        domicilio:
          type: object
          description: >
            Domicilio estructurado (solo `delivery`). Si el dato original no
            pudo

            separarse, los campos vienen en null y `delivery_address` trae el
            texto

            completo.
          properties:
            calle:
              type: string
              nullable: true
            numero:
              type: string
              nullable: true
            piso_depto:
              type: string
              nullable: true
            localidad:
              type: string
              nullable: true
            referencia:
              type: string
              nullable: true
              description: Indicaciones extra del cliente ("portón negro, tocar timbre").
        cliente:
          type: object
          properties:
            nombre:
              type: string
              nullable: true
              description: >-
                Puede venir null si el cliente no dio su nombre — mostrar
                "Cliente".
            telefono:
              type: string
              description: Número completo formato internacional (respaldo).
            telefono_pais:
              type: string
              nullable: true
              description: Código de país sin "+" (default "54").
            telefono_area:
              type: string
              nullable: true
              description: Código de área sin 0 ("11", "341", "2966").
            telefono_numero:
              type: string
              nullable: true
              description: Número local limpio, sin guiones ni espacios.
        pago:
          type: object
          description: >
            Cómo se paga el pedido — pensado para el cierre de caja. Hoy todos
            los

            pedidos nacen `en_entrega` / `pagado: false`; cuando un local active
            el

            pago online por WhatsApp (Mercado Pago), llegará `online` / `pagado:
            true`.
          properties:
            modo:
              type: string
              enum:
                - en_entrega
                - online
            pagado:
              type: boolean
            monto:
              type: number
              description: >
                Monto a cobrar (igual a `total`, envío incluido; 0 si no hay
                total).

                Pensado para calcular el vuelto en pagos en efectivo.
        costo_envio:
          type: number
          description: >
            Costo de envío del pedido (0 en retiro o si el local no lo
            configuró).

            **Ya está incluido en `total`** — no sumarlo de nuevo.
        total:
          type: number
        lineas:
          type: array
          items:
            type: object
            properties:
              codigo:
                type: string
                nullable: true
                description: >-
                  Tu código del producto (null si el producto se cargó
                  manualmente en Xenda).
              nombre:
                type: string
              cantidad:
                type: integer
              precio_unitario:
                type: number
              subtotal:
                type: number
              opciones:
                type: array
                items:
                  type: object
                  properties:
                    codigo:
                      type: string
                      nullable: true
                    nombre:
                      type: string
                    precio_adicional:
                      type: number
    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_...`).

````