Atlas Agent (NL control)
Atlas Agent
Atlas resolves a free-text command into a structured, executable action your client runs against the map. Under the hood it is a tool-calling AI agent: it understands natural language in any language (first-class English and Arabic, including Jordanian dialect), picks the right action, and — for factual questions — grounds its answer in live Navvo data (real places, ratings, and current traffic) rather than guessing. One endpoint covers search, navigation, pins, layer/style control, day-plan itineraries, fleet optimization, and grounded conversational answers.
The response contract is unchanged and backward-compatible — you still switch on action exactly as before. Replies come back in the same language the user wrote in. Atlas is resilient: if the primary model is briefly unavailable it automatically falls back to a local model and a deterministic parser, so the endpoint keeps working.
Scope required: places.
Authentication: Atlas requires an identified caller — either a signed-in Navvo user (Bearer token, as on navvo.io) or your API key (x-api-key). Anonymous requests receive 401.
"model": "navvo-ai". The underlying engine is a Navvo implementation detail and may change without notice — never depend on a specific model name.POST /ai/atlas
| Field | Type | Notes |
|---|---|---|
message | string | required — the user's natural-language command |
context | string | optional — short conversation/context hint (the Navvo map sends the live camera, visible street names and nearby businesses here so Atlas answers about what the user sees) |
userName | string | optional — display name of your signed-in end user; Atlas addresses them by first name |
curl -s -X POST "https://navvo.io/api/v1/ai/atlas" \
-H "x-api-key: $NAVVO_API_KEY" -H "content-type: application/json" \
-d '{ "message": "plan a 3 hour trip with cafes and museums" }'
Every response has a reply (a short human sentence, in the user's language), an action, a model (always navvo-ai), and unavailable. The other fields depend on the action:
action | Extra fields | Meaning — what your client should do |
|---|---|---|
search | query | run a place search for query and show results |
directions | query | start routing to query |
navigate | query | start turn-by-turn guidance to query immediately ("start navigation to…", "drive me to…") |
pin | query | drop a pin at query |
locate | query | center/zoom the map on query |
control | target, value | toggle a layer/style/panel — target e.g. traffic/satellite/3d/transit/weather; value is on/off/toggle |
itinerary | timeBudgetMin, interests | build a day plan — call POST /itinerary/auto with these + the user's location |
optimize_fleet | — | optimize the user's delivery stops — call the fleet optimizer |
report_incident | query (type: accident/hazard/police/camera/closure/jam) | hands-free crowd incident report — file it at the user's location via POST /incidents ("there's an accident ahead") |
answer | — | open-ended — reply is a conversational answer |
Planning examples
// "plan a 3 hour trip with cafes and museums"
{ "action": "itinerary", "timeBudgetMin": 180, "interests": ["cafe","museum"],
"reply": "Planning a 3-hour itinerary around cafe, museum near you." }
// "what can I do in 90 minutes near here"
{ "action": "itinerary", "timeBudgetMin": 90, "interests": [], "reply": "Planning a 1.5-hour itinerary near you." }
// "optimize my deliveries"
{ "action": "optimize_fleet", "reply": "Optimizing your stops into the fastest route order." }
Duration is parsed from the text (3 hours, 90 minutes, half-day → 240, afternoon → 240); interests are matched against a category vocabulary (cafe, restaurant, museum, park, shopping, historic, art, market, nature, …).
Other examples
{ "action": "directions", "query": "the airport", "reply": "Routing you to the airport." } // "directions to the airport"
{ "action": "search", "query": "cafes", "reply": "Here's what I found for \"cafes\"." } // "find cafes nearby"
{ "action": "control", "target": "traffic", "value": "on", "reply": "Turning on traffic." } // "turn on traffic"
Grounded answers
For factual questions Atlas fetches real Navvo data before replying — it never invents places, ratings, coordinates, or traffic:
// "is there a pharmacy near me?" → answered from live place search
{ "action": "answer", "reply": "Yes — the closest is Airport Bridge Pharmacy (4.8), with Airport Pharmacy nearby too." }
// "كيف حالة السير الآن؟" (how is traffic now?) → answered from live traffic, in Arabic
{ "action": "answer", "reply": "لا توجد تقارير مرور حية في منطقتك الآن. أخبرني باسم الشارع وسأتحقق لك." }
action: "answer". Because the schema is unchanged, existing integrations need no code changes.Quests (crowd data)
Gamified, crowd-sourced data improvement — surface nearby data-gap micro-tasks, collect answers into the moderation queue, and award contributor points.
Users & Sync
Accounts, profiles, saved places, history, and live location sharing — the personal-data API for building a signed-in consumer app on Navvo.