TABLE OF CONTENTS

En este artículo explicaremos los conceptos básicos de la integración con la API B2B de Moova para realizar un envío

URL base para el entorno de prueba: https://api-dev.moova.io/b2b
URL base para el  entorno de Producciónhttps://api-prod.moova.io/b2b 


Requisitos


Es necesarios tener estos requisitos cumplidos para poder avanzar en el desarrollo de la integración.

  • Haberse dado de alta en producción y en el entorno de testing. Si no lo hiciste aún ver las instrucciones aquí. 

  • Tener el APP ID y la KEY de Testing y Producción para poder realizar las pruebas, las mismas las puedes encontrar en el siguiente enlace https://dev.moova.io/ y siguiendo los pasos que dejamos a continuación. 

  1. Iniciar sesión
  2. Dirigirnos al marco superior derecho y hacer click en la imagen e ir a "Área de empresa".
  3. Luego hacer click en API/Webhook y te mostrara las Credenciales de la API





La documentación formal de la API la encontrarás en swagger aquí. Este es un documento que explica casos de uso para un mejor entendimiento sobre como utilizar este Endpoint.



Utilizar

URL entorno de prueba: https://api-dev.moova.io/b2b/shippings

URL entorno de Producción:  https://api-prod.moova.io/b2b/shippings

Método: POST 


Headers:

Authorization: Key( Clave secreta )(Preguntar a Axel por que así funciona y antes estaba en los dos la misma)


Query:

appId: ID de aplicación provisto


Campos

scheduledDate: (opcional) Esta es la fecha y hora en que se pasara de manera automatica al estado "READY" (listo para retirar). Si prefieres hacerlo mediante un "endpoint" se explica con más detalle en la sección "Cambio de estado y ciclo de vida de un envío". La fecha y hora se deben enviar en formato UTC con el siguiente formato: "AAAA-MM-DD HH:MM:SS". 


deliveryTimeRange:  (Opcional) Definir el rango horario en que se quiere realizar el envío. Las opciones son "AM" o "PM". Para que este parámetro sea tenido en cuenta, scheduledDate tiene que tener una fecha mayor al día donde se está creando el envío. Este parámetro sirve para envío que serán realizados en el futuro no para envíos sameday.


packagesCount: (Opcional) Valor numérico que especifica la cantidad de bultos que contiene el envío. Cuando se pidan etiquetas se imprimirán tantas etiquetas para este envío como cantidad de paquetes haya. OJO: no confundir con los items de un envío. Por ejemplo un envío puede tener 9 items (5 vasos y 4 platos) dentro de 2 cajas. Este valor de 2 cajas es el valor en packagesCount. Si es un solo paquete se puede omitir directamente en el payload.


type : tipo de envío. Pueden ser :

  • regular : Envío que se debiera utilizar normalmente. Se realizará el mismo día si se cambia a estado 'READY' antes de la hora corte, si no será realizado al día siguiente

  • minutes_90 : Envío que se necesite hacer en 2-3 horas desde que sube al sistema o desde un horario específico en el futuro por ejemplo (mañana a las 10 Am). Si un envío es del tipo minutes_90 debe ir con el parámetro flow: automatic. El tipo de envío minutes_90 tiene un costo más elevado que el regular y tiene que ser habilitado por el equipo comercial de Moova

  • mercado_flex : para envíos del tipo Mercado Libre Flex. La promesa de entrega es la misma que un regular, pero se le recordará al Moover que tiene que escanear dentro de la app de FLEX para no ser penalizados.

  • pickup : Este último únicamente debiera utilizarse luego de haber confirmado con Moova el uso que se le va a dar. En la mayoría de los casos es un envío generado automáticamente por Moova, para hacer la recolección de todos los paquetes y llevados a nuestro depósito

  • next_day: Estos envíos serán recolectados el mismo día, luego serán llevados a nuestro depósito y al día siguiente serán entregados al cliente final.

  • food: Envío de comida o bebida que requiere un tiempo rápido de resolución y que el moover disponga de una mochila térmica para su traslado. Este envío suele ir con el parámetro flow: automatic

flow: 

  • manual: Este es el flow normal de un envío. Este envío no se irá a buscar hasta que se pase al estado READY. Se puede crear este envío para generar etiquetas y luego cuando esté listo el paquete (ya sea el mismo día o dentro de 90 días) entonces pasarlo a READY. Recién en ready un operador de moova lo irá a buscar.
  • semi-automatic: Crea un envío y deja el envío en moova en estado READY. Esto significa que una vez creado el envío, está listo para que lo pasemos a retirar. Si el pedido fue creado antes de la hora corte, se retirará ese mismo día, si no, será el día siguiente.
  • automatic: Solo usar con  minutes_90 o food. El envío entrará al sistema de manera automática y buscará un mensajero de manera automática para realizarlo de manera inmediata. Usar este flow solo si se coordino con Moova antes.
  • warehouse: Este flujo tiene que ser revisado con el equipo de ventas. Aplica si tu pedido es consolidado en nuestro warehouse y luego entregado al cliente final


currency: string de 3 letras que define el tipo de moneda según el ISO 4217. Ejemplo: ars para Argentina.


from: Datos del que envía el objeto con los datos de la dirección. El primer valor que se toma es el "googlePlaceId" si no se sabe, no deben enviarlo. Después se interpreta las coordenadas. Si no lo saben, no enviar el campo. Después deben mandar "addres" y ultimo la direccion dividida. En "contact", va la persona de contacto en caso que tengamos alguna duda sobre este envío. Se debe elegir un solo metodo solo, no hay que mandar todos los campos juntos.


