WSGeocoding
Geocodificación interna contra los procedimientos almacenados locales (no Nominatim). Resuelve tres modos de entrada: calle + esquina, calle + número y ruta + km, devolviendo un arreglo de coincidencias con su coordenada.
Geocode
POST
/apidev/legacy/WSGeocodingAuthWSAutorizacion (body)
FormatoJSON
RespuestaHTTP 200 + Error
EstadoAvailable
La autenticación viaja en el cuerpo, dentro del objeto WSAutorizacion. No se usan encabezados Authorization, X-API-Key ni tenant. El servicio responde siempre HTTP 200: los errores de negocio viajan en el campo Error del envelope, nunca como código 4xx.
Request Body
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
WSAutorizacion | object | Sí | Bloque de autenticación. Ver subcampos abajo. |
WSAutorizacion.Guid | string | Sí | GUID de la compañía (API key). Se resuelve a CiaId. Si es inválido → Error = "GUID Inválido". |
WSAutorizacion.Usuario | string | Sí | Email del usuario. Se normaliza (minúsculas + recortado). |
WSAutorizacion.Password | string | Sí | Contraseña del usuario, validada por el servicio. |
WSSDTFiltroGeocoding | object | Sí | Filtro de búsqueda. Ver subcampos abajo. |
WSSDTFiltroGeocoding.Pais | string | Condicional | País. Se convierte a mayúsculas. Requerido salvo la excepción de ruta (ver Notas). |
WSSDTFiltroGeocoding.Departamento | string | Condicional | Departamento / estado. Se convierte a mayúsculas. Misma excepción que Pais. |
WSSDTFiltroGeocoding.Calle | string | Sí (uno de los modos) | Nombre de la calle. Se convierte a mayúsculas. Si contiene "RUTA" activa el modo ruta. |
WSSDTFiltroGeocoding.Esquina | string | Modo A | Calle de la esquina (intersección). Se convierte a mayúsculas. |
WSSDTFiltroGeocoding.NumeroPuerta | string | Modo B / C | Número de puerta (modo B) o kilómetro (modo C). Se interpreta como entero. |
Modos de entrada (mutuamente excluyentes por prioridad):
- Modo A — calle + esquina:
CalleyEsquinano vacíos → busca la intersección. - Modo B — calle + número:
NumeroPuerta > 0,Calleno vacía yCalleNO contiene"RUTA"→ busca por número de puerta. - Modo C — ruta + km:
NumeroPuerta > 0,Calleno vacía yCallecontiene"RUTA"→ busca por kilómetro sobre la ruta (NumeroPuertaes el km).
Response
Raíz del envelope: WSSDTDatosGeocoding.
| Campo | Tipo | Descripción |
|---|---|---|
Error | string | Mensaje de error del envelope. Vacío en caso de éxito. |
SDTDatosGeocoding | array | Arreglo de coincidencias (SDTDatosGeocodingItem). El orden final es inverso al orden de lectura. |
SDTDatosGeocoding[].Calle | string | Nombre de la calle. |
SDTDatosGeocoding[].Esquina | string | Calle de la esquina. En coincidencias por número / ruta la semántica difiere. |
SDTDatosGeocoding[].Desde | string | Inicio del rango de numeración. 0 para coincidencias por esquina o por número. |
SDTDatosGeocoding[].Hasta | string | Fin del rango de numeración. 0 para coincidencias por esquina o por número. |
SDTDatosGeocoding[].Zona | string | Nombre de la zona. |
SDTDatosGeocoding[].Geolocation | string | Coordenada emitida por el procedimiento almacenado (formato "lat,lon"), sin reformatear. |
Code Examples
- cURL
- JavaScript
- Python
curl -s -X POST "https://$TENANT/apidev/legacy/WSGeocoding" \
-H "Content-Type: application/json" \
-d '{
"WSAutorizacion": {
"Guid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Usuario": "usuario@empresa.com",
"Password": "contraseña"
},
"WSSDTFiltroGeocoding": {
"Pais": "URUGUAY",
"Departamento": "MONTEVIDEO",
"Calle": "18 DE JULIO",
"Esquina": "EJIDO",
"NumeroPuerta": ""
}
}'
const res = await fetch(`https://${TENANT}/apidev/legacy/WSGeocoding`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
WSAutorizacion: {
Guid: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
Usuario: 'usuario@empresa.com',
Password: 'contraseña',
},
WSSDTFiltroGeocoding: {
Pais: 'URUGUAY',
Departamento: 'MONTEVIDEO',
Calle: '18 DE JULIO',
Esquina: 'EJIDO',
NumeroPuerta: '',
},
}),
});
const data = await res.json();
// data.WSSDTDatosGeocoding.Error / .SDTDatosGeocoding
import requests
response = requests.post(
f"https://{TENANT}/apidev/legacy/WSGeocoding",
json={
"WSAutorizacion": {
"Guid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"Usuario": "usuario@empresa.com",
"Password": "contraseña",
},
"WSSDTFiltroGeocoding": {
"Pais": "URUGUAY",
"Departamento": "MONTEVIDEO",
"Calle": "18 DE JULIO",
"Esquina": "EJIDO",
"NumeroPuerta": "",
},
},
)
data = response.json()
# data["WSSDTDatosGeocoding"]["Error"] / ["SDTDatosGeocoding"]
Example Response
{
"WSSDTDatosGeocoding": {
"Error": "",
"SDTDatosGeocoding": [
{
"Calle": "18 DE JULIO",
"Esquina": "EJIDO",
"Desde": 0,
"Hasta": 0,
"Zona": "CENTRO",
"Geolocation": "-34.9058,-56.1882"
}
]
}
}
Errors
Todos los errores de negocio se devuelven con HTTP 200 en el campo Error del envelope WSSDTDatosGeocoding. El código 500 solo aparece ante una excepción no controlada del servicio.
Mensaje (Error) | Causa |
|---|---|
GUID Inválido | El GUID enviado no resuelve a ninguna compañía. |
Compañía inválida. | Compañía no válida durante la validación. |
URL Inválida | La URL de la API no es válida para la compañía (salvo el usuario admincloud@logicsat.com). |
Servicio no contratado. | La compañía no tiene contratado el servicio de geocodificación. |
Sin Saldo. Servicio no disponible. Servicio contratado [N] - Cantidad de solicitudes [N] - Saldo [N] | Se agotó el saldo de geocodificaciones. |
Debe ingresar el País y el Departamento. | Falta Pais o Departamento (no aplica la excepción de ruta). |
Debe ingresar Calle y Esquina o Calle y Nº | No se cumple ninguno de los modos de entrada válidos. |
No se ha encontrado calles con ese nombre, inténtelo poniendo parte del nombre. | La búsqueda no arrojó coincidencias. |
Notas
- Excepción de ruta: si
Pais == "URUGUAY"yCallecontiene"RUTA", se omite la validación obligatoria dePais+Departamento. - Consumo de cupo: cada respuesta con resultados consume un crédito de geocodificación; las respuestas vacías no descuentan saldo.
- Orden del arreglo: los ítems se insertan al frente, por lo que el orden final es inverso al de lectura del origen.