Maps
A map is one venue map with a public address (https://maps.waygomaps.com/{map_id}). Your Waygo team creates it; this API reads it, changes its settings, publishes it and takes it live, exactly as the dashboard's map page does.
Every endpoint here is scoped to your account (or a sub-account through the Waygo-Account header) and needs maps:read or maps:write. Whether a call is allowed also depends on the map's state: the overview's capabilities object tells you before you try.
ENDPOINTS
GET /maps/v1
GET /maps/v1/:map_id
GET /maps/v1/:map_id/overview
GET /maps/v1/:map_id/usage
GET /maps/v1/:map_id/publish-status
PUT /maps/v1/:map_id/configuration
POST /maps/v1/:map_id/publish
POST /maps/v1/:map_id/live
POST /maps/v1/:map_id/offline
POST /maps/v1/:map_id/preview-link
POST /maps/v1/:map_id/floor-plans
GET /maps/v1/:map_id/floor-plans
GET /map-views/v1/:map_id/load (public)
The map object
Properties
- Name
map_id- Type
- string
- Description
The map's ID and the last part of its public address. Set at creation; never changes.
- Name
account_id- Type
- string
- Description
The account the map belongs to.
- Name
name- Type
- string
- Description
The map's name, shown in the search bar and the browser tab.
- Name
unit_type- Type
- 'Meters' | 'Feet'
- Description
The unit directions are given in.
- Name
status- Type
- 'draft' | 'live' | 'offline'
- Description
Whether the map is public. See Publishing and going live.
- Name
status_reason- Type
- string | null
- Description
Who moved it last:
customer,staff,license_expired.
- Name
status_changed_at- Type
- timestamp | null
- Description
When the status last changed.
- Name
first_published_at- Type
- timestamp | null
- Description
When Waygo first published the base map.
- Name
license- Type
- object | null
- Description
{ starts_at, ends_at, note }: the map's license period, set by Waygo.
- Name
floor_labels- Type
- array
- Description
Your per-level overrides of the level names: one
{ name, indicator }ornullper level, by index.
- Name
map_source_id- Type
- string
- Description
The floors the map is built on. Two maps can share floors.
- Name
default_map_view_id- Type
- string
- Description
The map's default view: the view ID that appears in links.
- Name
publish_limits- Type
- object | null
- Description
A per-map publish allowance set by Waygo, when one differs from the account's.
- Name
created_at / updated_at- Type
- timestamp
- Description
Timestamps.
The map object
{
"map_id": "acme-expo-2027",
"account_id": "dash-dev-acct",
"name": "Acme Expo 2027",
"unit_type": "Meters",
"status": "live",
"status_reason": "customer",
"status_changed_at": "2026-08-09T14:02:11",
"first_published_at": "2026-08-08T23:44:00",
"license": { "starts_at": "2026-08-04T00:00:00", "ends_at": "2027-08-04T00:00:00", "note": null },
"floor_labels": [null, { "name": "Mezzanine", "indicator": "M" }],
"map_source_id": "dash-dev-src",
"default_map_view_id": "k3Qm7vX2S8aB1nR9tLpYwA",
"publish_limits": null,
"created_at": "2026-07-01T09:00:00",
"updated_at": "2026-09-18T19:44:21"
}
List maps
Every map of the account, newest first, with the facts the dashboard's Maps list shows on top of the map object.
Optional parameters
- Name
skip- Type
- integer
- Description
- Number of maps to skip. Default
0.
- Name
limit- Type
- integer
- Description
- Maps per page. Default
20.
Extra fields per map
- Name
public_url- Type
- string
- Description
- The map's public link.
- Name
license_ends_at- Type
- timestamp | null
- Description
- When the license ends.
- Name
level_count- Type
- integer
- Description
- Number of levels.
- Name
placed_count- Type
- integer
- Description
- Content rows placed on the map.
- Name
floor_plans_awaiting_build- Type
- integer
- Description
- Uploaded floor plans Waygo has not built yet.
GET /maps/v1
curl "https://api.waygomaps.com/maps/v1?limit=20" \
-H "Waygo-API-Key: $WAYGO_API_KEY"
Response
{
"maps": [
{
"map_id": "acme-expo-2027",
"name": "Acme Expo 2027",
"status": "live",
"public_url": "https://maps.waygomaps.com/acme-expo-2027",
"license_ends_at": "2027-08-04T00:00:00",
"level_count": 2,
"placed_count": 301,
"floor_plans_awaiting_build": 0
// …the map object's other fields
}
],
"total": 4,
"skip": 0,
"limit": 20
}
Retrieve a map
The map object alone. For everything the map page shows, use the overview.
GET /maps/v1/:map_id
curl https://api.waygomaps.com/maps/v1/acme-expo-2027 \
-H "Waygo-API-Key: $WAYGO_API_KEY"
The map overview
Everything the dashboard's map page renders, in one read: the map, its floors and floor plans, presentation, publishing state, content counts, the draft checklist, links, and what the caller may do.
Response fields
- Name
map- Type
- object
- Description
- The map object.
- Name
public_url- Type
- string
- Description
- The public link.
- Name
license- Type
- object
- Description
{ active, expired, ending_soon, days_remaining, starts_at, ends_at }.
- Name
floors- Type
- object
- Description
map_source_id,name,level_count,shared_with(other maps on the same floors),levels[](each withindex,indicator,name,default_indicator,default_name,overridden),base_map(its publish state),paths_version.
- Name
floor_plans- Type
- array
- Description
- The map's floor plans (see Floor plans).
- Name
floor_plans_awaiting_build- Type
- integer
- Description
- Uploaded plans Waygo has not built yet.
- Name
presentation- Type
- object
- Description
{ map_view_id, style_set, default_floor, suggested_search_terms }.
- Name
publishing- Type
- object
- Description
- The same shape as the publish status below.
- Name
recent_publishes- Type
- array
- Description
- Recent publish runs.
- Name
content- Type
- array
- Description
- Per catalog:
{ catalog_id, title, total_rows, placed_rows, last_change_at }.
- Name
checklist- Type
- object
- Description
- The draft checklist:
{ map_created, floor_plans: { uploaded, building, failed, ready, total_levels }, built, can_go_live }.
- Name
links- Type
- object
- Description
{ kiosk_count, reservation_feature_enabled, embed_url, embed_snippet }.
- Name
usage_window_days- Type
- integer
- Description
- The usage window (7).
- Name
capabilities- Type
- object
- Description
Per action,
{ allowed, reason }. Actions includeedit_general,edit_floor_labels,edit_presentation,upload_floor_plan,delete_uploaded_floor_plan,publish_content_labels,go_live,take_offline,preview,manage_links.reasonexplains a refusal:license_inactive,map_not_ready,publish_allowance_exceeded,publish_in_progress,already_live,already_offline,nothing_to_preview,staff_only,missing_scope.
GET /maps/v1/:map_id/overview
curl https://api.waygomaps.com/maps/v1/acme-expo-2027/overview \
-H "Waygo-API-Key: $WAYGO_API_KEY"
Response (abridged)
{
"map": { "map_id": "acme-expo-2027", "status": "live", "…": "…" },
"public_url": "https://maps.waygomaps.com/acme-expo-2027",
"license": { "active": true, "expired": false, "ending_soon": false, "days_remaining": 320 },
"floors": {
"level_count": 2,
"levels": [
{ "index": 0, "indicator": "1", "name": "Expo Hall", "overridden": false },
{ "index": 1, "indicator": "M", "name": "Mezzanine", "default_name": "Level 2", "overridden": true }
],
"paths_version": 3
},
"presentation": { "default_floor": 0, "suggested_search_terms": ["Registration", "Coffee"] },
"content": [
{ "catalog_id": "exhibitors", "title": "Exhibitors", "total_rows": 301, "placed_rows": 298 }
],
"links": {
"kiosk_count": 2,
"embed_url": "https://maps.waygomaps.com/acme-expo-2027?embed=1",
"embed_snippet": "<iframe src=\"…\" …></iframe>"
},
"capabilities": {
"publish_content_labels": { "allowed": true, "reason": null },
"go_live": { "allowed": false, "reason": "already_live" },
"manage_links": { "allowed": true, "reason": null }
}
}
Usage
What the dashboard's Usage section shows: loads, searches, directions and place views over the window, with the previous window for comparison.
Optional parameters
- Name
days- Type
- integer
- Description
- The window in days. Default
7.
GET /maps/v1/:map_id/usage
curl "https://api.waygomaps.com/maps/v1/acme-expo-2027/usage?days=7" \
-H "Waygo-API-Key: $WAYGO_API_KEY"
Response
{
"map_id": "acme-expo-2027",
"days": 7,
"from": "2026-09-11T00:00:00",
"to": "2026-09-18T00:00:00",
"loads_per_day": [{ "date": "2026-09-12", "count": 61 }, { "date": "2026-09-13", "count": 74 }],
"totals": { "loads": 492, "searches": 27, "routes": 42, "place_views": 63 },
"kiosk_route_share": { "kiosk": 21, "other": 21 },
"top_searches": [{ "term": "registration", "count": 7 }, { "term": "coffee", "count": 7 }],
"prior": { "loads": 302, "searches": 28, "routes": 30, "place_views": 28 }
}
Publish status
The state of the two layers, the running publish if any, the allowance and recent runs. Poll it every few seconds while active_run is set. See Publishing and going live for what the layers mean.
Response fields
- Name
status / status_reason- Type
- string
- Description
- The map's status.
- Name
license- Type
- object
- Description
- The license summary.
- Name
active_run- Type
- object | null
- Description
- The publish run in flight.
- Name
layers.content_labels- Type
- object
- Description
last_published_at,publish_status,pending_changes,stale,auto_publish { enabled, threshold, cooldown_seconds, forecast }whereforecastisnot_due,due,cooling_down,manual_firstordisabled.
- Name
layers.base_map- Type
- object
- Description
last_published_at,publish_status,stale,last_error.
- Name
readiness- Type
- object
- Description
{ ready, blockers[], warnings[] }for going live.
- Name
allowance- Type
- object
- Description
{ used_today, per_day, min_interval_seconds, next_available_at, scope, exempt }.
- Name
recent_runs- Type
- array
- Description
- Publish runs, newest first.
GET /maps/v1/:map_id/publish-status
curl https://api.waygomaps.com/maps/v1/acme-expo-2027/publish-status \
-H "Waygo-API-Key: $WAYGO_API_KEY"
Response (abridged)
{
"status": "live",
"active_run": null,
"layers": {
"content_labels": {
"last_published_at": "2026-09-17T22:49:00",
"publish_status": "published",
"pending_changes": 18,
"stale": true,
"auto_publish": { "enabled": true, "threshold": 500, "cooldown_seconds": 600, "forecast": "not_due" }
},
"base_map": { "last_published_at": "2026-08-08T23:44:00", "publish_status": "published", "stale": false }
},
"readiness": { "ready": true, "blockers": [], "warnings": [] },
"allowance": { "used_today": 0, "per_day": 12, "min_interval_seconds": 600, "next_available_at": null, "scope": "account", "exempt": false },
"recent_runs": [
{ "run_id": "…", "targets": ["content_labels"], "requested_role": "customer", "trigger": "manual", "status": "succeeded", "started_at": "2026-09-17T22:49:00", "finished_at": "2026-09-17T22:51:30", "counted_against_allowance": true }
]
}
Update settings
What the dashboard's Map settings panel saves. Send only the sections you change; each section is authorised on its own, and a section you may not edit answers 403 section_not_editable (nothing is silently dropped).
Sections
- Name
general- Type
- object
- Description
{ name?, unit_type? }.
- Name
floor_labels- Type
- array
- Description
- One entry per level by index:
{ name?, indicator? }to override,nullto use Waygo's default. The indicator is 1 to 3 characters.
- Name
presentation- Type
- object
- Description
{ default_floor?, suggested_search_terms? }: the level the map opens on and the chips under the search bar.
The floor structure, anchor point, shared floors, map style, license and allowances are set by Waygo; sending those sections answers 403.
Answers the updated overview.
PUT /maps/v1/:map_id/configuration
curl -X PUT https://api.waygomaps.com/maps/v1/acme-expo-2027/configuration \
-H "Waygo-API-Key: $WAYGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"general": { "name": "Acme Expo 2027" },
"floor_labels": [null, { "name": "Mezzanine", "indicator": "M" }],
"presentation": { "default_floor": 0, "suggested_search_terms": ["Registration", "Coffee", "Restrooms"] }
}'
Refused section
{ "error": "section_not_editable", "section": "anchor", "reason": "staff_only" }
Publish
Bake the map's content labels. Content changes are already live; publishing makes them permanent and fast to load, and the map republishes itself after 500 changes, so call this only when you want it now. Runs as a job: the response is the run; follow it through the publish status.
Body
- Name
targets- Type
- array
- Description
["content_labels"]. (The base map is published by Waygo.)
Errors
- Name
409 publish_in_progress- Description
- A run is already in flight.
- Name
409 license_inactive- Description
- The map's license has ended.
- Name
429 publish_allowance_exceeded- Description
- Today's allowance is spent or the interval has not passed;
next_available_atand aRetry-Afterheader say when.
POST /maps/v1/:map_id/publish
curl -X POST https://api.waygomaps.com/maps/v1/acme-expo-2027/publish \
-H "Waygo-API-Key: $WAYGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "targets": ["content_labels"] }'
Response (202)
{
"run_id": "7f3c…",
"map_id": "acme-expo-2027",
"targets": ["content_labels"],
"requested_role": "customer",
"trigger": "manual",
"status": "running",
"target_states": { "content_labels": { "status": "queued" } },
"counted_against_allowance": true,
"started_at": "2026-09-18T19:44:21",
"finished_at": null
}
429
{ "error": "publish_allowance_exceeded", "reason": "daily_limit_reached", "used_today": 12, "per_day": 12, "next_available_at": "2026-09-19T00:00:00" }
Go live
Make the map public. Refused with 409 map_not_ready and a blockers list while Waygo is still building it, and with 409 license_inactive after the license ends. The first time a map goes live, Waygo bakes its content labels automatically (a system run that does not count against the allowance). Answers the updated overview.
POST /maps/v1/:map_id/live
curl -X POST https://api.waygomaps.com/maps/v1/acme-expo-2027/live \
-H "Waygo-API-Key: $WAYGO_API_KEY"
409
{ "error": "map_not_ready", "blockers": ["base_map_not_published"] }
Take offline
Stop serving the map. Every link and kiosk shows “This map is not available right now” until it goes live again; nothing is deleted. Answers the updated overview.
POST /maps/v1/:map_id/offline
curl -X POST https://api.waygomaps.com/maps/v1/acme-expo-2027/offline \
-H "Waygo-API-Key: $WAYGO_API_KEY"
Preview link
A signed link that opens a draft or offline map for 24 hours. Refused with 409 map_not_ready on a draft whose base map Waygo has not published yet (there is nothing to show). The token is what Waygo.js takes as its preview option.
POST /maps/v1/:map_id/preview-link
curl -X POST https://api.waygomaps.com/maps/v1/acme-winter-market-2025/preview-link \
-H "Waygo-API-Key: $WAYGO_API_KEY"
Response
{
"token": "bWFwX3ByZXZpZXd8YWNtZQ.c2ln",
"url": "https://maps.waygomaps.com/acme-winter-market-2025?preview=bWFwX3ByZXZpZXd8YWNtZQ.c2ln",
"expires_at": "2026-09-19T19:44:21"
}
Floor plans
POST /maps/v1/:map_id/floor-plans uploads drawings for the map and GET /maps/v1/:map_id/floor-plans lists them. Both are documented under Floor plans.
Load a map (public)
What the public map and Waygo.js call to open a map. No authentication; a draft, offline or expired map answers 404 map_not_available unless a valid preview token is given.
Optional parameters
- Name
map_view_id- Type
- string
- Description
- A specific view; defaults to the map's default view.
- Name
preview- Type
- string
- Description
- A preview token.
GET /map-views/v1/:map_id/load
curl https://api.waygomaps.com/map-views/v1/acme-expo-2027/load
Response
{
"account_id": "dash-dev-acct",
"map_id": "acme-expo-2027",
"map_view_id": "k3Qm7vX2S8aB1nR9tLpYwA",
"map_name": "Acme Expo 2027",
"map_view_name": "Acme Expo 2027 — Main",
"status": "live",
"preview": false,
"floors": [{ "name": "Expo Hall", "indicator": "1" }, { "name": "Mezzanine", "indicator": "M" }],
"default_floor": 0,
"suggested_search_terms": ["Registration", "Coffee"],
"reference_coordinate": [-122.41941, 37.77493],
"coordinate_scaling_multiplier": 30.0,
"style_id": "cmsn…"
}