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

# Crear un envío

> Acepta una cotización vigente y crea la entrega con el precio y la hora de retiro cotizados, sin recalcular nada. Se cobra a tu cuenta (si tu cuenta usa saldo prepago, debe alcanzar). Puedes reintentar sin riesgo: la misma cotización siempre devuelve la misma entrega. Responde 409 si la cotización venció. Si aceptas tarde, la hora de retiro puede correrse; si el local ya no está abierto para retirar, responde `storeClosed`. La entrega trae `requiresDeliveryVerificationCode`: el código que tu cliente debe decirle al repartidor para cerrar la entrega. Entrégaselo a tu cliente (por ejemplo, en el seguimiento o en un mensaje). Si recibes un error 500 o un timeout, reintenta con la misma cotización: si la entrega alcanzó a crearse, la recibes (en el peor caso, tras 5 minutos). Un externalId ya usado en otra entrega responde `externalIdAlreadyUsed`. Para seguir la entrega usa GET /deliveries/{deliveryId}, el webhook `deliveries.delivery.updated` y POST /deliveries/{deliveryId}/cancel para cancelarla.

Acepta una cotización vigente y crea la entrega con el precio y la hora de retiro cotizados, sin recalcular nada. Envía el `quoteId` y los datos de quien recibe en `receiver` (nombre y teléfono con código de país). El contacto en el local de retiro (`sender`) usa por defecto el nombre y el teléfono del local.