to: Datos del que recibe el objeto con los datos de la dirección. El primer valor que se toma es el "googlePlaceId" si no se sabe, no deben enviarlo. Después se interpreta las coordenadas. Si no lo saben, no enviar el campo. Después deben mandar "address" y ultimo la direccion dividida.  En "contact", va la persona de contacto en caso que tengamos alguna duda sobre este envío. En caso de tener el teléfono es muy importante que se incluya dado que ayudará a que la entrega sea más rápida y efectiva. Se debe elegir un solo metodo solo, no hay que mandar todos los campos juntos.


to.message: mensaje particular para dejar en ese destino (no es lo mismo que las instrucciones para la dirección).


internalCode: (opcional) código interno de la empresa que pide el envío para este envío. En caso de ingresar los operadores podrán ubicar en búsquedas este envío por su código interno.


comments: (opcional) comentario general sobre el envío.


extra: (opcional) objeto con cualquier valor extra que se quiera agregar.


settings:(opcional)  los settings son características especiales de un shipping en particular. Lo normal es que NO haya ningún setting. Hay un endpoint para ver los setting disponibles: /shipping-setting-options


    {
"id":1,
"name":"PickupSignature",
"description":"Requiere firma en el pickup",

},
{
"id":2,
"name":"PickupPhoto",
"description":"Requiere foto en el pickup",
}


El caso de uso más habitual utilizar los settings (1 y 2) es en la logística inversa donde se quiere tener firma y foto del pickup.

conf: (opcional) información sobre el paquete que se va a transportar.


conf.assurace: (opcional) relativo al seguro. Por el momento ponerlo en null. No está implementado por el momento.


conf.item :(opcional)  información sobre el precio, peso (gramos), largo (cm), ancho(cm) y alto del objeto(cm). En caso de no tener el dato poner null.



Errores Comunes:


A la hora de crear cualquier envío les puede salir el cartel "No se encontró presupuesto" Esto significa que o no están ingresando direcciones dentro del area valida para la entrega, es importante que prueben con otras direcciones que sepan que están dentro del area, o probando una dirección mas completa.

Debajo tienen varios ejemplos de como cargar estos datos de diferentes formas dependiendo sus requisitos. 



Ejemplo de payload  street y number separado mas habitual

 {
"currency": "ARS",
"type": "regular",
"flow": "manual",
"from": {
"street": "Av. Santa Fe",
"number": "2678",
"floor": "6to",
"apartment": "C",
"city": "Capital Federal",
"state": "Capital Federal",
"postalCode": "1425",
"country": "AR",
"instructions": "No funciona el timbre. Llamar antes",
"contact": {
"firstName": "Juan",
"lastName": "Perez",
"email": "xxxxxx@gmail.com",
"phone": "+54 9 11 6576 3432"
}
},
"to": {
"street": "Blas Parera",
"number": "51",
"floor": "7to",
"apartment": "C",
"city": "Florida",
"state": "Buenos Aires",
"postalCode": "B1602",
"country": "AR",
"instructions": "No funciona el timbre. Llamar antes",
"contact": {
"firstName": "Juan",
"lastName": "Perez",
"email": "",
"phone": "+54 11 7658 3443"
},
"message": ""
},
"internalCode": "XX475738YY",
"extra": {},
"conf": {
"assurance": false
},
"items": [
{
"description": "Tarjeta",
"referenceCode": "18-X0-99",
"serialNumber": null,
"price": 150,
"currency": "ARS",
"weight": 20,
"length": 20,
"width": 20,
"height": 20,
"quantity": 1
},
{
"description": "Libro X",
"price": 140,
"currency": "ARS",
"weight": 20,
"length": 20,
"width": 20,
"height": 20,
"quantity": 1
},
{
"description": "Auriculares",
"price": 140,
"currency": "ARS",
"weight": 20,
"length": 20,
"width": 20,
"height": 20,
"quantity": 1
}
]
}

Response

