Descripción #
Una consulta es el ofrecimiento de un servicio antes de asignarlo. La compañía la publica por API REST, AsistManager la distribuye internamente a uno o varios prestadores, y el resultado se envía al callback configurado para esa compañía.
Un prestador no equivale a un vehículo: puede tener un solo móvil o cien. La compañía consulta a la organización, y la distribución hacia los móviles la resuelve AsistManager.
Existen cuatro formas de consultar, según qué se le pide al prestador que decida: cuánto va a tardar, si acepta una demora ya fijada, cuál de una lista acotada de demoras elige, o cuál de varios turnos con fecha y rango horario prefiere. A cualquiera de las cuatro se le puede sumar el pedido de una cotización.
Sobre esas cuatro está la consulta de cotización, que se marca con el campo kind y pide los tres datos en un mismo formulario: el monto, los kilómetros y la demora estimada.
Una consulta no es una asignación. Para enviar un servicio directamente a un prestador, sin fase de ofrecimiento, se usa el punto de acceso de alta de caso.
Cuándo se usa #
Cuando hay más de un prestador que podría tomar el servicio y se quiere que la asignación la resuelva la disponibilidad real, no una decisión previa del operador.
También cuando el dato que falta para asignar es del prestador: cuánto va a demorar, cuánto va a costar, o qué día y en qué franja puede ir. Los servicios de hogar y los programados usan la variante de turnos precisamente por eso.
Cómo se distribuye una consulta #
La compañía no elige el móvil. Publica el ofrecimiento y AsistManager resuelve a quiénes llega, cuándo y en qué orden. Eso permite que la misma integración sirva para un prestador con un vehículo y para una flota de cien, sin que la compañía tenga que conocer esa diferencia.
La política de distribución se configura por compañía y por tipo de servicio. Va desde lo más simple hasta esquemas de varias etapas.
Las etapas se suman: los prestadores de una etapa anterior siguen vigentes cuando se incorporan los de la siguiente. La adjudicación ocurre una sola vez, con todas las propuestas recibidas.
Del más simple al más elaborado #
-
1
Consulta y respuestaSe ofrece a un prestador y se espera su respuesta dentro de una ventana de tiempo. Es el esquema tradicional.
-
2
Propuesta múltipleEl mismo servicio se ofrece simultáneamente a varios prestadores, por ejemplo cinco. Cada uno responde con su compromiso de demora y, si corresponde, su cotización.
-
3
Ampliación por etapasSi dentro de la ventana inicial ninguno aceptó, se incorporan más prestadores, por ejemplo diez más durante cuarenta y cinco segundos adicionales. Los de la etapa anterior siguen vigentes en paralelo: la ampliación suma candidatos, no los reemplaza. El esquema se repite tantas etapas como se haya definido.
-
4
AdjudicaciónCerradas las etapas, se resuelve con las propuestas recibidas. Puede resolverla el sistema o una persona.
Cómo se adjudica #
La decisión final admite dos caminos, y la compañía elige cuál usar.
Los dos caminos de la adjudicación #
| Camino | Cómo decide | Cuándo conviene |
|---|---|---|
| Automática | El sistema pondera las propuestas recibidas según la demora comprometida, la ubicación y la ocupación de los móviles, y el costo. | Cuando el criterio es estable y la velocidad importa más que el matiz. |
| Manual | Se devuelve al asignador de la compañía la lista de propuestas recibidas para que resuelva. | Cuando la decisión depende de contexto que el sistema no tiene: el cliente, el historial con el prestador, una excepción comercial. |
Cómo se envía una consulta #
POST <punto de acceso de consultas>
Content-Type: application/json
El punto de acceso se entrega al habilitar la integración. Solicítelo a soporte@dosalinfinito.com.ar.
Cuerpo de la petición #
{
"identifier": "20260812101952844",
"alias": "prestador",
"worker": "",
"delay": "0",
"task": { … }
}
El objeto task está definido una sola vez, en la sección El objeto task al final de este documento. En los ejemplos que siguen se abrevia para que se vea lo que cambia en cada variante.
Campos de la petición #
| Campo | Tipo | Obligatorio | Valores posibles | Descripción |
|---|---|---|---|---|
identifier |
string | Obligatorio | — | Identificador único de la consulta. Es la clave global: consultar el mismo identificador a una segunda flota elimina la consulta anterior. |
alias |
string | Obligatorio | — | Flota u organización destinataria. |
worker |
string | Opcional | — | Dispositivo puntual al que dirigir la consulta. Si se omite o va vacío, la consulta se envía a toda la flota indicada en alias. |
delay |
string | Opcional | — | Demora precargada en minutos, como texto: "0", "30". Con un valor distinto de cero el prestador no elige: acepta o rechaza la demora fijada. |
task |
objeto | Obligatorio | — | El caso completo. Se envían todos los campos, vacíos los que no apliquen. Admite además claves propias, que se conservan y se reenvían sin alterar. |
kind |
string | Opcional | cotizacion | Marca la consulta como consulta de cotización. Es el único campo que nombra una variante y es aditivo: si se omite, la consulta se comporta como hasta ahora. El único valor admitido es cotizacion: cualquier otro se descarta y la consulta degrada a la de siempre. Una aplicación que no lo conozca lo ignora. |
custom_body |
string | Opcional | Texto plano | Reemplaza el cuerpo estándar de la tarjeta que ve el prestador —hora, ubicación, vehículo y desperfecto— por este texto. Si se omite, la tarjeta muestra el cuerpo estándar. Se muestra como texto plano: las etiquetas HTML no se interpretan. |
proposed_slots |
array | Opcional | — | Turnos con fecha y rango horario entre los que el prestador elige. |
delay_options |
array | Opcional | — | Lista acotada de demoras entre las que el prestador elige. |
allow_custom_slot |
booleano | Opcional | — | Habilita al prestador a proponer una fecha y un horario propios. |
allow_cost_estimate |
booleano | Opcional | — | Habilita al prestador a cargar una cotización. |
cost_min |
entero | Condicional Solo se transmite si allow_cost_estimate es verdadero | — | Extremo inferior de la banda de referencia. Debe ser un entero: un valor decimal se descarta en silencio. |
cost_max |
entero | Condicional Solo se transmite si allow_cost_estimate es verdadero | — | Extremo superior de la banda de referencia. Debe ser un entero. |
kms |
numérico | Opcional | Entero o decimal con punto | Kilómetros preasignados por la compañía. Si no se envía, el valor de partida es cero, y en cualquier caso el prestador puede cambiarlo. Admite decimales con punto: escritos con coma se descartan. Vuelve en el campo kms de la respuesta con el valor final. |
custom_body no se interpreta como HTML: la aplicación lo escapa, de modo que las etiquetas se leen literalmente en la pantalla del prestador. Enviar <b>Servicio programado</b><br> hace que en la tarjeta se lea exactamente eso, con las etiquetas a la vista. No hay marcado disponible para resaltar ni para cortar líneas: el texto conviene escribirlo ya legible, tal como debe leerse.tipo ni equivalente: se activan por la presencia de los campos opcionales. Un campo ausente y un campo con valor falso producen el mismo resultado, porque AsistManager solo incorpora al mensaje los valores no vacíos. Quien integre debe tratar la ausencia como desactivado. La única excepción es la consulta de cotización, que sí se marca con un campo, kind: es un agregado y no un tipo global, de modo que no renombra ni reinterpreta nada de lo que ya viajaba.Las cuatro variantes #
Los ejemplos siguientes muestran el cuerpo de la petición en cada caso. Para no repetirlo, el objeto task se abrevia: va siempre completo, como en el ejemplo de arriba.
1 · Demora libre (tradicional) #
{
"identifier": "20260812101952844",
"alias": "prestador",
"worker": "",
"delay": "0",
"task": { … }
}
El campo task va completo, como en el ejemplo de arriba. Acá se abrevia.
Es la forma predeterminada: no se envía ninguno de los campos opcionales. El prestador ve una grilla de demoras y elige una. Esa grilla la define la aplicación, no la compañía: no viaja en el mensaje y no puede configurarse desde el envío. Es la variante mayoritaria en producción.
2 · Demora precargada #
{
"identifier": "20260716103505194",
"alias": "prestador",
"delay": "30",
"task": { … }
}
Con delay distinto de cero, el prestador no elige: ve la demora requerida y solamente puede aceptarla o rechazarla. Se usa cuando el compromiso con el cliente final ya está tomado y no admite negociación.
3 · Lista acotada de demoras #
{
"identifier": "20260716103505194",
"alias": "prestador",
"delay": "0",
"delay_options": [15, 30, 45, 90, "condicional"],
"task": { … }
}
El prestador elige entre las opciones enviadas y no entre la grilla completa. Los elementos son enteros que representan minutos; el valor especial "condicional" se presenta como una aceptación sujeta a condición y se registra como 300 minutos.
4 · Turnos con fecha y rango horario #
{
"identifier": "20260812101952844",
"alias": "prestador",
"worker": "",
"delay": "0",
"task": { … },
"proposed_slots": [
{"date": "2026-08-12", "from": "09:00", "to": "12:00", "label": "Mié 12/08 09:00-12:00"},
{"date": "2026-08-12", "from": "13:00", "to": "18:00", "label": "Mié 12/08 13:00-18:00"},
{"date": "2026-08-13", "from": "09:00", "to": "12:00", "label": "Jue 13/08 09:00-12:00"},
{"date": "2026-08-14", "from": "09:00", "to": "15:00", "label": "Vie 14/08 09:00-15:00"}
],
"allow_custom_slot": true
}
Campos de cada turno #
| Campo | Tipo | Obligatorio | Valores posibles | Descripción |
|---|---|---|---|---|
date |
string | Obligatorio | AAAA-MM-DD | Fecha del turno. Se devuelve sin modificar en la respuesta del prestador. |
from |
string | Obligatorio | HH:MM en 24 horas | Inicio del rango. |
to |
string | Obligatorio | HH:MM en 24 horas | Fin del rango. |
label |
string | Obligatorio | — | Texto que ve el prestador. Es lo único que se muestra en pantalla, de modo que debe bastar por sí solo. El formato es libre. |
Esta es la variante de los servicios de hogar y de los programados. Tiene precedencia sobre las demás: si se envían turnos y además una lista de demoras, el prestador ve los turnos. Con allow_custom_slot se agrega la posibilidad de proponer una fecha distinta de las ofrecidas.
Cotización #
Se activa con allow_cost_estimate. Habilita en la aplicación un paso adicional donde el prestador carga un precio y, opcionalmente, kilómetros adicionales.
Los campos cost_min y cost_max definen una banda de referencia. El extremo inferior se presenta como valor inicial, de modo que el prestador puede aceptarlo tal cual o modificarlo dentro del rango. No existe una modalidad de precio fijo de solo lectura: la compañía propone una banda, no impone un importe.
Consulta con cotización #
{
"identifier": "20260812093000123",
"alias": "prestador",
"delay": "0",
"allow_cost_estimate": true,
"cost_min": 7360,
"cost_max": 18400,
"task": { … }
}
cost, y los kilómetros adicionales en kms_adicionales. Ambos se incluyen en el aviso al callback desde septiembre de 2026: antes de esa fecha quedaban únicamente en el historial de la consulta. Los campos cost_estimate_min y cost_estimate_max corresponden al flujo de preguntas libres, donde expresan una banda, y no se utilizan en la respuesta a una consulta.5 · Consulta de cotización #
Es la forma de consultar que pide los tres datos a la vez: el monto, los kilómetros y la demora estimada. Se marca con kind en "cotizacion", y el prestador los completa en un único formulario.
El monto se acota con cost_min y cost_max, que en esta variante viajan siempre junto con allow_cost_estimate. El prestador responde un valor, en el campo cost.
Los kilómetros se envían en kms como valor preasignado y el prestador puede cambiarlo. Si el campo no se envía, el valor de partida es cero. Admiten decimales, siempre con punto, nunca con coma: un valor con coma se descarta. Vuelven en kms, con lo que el prestador haya dejado.
La demora estimada se ofrece con delay_options, la misma lista de la variante 3. La diferencia es cómo se presenta: acá es un desplegable compacto dentro del formulario, con las etiquetas de siempre (00:15, 00:30, 01:30, Condicional) en lugar de la fila de botones. La opción elegida vuelve en delay.
delay_options es opcional también en una cotización. Si no viaja, el formulario no dibuja la fila de demora y la respuesta llega con delay en cero: la cotización queda reducida al monto y a los kilómetros.
El plazo de la consulta no se extiende por ser una cotización: los 90 segundos incluyen completar el formulario, y son tres campos. Conviene tenerlo en cuenta al elegir a quién se le manda una cotización.
Cuerpo de una consulta de cotización #
{
"identifier": "20260927110500001",
"alias": "prestador",
"delay": "0",
"kind": "cotizacion",
"allow_cost_estimate": true,
"cost_min": 7360,
"cost_max": 18400,
"kms": 12,
"delay_options": [15, 30, 45, 90],
"task": { … }
}
El campo task va completo, como en el ejemplo de arriba. Acá se abrevia.
kind es un agregado: no renombra ni reinterpreta ninguno de los campos que ya viajaban. Enviar allow_cost_estimate con su banda y sin kind produce el comportamiento descripto en la sección Cotización. Y una aplicación que todavía no conozca kind lo ignora y dibuja lo de siempre: la consulta degrada, no se rompe.El resultado, en el callback #
Resuelta la adjudicación, la compañía recibe una petición HTTP en el callback que registró al solicitar el acceso, con el prestador adjudicado y las condiciones acordadas. En un esquema de propuesta múltiple, lo que llega es el resultado del proceso, no cada respuesta individual.
Respuesta a una consulta con turnos #
{
"source": "compania",
"identifier": "20260716103505194",
"alias": "prestador",
"date": "2026-07-16T10:35:52.700000-03:00",
"accepted": true,
"delay": 0,
"timeout": false,
"scheduled_date": "2026-07-16",
"scheduled_from": "09:00",
"scheduled_to": "12:00"
}
Respuesta con cotización #
{
"source": "compania",
"identifier": "20260812093000123",
"alias": "prestador",
"date": "2026-08-12T11:04:22.000000-03:00",
"accepted": true,
"delay": 45,
"timeout": false,
"cost": 12500,
"kms_adicionales": 12
}
Respuesta a una consulta de cotización #
{
"source": "compania",
"identifier": "20260927110500001",
"alias": "prestador",
"date": "2026-09-27T11:06:41.000000-03:00",
"accepted": true,
"delay": 45,
"timeout": false,
"cost": 12500,
"kms": 18
}
Un solo valor en cost, dentro de la banda enviada; kms con el valor final, que puede ser el preasignado o el que cargó el prestador; y en delay, la opción elegida del desplegable.
Campos de la respuesta #
| Campo | Tipo | Obligatorio | Valores posibles | Descripción |
|---|---|---|---|---|
identifier |
string | Obligatorio | — | El mismo identificador de la consulta. |
alias |
string | Obligatorio | — | El prestador adjudicado. En una propuesta múltiple es el que resultó elegido, por decisión del sistema o del asignador. |
accepted |
booleano | Obligatorio | — | Verdadero si aceptó. Falso en rechazo y también en vencimiento. |
delay |
entero | Obligatorio | — | Demora comprometida, en minutos. Llega en cero cuando la respuesta fue un turno, porque en esa variante el dato operativo es la fecha, y también cuando la consulta de cotización se envió sin delay_options, porque en ese caso no se le pide la demora al prestador. |
timeout |
booleano | Obligatorio | — | Verdadero cuando la consulta venció sin respuesta. Permite distinguir un rechazo explícito de una falta de respuesta. |
scheduled_date |
string | Condicional Solo en respuestas con turno | AAAA-MM-DD | Fecha del turno elegido o propuesto. |
scheduled_from |
string | Condicional Solo en respuestas con turno | HH:MM | Inicio del rango acordado. |
scheduled_to |
string | Condicional Solo en respuestas con turno | HH:MM | Fin del rango acordado. |
proposed_by |
string | Opcional | prestador | Presente solo cuando la fecha la propuso el prestador. Su ausencia indica que eligió uno de los turnos ofrecidos. Es lo que distingue ambos casos. |
cost |
entero | Condicional Solo cuando se habilitó la cotización | — | Importe cargado por el prestador, en la moneda de la operación. |
kms |
numérico | Condicional Solo en consultas de cotización | Entero o decimal con punto | Kilómetros finales: el valor preasignado en la consulta, o el que el prestador haya cargado en su lugar. Puede llegar con decimales. |
kms_adicionales |
entero | Opcional | — | Kilómetros adicionales declarados por el prestador, si corresponde. Es otro concepto que kms: son los kilómetros extra sobre los incluidos, y los dos campos conviven sin unificarse. |
El objeto task #
Describe el servicio y es el mismo en la consulta y en el alta de caso. **Se envían todos los campos**, vacíos los que no apliquen: no se omiten.
Las fechas sin valor llevan el centinela 1899-12-30T00:00:00+00:00. Tratarlo como una fecha real produce cálculos absurdos: significa no ocurrió.
task completo #
{
"HoraPasadoMovil": "1899-12-30T00:00:00+00:00",
"Movil": "",
"FinalRadioCobertura": "",
"HoraFinal": "1899-12-30T00:00:00+00:00",
"Titular": "TITULAR",
"UsuarioPrecio": "",
"TipoServicioInicial": "Traslado",
"TipoServicioFinal": "",
"Destino": "DESTINO",
"FinalPrecioHRescate": "",
"Historico": "",
"Ubicacion": "UBICACION",
"Desperfecto": "DESPERFECTO",
"Telefono": "TELEFONO",
"UsuarioAsignacion": "",
"HoraInicio": "2026-08-12T13:19:52.844Z",
"FinalPrecioMovidaUrbana": "",
"HoraLlegada": "1899-12-30T00:00:00+00:00",
"FinalHsRescate": "",
"Vehiculo": "MODELO",
"Denunciante": "DENUNCIANTE",
"Observaciones": "Cia.ObsOrigen: \r\nCia.ObsDestino: \r\nCia.Obs:\r\nDemora: 0\r\nCia.Copago: \r\n",
"FinalPrecioKmAdicionalCamino": "",
"Numero": "20260812101952844",
"Patente": "AAA111",
"FinalKmsAdicionales": "",
"UsuarioFinalizacion": "",
"UsuarioCarga": "",
"FinalPrecioTotal": "",
"CodAutorizacion": "CODAUTORIZACION",
"HoraActivacionInicial": "1899-12-30T00:00:00+00:00",
"FinalPrecioHAdicionalDemora": "",
"Localidad": "||OLIVOS/VICENTE LOPEZ/BUENOS AIRES/ARGENTINA",
"Empresa": "compania",
"FinalKmsAdicionalesCamino": "",
"FinalPrecioKmAdicional": "",
"Color": "COLOR",
"FinalPrecioPeajes": "",
"FinalHsAdicionalDemora": ""
}
Además de estos campos, task admite claves propias: se conservan, se reenvían y no se pisan al actualizar el caso. Es el mecanismo que usan las reglas de captura obligatoria.
Los campos que definen el servicio #
| Campo | Tipo | Obligatorio | Valores posibles | Descripción |
|---|---|---|---|---|
CodAutorizacion |
string | Obligatorio | — | Código de la compañía. Es lo que agrupa las consultas y la asignación de un mismo servicio. |
Numero |
string | Obligatorio | — | Número de caso. Suele coincidir con el identificador de la consulta. |
Empresa |
string | Obligatorio | — | La compañía de origen. Coincide con el segmento de la ruta del punto de acceso. |
TipoServicioInicial |
string | Obligatorio | Traslado · Hogar/Plomeria · Hogar/Cerrajeria · Hogar/Gasista · Hogar/Electricista · Hogar/Vidrieria · Hogar/Service Electrodomestico · Hogar/Tecnico PC | Determina el tipo de servicio. Los de hogar usan el prefijo con barra. |
Ubicacion |
string | Obligatorio | — | Dirección de origen. Si termina en (lat,lng) se extraen las coordenadas automáticamente. |
Localidad |
string | Opcional | ||LOCALIDAD/PARTIDO/PROVINCIA/PAÍS | Cadena jerárquica con barra como separador. |
Destino |
string | Opcional | — | Dirección de destino, con el mismo tratamiento de coordenadas. |
Desperfecto |
string | Obligatorio | — | Motivo del servicio, texto libre. Es lo que el prestador lee para decidir. |
Titular · Telefono · Denunciante |
string | Opcional | — | Datos de contacto del cliente final. |
Vehiculo · Patente · Color |
string | Condicional En servicios de vehículo | — | Datos del vehículo. Van vacíos en servicios de hogar. |
Observaciones |
string | Opcional | — | Bloque de texto con subcampos separados por salto de línea: Cia.ObsOrigen, Cia.ObsDestino, Cia.Obs, Demora y Cia.Copago. |
Hora* |
string | Obligatorio | — | Hitos del servicio. Al crear solo HoraInicio lleva valor; el resto va con el centinela de 1899. |
Movil · Usuario* |
string | Obligatorio | — | Asignación y auditoría por etapa. Vacíos al crear: los completa la operación. |
Final* |
string | Obligatorio | — | Cierre económico. Vacíos al crear: los completa el prestador al finalizar. |
Errores frecuentes #
AsistManager no valida la entrada de estos endpoints. Una petición mal formada responde con código 200 y un cuerpo breve, sin detalle del problema, de modo que los errores se manifiestan como ausencia de efecto.
| Código | Qué se ve | Causa | Cómo se resuelve |
|---|---|---|---|
200 · bye! |
La consulta no se distribuyó | El cuerpo no contiene la combinación identifier + alias + task, o no es JSON válido. | Verificar el nombre exacto de los tres campos y que el cuerpo sea JSON. Un error de tipeo en un nombre produce esta respuesta. |
Sin efecto |
Se envió una variante y el prestador ve la grilla común | El campo viajó vacío, en cero o como cadena. Solo se incorporan los valores no vacíos. | Enviar arreglos con al menos un elemento y booleanos verdaderos. No existe forma de enviar una lista explícitamente vacía. |
Sin efecto |
Se envió una banda de precios y no se aplicó | Falta allow_cost_estimate, o los importes no son enteros. | Incluir el permiso y enviar enteros. Un valor decimal se descarta sin aviso. |
Sin efecto |
Los turnos se ven como una sucesión de botones de una letra | Se envió el arreglo como texto en lugar de JSON, por ejemplo con datos de formulario. | Enviar el cuerpo como JSON con Content-Type application/json. |
Consulta perdida |
Un prestador deja de ver una consulta que tenía | Se envió el mismo identificador a otra flota. El identificador es único global y la consulta anterior se elimina. | Usar un identificador distinto por flota, por ejemplo agregando el alias como sufijo, y agrupar por el código de autorización del caso. |
Sin respuesta |
La compañía nunca recibe el resultado | El origen indicado no tiene un destino de retorno configurado. | Solicitar la configuración del destino de retorno para ese origen. Mientras tanto, el resultado puede consultarse por la API de historial. |
Compatibilidad #
| Componente | Desde | Estado | Nota |
|---|---|---|---|
| Demora libre y demora precargada | En producción |
vigente | Uso masivo. |
| Turnos con fecha y rango horario | Julio de 2026 |
vigente | En uso en servicios de hogar y programados. |
| Cotización | Julio de 2026 |
vigente | Desde septiembre de 2026 el importe cargado viaja en el aviso de respuesta. Antes quedaba solo en el historial. |
| Consulta de cotización (kind) | Septiembre de 2026 |
vigente | Los tres datos en un único formulario. El formulario se dibuja a partir de la versión 6.0.1557 de la aplicación; un dispositivo con una versión anterior ignora kind y ve la consulta de siempre. Mientras kind no se envíe, la consulta se comporta como hasta ahora. |
| Cuerpo de tarjeta propio (custom_body) | En producción |
vigente | El contenido se muestra como texto plano; el HTML no se interpreta. |
| Lista acotada de demoras | Disponible |
vigente | Implementado de ambos lados, sin uso en producción al momento de esta publicación. |
| Turno propuesto por el prestador | Disponible |
vigente | Implementado de ambos lados, sin uso en producción al momento de esta publicación. |
| Formato heredado separado por tabulaciones | Histórico |
Deprecado | No admite ninguna de las variantes. Usar el formato JSON. |