Quickstart
This walkthrough takes you from a fresh API key to your first markers on a map. Every step
has a copy-pasteable curl. It should take well under ten minutes.
Before you start
You need:
- A ZeeMaps account on the enterprise plan. API access is gated on this plan — a key
on any lower plan is rejected with
402 PLAN_REQUIRED. See Authentication for how to request a key and upgrade. - An API key. Keys are minted by ZeeMaps on request and shown to you once. Store it like a password.
Set it as an environment variable so the snippets below just work:
export ZM_KEY="zm_your_api_key_here"
export ZM_API="https://api.zeemaps.com/v1"
Step 1 — Confirm your key works
GET /v1/me is the cheapest authenticated call. It echoes the account, scope, plan, and
rate limit behind your key — a good first check and a way for a client to self-configure.
curl -s "$ZM_API/me" \
-H "Authorization: Bearer $ZM_KEY"
{
"account_email": "ops@acme.example",
"scope": "read_write",
"plan": "enterprise",
"rate_limit": 30
}
If you get a 401, the key is missing/invalid/revoked. If you get a 402, the key is
valid but the account is not on the enterprise plan. Both responses include an
error.help_url that deep-links you to the page that fixes it — see
Errors and Authentication.
Reference: GET /me.
Step 2 — List your maps
GET /v1/maps returns the maps your account owns (the API is owned-only — maps merely
shared with you are not listed; see Conventions).
curl -s "$ZM_API/maps?page_size=10" \
-H "Authorization: Bearer $ZM_KEY"
{
"maps": [
{ "id": 4321179, "name": "US Sales Territories Q3 2026", "status": "active", "private": true }
],
"page_info": { "total_count": 1, "next_page_token": null }
}
Reference: GET /maps.
Step 3 — Create a map
A new map needs only a name (and optionally a description). New maps are created
private by default; flip that later with PATCH /v1/maps/{map_id}.
curl -s -X POST "$ZM_API/maps" \
-H "Authorization: Bearer $ZM_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Quickstart Demo",
"description": "Created from the API quickstart"
}'
{
"id": 4322001,
"name": "Quickstart Demo",
"description": "Created from the API quickstart",
"owner_email": "ops@acme.example",
"status": "active",
"private": true,
"extended_colors": false,
"marker_count": 0,
"region_count": 0,
"created_at": "2026-06-30T17:00:00Z",
"updated_at": "2026-06-30T17:00:00Z"
}
Capture the new id for the next step:
export ZM_MAP=4322001
Reference: POST /maps.
Step 4 — Add a marker
Add a pin with coordinates. Only name is required; supply either lat+lng or an
address (the server geocodes address-only markers for you).
curl -s -X POST "$ZM_API/maps/$ZM_MAP/markers" \
-H "Authorization: Bearer $ZM_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Corp HQ",
"lat": 37.7879,
"lng": -122.3983,
"category": "Customer"
}'
{
"id": 88341027,
"map_id": 4322001,
"name": "Acme Corp HQ",
"type": "pin",
"lat": 37.7879,
"lng": -122.3983,
"category": "Customer",
"color": "blue",
"created_at": "2026-06-30T17:01:00Z"
}
Prefer to add by address only? Drop lat/lng and send a structured address — the
server geocodes it:
curl -s -X POST "$ZM_API/maps/$ZM_MAP/markers" \
-H "Authorization: Bearer $ZM_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Corp HQ",
"address": { "street": "350 Mission St", "city": "San Francisco", "state": "CA", "zip": "94105" },
"category": "Customer"
}'
Reference: POST /maps/{map_id}/markers.
Step 5 — Read your markers
curl -s "$ZM_API/maps/$ZM_MAP/markers?page_size=50" \
-H "Authorization: Bearer $ZM_KEY"
The list is paginated — follow page_info.next_page_token to walk large maps. See
Pagination.
Reference: GET /maps/{map_id}/markers.
Where to next
- Adding many markers at once? Use bulk import — see Recipes → Bulk import.
- Region markers (e.g. ZIP areas) and circles? See Recipes → Marker types.
- Searching by text, category, or geography? See Recipes → Search.
- A full field-by-field contract for every endpoint is in the API Reference.