La plataforma de mapas de TeleHost
Rutas, búsqueda, tiles, buques, reportes en vivo y logística — todo en https://maps.telehost.net, sin costo de licencias. Las claves se gestionan en el portal de desarrolladores.
Estilos MapLibre listos: calles en 27 áreas, satélite, náutico, y 14,9 M de edificios de Venezuela.
› Mapa estáticoPNG con ruta dibujada para WhatsApp, correos o PDFs — sin JavaScript.
› Búsqueda (Overture)30,2 M de negocios, 856 K barrios y 168,5 M de direcciones, buscados cerca del usuario.
› GeocodificaciónDirección → coordenada, reverso y autocompletar tolerante a tipeo (VE+CO).
› Rutas terrestresOSRM en 22 países + EE.UU.: rutas, matriz, TSP, map-matching y perfil moto en VE.
› LogísticaCotizar entregas con ruta real, optimizar repartos (VROOM) e isócronas de cobertura.
› Reportes en vivoLa capa tipo Waze: alcabalas, tráfico y huecos reportados por la comunidad, con aviso en ruta.
› Correcciones del directorioTu gente de calle corrige el mapa: negocios cerrados o mudados y lugares criollos, con moderación.
› Cargo y buquesRutas marítimas reales (esquivan tierra, cruzan Panamá), AIS en vivo y 3.804 puertos.
› PagosCotizá y cobrá la entrega en bolívares con referencia USD, vía SPIDI.
› Tracking y pedidosGPS del repartidor, despacho al más cercano y página de seguimiento lista para el cliente.
› SDKs@telehostnet/maps (npm) y telehost_maps (pub.dev): el mapa con la marca en dos líneas.
18 herramientas espaciales para LLMs: rutas, alcabalas en ruta, tarifas reales, flotas. Claude, y cualquier cliente MCP.
›Autenticación y límites
Dos mundos, elegidos por diseño:
| tipo | quién lo llama | cómo |
|---|---|---|
| público | el navegador o la app, directo (CORS abierto) | sin credenciales; límite por IP |
| con clave | tu backend — nunca pongas la clave en el frontend ni en el APK: se extrae en minutos | cabecera x-api-key: thmk_… o Authorization: Bearer thmk_… |
Límites por clave (por minuto, en baldes separados — un canal no compite con otro): 60 general · 10 los caros (optimize, isócronas, searoute) · 600 tracking · 120 reportes · 30 sugerencias. Además, cuota diaria por clave (default 10.000; se pide más en el portal). Al pasarte: 429 con Retry-After. Los tiles y estilos no consumen cuota. Planes planos — sin sorpresas por request: telehost.net/maps.
reportes,sugerencias recibe 403 scope-no-autorizado fuera de eso. Pedí el scope mínimo que tu app necesite: si la clave se filtra, el daño queda contenido.SDKs oficiales
# Web / React Native
npm i @telehostnet/maps
# Flutter
flutter pub add telehost_maps
Traen el basemap, la marca de agua y la atribución resueltas. La marca no depende de la red: un repartidor sin señal la ve igual.
Estilos y tiles público
// MapLibre GL — así de simple:
const map = new maplibregl.Map({
container: "map",
style: "https://maps.telehost.net/styles/telehost/style.json",
center: [-66.88, 10.49], zoom: 13
});
| estilo | para qué |
|---|---|
telehost | el principal: calles en 27 áreas, POIs, tiendas y 14,9 M de edificios de Venezuela |
cargo | náutico oscuro: océanos, puertos, buques en vivo |
satellite / hybrid | imagen Esri; hybrid = imagen + calles + POIs |
liberty · positron · dark-matter | alternativas clara / minimal / oscura |
TileJSON: /data/detalle.json (calles, z0-14) y /data/world.json (planeta z0-7). Cobertura de calles: América Latina completa + Brasil, España y EE.UU.
Mapa estático (PNG) público
Minimapas para WhatsApp, correos o PDFs — sin JavaScript:
https://maps.telehost.net/styles/telehost/static/-66.88,10.49,14/600x400.png
# con ruta dibujada:
…/static/path=stroke:%23ED3237|width:5|enc:{polyline}/600x400.png
stroke/width (sintaxis tileserver), no color/weight (sintaxis Google) — con los de Google responde 400.Buscar y cerca (Overture) público
El buscador del directorio: 30,2 M de negocios, 856 K barrios y 168,5 M de direcciones. La ubicación manda: busca primero cerca del usuario y abre el radio solo si hace falta (radio_km dice a qué anillo apareció).
/api/biz/buscar?q=&lat=&lon=&tipo=&limit=| parámetro | detalle |
|---|---|
q | texto, mínimo 2 caracteres; tolera acentos ("bodegon" encuentra "Bodegón") |
lat, lon | posición del usuario — sin ella no hay cercanía |
tipo | negocios · direcciones · ambos (default) |
fetch("https://maps.telehost.net/api/biz/buscar?q=farmacia&lat=10.49&lon=-66.88")
// → { q, radio_km: 5, negocios: [{ id: "08f2…", nombre, categoria, direccion,
// ciudad, pais, lat, lon, km, confianza }], direcciones: […] }
id — la referencia estable para reportar que cerró o se mudó. Los resultados con fuente:"aliados" son lugares criollos aportados por la comunidad ("El 70", "La Bombilla") que ningún otro mapa tiene./api/biz/cerca?lat=&lon=&km=3&limit=10Qué hay alrededor de un punto, sin texto — para sugerir apenas se abre el mapa.
Geocodificación clásica público
GET /geocode/search?q=avenida+libertador+caracas # dirección → coordenada
GET /geocode/reverse?lat=10.49&lon=-66.88 # coordenada → dirección
GET /autocomplete?q=maraca&lat=&lon= # tolerante a tipeo (Photon)
GET /api/biz/config/country?lat=&lon= # país + ¿es ruteable? — preguntá ANTES de rutear
/api/biz/config/cobertura dice la lista viva). Fuera de ahí no dice "no sé": devuelve otra cosa con confianza — usá /api/biz/buscar, que sí respeta la ubicación en todo el planeta.Rutas terrestres (OSRM) público
27 zonas: 22 países (ve co ec pe bo py uy cl ar mx gt sv hn ni cr pa bz cu do pr es br) + 5 regiones de EE.UU. (us-northeast us-midwest us-south us-west us-pacific — no se rutea entre regiones).
GET https://maps.telehost.net/route/ve/route/v1/driving/-70.2075,8.6226;-66.9036,10.4880?overview=full&geometries=geojson&alternatives=true&steps=true
// → { code:"Ok", routes:[{ distance, duration, geometry, legs:[{steps:…}] }],
// waypoints:[{ distance, name, location }] } ← distance = metros del snap
waypoints[].distance (a cuántos metros quedó tu punto de la vía usada). OSRM pega el punto que no conoce a la vía más cercana y responde una distancia creíble y falsa: un snap de kilómetros = el punto no está en el grafo. Si tu ruta se convierte en dinero, esta verificación no es opcional.| servicio | qué hace |
|---|---|
/route/ve-moto/route/v1/… | perfil MOTO (solo VE): −21 a −27 % en vías de superficie, ~0 % cuando la ruta va por autopista |
/route/{cc}/table/v1/… | matriz N×M de tiempos y distancias (Distance Matrix) |
/route/{cc}/trip/v1/… | orden óptimo de N paradas, viaje cerrado (TSP) |
/route/{cc}/match/v1/… | pega una traza GPS sucia a las calles reales |
/route/{cc}/nearest/v1/… | el punto exacto sobre la vía + nombre de la calle |
Cotizar, optimizar, isócronas con clave
/api/biz/pay/quoteCotiza una entrega con ruta real: km, minutos, tarifa en USD y combustible. vehiculo: "moto"|"carro".
/api/biz/route/optimizecurl -X POST https://maps.telehost.net/api/biz/route/optimize \
-H "x-api-key: $THMK" -H "content-type: application/json" \
-d '{"depot":{"lat":10.25,"lon":-67.6},"deliveries":[{"id":"c1","lat":10.3,"lon":-67.5},{"id":"c2","lat":10.28,"lon":-67.55}]}'
# → { ok, country, stops, total_min, total_km,
# order: [{ stop, delivery_id, lat, lon, eta_min }],
# unassigned: [], geometry: "polyline precisión 5" }
VROOM con matriz OSRM real. Solo VE y CO — para el resto, trip/v1. Balde de los caros: 10/min.
/api/biz/isochrone?lat=&lon=&minutes=10La zona alcanzable en N minutos desde un punto — cobertura honesta de un comercio. (POST /api/biz/isochrone/check responde si un punto cae dentro.)
Reportes en vivo — la capa tipo Waze escribir leer
Alcabalas, tráfico, huecos: lo reporta la comunidad de motorizados y lo ve todo el que use el mapa. El vencimiento sale del tipo, no lo elige el usuario:
| tipo | vence a los |
|---|---|
alcabala | 90 min |
trafico | 45 min |
hueco | 30 días |
accidente | 60 min |
via_cerrada | 6 h |
sin_gasolina | 4 h |
/api/biz/reportes con clavecurl -X POST https://maps.telehost.net/api/biz/reportes \
-H "x-api-key: $THMK" -H "content-type: application/json" \
-d '{"tipo":"alcabala","lat":10.4910,"lon":-66.8790,"dispositivo":""}'
# → 201 { ok, id, tipo, vence_en }
dispositivo es un UUID de instalación (8-128 chars), nunca teléfono ni IMEI: el servidor lo guarda hasheado con sal y es la unidad del anti-abuso — 6 reportes/hora, y el mismo tipo a <300 m en <20 min responde 409 con el id del que ya existe (usalo)./api/biz/reportes/cerca?lat=&lon=&km=3&tipos=alcabala,trafico público/api/biz/reportes.geojson?bbox=minLon,minLat,maxLon,maxLat público// capa MapLibre directa, refrescala cada ~60 s:
map.addSource("reportes", { type: "geojson",
data: "https://maps.telehost.net/api/biz/reportes.geojson?bbox=-67.1,10.3,-66.7,10.6" });
/api/biz/reportes/en-ruta con claveEl que convierte la función en producto: le pasás la geometry que ya te dio OSRM y devuelve lo que el conductor se va a encontrar, en orden de avance.
curl -X POST https://maps.telehost.net/api/biz/reportes/en-ruta \
-H "x-api-key: $THMK" -H "content-type: application/json" \
-d '{"geometria":[[-66.95,10.45],[-66.90,10.45],[-66.85,10.46]],"margen_m":120}'
# → { margen_m: 120, reportes: [
# { id, tipo:"alcabala", lat, lon, en_km: 0.7, desvio_m: 22, vence_en, confirmas, desmientes } ] }
# el aviso "alcabala a 600 m" = (en_km − km_recorridos)
/api/biz/reportes/{id}/confirmar · /desmentir con claveCuerpo: {"dispositivo":"…"}. La confirmación del que pasa extiende la vida (ttl/2, tope 3); dos desmientes seguidos apagan el reporte. Nadie vota su propio reporte (403) ni dos veces (409).
Correcciones del directorio con clave
Cuando tu gente de calle sabe algo que el mapa no: un negocio cerró, se mudó, o un lugar tiene nombre criollo. Todo pasa por moderación — solo lo aprobado toca el buscador.
/api/biz/sugerencias# negocio que ya no existe (ref_ext_id = el campo `id` de /api/biz/buscar)
-d '{"tipo":"negocio-cerrado","ref_ext_id":"","ref_nombre":"Panadería X","detalle":"cerró en julio"}'
# negocio que se mudó (lat/lon = posición NUEVA)
-d '{"tipo":"negocio-mudado","ref_ext_id":"","lat":10.4931,"lon":-66.8531}'
# lugar criollo nuevo
-d '{"tipo":"lugar-nuevo","nombre":"La Bombilla","alias":"bombilla de petare","ciudad":"Caracas","lat":10.4805,"lon":-66.8021}'
# corrección libre (la aplica un humano)
-d '{"tipo":"correccion","ref_ext_id":"","detalle":"se llama Bodegón El Mirador"}'
404 si el ref_ext_id no existe en el directorio (no lo inventes). GET /api/biz/sugerencias/mias devuelve las tuyas con estado y nota del moderador.
Marítimo y buques (AIS)
/api/biz/cargo/ruta?from=lon,lat&to=lon,lat públicofetch("https://maps.telehost.net/api/biz/cargo/ruta?from=114.27,22.59&to=-68.01,10.48")
// → { ok, nm: 10188.9, km, dias_a_14kn, geometry: LineString } // esquiva tierra, cruza Panamá
/ais/ships?bbox= públicofetch("https://maps.telehost.net/ais/ships?bbox=-73,9,-59,13")
// → FeatureCollection de buques en vivo; properties: { mmsi, name, dest, sog, cog, stale, visto }
// cog = rumbo, para rotar el ícono. stale=true → sin señal hace >30 min
GET /api/biz/ais/ship/:mmsi con clave — un buque puntual (detección de arribo) · GET /puertos/puertos.geojson — 3.804 puertos con UN/LOCODE.
MCP para agentes de IA Empresa
Un servidor Model Context Protocol (Streamable HTTP) con 18 herramientas espaciales: tu agente de IA razona sobre el mapa real — rutas con perfil moto, alcabalas SOBRE la ruta, tarifas reales de delivery, optimización de flotas, isócronas, buques. Es lo que usan los propios agentes de TeleHost (SARI).
// Claude Code / Claude Desktop — agregá a tu config de MCP:
{
"mcpServers": {
"telehost-maps": {
"type": "http",
"url": "https://maps.telehost.net/mcp",
"headers": { "Authorization": "Bearer thmk_TU_CLAVE" }
}
}
}
mcp (no lo incluye ningún plan self-service — escribinos). Sin él: 403.| herramienta | qué hace |
|---|---|
search_places | buscar negocios/barrios/direcciones cerca (Overture + lugares criollos; cada negocio con su id) |
geocode · reverse_geocode | texto ↔ coordenadas (VE+CO) |
route | ruta en las 27 zonas, perfil moto en VE, con chequeo de snap (nunca una distancia inventada) |
distance_matrix | matriz N×M de tiempos/distancias |
reports_near · reports_on_route | alcabalas, tráfico y huecos de la comunidad — cerca de un punto o SOBRE la ruta, en orden de avance |
quote_delivery | cotización con la tarifa REAL configurada (no estimada) |
optimize_delivery_route · assign_deliveries_to_fleet | VROOM: orden óptimo de paradas y asignación de flota |
get_isochrone · check_delivery_coverage | zona alcanzable en N minutos y verificación de cobertura |
get_driver_location · find_nearby_drivers | tracking en vivo de repartidores |
sea_route | ruta marítima real entre puertos (nm, km, días) |
static_map_image | URL de mapa PNG para incrustar |
reason_about_location · get_delivery_insights | razonamiento compuesto: geocodifica + rutea + cobertura + repartidor más cercano + tarifa real |
Pagos (SPIDI) con clave
POST /api/biz/pay/delivery # cotiza la entrega + genera link de cobro en Bs (referencia USD)
# → { ok, session_id, payment_url, … }
GET /api/biz/pay/{ref} # estado del pago — polling hasta "paid"
Tracking y pedidos con clave
POST /api/biz/tracking/position # ingesta GPS del repartidor (cada 3-5 s; balde 600/min)
POST /api/biz/delivery/dispatch # el repartidor más cercano por matriz OSRM real
POST /api/biz/orders # crear pedido: {origin:{lat,lon}, dest:{lat,lon}, vehiculo, country}
# cotiza con ruta real y devuelve token + PIN + tracking_url
GET /api/biz/track/{token} # PÚBLICO: seguimiento para el cliente final (datos mínimos)
La página de seguimiento ya existe (/track/{token}): ETA en vivo, estado del repartidor y aviso honesto si se pierde la señal. Tu app no tiene que construirla.
Errores
| código | qué significa |
|---|---|
400 | parámetros inválidos — el cuerpo dice exactamente qué (error + hint) |
401 | sin clave o clave revocada |
403 | scope no autorizado, o acción que no te pertenece (votar tu propio reporte) |
404 | el recurso no existe (un GERS inventado, un reporte vencido) |
409 | duplicado — la respuesta trae el id del que ya existe: usalo |
422 | ruteable pero imposible (ruta-cruza-cobertura entre regiones de EE.UU.) |
429 | tope por minuto o cuota diaria — respetá Retry-After |
¿Falta algo o un ejemplo no cuadra? Escribinos: [email protected] · TeleHost Maps · datos © Overture Maps · © OpenStreetMap contributors