Navvo
Getting Started

Developer Portal

Use the Navvo Developer Portal to create organizations and projects, manage API keys, watch live usage and search analytics, and test endpoints in the sandbox.

Developer Portal

The Developer Portal at navvo.io/developer is the fastest way to work with the Navvo API. It's a point-and-click console for everything you'd otherwise do over REST — organizations, projects, API keys, live usage, search analytics and a request sandbox.

Everything in the portal is scoped to your account: you only ever see and manage the organizations, projects and keys that you created.

The portal requires the developer role (or admin / super_admin). Enrollment is self-serve: any signed-in account can grant itself the role by calling POST /developer/enroll (or simply reading GET /developer/access, which auto-enrolls on first read) — no admin approval needed. The change takes effect on the next request, so you reach the portal immediately. See Authentication for the role model.

Layout

The portal is organised into five tabs:

Overview

Your organization, project and key counts, total requests today, and a guided three-step setup. ::::

Workspace

Create, rename and delete organizations and the projects inside them. ::::

API keys

Mint keys, edit scopes/plan/quotas, rotate secrets, activate/deactivate, and delete — with live per-key usage. ::::

Search analytics

What people search for with each project's keys, what finds nothing, and how long Navvo keeps it. ::::

Sandbox

Run real API requests as one of your keys without ever copying the secret into the browser. ::::

1. Set up a workspace

Open the Workspace tab and create an organization (a URL-safe slug is generated for you). Inside each organization card, add one or more projects — typically one per app or environment (for example Driver App and Rider App, or staging and production).

You can rename or delete an organization or project at any time. Deleting an organization cascades to its projects and keys; deleting a project cascades to its keys. These actions are permanent.

2. Mint an API key

Switch to the API keys tab and fill in the Create an API key form:

Pick a project

Choose from a dropdown of your projects (grouped as Organization / Project) — no IDs to copy.

Name the key

Give it a clear label such as Driver App — production.

Choose a plan

free, starter, growth, scale or enterprise. The plan sets default quotas (adopted from the matching billing tier); you can fine-tune them later. (The legacy startup value is now starter.)

(Optional) Adjust scopes

Expand Scopes to toggle exactly what the key can do. Eight scopes are on by default; geo, insights and optimize are opt-in. See Authentication → Scopes.

When you click Issue API key, the full secret is shown once in a highlighted banner. Copy it immediately — Navvo only stores a hash, so it can never be shown again.

If you navigate away without copying the key, you can't recover it. Rotate the key to get a fresh secret.

3. Manage your keys

Each key in Your API keys shows its label, last-four, plan, status, scope count, when it was last used, and two live usage meters (requests this minute and today, against the key's quota — refreshed automatically).

A key that Navvo has made unlimited shows an Unlimited badge. Its meters still count requests this minute and today, but show them without a ceiling (1,240 / Unlimited, with no bar and no warning colour), because the key has no quota to fill.

The per-key actions are:

ActionIconWhat it does
Activate / DeactivatepowerToggle the key on or off. An inactive key is rejected with 403 until re-enabled.
EditpencilChange the label, plan, scopes, per-minute / per-day quotas, and the websites and IP addresses the key may be used from. On an unlimited key the quota fields are read-only and show Unlimited.
RotaterefreshGenerate a new secret and immediately invalidate the old one (same key id, scopes and quotas). The new secret is shown once.
DeletetrashPermanently remove the key. Requests using it stop working immediately.
In the portal you can set up to 255 requests per minute and 10,000,000 per day: that is the self-serve cap. Keys set up by Navvo can have higher limits, which saving the key keeps, or be unlimited; only Navvo can make a key unlimited. Usage meters turn amber at 70% and red at 90% so you can spot a key approaching its limit.

Lock a key to your websites or servers

In Edit, fill Allowed websites for a key used in web pages (example.com, *.example.com, localhost:3000), or Allowed IP addresses for a key used from your servers (203.0.113.7, 198.51.100.0/24). Write one entry per line. A restricted key shows Locked to … in its row. Requests from anywhere else get 403. See Authentication → Restricting a key for the matching rules.

4. Test in the sandbox

The Sandbox tab lets you fire real requests at the Navvo API and see the live response.

  1. Select an API key — this is required. The dropdown lists only your own keys, so the secret never leaves the server: the portal proxies the call server-side as the key you pick.
  2. Choose an endpoint from the curated, read-only list (search, geocoding, places, routing, health, …). For POST endpoints (read-only compute, e.g. routing) you can edit the JSON body. The sandbox deliberately exposes only safe, non-mutating endpoints.
  3. Send request — the button is disabled until you've selected a key.

The response panel shows the HTTP status, round-trip time, and the formatted JSON body. The sandbox applies your key's scope and active-state checks before forwarding: if the selected key is inactive, or is missing a scope the endpoint needs, you'll get a 403 explaining exactly what's wrong — a quick way to verify a key is configured correctly before you ship. It does not apply the key's website or IP restrictions, because the request runs on Navvo's servers on your behalf.

The sandbox is the easiest way to confirm a newly minted key works and has the right scopes. Once it succeeds there, the same request will work from your own code with the x-api-key header.

5. Watch your search analytics

The Search analytics tab shows the searches made with one project's API keys. Only a project's owner can see its analytics; for a legacy project with no owner, only Navvo's highest admin role (super_admin) can. Pick a project and a range of 7, 30 or 90 days (days follow Asia/Amman time):

  • Six tiles: searches, zero-result rate, click-through rate, average click position, conversion rate and median response time. A rate backed by fewer than 30 searches shows Insufficient data rather than a misleading number.
  • Searches per day, as a chart or a table.
  • Top queries and Queries with no results, 20 of each, with searches, zero-result rate, click-through rate, conversions and when each was last seen. The no-results list is the quickest way to find the places and spellings your users expect and don't get.

Click-through and conversion rates stay empty until your app reports what users opened, with search events sent for searches that carried a user-consented session id.

Choose how long Navvo keeps your searches

SettingWhat happens
30 days (default)Searches made with the project's keys are kept for 30 days.
90 daysKept for 90 days.
OffWithin about a minute, Navvo stops logging searches and stops accepting click and conversion events for the project's keys. Everything already stored for the project, events included, is deleted.

Moving from 90 to 30 days deletes the older searches at the next nightly clean-up. Deleted data can't be restored, so the portal asks you to confirm first. Search analytics & privacy lists what a search record holds and what is never stored. In short: the query text after emails, phone numbers and other personal details are removed, the filters and results, and a coarse area instead of coordinates. Search records never contain the IP address itself. Separately, and whatever this setting, usage metering records the address each API-key call comes from (usually your server; your user's device when a key is used from a browser or an app) for billing and abuse prevention. A single request can stay out of analytics with analytics=false.

