Change the host, keep the query string.
This is the closest of the three migrations by design: response field names and nesting follow HERE's documented payloads, so most integrations move without touching the code that reads the response.
- Same field names and nesting on geocoding, routing, matrix, isolines, traffic and places
- Flexible polyline by default, as on HERE
- Free allowances identical, so the free tier does not shrink on the way over
- Every rate exactly half of the list price you are paying today
The swap
Host and auth header. Everything below is the parameter map.
- https://geocode.search.hereapi.com?apiKey=YOUR_KEY
+ https://api.apinavi.com
+ Authorization: Bearer $APINAVI_KEYParameter map
Geocoding & search
| HERE | ApiNavi | Note |
|---|---|---|
| GET /v1/geocode?q= | GET /v1/geocode?q= | Identical. Response fields keep their names. |
| GET /v1/revgeocode?at= | GET /v1/revgeocode?at= | — |
| GET /v1/autosuggest?q=&at= | GET /v1/autosuggest?q=&at= | — |
| in=countryCode:DEU | in=countryCode:DEU | — |
| items[].scoring.queryScore | items[].scoring.queryScore | Same 0–1 range; our field scores cover fewer components. |
| items[].resultType=administrativeArea | items[].resultType=locality | We collapse three administrative levels into locality and district. |
Routing
| HERE | ApiNavi | Note |
|---|---|---|
| GET /v8/routes?transportMode= | GET /v1/routes?transportMode= | Version segment differs; parameters do not. |
| return=polyline,summary | return=polyline,summary | — |
| vehicle[grossWeight] | vehicle[grossWeight] | — |
| POST /v8/matrix | POST /v1/matrix | Synchronous up to 500×500; larger jobs return a job id. |
| GET /v8/isolines | GET /v1/isolines | — |
| spans=speedLimit,truckRestriction | spans=speedLimit,truckRestriction | — |
Maps & traffic
| HERE | ApiNavi | Note |
|---|---|---|
| maps.hereapi.com/v3/base/mc/{z}/{x}/{y}/png8 | /v1/tiles/raster/{z}/{x}/{y}.png | — |
| vector/mc/{z}/{x}/{y}/omv | /v1/tiles/vector/{z}/{x}/{y}.mvt | Layer names follow the OpenMapTiles convention rather than HERE's. |
| GET /v7/flow?in=bbox: | GET /v1/traffic/flow?in=bbox: | — |
| GET /v7/incidents?in= | GET /v1/traffic/incidents?in= | — |
Where it is not a drop-in
Administrative result types
HERE returns three administrative levels; we collapse them into locality and district. If you branch on resultType, that branch needs one extra case removed.
Vector tile layer names
Our MVT layers follow the OpenMapTiles convention rather than HERE's naming. A style needs its layer references renamed — mechanical, but not zero.
Indoor and HD data
We do not serve indoor venue maps or lane-level HD content. If you use either, this is not a migration you should make.
Scoring granularity
queryScore matches HERE's 0–1 semantics, but fieldScore covers fewer components. Thresholds usually transfer; per-component gates may need retuning.
How teams usually do it
- 01
Shadow
Send a copy of production traffic to both providers for a week. No user-facing change.
- 02
Diff
Compare field by field on the endpoints you actually use. Most teams find two or three real differences, not twenty.
- 03
Split
Move 5%, then 50%, watching error rate and latency per region.
- 04
Cut
Flip the rest, keep the old key alive for a fortnight, then rotate it out.
Dual-run mode
Point a percentage of traffic at both providers and diff the responses. The console shows field-level disagreement rates per endpoint, so you cut over on evidence rather than on a spot check.
Leaving later
The same tables read in reverse, and an export endpoint returns your saved geofences, styles and batch results in open formats. A migration guide that only points inwards is a warning sign, not a feature.
Cutover checklist
- Rate limits raised on the new key before the split, not after
- Spend cap set for the first full month
- Saved place identifiers re-resolved if you store them
- Polyline decoder confirmed against a known route
- Coverage checked for the countries in the long tail of your traffic
- Old key rotated out and removed from secrets