{
"id": "25debfd0-fd12-11ea-b375-87a079a4fb9e",
"scheduledDate": null,
"type": "regular",
"priceFormatted": "$329,86",
"price": "329.86",
"currency": "ARS",
"from": {
"placeId": 63,
"googlePlaceId": "ChIJYVOqvJrKvJURbO0qQqXC8MA",
"address": "Av. Santa Fe 2678, C1425BGO CABA, Argentina",
"addressExtra": "6to C",
"contact": "Juan Perez",
"email": "xxxxxx@gmail.com",
"phone": "+54 9 11 6576 3432",
"instructions": "No funciona el timbre. Llamar antes",
"coords": {
"lat": "-34.59361200",
"lng": "-58.40485790"
}
},
"to": {
"placeId": 56994,
"googlePlaceId": "ChIJg5OihcO2vJURAjUW8Qjjd0c",
"address": "Blas Parera 51, B1602 Florida, Provincia de Buenos Aires, Argentina",
"addressExtra": "7to C",
"contact": "Juan Perez",
"email": "",
"phone": "+54 11 7658 3443",
"instructions": "No funciona el timbre. Llamar antes",
"coords": {
"lat": "-34.54533850",
"lng": "-58.49378440"
}
},
"status": "DRAFT",
"secretCode": "7062",
"internalCode": "XX475738YY",
"internalOrderId": null,
"description": null,
"hash": "6a7fd49208808962fbe1c4fe7525546aa9bd46745725f5c6fcd77ea0c20305e1",
"message": "",
"extra": [],
"conf": {
"assurance": false
},
"deliveryInfo": {
"courier": null,
"lat": null,
"lng": null
},
"statusHistory": [
{
"status": "DRAFT",
"details": null,
"createdAt": "2020-09-22 20:28:17"
}
],
"activeSettings": [
{
"id": 5,
"name": "SignaturePhoto",
"apply_to_all": 1,
"description": "Instead of ask for a signature, take a picture of the package.",
"message": "Debido al coronavirus, en vez de solicitar la firma, por favor saca una foto al DNI de la persona que recibe el pedido",
"created_at": "2020-03-17 11:33:16",
"updated_at": "2020-03-17 11:33:16",
"deleted_at": null,
"laravel_through_key": "25debfd0-fd12-11ea-b375-87a079a4fb9e"
},
{
"id": 6,
"name": "DeliveryUserIdentification",
"apply_to_all": 1,
"description": "Request user identification when shipping is delivered",
"message": "Documento de identidad",
"created_at": "2020-03-17 11:33:16",
"updated_at": "2020-03-17 11:33:16",
"deleted_at": null,
"laravel_through_key": "25debfd0-fd12-11ea-b375-87a079a4fb9e"
}
],
"relatedShippings": {
"previous": null,
"next": null
},
"items": [
{
"description": "Tarjeta",
"refenceCode": "18-X0-99",
"serialNumber": null,
"price": 150,
"currency": "ARS",
"weight": 20,
"length": 20,
"width": 20,
"height": 20,
"quantity": 1
},
{
"description": "Libro X",
"refenceCode": null,
"serialNumber": null,
"price": 140,
"currency": "ARS",
"weight": 20,
"length": 20,
"width": 20,
"height": 20,
"quantity": 1
},
{
"description": "Auriculares",
"refenceCode": null,
"serialNumber": null,
"price": 140,
"currency": "ARS",
"weight": 20,
"length": 20,
"width": 20,
"height": 20,
"quantity": 1
}
],
"createdAt": "2020-09-22 20:28:17"
}



Ejemplo de payload con la dirección en una sola linea


La dirección se pueden enviar en una sola línea en el campo address, pero es muy importante que el piso y/o departament vengan por separado en sus campos floor y apartment

Correcto : "address": "Vidal 1432, CABA, Argentina"

Incorrecto: "address": "Vidal 1432 4 Piso B, CABA, Argentina"

Correcto:  "address": "Blas Parera 51, B1602 Florida, Provincia de Buenos Aires, Argentina" Incorrecto:  "address": "Blas Parera 51, 7 Piso B, B1602 Florida, Provincia de Buenos Aires, Argentina"

{
"currency": "ARS",
"type": "regular",
"flow": "manual",
"from": {
"address": "Vidal 1432, CABA, Argentina",
"floor": "6to",
"apartment": "C",
"country": "AR",
"instructions": "No funciona el timbre. Llamar antes",
"contact": {
"firstName": "Juan",
"lastName": "Perez",
"email": "xxxxxx@gmail.com",
"phone": "+54 9 11 6576 3432"
}
},
"to": {
"street": "Blas Parera",
"number": "51",
"floor": "7to",
"apartment": "C",
"city": "Florida",
"state": "Buenos Aires",
"postalCode": "B1602",
"country": "AR",
"instructions": "No funciona el timbre. Llamar antes",
"contact": {
"firstName": "Juan",
"lastName": "Perez",
"email": "mdetry@gmail.com",
"phone": "+54 11 7658 3443"
},
"message": ""
},
"internalCode": "XX475738YY",
"extra": {},
"conf": {
"assurance": false
},
"items": [
{
"description": "iPhone",
"price": 150,
"currency": "ARS",
"weight": 900,
"length": 20,
"width": 20,
"height": 20,
"quantity": 1
}
]
}

Ejemplo de payload donde envío a dirección a través de un Google Place ID y también ejemplo de settings.

 {
"scheduledDate": "2021-02-20 15:00:00",
"currency": "ARS",
"type": "minutes_90",
"flow": "automatic",
"from": {
    "googlePlaceId": "ChIJYVOqvJrKvJURbO0qQqXC8MA",
"floor": "6to",
"apartment": "C",
"city": "Capital Federal",
"state": "Capital Federal",
"postalCode": "1425",
"country": "AR",
"instructions": "No funciona el timbre. Llamar antes",
"contact": {
"firstName": "Juan",
"lastName": "Perez",
"email": "",
"phone": "+54 11 8786 1232"
},
"message": ""
},
"to": {
    "googlePlaceId": null,
"street": "Avenida Córdoba",
"number": "1500",
"floor": "3to",
"apartment": "F",
"city": "CABA",
"state": "CABA",
"postalCode": "1055",
"country": "AR",
"instructions": "Entregar al Portero",
"contact": {
"firstName": "Juan",
"lastName": "Perez",
"email": "",
"phone": "+54 11 6765 8765"
},
"message": ""
},
"internalCode": "X23454",
"description": "string",
"label": "string",
"extra": {},
"settings": [1, 2],
"conf": {
"assurance": false
},
"items": [
{
"description": "iPhone",
"price": 150,
"currency": "ARS",
"weight": 900,
"length": 20,
"width": 20,
"height": 20,
"quantity": 1
}
]
}

Response

