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

# Informar cambio de estado

> Informa la decisión del local sobre un pedido. `aceptado` mueve el pedido a
`en_preparacion`. Si tu sistema asigna repartidor, informá `asignado` (podés
saltear `listo`); al entregar, `entregado`. `rechazado` y `cancelado` requieren
`motivo` — **ese texto le llega al cliente final por WhatsApp**, escribilo
para esa persona.

**Aceptación implícita**: si mandás `listo`, `asignado` o `entregado` sobre un
pedido `pendiente`, lo tomamos como aceptado + el estado que enviaste, en un
solo evento (no hace falta mandar `aceptado` antes). Los pedidos ya cerrados
(`entregado`/`rechazado`/`cancelado`) no admiten más cambios.

Idempotente por `event_id`. Una transición inválida devuelve `400` con el
estado actual del pedido en el mensaje.




## OpenAPI

````yaml /openapi-pos.yaml post /v1/orders/{order_id}/status
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/{order_id}/status:
    post:
      summary: Informar cambio de estado
      description: >
        Informa la decisión del local sobre un pedido. `aceptado` mueve el
        pedido a

        `en_preparacion`. Si tu sistema asigna repartidor, informá `asignado`
        (podés

        saltear `listo`); al entregar, `entregado`. `rechazado` y `cancelado`
        requieren

        `motivo` — **ese texto le llega al cliente final por WhatsApp**,
        escribilo

        para esa persona.


        **Aceptación implícita**: si mandás `listo`, `asignado` o `entregado`
        sobre un

        pedido `pendiente`, lo tomamos como aceptado + el estado que enviaste,
        en un

        solo evento (no hace falta mandar `aceptado` antes). Los pedidos ya
        cerrados

        (`entregado`/`rechazado`/`cancelado`) no admiten más cambios.


        Idempotente por `event_id`. Una transición inválida devuelve `400` con
        el

        estado actual del pedido en el mensaje.
      operationId: updateOrderStatus
      parameters:
        - name: order_id
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StatusRequest'
            example:
              event_id: pos-evt-20260730-003
              occurred_at: '2026-07-30T13:10:00-03:00'
              status: aceptado
      responses:
        '200':
          description: Estado aplicado (o replay idempotente con el estado vigente).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StatusResponse'
        '400':
          description: Transición inválida o `motivo` faltante.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: ERROR_CODE_INPUT_ERROR
                message: >-
                  invalid_transition: aceptado requires status=pendiente
                  (current: entregado)
                payload: ''
        '403':
          $ref: '#/components/responses/AccessDenied'
        '404':
          description: El pedido no existe o no pertenece a esta sucursal.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    StatusRequest:
      type: object
      required:
        - event_id
        - occurred_at
        - status
      properties:
        event_id:
          type: string
        occurred_at:
          type: string
          format: date-time
        status:
          type: string
          enum:
            - aceptado
            - rechazado
            - listo
            - asignado
            - entregado
            - cancelado
        motivo:
          type: string
          description: >-
            Obligatorio en `rechazado` y `cancelado`. Le llega al cliente final
            por WhatsApp.
    StatusResponse:
      type: object
      properties:
        duplicate:
          type: boolean
        order_id:
          type: integer
        status:
          type: string
          description: Estado resultante (`aceptado` → `en_preparacion`).
    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_...`).

````