TeleHost Maps · Docs
PreciosPortal y claves →

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.

Autenticación y límites

Dos mundos, elegidos por diseño:

tipoquién lo llamacómo
públicoel navegador o la app, directo (CORS abierto)sin credenciales; límite por IP
con clavetu backend — nunca pongas la clave en el frontend ni en el APK: se extrae en minutoscabecera 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.

Las claves tienen scopes: una clave acotada a 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
});
estilopara qué
telehostel principal: calles en 27 áreas, POIs, tiendas y 14,9 M de edificios de Venezuela
cargonáutico oscuro: océanos, puertos, buques en vivo
satellite / hybridimagen Esri; hybrid = imagen + calles + POIs
liberty · positron · dark-matteralternativas 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
Los parámetros son 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ó).

GET /api/biz/buscar?q=&lat=&lon=&tipo=&limit=
parámetrodetalle
qtexto, mínimo 2 caracteres; tolera acentos ("bodegon" encuentra "Bodegón")
lat, lonposición del usuario — sin ella no hay cercanía
tiponegocios · 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: […] }
Cada negocio trae 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.
GET /api/biz/cerca?lat=&lon=&km=3&limit=10

Qué 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
El índice clásico cubre VE+CO (/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
Verificá 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.
servicioqué 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

POST /api/biz/pay/quote

Cotiza una entrega con ruta real: km, minutos, tarifa en USD y combustible. vehiculo: "moto"|"carro".

POST /api/biz/route/optimize
curl -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.

GET /api/biz/isochrone?lat=&lon=&minutes=10

La 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:

tipovence a los
alcabala90 min
trafico45 min
hueco30 días
accidente60 min
via_cerrada6 h
sin_gasolina4 h
POST /api/biz/reportes con clave
curl -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).
GET /api/biz/reportes/cerca?lat=&lon=&km=3&tipos=alcabala,trafico público
GET /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" });
POST /api/biz/reportes/en-ruta con clave

El 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)
POST /api/biz/reportes/{id}/confirmar · /desmentir con clave

Cuerpo: {"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.

POST /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)

GET /api/biz/cargo/ruta?from=lon,lat&to=lon,lat público
fetch("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á
GET /ais/ships?bbox= público
fetch("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" }
    }
  }
}
El acceso MCP es del tier Empresa: requiere una clave con el scope explícito mcp (no lo incluye ningún plan self-service — escribinos). Sin él: 403.
herramientaqué hace
search_placesbuscar negocios/barrios/direcciones cerca (Overture + lugares criollos; cada negocio con su id)
geocode · reverse_geocodetexto ↔ coordenadas (VE+CO)
routeruta en las 27 zonas, perfil moto en VE, con chequeo de snap (nunca una distancia inventada)
distance_matrixmatriz N×M de tiempos/distancias
reports_near · reports_on_routealcabalas, tráfico y huecos de la comunidad — cerca de un punto o SOBRE la ruta, en orden de avance
quote_deliverycotización con la tarifa REAL configurada (no estimada)
optimize_delivery_route · assign_deliveries_to_fleetVROOM: orden óptimo de paradas y asignación de flota
get_isochrone · check_delivery_coveragezona alcanzable en N minutos y verificación de cobertura
get_driver_location · find_nearby_driverstracking en vivo de repartidores
sea_routeruta marítima real entre puertos (nm, km, días)
static_map_imageURL de mapa PNG para incrustar
reason_about_location · get_delivery_insightsrazonamiento 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"
Los cobros son reales desde el día uno. Probá con montos mínimos.

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ódigoqué significa
400parámetros inválidos — el cuerpo dice exactamente qué (error + hint)
401sin clave o clave revocada
403scope no autorizado, o acción que no te pertenece (votar tu propio reporte)
404el recurso no existe (un GERS inventado, un reporte vencido)
409duplicado — la respuesta trae el id del que ya existe: usalo
422ruteable pero imposible (ruta-cruza-cobertura entre regiones de EE.UU.)
429tope 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