{
"id": "b9255870-6166-11ea-914b-ff471ce5170b",
"scheduledDate": "2021-02-20 15:00:00",
"type": "minutes_90",
"priceFormatted": "$ 200,00",
"price": 200,
"currency": "ARS",
"from": {
"placeId": 63,
"googlePlaceId": "ChIJYVOqvJrKvJURbO0qQqXC8MA",
"address": "Av. Santa Fe 2678, C1425BGO CABA, Argentina",
"addressExtra": "6to C",
"contact": "Juan Perez",
"email": "",
"phone": "+54 11 8786 1232",
"instructions": "No funciona el timbre. Llamar antes"
},
"to": {
"placeId": 258,
"googlePlaceId": "ChIJGTa0WcfKvJUReHvuhmo0zpE",
"address": "Av. Córdoba 1500, C1055AAR CABA, Argentina",
"addressExtra": "3to F",
"contact": "Juan Perez",
"email": "",
"phone": "+54 11 6765 8765",
"instructions": "Entregar al Portero"
},
"status": "WAITING",
"secretCode": "6975",
"internalCode": "X23454",
"internalOrderId": null,
"description": "string",
"hash": "eff81c0aaefe7a39e43e1c5ff52762eda533fd77aad5d743d3841b5ba1e90d0d",
"message": "",
"extra": [],
"conf": {
"assurance": false
},
"deliveryInfo": {
"courier": null,
"lat": null,
"lng": null
},
"statusHistory": [
{
"status": "WAITING",
"details": null,
"createdAt": "2020-03-08 18:00:40"
}
],
"activeSettings": [
{
"id": 1,
"name": "PickupSignature",
"description": "In order to pick up this shipping the sender must provide a signature",
"created_at": "2020-02-10 14:31:44",
"updated_at": "2020-02-10 14:31:44",
"deleted_at": null,
"shipping_id": "b9255870-6166-11ea-914b-ff471ce5170b"
},
{
"id": 2,
"name": "PickupPhoto",
"description": "In order to pick up this shipping is mandatory to take a picture of the package",
"created_at": "2020-02-10 14:31:44",
"updated_at": "2020-02-10 14:31:44",
"deleted_at": null,
"shipping_id": "b9255870-6166-11ea-914b-ff471ce5170b"
}
],
"relatedShippings": {
"previous": null,
"next": null
},
"items": [
{
"description": "iPhone",
"referenceCode": null,
"serialNumber": null,
"price": 150,
"currency": "ARS",
"weight": 900,
"length": 20,
"width": 20,
"height": 20,
"quantity": 1
}
],
"createdAt": "2020-03-08 18:00:40"
}

Ejemplo de payload con coordenadas en lugar de direcciones

En ocasiones hay zonas o calles que no son fácilmente detectadas por los servicios de direcciones, en dicho caso se soporta la opción de enviar las coordenadas para identificar los puntos de origen y/o destino. En dicho caso además de las coordenadas deben enviarse una descripción de la dirección, la cual quedará adjunta a las indicaciones para el moover que realizará el envío.

{
"currency": "ARS",
"type":"regular",
"flow":"manual",
"from": {
"coords": {
"lat":-34.55943430,
"lng":-58.45851540
},
"addressDescription":"Av. Cabildo 2351",
"floor": "6to",
"apartment": "C",
"instructions": "No funciona el timbre. Llamar antes",
"contact": {
"firstName": "Juan",
"lastName": "Perez",
"email": "xxxxx@gmail.com",
"phone": "+54 9 11 6576 3432"
}
},
"to": {
"coords": {
"lat":-34.58267030,
"lng":-58.41209520
},
"addressDescription":"French 4351",
"floor": "6to",
"apartment": "C",
"instructions": "No funciona el timbre. Llamar antes",
"contact": {
"firstName": "Antonio",
"lastName": "Prieto",
"email": "aprieto@mailcatch.com",
"phone":"4765-5213"
},
"message": "Es su cumpleaños"
},
"internalCode": "A4564",
"comments": "XX475738YY",
"extra": {},
"conf": {
"assurance": false
},
"items": [
{
"description": "iPhone",
"price": 150,
"currency": "ARS",
"weight": 900,
"length": 20,
"width": 20,
"height": 20,
"quantity": 1
}
]
}

Donde

            id : id del envío de moova de este pedido.

            price : el costo del envío

            from: los datos de la recogida del pedido.

            to: los datos del destino del pedido.

            status: el estado del pedido.

            secretCode : código secreto de este envío que podrá ser utilizado por el receptor del envío para verificar la autenticidad del mismo con el mensajero.

            hash: hash de este envío que será utilizado para visualizar y poder realizar cambios a este envío sin estar logeado a moova. Ejemplo: a) que el usuario verifique la dirección y en caso que no sea correcta que la pueda cambiar. B) enviar una URL al usuario para que pueda seguir el estado del envío.



Ejemplo de payload con pedido de Escaneo de nro de serie.

Este es un caso muy particular, donde el objetivo es que cuando el mensajero realice la entrega, escanee una etiqueta con el nro de serie del producto para que este se guarde y se pueda pedir luego con un GET del shipping.

Para pedir que se escanee el número de serie setear setting en 6.

 "settings": [6]

OJO: a todos los ítems en este envío se les va a pedir el número de serie. En caso de haber varios ítem a entregar en un mismo domicilio, unos con necesidad de escanear número de serie y otros que no por favor generar dos envíos distintos separando los ítem que necesitan escanear el número de serie y los que no.

Aquí vemos un ejemplo de un payload completo para la creación del pedido con necesidad de escaneo de número de serie.

