GeoMaps logoGeoMaps
REST API logo
Developers

The GeoMaps REST API

Push records into a CSV or Excel map programmatically. Enable the API on a source, generate a key, and create, update or delete records with simple HTTP requests.

Connect a spreadsheet

Upload a CSV or Excel file to GeoMaps — it geocodes every row onto an interactive map.

Generate an API key

Open the source's Settings, enable the API, and generate a key scoped to that data source.

Send a request

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 header
Authorization: Bearer gm_live_your_key_here

Requests are rate-limited to 120 requests per minute per key. Exceeding it returns 429.

Endpoints

MethodPathDescription
GET/schemaList the source's fields and types
GET/recordsList or filter records
GET/records/{id}Fetch a single record by its ID
POST/recordsCreate 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.

Request
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"
  }'
Response 201
{
  "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.

Update (PATCH)
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" }'
Upsert (PUT)
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" }'
Delete
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.

Find
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 values
  • date / datetime — dates and timestamps
  • boolean — true / false
  • id — the ID column (exactly one), exposed as id

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.

Put your first map together in 10 minutes.

Free forever for 1,000 locations. No credit card required.