Over the API

These endpoints take the same bearer token as the rest of the portal and follow the same access rule as the tab:

curl "https://navvo.io/api/v1/developer/projects/PROJECT_ID/search-analytics?days=30" \
  -H "Authorization: Bearer $NAVVO_TOKEN"

curl -X PATCH "https://navvo.io/api/v1/developer/projects/PROJECT_ID/search-settings" \
  -H "Authorization: Bearer $NAVVO_TOKEN" -H "Content-Type: application/json" \
  -d '{"analytics":"90"}'

GET …/search-analytics takes days = 7, 30 or 90 (default 30) and returns:

{
  "project": { "id": "…", "name": "Rider App", "slug": "rider-app", "organization": { "id": "…", "name": "Acme Mobility", "slug": "acme-mobility" } },
  "range": { "days": 30, "from": "2026-09-01", "to": "2026-09-30", "timeZone": "Asia/Amman" },
  "settings": { "analytics": "30", "retentionDays": 30, "isDefault": true },
  "available": true,
  "overview": {
    "searches": 1240, "requests": 1512, "sessions": 0,
    "zeroRate": 0.06, "ctr": null, "avgClickPos": null, "conversionRate": null,
    "p50Ms": 38, "p95Ms": 190, "hybridShare": 0,
    "insufficient": { "zeroRate": false, "ctr": true, "avgClickPos": true, "conversionRate": true },
    "series": [{ "day": "2026-09-30", "searches": 52, "zero": 3, "clicks": 0, "conversions": 0 }]
  },
  "topQueries": {
    "total": 318,
    "items": [{ "query": "pharmacy", "qNorm": "pharmacy", "searches": 96, "sessions": 0, "zeroRate": 0, "ctr": null, "avgClickPos": null, "conversions": 0, "lastSeen": "2026-09-30T11:02:11.000Z" }]
  },
  "zeroResultQueries": { "total": 21, "items": [] }
}
  • Rates are fractions (0.06 = 6%). null means there was nothing to divide by.
  • searches leaves out keystrokes that the same user replaced with a longer query within 10 seconds; requests counts every call.
  • hybridShare is the share of searches where meaning-based matching contributed.
  • available: false means analytics are temporarily unavailable. The numbers are then empty, not zero.
  • With analytics: "off", overview is null and both lists are empty.

PATCH …/search-settings takes {"analytics": "off" | "30" | "90"} and returns the project with its new settings.

Deleting one end user's searches. If one of your users asks you to delete their data, call DELETE …/search-sessions/SESSION_ID with the session id your app sent for them in X-Navvo-Session:

curl -X DELETE "https://navvo.io/api/v1/developer/projects/PROJECT_ID/search-sessions/SESSION_ID" \
  -H "Authorization: Bearer $NAVVO_TOKEN"

It removes that session's searches and click events from the last 91 days and returns how many were deleted: {"project": {…}, "deleted": {"queries": 12, "events": 3}}. Navvo stores only a daily hash of a session id, so the id itself has to come from you; searches sent without a session id can't be tied to a user and aren't affected. Only the project's owner can call it, and each call is recorded in the audit log without the id. A malformed id answers 400.

StatusWhen
400days or analytics has a value other than the ones listed.
401No bearer token, or it has expired.
403The project isn't yours, or your account lacks the developer role.
404No project has this id.

Prefer the API?

Everything in the portal is backed by the /developer/* REST endpoints documented in Authentication → Managing keys, so you can script organization, project and key management into your own tooling.

Copyright © 2026