{
"currency": "ARS",
"type": "regular",
"flow": "manual",
"from": {
"street": "Av. Santa Fe",
"number": "2678",
"floor": "6to",
"apartment": "C",
"city": "Capital Federal",
"state": "Capital Federal",
"postalCode": "1425",
"country": "AR",
"instructions": "Intruciones pickup",
"contact": {
"firstName": "Juan",
"lastName": "Perez",
"email": "",
"phone": ""
},
"message": "Mensaje pickup"
},
"to": {
"street": "Av. Santa Fe",
"number": "2678",
"floor": "6to",
"apartment": "C",
"city": "Capital Federal",
"state": "Capital Federal",
"postalCode": "1425",
"country": "AR",
"instructions": "Instrucciones entrega",
"contact": {
"firstName": "Juan",
"lastName": "Perez",
"email": "",
"phone": ""
},
"message": "Mensaje entrega"
},
"internalCode": "string",
"description": "Descripcion del item",
"label": "label del item",
"extra": {},
"settings": [
6
],
"conf": {
"assurance": false
},
"items": [
{
"description": "Tarjeta",
"price": 150,
"weight": 20,
"length": 20,
"width": 20,
"height": 20
},
{
"description": "Post Marca A",
"price": 140,
"weight": 20,
"length": 20,
"width": 20,
"height": 20,
"quantity": 1
},
{
"description": "Post Marca B",
"price": 140,
"weight": 20,
"length": 20,
"width": 20,
"height": 20,
"quantity": 2
}
]
}

Y aquí la response de la creación del payload. Podemos verificar al final dentro de "activeSettings"

que el que tiene ID = 6 está presente que es el que necesitamos. Puede haber otros "activeSettings"

que no pusieron el payload pero que el sistema agrega de manera automática.

    "activeSettings": [

{
"id": 6,
"name": "UpdateDeliveredItems",
"apply_to_all": 0,
"description": "Once the shipping is delivered, update the delivered items",
"message": null,
"created_at": "2021-01-05 19:01:27",
"updated_at": "2021-01-05 19:01:27",
"deleted_at": null,
"laravel_through_key": "b07ae420-5456-11eb-848c-b95db72a2751"
}
]

Aquí la response del payload de creación completo.

{
"id": "b07ae420-5456-11eb-848c-b95db72a2751",
"scheduledDate": null,
"type": "regular",
"priceFormatted": "$100,00",
"price": "100.00",
"currency": "ARS",
"from": {
"placeId": 63,
"googlePlaceId": "ChIJYVOqvJrKvJURbO0qQqXC8MA",
"address": "Av. Santa Fe 2678, C1425BGO CABA, Argentina",
"addressExtra": "6to C",
"contact": "Juan Perez",
"email": "",
"phone": "",
"instructions": "Intruciones pickup",
"coords": {
"lat": "-34.59361200",
"lng": "-58.40485790"
}
},
"to": {
"placeId": 63,
"googlePlaceId": "ChIJYVOqvJrKvJURbO0qQqXC8MA",
"address": "Av. Santa Fe 2678, C1425BGO CABA, Argentina",
"addressExtra": "6to C",
"contact": "Juan Perez",
"email": "",
"phone": "",
"instructions": "Instrucciones entrega",
"coords": {
"lat": "-34.59361200",
"lng": "-58.40485790"
}
},
"status": "DRAFT",
"secretCode": "6063",
"internalCode": "string",
"internalOrderId": null,
"description": "Descripcion del item",
"hash": "15528bb4ff6cf51695390725a0e7bc24e483b5242ff7e50097ceca53abb272b6",
"message": "Mensaje entrega",
"extra": [],
"conf": {
"assurance": false
},
"deliveryInfo": {
"courier": null,
"lat": null,
"lng": null
},
"statusHistory": [
{
"status": "DRAFT",
"details": null,
"createdAt": "2021-01-11 21:48:06"
}
],
"activeSettings": [
{
"id": 3,
"name": "SignaturePhoto",
"apply_to_all": 1,
"description": "Instead of ask for a signature, take a picture of the package.",
"message": "Debido al coronavirus, en vez de solicitar la firma, por favor sacale una foto a la puerta del domicilio donde estás haciendo la entrega.",
"created_at": "2021-01-05 19:01:27",
"updated_at": "2021-01-05 19:01:27",
"deleted_at": null,
"laravel_through_key": "b07ae420-5456-11eb-848c-b95db72a2751"
},
{
"id": 4,
"name": "DeliveryUserIdentification",
"apply_to_all": 1,
"description": "Request user identification when shipping is delivered",
"message": "Documento de identidad",
"created_at": "2021-01-05 19:01:27",
"updated_at": "2021-01-05 19:01:27",
"deleted_at": null,
"laravel_through_key": "b07ae420-5456-11eb-848c-b95db72a2751"
},
{
"id": 6,
"name": "UpdateDeliveredItems",
"apply_to_all": 0,
"description": "Once the shipping is delivered, update the delivered items",
"message": null,
"created_at": "2021-01-05 19:01:27",
"updated_at": "2021-01-05 19:01:27",
"deleted_at": null,
"laravel_through_key": "b07ae420-5456-11eb-848c-b95db72a2751"
}
],
"relatedShippings": {
"previous": null,
"next": null
},
"items": [
{
"price": 150,
"currency": "ARS",
"width": 20,
"height": 20,
"length": 20,
"weight": 20,
"description": "Tarjeta",
"referenceCode": null,
"serialNumber": null,
"quantity": 1
},
{
"price": 140,
"currency": "ARS",
"width": 20,
"height": 20,
"length": 20,
"weight": 20,
"description": "Post Marca A",
"referenceCode": null,
"serialNumber": null,
"quantity": 1
},
{
"price": 140,
"currency": "ARS",
"width": 20,
"height": 20,
"length": 20,
"weight": 20,
"quantity": 2,
"description": "Post Marca B",
"referenceCode": null,
"serialNumber": null,
}
],
"createdAt": "2021-01-11 21:48:06".
}

