Getting your bearings…
PMap is Africa's own map, address, and places layer. We render with MapLibre where a custom engine is not the product — the product is PMap's own data for all 54 countries, PMap address codes, pin-confirm, GPS trails, and APIs other businesses can call. Attribution in every response is © PMap.
If you already call Google Maps Platform, Mapbox, or HERE, you do not rewrite your whole app. Swap the host, map the parameter names below, and keep pm_live_ on your server. pm_test_ is canned Lagos — not outdoor QA.
| You have | Call PMap |
|---|---|
| Geocoding API ?address= | GET /api/v1/geocode?q= or /api/v1/compat/google/geocode?address= |
| Geocoding API ?latlng= | GET /api/v1/reverse?lat=&lng= or compat …/geocode?latlng= |
| Places Autocomplete ?input= | GET /api/v1/search/suggest?q= (alias: input=) |
| Places Nearby location=&radius=&type= | GET /api/v1/places/nearby?lat=&lng=&category= (alias: location=, type=) |
| Directions origin=&destination= | GET /api/v1/route?from=&to= or compat …/directions |
| Static Maps center=&size=&key= | GET /api/v1/staticmap?center=&size=&format=png (image is proxied; JSON url is a PMap URL) |
| Maps JavaScript API new google.maps.Map | Browser SDK new PMap({ container, center, zoom, theme }) — /sdk/v1/pmap.js |
| Maps Embed iframe | /embed/map?lat=&lng=&zoom= (generator: /developers/embed) |
Native v1 also accepts Google query names on geocode, reverse, route, nearby, and suggest. Compat envelope adds status / results shaped like Google callbacks. Native fields stay in pmap. We do not emit a Google encoded polyline — use GeoJSON.
<!-- Browser adapter (demo / restricted keys only) -->
<script src="https://pechmap.com/pmap-google.js"></script>
<script>
const geo = new PMapGoogle.Geocoder({ key: 'pm_test_…' })
geo.geocode({ address: 'Ikeja Lagos' }, (results, status) => {
// status === 'OK' · results[0].geometry.location.lat()
})
</script>Map tiles: https://tiles.pechmap.com/style.json (day) and style-dark.json (night). MapLibre GL JS loads those styles. Do not put a live key in a mobile binary.
route_truck: false on capabilities). Driving/walk/cycle are live.Confirm a stop
POST /v1/stops/confirm — the only way pinConfirmed is true. Needed for last-mile in cities with weak street names.
Vehicle GPS
POST /v1/track/ping then GET /v1/track/{device}?trail=1. Empty until a real ping — never invented.
Proof of delivery
POST /v1/pod with an https photo you host. Dispute pack: POST /v1/disputes.
Trip pin survey
POST /v1/integrations/{your-slug}/trip-outcome — UX hints only, never surge pricing.
Probe what actually ships: GET /api/v1/capabilities (no key). Compat envelopes are not Google. Keep live keys server-side.