Upload a CSV or Excel file to GeoMaps — it geocodes every row onto an interactive map.
Open the source's Settings, enable the API, and generate a key scoped to that data source.
Call POST, PATCH or DELETE on /api/v1/records — new pins geocode and appear on your map automatically.
Overview
The GeoMaps REST API lets you create, read, update and delete records on a CSV or Excel data source from your own code. Each API key is scoped to a single data source, and any record you create is geocoded and dropped onto your map automatically.
Base URL: https://api.geomaps.co/api/v1
1. Create a data source
In GeoMaps, open Data Sources and upload a.csv or .xlsx file. GeoMaps detects your address columns, geocodes every row, and plots them on an interactive map. This file-backed source is the one the API reads from and writes to.
2. Enable the API & generate a key
Open the source, click Settings, and tick Enable API. Then click Generate API key and copy the key — it looks like gm_live_…. You can re-copy or regenerate it any time from the same screen.
3. Choose your ID column
In Settings → Data fields, set one column's type to ID. That column is how the API addresses records for update, delete and lookup — and it's always exposed in the API as id, whatever the column is actually called. If a column named ID or Record ID exists, it's selected automatically.
While you're there, set each column's type (text, number, date, datetime, boolean) — the API validates writes against these.
Authentication
Send your key as a bearer token on every request (the header X-API-Key is also accepted):
Authorization: Bearer gm_live_your_key_hereRequests are rate-limited to 120 requests per minute per key. Exceeding it returns 429.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /schema | List the source's fields and types |
| GET | /records | List or filter records |
| GET | /records/{id} | Fetch a single record by its ID |
| POST | /records | Create a record (fails if the ID already exists) |
| PATCH | /records/{id} | Update a record (fails if the ID doesn't exist) |
| PUT | /records/{id} | Upsert — create if new, update if it exists |
| DELETE | /records/{id} | Delete a record |
Create a record
Send the record's fields by their column names; use id for the ID column. Omit id and GeoMaps generates one.
curl -X POST https://api.geomaps.co/api/v1/records \
-H "Authorization: Bearer gm_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"id": "1042",
"name": "Acme HQ",
"address": "1 Market St, San Francisco, CA"
}'{
"record": {
"id": "1042",
"name": "Acme HQ",
"address": "1 Market St, San Francisco, CA",
"geocode_status": "Processing"
}
}The pin appears on your map once geocoding finishes (typically a few seconds).
Update & delete a record
Address records by the value of your ID column. Updating an address field re-geocodes the pin automatically. PATCH updates only an existing record; use PUT to upsert (create the record if that ID doesn't exist yet, otherwise update it) — handy when syncing from a system where you don't know if the record is already mapped.
curl -X PATCH https://api.geomaps.co/api/v1/records/1042 \
-H "Authorization: Bearer gm_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "name": "Acme Headquarters" }'curl -X PUT https://api.geomaps.co/api/v1/records/1042 \
-H "Authorization: Bearer gm_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "company": "Acme", "address": "1 Market St, San Francisco, CA" }'curl -X DELETE https://api.geomaps.co/api/v1/records/1042 \
-H "Authorization: Bearer gm_live_your_key_here"Find records
Fetch one record by ID, or filter the list by any field. Supports limit (max 200) and offset.
curl "https://api.geomaps.co/api/v1/records?id=1042" \
-H "Authorization: Bearer gm_live_your_key_here"
curl "https://api.geomaps.co/api/v1/records?limit=50&offset=0" \
-H "Authorization: Bearer gm_live_your_key_here"Field types
Each column has a type, set in the source's Settings:
text— any string (the default)number— numeric valuesdate/datetime— dates and timestampsboolean— true / falseid— the ID column (exactly one), exposed asid
Discover the live field list any time with GET /schema.
What you get
- A clean REST interface — Predictable JSON endpoints for create, update, delete and find — authenticated with a single bearer token.
- Define your field types — Set each column's type and pick the ID column the API uses to address records — no schema files to maintain.
- Logs built in — Every API request is recorded so you can see exactly what was created, updated or deleted, and when.