Luego de que se haya entregado el producto y se haya escaneado el número de serie se puede hacer un get del shipping y nos encontraremos con la información del shippping pero incluyendo el nro de serie.

{
"id": "b07ae420-5456-11eb-848c-b95db72a2751",
"scheduledDate": null,
"type": "regular",
"priceFormatted": "$100,00",
"price": "100.00",
"currency": "ARS",
"from": {
"placeId": 63,
"googlePlaceId": "ChIJYVOqvJrKvJURbO0qQqXC8MA",
"address": "Av. Santa Fe 2678, C1425BGO CABA, Argentina",
"addressExtra": "6to C",
"contact": "Juan Perez",
"email": "",
"phone": "",
"instructions": "Intruciones pickup",
"coords": {
"lat": "-34.59361200",
"lng": "-58.40485790"
}
},
"to": {
"placeId": 63,
"googlePlaceId": "ChIJYVOqvJrKvJURbO0qQqXC8MA",
"address": "Av. Santa Fe 2678, C1425BGO CABA, Argentina",
"addressExtra": "6to C",
"contact": "Juan Perez",
"email": "",
"phone": "",
"instructions": "Instrucciones entrega",
"coords": {
"lat": "-34.59361200",
"lng": "-58.40485790"
}
},
"status": "DELIVERED",
"secretCode": "6063",
"internalCode": "string",
"internalOrderId": null,
"description": "Descripcion del item",
"hash": "15528bb4ff6cf51695390725a0e7bc24e483b5242ff7e50097ceca53abb272b6",
"message": "Mensaje entrega",
"extra": [],
"conf": {
"assurance": false
},
"deliveryInfo": {
"courier": "Thomas Jefferson",
"lat": null,
"lng": null
},
"statusHistory": [
{
"status": "DELIVERED",
"details": {
"receiverUid": "12369580",
"receiverPhone": "",
"courierPosition": {
"lat": "-34.59561000",
"lng": "-58.39461000"
},
"receiverTypeId": 0,
"receiverLastName": "",
"receiverSignature": "https://s3.amazonaws.com/develop.files.moova.io/404/w2LgxTbv6oHfRHH887v4QXSH0ia5C4TZT8FxKxtV.jpg",
"receiverFirstName": "Juan Perez",
"receiverAddressExtra": "6to C",
"receiverAddressNumber": "",
"receiverAddressStreet": "Av. Santa Fe 2678, C1425BGO CABA, Argentina"
},
"createdAt": "2021-01-12 10:55:46"
},
{
"status": "INTRANSIT",
"details": {
"courierPosition": {
"lat": "-34.59564000",
"lng": "-58.39462300"
}
},
"createdAt": "2021-01-12 10:52:37"
},
{
"status": "PICKEDUP",
"details": null,
"createdAt": "2021-01-12 10:52:37"
},
{
"status": "ATPICKUPPOINT",
"details": {
"courierPosition": {
"lat": "-34.59564000",
"lng": "-58.39462300"
}
},
"createdAt": "2021-01-12 10:52:33"
},
{
"status": "CONFIRMED",
"details": null,
"createdAt": "2021-01-12 10:44:46"
},
{
"status": "WAITING",
"details": null,
"createdAt": "2021-01-12 10:39:45"
},
{
"status": "READY",
"details": null,
"createdAt": "2021-01-12 10:39:38"
},
{
"status": "DRAFT",
"details": null,
"createdAt": "2021-01-11 21:48:06"
}
],
"activeSettings": [
{
"id": 3,
"name": "SignaturePhoto",
"apply_to_all": 1,
"description": "Instead of ask for a signature, take a picture of the package.",
"message": "Debido al coronavirus, en vez de solicitar la firma, por favor sacale una foto a la puerta del domicilio donde estás haciendo la entrega.",
"created_at": "2021-01-05 19:01:27",
"updated_at": "2021-01-05 19:01:27",
"deleted_at": null,
"laravel_through_key": "b07ae420-5456-11eb-848c-b95db72a2751"
},
{
"id": 4,
"name": "DeliveryUserIdentification",
"apply_to_all": 1,
"description": "Request user identification when shipping is delivered",
"message": "Documento de identidad",
"created_at": "2021-01-05 19:01:27",
"updated_at": "2021-01-05 19:01:27",
"deleted_at": null,
"laravel_through_key": "b07ae420-5456-11eb-848c-b95db72a2751"
},
{
"id": 6,
"name": "UpdateDeliveredItems",
"apply_to_all": 0,
"description": "Once the shipping is delivered, update the delivered items",
"message": null,
"created_at": "2021-01-05 19:01:27",
"updated_at": "2021-01-05 19:01:27",
"deleted_at": null,
"laravel_through_key": "b07ae420-5456-11eb-848c-b95db72a2751"
}
],
"relatedShippings": {
"previous": null,
"next": null
},
"items": [
{
"price": 150,
"currency": "ARS",
"width": 20,
"height": 20,
"length": 20,
"weight": 20,
"quantity": 1,
"description": "Tarjeta",
"referenceCode": null,
"serialNumber": "12345678998765432111"
},
{
"price": 140,
"currency": "ARS",
"width": 20,
"height": 20,
"length": 20,
"weight": 20,
"quantity": 1,
"description": "Post Marca A",
"referenceCode": null,
"serialNumber": "12345678998765432222"
},
{
"price": 140,
"currency": "ARS",
"width": 20,
"height": 20,
"length": 20,
"weight": 20,
"quantity": 2,
"description": "Post Marca B",
"referenceCode": null,
"serialNumber": "12345678998765432333"
},
{
"price": 140,
"currency": "ARS",
"width": 20,
"height": 20,
"length": 20,
"weight": 20,
"quantity": 2,
"description": "Post Marca B",
"referenceCode": null,
"serialNumber": "12345678998765432444"
}
],
"createdAt": "2021-01-11 21:48:06"
}