La entrega se cobra a tu cuenta de integrador. Si tu cuenta usa saldo prepago, debe alcanzar para cubrirla. La respuesta incluye la cotización aceptada en `quote` (con `status: "accepted"`, el `deliveryId` y la hora de retiro definitiva) y la entrega en `delivery`, con el mismo formato que [Obtener una entrega](https://docs.getjusto.com/docs/admin/delivery/get.md). La entrega trae el código de entrega (`requiresDeliveryVerificationCode`) que tu cliente debe decirle al repartidor para recibir el paquete: entrégaselo.

Puedes reintentar sin riesgo con los mismos datos: la misma cotización siempre devuelve la misma entrega. Si reintentas con otro `externalId` u otro valor de `simulation` mientras la cotización se está aceptando, responde `409` con `bookingMismatch`. Si la cotización venció responde `409` con `quoteExpired`, y si otra solicitud la está aceptando en ese momento, `409` con `quoteBeingAccepted`. Para seguir la entrega usa [Obtener una entrega](https://docs.getjusto.com/docs/admin/delivery/get.md), el webhook [`deliveries.delivery.updated`](https://docs.getjusto.com/docs/admin/last-mile/webhooks/delivery-updated) y [Cancelar una entrega](https://docs.getjusto.com/docs/admin/delivery/cancel.md).

Para probar tu integración sin repartidores reales, crea el envío desde una cuenta de pruebas con el campo `simulation`: lo atiende una flota simulada y no se cobra. Ver [Probar la integración](https://docs.getjusto.com/docs/admin/last-mile/test-deliveries.md).


## OpenAPI

````yaml post /admin/last-mile/deliveries
openapi: 3.1.0
info:
  title: Justo API
  version: 3.0.0
servers:
  - url: https://api.service.getjusto.com/v3
    description: Servidor de producción
security: []
paths:
  /admin/last-mile/deliveries:
    post:
      summary: Crear un envío desde una cotización
      description: >-
        Acepta una cotización vigente y crea la entrega con el precio y la hora
        de retiro cotizados, sin recalcular nada. Se cobra a tu cuenta (si tu
        cuenta usa saldo prepago, debe alcanzar). Puedes reintentar sin riesgo:
        la misma cotización siempre devuelve la misma entrega. Responde 409 si
        la cotización venció. Si aceptas tarde, la hora de retiro puede
        correrse; si el local ya no está abierto para retirar, responde
        `storeClosed`. La entrega trae `requiresDeliveryVerificationCode`: el
        código que tu cliente debe decirle al repartidor para cerrar la entrega.
        Entrégaselo a tu cliente (por ejemplo, en el seguimiento o en un
        mensaje). Si recibes un error 500 o un timeout, reintenta con la misma
        cotización: si la entrega alcanzó a crearse, la recibes (en el peor
        caso, tras 5 minutos). Un externalId ya usado en otra entrega responde
        `externalIdAlreadyUsed`. Para seguir la entrega usa GET
        /deliveries/{deliveryId}, el webhook `deliveries.delivery.updated` y
        POST /deliveries/{deliveryId}/cancel para cancelarla.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/apiLastMileDeliveryInput'
      responses:
        '200':
          description: Respuesta exitosa
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    $ref: '#/components/schemas/apiLastMileDeliveryResult'
        '400':
          description: Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: 'false'
                  error:
                    type: object
                    properties:
                      error:
                        type: string
                        example: error
                      message:
                        type: string
                        example: The request has an error
        '409':
          description: >-
            La cotización venció (`quoteExpired`) o se está aceptando en otra
            solicitud (`quoteBeingAccepted`). Si venció, pide una nueva.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: object
                    properties:
                      error:
                        type: string
                        enum:
                          - quoteExpired
                          - quoteBeingAccepted
                      message:
                        type: string
components:
  schemas:
    apiLastMileDeliveryInput:
      type: object
      required:
        - quoteId
        - receiver
      additionalProperties: false
      properties:
        quoteId:
          type: string
          description: ID de una cotización vigente (POST /last-mile/quotes).
        receiver:
          type: object
          required:
            - name
            - phone
          additionalProperties: false
          description: Quién recibe el paquete.
          properties:
            name:
              type: string
              description: Nombre.
            phone:
              type: string
              description: Teléfono con código de país, por ejemplo +56912345678.
        sender:
          type: object
          additionalProperties: false
          description: >-
            Contacto en el local. Por defecto, el nombre y el teléfono del
            local.
          properties:
            name:
              type: string
              description: Nombre.
            phone:
              type: string
              description: Teléfono con código de país.
        instructions:
          type: string
          description: Indicaciones para el repartidor.
        extendedAddress:
          type: string
          description: Departamento u oficina, si no venía en la dirección cotizada.
        externalId:
          type: string
          description: Tu identificador del envío. Reemplaza el enviado en la cotización.
        simulation:
          type: object
          required:
            - mode
          additionalProperties: false
          description: >-
            Entrega de prueba atendida por la flota simulada de Justo: no se
            ofrece a repartidores reales ni se cobra, y dispara los mismos
            webhooks que una entrega real. Solo está disponible para cuentas que
            todavía no están activas; si tu cuenta ya opera, pide a Justo una
            cuenta de pruebas (si no, responde `simulationNotAllowed`). Justo
            habilita el simulador por zona.
          properties:
            mode:
              type: string
              enum:
                - auto
                - custom
              description: >-
                auto: un repartidor simulado acepta, viaja en línea recta
                reportando su GPS cada 30 segundos, retira y entrega por sí
                solo. custom: igual, con la duración de cada paso que envíes en
                timings.
            scenario:
              type: string
              enum:
                - none
                - driverCancels
                - notDelivered
                - returnToStore
              description: >-
                Escenario de falla. driverCancels: el repartidor libera la
                entrega antes de retirar y la toma otro. notDelivered: no se
                pudo entregar y se cierra como no entregada. returnToStore: no
                se pudo entregar y el paquete vuelve al local.
            timings:
              type: object
              description: >-
                Solo con mode custom. Segundos de cada paso (0 a 600); lo que no
                envíes usa los tiempos de auto.
              properties:
                acceptAfterSeconds:
                  type: number
                  minimum: 0
                  maximum: 600
                arriveAtPickupAfterSeconds:
                  type: number
                  minimum: 0
                  maximum: 600
                pickupAfterSeconds:
                  type: number
                  minimum: 0
                  maximum: 600
                arriveAtDropoffAfterSeconds:
                  type: number
                  minimum: 0
                  maximum: 600
                deliverAfterSeconds:
                  type: number
                  minimum: 0
                  maximum: 600
      example:
        quoteId: lmq-0193...
        receiver:
          name: Camila Rojas
          phone: '+56912345678'
        instructions: Dejar en conserjería
    apiLastMileDeliveryResult:
      type: object
      properties:
        quote:
          $ref: '#/components/schemas/apiLastMileQuote'
        delivery:
          $ref: '#/components/schemas/apiDeliveryWithoutOrder'
    apiLastMileQuote:
      type: object
      description: >-
        Cotización guardada. Garantiza el precio y la hora de retiro hasta
        `expiresAt`. Para crear la entrega envía su `id` a POST
        /last-mile/deliveries antes de que venza.
      properties:
        id:
          type: string
          description: ID de la cotización.
          example: lmq-0193...
        status:
          type: string
          enum:
            - open
            - accepting
            - accepted
            - expired
          description: >-
            `open`: se puede aceptar. `accepting`: se está creando la entrega.
            `accepted`: ya tiene entrega (`deliveryId`). `expired`: venció sin
            aceptarse.
        expiresAt:
          type: string
          example: '2020-01-01T00:00:00.000Z'
          format: date-time
          description: Hasta cuándo se puede aceptar.
        pickupAt:
          type: string
          example: '2020-01-01T00:00:00.000Z'
          format: date-time
          description: >-
            Hora de retiro que Justo asegura, en el local y dentro de su
            horario. Si cotizaste sin `pickupAt` y aceptas varios minutos
            después, se corre en la misma medida: la hora definitiva viene al
            crear la entrega.
        estimatedDeliveryAt:
          type: string
          example: '2020-01-01T00:00:00.000Z'
          format: date-time
          description: Hora estimada de entrega en el destino.
        store:
          type: object
          description: >-
            Local elegido: el más cercano al destino entre los candidatos
            abiertos.
          properties:
            storeId:
              type: string
              description: ID Justo del local.
            name:
              type: string
              description: Nombre del local.
        fromAddress:
          $ref: '#/components/schemas/apiLastMileAddress'
        toAddress:
          $ref: '#/components/schemas/apiLastMileAddress'
        package:
          $ref: '#/components/schemas/apiLastMilePackage'
        vehicleType:
          type: string
          enum:
            - moto
            - car
          description: Tipo de vehículo que puede transportar el paquete.
        distanceMeters:
          type: integer
          description: Distancia por calle del local al destino.
        price:
          type: number
          description: >-
            Precio sin impuestos. Si el paquete necesita auto, incluye el
            recargo fijo por auto.
        priceWithTax:
          type: number
          description: 'Precio con impuestos: lo que se factura.'
        currency:
          type: string
          description: Moneda (CLP, COP, MXN, PEN…).
        externalId:
          type: string
          description: Tu identificador del envío.
        deliveryId:
          type: string
          description: Entrega creada desde esta cotización.
        createdAt:
          type: string
          example: '2020-01-01T00:00:00.000Z'
          format: date-time
          description: Fecha de la cotización.
    apiDeliveryWithoutOrder:
      type: object
      description: >-
        Entrega de Justo Delivery creada sin un pedido de Justo Ecommerce
        asociado. Se usa para despachos manuales o integraciones externas que
        necesitan logística fuera del checkout de Justo.
      properties:
        _id:
          type: string
          description: ID Justo de la entrega.
        websiteId:
          type: string
          description: ID de la marca autorizada.
        storeId:
          type: string
          description: ID Justo del local que solicita la entrega.
        orderId:
          type: string
          description: Siempre null para entregas sin pedido.
        partner:
          type: string
          description: Partner logístico usado para la entrega.
        status:
          type: string
          description: Estado actual de la entrega.
          enum:
            - active
            - canceled
            - done
            - error
            - pending
            - scheduled
            - delivering
            - waiting
            - unconfirmed
        specialCode:
          type: string
          description: Código corto de entrega especial.
        externalId:
          type: string
          description: Identificador externo opcional enviado por la integración.
        price:
          type: number
          description: Precio del despacho con impuestos, sin propina.
        priceWithoutTax:
          type: number
          description: Precio sin impuestos.
        tipAmount:
          type: number
          description: Propina registrada para el repartidor, en moneda del local.
        receiveProofImage:
          type:
            - string
            - 'null'
          description: >-
            URL de la imagen de evidencia del retiro. Null si no hay una imagen
            registrada.
          format: uri
        deliverProofImage:
          type:
            - string
            - 'null'
          description: >-
            URL de la imagen de evidencia de la entrega. Null si no hay una
            imagen registrada.
          format: uri
        isCash:
          type: boolean
          description: Indica si el repartidor debe cobrar efectivo.
        isRoundTrip:
          type: boolean
          description: Indica si el repartidor debe volver al origen.
        instructions:
          type: string
          description: Instrucciones operativas para el repartidor.
        fromName:
          type: string
          description: Nombre de contacto en origen.
        toName:
          type: string
          description: Nombre de contacto en destino.
        fromPlaceId:
          type: string
          description: Place ID de origen.
        toPlaceId:
          type: string
          description: Place ID de destino.
        fromAddressLine2:
          type: string
          description: Complemento de dirección de origen.
        toAddressLine2:
          type: string
          description: Complemento de dirección de destino.
        fromLocation:
          $ref: '#/components/schemas/apiDeliveryLocation'
        toLocation:
          $ref: '#/components/schemas/apiDeliveryLocation'
        location:
          type:
            - object
            - 'null'
          description: >-
            Última ubicación del repartidor. Disponible al consultar el detalle
            mientras está en retiro, en camino o en espera; null en los demás
            estados.
          required:
            - lat
            - lng
          properties:
            lat:
              type: number
              description: Latitud del repartidor.
            lng:
              type: number
              description: Longitud del repartidor.
            updatedAt:
              type: string
              example: '2020-01-01T00:00:00.000Z'
              format: date-time
              description: Fecha del reporte GPS; no es la hora de consulta.
        driverInformation:
          type:
            - object
            - 'null'
          description: Información del repartidor asignado, si está disponible.
          properties:
            name:
              type: string
              description: Nombre del repartidor.
            code:
              type: string
              description: Código del repartidor.
            type:
              type: string
              description: Tipo de vehículo.
        driverPassword:
          type: string
          description: Código de verificación del repartidor, si aplica.
        trackingURL:
          type: string
          description: URL de tracking público de la entrega.
        requiresDeliveryVerificationCode:
          type: string
          description: >-
            Código de entrega que el destinatario debe decirle al repartidor
            para que pueda cerrar la entrega. Las entregas de última milla
            siempre lo traen: entrégaselo a tu cliente.
        lastMileQuoteId:
          type: string
          description: >-
            ID de la cotización de última milla desde la que se creó la entrega
            (POST /last-mile/deliveries).
        createdAt:
          type: string
          example: '2020-01-01T00:00:00.000Z'
          format: date-time
          description: Fecha de creación.
        forDate:
          type: string
          example: '2020-01-01T00:00:00.000Z'
          format: date-time
          description: Fecha programada de la entrega.
        canceledAt:
          type: string
          example: '2020-01-01T00:00:00.000Z'
          format: date-time
          description: Fecha de cancelación.
        completedAt:
          type: string
          example: '2020-01-01T00:00:00.000Z'
          format: date-time
          description: Fecha de término.
    apiLastMileAddress:
      type: object
      properties:
        streetAddress:
          type: string
          description: Calle y número.
        extendedAddress:
          type: string
          description: Departamento, oficina, piso o block.
        locality:
          type: string
          description: Comuna o localidad.
        region:
          type: string
          description: Región o estado.
        countryCode:
          type: string
          description: País en ISO 3166-1 alfa-2.
        location:
          type: object
          required:
            - lat
            - lng
          additionalProperties: false
          properties:
            lat:
              type: number
              description: Latitud.
              example: -33.4290115
            lng:
              type: number
              description: Longitud.
              example: -70.6211027
          description: Coordenadas usadas para la distancia y el precio.
    apiLastMilePackage:
      type: object
      description: >-
        Paquete a despachar. Según su peso y sus medidas, Justo envía un
        repartidor en un vehículo que pueda transportarlo. Si el paquete
        necesita un auto, el local debe tener `acceptsCar: true` y el precio
        incluye un recargo fijo por auto.
      required:
        - weightKg
        - lengthCm
        - widthCm
        - heightCm
        - valueAmount
      additionalProperties: false
      properties:
        weightKg:
          type: number
          exclusiveMinimum: 0
          description: Peso en kilos.
        lengthCm:
          type: number
          exclusiveMinimum: 0
          description: Largo en centímetros.
        widthCm:
          type: number
          exclusiveMinimum: 0
          description: Ancho en centímetros.
        heightCm:
          type: number
          exclusiveMinimum: 0
          description: Alto en centímetros.
        valueAmount:
          type: number
          minimum: 0
          description: Valor declarado del contenido, en la moneda del país del local.
        description:
          type: string
          description: Qué contiene, por ejemplo "Caja de chocolates".
      example:
        weightKg: 1.2
        lengthCm: 30
        widthCm: 20
        heightCm: 10
        valueAmount: 25990
    apiDeliveryLocation:
      type: object
      description: Punto de origen o destino de una entrega sin pedido.
      properties:
        address:
          type: string
          description: Dirección principal.
        addressSecondary:
          type: string
          description: Comuna, ciudad o referencia secundaria.
        placeId:
          type: string
          description: ID del lugar.
        streetAddress:
          type: string
          description: Calle y número.
        extendedAddress:
          type: string
          description: Departamento, oficina o referencia.
        contactPhone:
          type: string
          description: Teléfono de contacto del punto.
        contactName:
          type: string
          description: Nombre de contacto del punto.
        lat:
          type: number
          description: Latitud.
        lng:
          type: number
          description: Longitud.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.