API
An API for your locations, scans and grid points, plus three write calls (add a location, add searches, run a scan) that stay inside your plan's limits. The API and the Claude (MCP) connector are included on Growth ($79/mo), Agency ($199/mo) and Scale ($497/mo). The Google Sheets / Looker Studio feed and webhooks are on every paid plan.
Plans are billed monthly or yearly.
Get a key
Sign in, open Brand in your dashboard, and press Create an API key. Send it as a bearer token. Making a new key turns the old one off.
curl -H "Authorization: Bearer lmr_YOUR_KEY" https://localmapsrank.com/api/v1/locations
Endpoints
GET /api/v1/groups: your saved location groups and membership counts.
GET /api/v1/groups/{id}/locations: locations in one of your groups.
GET /api/v1/locations/{id}/organic: latest 200 organic observations, including source, depth and date. Rows with the source “Google organic (automatic, top 20)” come from the weekly automatic check on paid plans; other rows were entered by the account owner.
GET /api/v1/locations: your locations with their searches, grid size and spacing.
GET /api/v1/locations/{id}/scans?keyword=plumber&limit=12: finished scans (weekly, daily and the other schedules), newest first, with the summary (top-3 spots, spots found, average position), the top rivals, and a PNG of the heat-map.
GET /api/v1/scans/{scanId}: one scan with every grid point (latitude, longitude, your rank; points with no result are marked).
GET /api/v1/scans/{scanId}.csv: the same grid as a spreadsheet, with the top 3 businesses at each point.
Good to know
Read calls never start a scan. Responses are JSON. Errors return 400 (bad input), 401 (bad key), 403 (plan without the API, or over a plan limit), 404, 409 or 429.
Write calls
POST /api/v1/locations with JSON {"business": "Bright Dental", "city": "Austin, TX", "keywords": ["dentist"], "grid": 7, "spacing": 1}: looks the business up on Google Maps and adds it. grid is 3 to 21 (points per side). spacing is miles between points, 0.1 to 25 in steps of 0.1, with the whole grid at most 100 miles across. Optional: shape ("square" or "circle"), language ("en" or "es"), country ("US", "CA" or "GB"; default "US"), pick (which match, from candidates). Up to 25 lookups a day.
POST /api/v1/locations/{id}/keywords with {"keywords": ["emergency dentist"], "frequency": "weekly"}. frequency is daily, 3day (every 3 days), weekly, biweekly (every 2 weeks) or monthly (every 4 weeks). Daily searches per plan: Local 2, Growth 5, Agency 15, Scale 5.
POST /api/v1/locations/{id}/scans: runs every search of the location now, with the same waiting time between hand-run scans as the dashboard button (429 with retryAt when it is too soon).
Write calls use your plan's limits exactly like the dashboard: locations, pooled searches, daily slots and the monthly scan-points pool (403 with the reason when something does not fit). Send an Idempotency-Key header to make a retry safe: the same key returns the first answer. Up to 60 write calls an hour.
Claude and other AI assistants (MCP)
Add https://localmapsrank.com/mcp as a custom connector with the header Authorization: Bearer lmr_YOUR_KEY (the same API key, Growth, Agency or Scale). It uses MCP over HTTPS (POST). Its tools only read: list_locations, latest_scan, rivals, fix_list, trends and ai_visibility. None of them starts a scan.
Google Sheets and Looker Studio feed
On any paid plan, open Integrations in your dashboard and press Create a feed link. The link carries its own secret in the address and is separate from the API key (no Authorization header). Anyone with the link can read your numbers, so replace or turn it off there if it leaks.
GET /feed/{token}/locations.csv, /feed/{token}/scans.csv and /feed/{token}/points.csv?scan={scanId}: your locations, every finished scan, and the grid points of one scan. Use .json instead of .csv for JSON. In Google Sheets: =IMPORTDATA("https://localmapsrank.com/feed/YOUR_TOKEN/scans.csv"); Looker Studio can read that sheet.
Webhooks and Slack alerts
On any paid plan, add up to 5 https addresses under Integrations: a Slack incoming webhook, or a JSON webhook (works with Zapier, Make and n8n catch-hook URLs). Events: map finished, top-3 coverage dropped (you choose how many spots), Google profile changed, AI check finished. JSON deliveries are signed: the headers X-LMR-Timestamp and X-LMR-Signature carry sha256= and the HMAC-SHA256 of “timestamp.body” made with the signing secret shown once when you add the webhook. Failed deliveries are retried.