Ejemplo de payload de un pedido ida y vuelta

En este caso, el objetivo es que cuando el mensajero realice la entrega, recoja algo y esto sea devuelto al origen. Ejemplo de un caso de uso: reemplazo de un celular.

Por favor chequear con la sección comercial de Moova antes de utilizar este tipo de envío.

Para pedir que se que un envío sea “ida y vuelta” setear settings en 5.

 "settings": [5]

Los settings se pueden acumular, por ejemplo si quisiéramos reemplazar un equipo, al que tenemos que tomar el número de serie del que entregamos y a su vez devolver el viejo, entonces usamos la siguiente configuración en settings. (6 por nro de serie y 5 para ida y vuelta).

 "settings": [6,5]

OJO: Este tipo de envío debiera utilizarse únicamente con 1 ítem que es el que entregamos y luego devolvemos uno que se recoge en el punto de entrega.

Por otra parte cuando se hace un envío de ida y vuelta, se pueden especificar settings para el retorno, por ejemplo si ponemos

"return_settings": [2]

Significa que le pedimos al mensajero que saque una foto del ítem que le entregan para la devolución.

Otra opción que podríamos agregar al "return_settings" podría ser la 1 que significa pedir la firma en pickup.

Aquí vemos un ejemplo de un payload completo para la creación del pedido

{
"currency": "ARS",
"type": "regular",
"flow": "manual",
"from": {
"street": "Av. Santa Fe",
"number": "2678",
"floor": "6to",
"apartment": "C",
"city": "Capital Federal",
"state": "Capital Federal",
"postalCode": "1425",
"country": "AR",
"instructions": "Intruciones pickup",
"contact": {
"firstName": "Juan",
"lastName": "Perez",
"email": "",
"phone": ""
},
"message": "Mensaje pickup"
},
"to": {
"street": "Av. Santa Fe",
"number": "2678",
"floor": "6to",
"apartment": "C",
"city": "Capital Federal",
"state": "Capital Federal",
"postalCode": "1425",
"country": "AR",
"instructions": "Recoger el Router Viejo",
"contact": {
"firstName": "Juan",
"lastName": "Perez",
"email": "",
"phone": ""
},
"message": "Mensaje entrega"
},
"internalCode": "string",
"description": "Descripcion del item",
"label": "label del item",
"extra": {},
"settings": [
5
],
"conf": {
"assurance": false
},
"items": [
{
"description": "Post Marca A",
"price": 130,
"currency": "ARS",
"weight": 14,
"length": 15,
"width": 16,
"height": 17,
"quantity": 1
}
]
}

Y aquí la response de la creación del payload. Podemos verificar al final dentro de "activeSettings"

que el que tiene ID = 5 está presente que es el que necesitamos. Puede haber otros "activeSettings"

que no pusieron el payload pero que el sistema agrega de manera automática.

La response completa será:

{
"id": "3ace6160-6492-11eb-8d87-cdce34618873",
"scheduledDate": null,
"type": "regular",
"priceFormatted": "$100,00",
"price": "100.00",
"currency": "ARS",
"from": {
"placeId": 63,
"googlePlaceId": "ChIJYVOqvJrKvJURbO0qQqXC8MA",
"address": "Av. Santa Fe 2678, C1425BGO CABA, Argentina",
"addressExtra": "6to C",
"contact": "Juan Perez",
"email": "",
"phone": "",
"instructions": "Intruciones pickup",
"coords": {
"lat": "-34.59361200",
"lng": "-58.40485790"
}
},
"to": {
"placeId": 63,
"googlePlaceId": "ChIJYVOqvJrKvJURbO0qQqXC8MA",
"address": "Av. Santa Fe 2678, C1425BGO CABA, Argentina",
"addressExtra": "6to C",
"contact": "Juan Perez",
"email": "",
"phone": "",
"instructions": "Recoger el Router Viejo",
"coords": {
"lat": "-34.59361200",
"lng": "-58.40485790"
}
},
"status": "DRAFT",
"secretCode": "6692",
"internalCode": "string",
"internalOrderId": null,
"description": "Descripcion del item",
"hash": "6b17a6b246930a7b781bb217846493ed1d93eb5b4d6920e9ca237a952526538c",
"message": "Mensaje entrega",
"extra": [],
"conf": {
"assurance": false
},
"deliveryInfo": {
"courier": null,
"lat": null,
"lng": null
},
"statusHistory": [
{
"status": "DRAFT",
"details": null,
"createdAt": "2021-02-01 13:34:37"
}
],
"activeSettings": [
{
"id": 3,
"name": "SignaturePhoto",
"apply_to_all": 1,
"description": "Instead of ask for a signature, take a picture of the package.",
"message": "Debido al coronavirus, en vez de solicitar la firma, por favor sacale una foto a la puerta del domicilio donde estás haciendo la entrega.",
"created_at": "2021-01-05 19:01:27",
"updated_at": "2021-01-05 19:01:27",
"deleted_at": null,
"laravel_through_key": "3ace6160-6492-11eb-8d87-cdce34618873"
},
{
"id": 4,
"name": "DeliveryUserIdentification",
"apply_to_all": 1,
"description": "Request user identification when shipping is delivered",
"message": "Documento de identidad",
"created_at": "2021-01-05 19:01:27",
"updated_at": "2021-01-05 19:01:27",
"deleted_at": null,
"laravel_through_key": "3ace6160-6492-11eb-8d87-cdce34618873"
},
{
"id": 5,
"name": "BackAndForth",
"apply_to_all": 0,
"description": "Back and forth shipping",
"message": null,
"created_at": "2021-01-05 19:01:27",
"updated_at": "2021-01-05 19:01:27",
"deleted_at": null,
"laravel_through_key": "3ace6160-6492-11eb-8d87-cdce34618873"
}
],
"relatedShippings": {
"previous": null,
"next": "eb831920-8ca7-11eb-ac1f-af3103d0d3db"
},
"items": [
{
"description": "Post Marca A",
"referenceCode": null,
"serialNumber": null,
"price": 130,
"currency": "ARS",
"weight": 14,
"length": 15,
"width": 16,
"height": 17,
"quantity": 1
}
],
"createdAt": "2021-02-01 13:34:37"
}

En “relatedShippings” se tendrá información de la vuelta en el elemento “next”. En caso de pedir información sobre la vuelta, en el campo “previous” se tendrá el ID de envío de “la ida”.


Ejemplo de setting para exigir que solo se entregue a la persona que figura como destinatario (OnlyDeliverToAddressee)

En este caso, el objetivo es que cuando el mensajero realice la entrega, únicamente le entregue el paquete a la persona que figura como destinatario. En caso que está persona no esté presente en la casa no se lo va a entregar a ningún familiar.

Por favor chequear con el agente comercial de Moova antes de utilizar este tipo de envío dado que generará un porcentaje mucho más alto de lo normal de incidencias que genera costos adicionales.

Para pedir que se que un envío sea “OnlyDeliverToAddressee” setear settings en 8.

 "settings": [8]

Los settings se pueden acumular, por ejemplo si quisiéramos que solo se entregue al destinatario que figura y que además el escaneo de la “mancha” del DNI (SOLO EN ARGENTINA) sea obligatorio entonces configuraremos los settings de la siguiente manera

 "settings": [8,9]


Ejemplo de setting para exigir que solo se escanee la mancha del DNI Argentino (ScanReiceiverId)

En este caso, el objetivo es que cuando el mensajero realice la entrega, sea obligatorio el escaneo de la mancha del DNI de la persona que recibe el paquete. Luego se puede recuperar el string completo de este escaneo a través de un GET del envío.

Este setting solo funciona en Argentina dado que el es único documento que tiene “la mancha”

Por favor chequear con el agente comercial de Moova antes de utilizar este tipo de envío dado que generará un porcentaje mucho más alto de lo normal de incidencias que generan costos adicionales.

Para pedir que se envíe un envío sea “ScanReiceiverId” setear settings en 9.

 "settings": [9]

Los settings se pueden acumular, por ejemplo si quisiéramos que solo se entregue al destinatario que figura y que además el escaneo de la “mancha” del DNI (SOLO EN ARGENTINA) sea obligatorio entonces configuraremos los settings de la siguiente manera:

 "settings": [8,9]


Ejemplo de setting para que los envíos pasen por nuestro warehouse y no se envíen directo al cliente. (ViaWarehouse)

En este caso, el objetivo es que el envío realice otro flujo, para que antes de que se le entregue el envío al cliente, el mismo pase por el deposito de Moova.

Si no se pone el settings: [6] el envío no va a pasar por el warehouse y va a ir directamente al cliente.

Para pedir que se envíe un envío sea “ViaWarehouse” setear settings en 6.

 "settings": [6]



Ejemplo para que el moover le pueda exigir al usuario final un código para realizar la entrega

Supongamos que estamos entregando un elemento de mucho valor y que queremos asegurarnos que la persona a la cual se la estamos entregando es la persona correcta para realizar la entrega. Para esto podemos exigirle al usuario final que este nos de un código que valide la operación.

Ejemplos:

  • Queremos que el usuario final nos diga los últimos 4 dígitos de la tarjeta de crédito con la cual realizó la compra.

  • Queremos que el usuario final nos diga los últimos 3 dígitos de la factura de la compra.

Un ejemplo de como implementar este requerimiento es incluyendo en el payload de creación de un envío lo siguiente:

"delivery": {
   "securityCode": "C212412",
   "securityMessage": "Por favor pedir el numero de la factura"
}

La ubicación de esta opción debe estar dentro del cuerpo principal del payload.

En caso que exista dentro del payload esta información, será mandatorio que el usuario final le de esta información al moover para que este la ingrese en la app y se verifique. En caso que el usuario no tenga esta info o que no sea correcta las instrucciones el Moover NO entregará este ítem.

Antes de agregar esta opción en el payload por favor contactar con el comercial de Moova que lo atiende para entender las consecuencias de esta exigencia, dado que generará una cantidad importante de incidencias en entregas que tendrán un costo económico.


Ejemplo para cobrarle al cliente un envio a la hora de entregar el paquete (cash_on_delivery)

Lo que buscamos con esto es a la hora de entregar un paquete este mismo se abonara al momento de la entrega, el cliente le pagara al moover, esto puede ser en efectivo o con tarjeta.

Para poder configurar esto primero hay que preguntar a la persona encargada de darle seguimiento de moova si lo tienen habilitado.

Si lo tienen pueden crear un envio utilizando lo siguiente.

"services": [
                "cash_on_delivery"
            ],
"chargeAmount": "25.00"

Donde "services" es el tipo de cobro, y "chargeAmount" el valor que se le cobrara por el