Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: InstaMaps Around a place API
version: 0.6.0
description: 'Location data for lists, as one REST endpoint per job: geocode with a confidence per row, straight-line and road distances,
multi-driver route plans, drive-time areas, official facts (census tract, HUBZone, flood zones), flood, crime and natural-hazard
risk, live warnings, places nearby, plain-English questions over a table, and hosted maps. Strongest in the US and Great Britain,
on our own address index, roads and official data. The same tools as the InstaMaps MCP server, as plain HTTP.
**Auth.** Authorization: Bearer (or X-API-Key). Keys are free: sign in with Google at /developers/portal.
**Free.** 2,500 lookups a day per account, every endpoint, reset at midnight UTC. No card.
**What counts as a lookup.**
- One lookup per row a call carries: an address placed, a journey measured, a stop routed, a place checked.
- A question to ask_table is 10 lookups, however long the table.
- A drive-time area is 10 lookups a band, plus one per place checked against it.
- Maps, live hazards and postcode-radius lists are one lookup a call. Checking a background job (get_job) is free.
- Rows sent by reference (a Google Sheet, a Drive file or an earlier run) are counted from the answer.
**Keep what you get.** No 30-day cache rule: store the results in your own database for as long as you like. Every answer names its sources and their dates.
**Every answer:**
- Nothing is dropped: every row sent comes back, in order, under your own id; rows that cannot be placed or answered say why. An answer that would lose rows fails loudly instead.
- Every row carries confidence {level: high | medium | low, score, basis}; basis is a stable code (rooftop, postcode_centre, not_placed…) and the answer''s confidence object says what each basis present means and what to do about it.
- Every row carries record_key, the same place ID from every tool, so answers from different tools join on it.
- Every answer ends with a run block: when, how many rows, sources with their dates, the confidence counts, calls used and left today, and a run_id that any tool can take as source {run} and render_map as from_run.
- Lists by reference: pass a Google Sheet, a Drive file or a run_id instead of typing rows. Every tool but one only reads; write_to_sheet puts an answer into the sheet as new dated columns or a new tab, never overwriting.
- No vendor or model names in answers; every source is named with its date.
Docs: https://get-instamaps.com/developers'
contact:
name: InstaMaps
email: hello@get-instamaps.com
url: https://get-instamaps.com/developers
termsOfService: https://get-instamaps.com/terms
servers:
- url: https://get-instamaps.com
description: InstaMaps
security:
- apiKey: []
tags:
- name: Around a place
paths:
/v1/find_nearby:
post:
operationId: find_nearby
summary: The nearest, the count, or a list of places of a kind (stations, schools…
description: 'For up to 500 addresses or points in the UK and the US: the nearest places of a kind (mode nearest), how many are within a radius (count), or a list (list). One answer carries up to 300 places (records × n); count mode has no such limit. Categories: pharmacy, station, supermarket, school, GP, hospital, pub, cafe, restaurant, car park, EV charger, bus stop, bank, post office, gym, park and more (an unknown word gets the full list back). From open map data on our own index: classic amenities are well covered, trades patchily. For A&E, hospitals, GP practices, care homes, dentists and NHS pharmacies in England, find_official_places answers from the CQC and NHS registers, with ratings: open map data mixes these up.
Use when:
- "Nearest station to each property"
- Counting competitors or amenities around sites
- Site selection
Not for:
- Official records with ratings (CQC, NHS, food hygiene): find_official_places
Coverage: UK and US, from OpenStreetMap; each answer says how well that kind of place is mapped.
Reference: https://get-instamaps.com/mcp-server/tools/find_nearby'
tags:
- Around a place
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
category:
type: string
mode:
type: string
enum:
- nearest
- count
- list
default: nearest
radius_km:
type: number
maximum: 25
description: Default 10 km for nearest, 2 km otherwise.
n:
type: integer
minimum: 1
maximum: 50
description: How many places to return per record.
records:
type: array
maxItems: 500
items:
type: object
properties:
id:
type: string
description: Your id for the row; results come back under it.
name:
type: string
description: What to call the place on the map.
address:
type: string
lat:
type: number
lng:
type: number
description: '{id, address} or {id, lat, lng}. Send your own ids to merge results back.'
addresses:
type: array
maxItems: 500
items:
type: string
description: Or plain addresses/postcodes, numbered from 1.
background:
type: boolean
description: 'With source: run as a background job and answer at once with job_id (automatic past 150 rows). Check with get_job; write_to_sheet with the job_id puts the results in the sheet as they finish.'
source:
type: object
description: 'Instead of typing rows: { sheet: "<Google Sheets link>", tab?: "Sites" } (shared with the InstaMaps service account, or viewable by anyone with the link), { file: "<Drive link to a CSV or Excel file>" }, or { run: "<run_id from an earlier answer>" }. Columns are found by their headers (id, name, address or its parts, lat/lng); name them if they aren''t obvious (id_column, address_column, lat_column, lng_column; from_column and to_column for road distances). Rows with coordinates are used as they are.'
properties:
sheet:
type: string
tab:
type: string
range:
type: string
description: e.g. "A1:H501"; the first row is the header.
file:
type: string
run:
type: string
id_column:
type: string
name_column:
type: string
address_column:
type: string
lat_column:
type: string
lng_column:
type: string
from_column:
type: string
to_column:
type: string
required:
- category
example:
category: pharmacy
addresses:
- Leeds LS1 4AP
n: 3
responses:
'200':
description: 'The answer. For example: "Pharmacy (nearest, 10 km): 1 of 1 placed · 0 of 1 high confidence (1 medium, 0 low). Caveats: postcode centre (1 row); open map data, not the official register (1 row)."'
headers:
X-Lookups-Used:
schema:
type: integer
description: Lookups this call cost.
X-Lookups-Remaining:
schema:
type: integer
description: Free lookups left today.
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: The answer in one or two sentences.
additionalProperties: true
'400':
description: The request could not be answered; error says why.
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
'401':
description: No API key, or an unknown or revoked one.
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
'404':
description: No such endpoint.
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
'429':
description: Today's free lookups are used up (or the call needs more than are left), or too many requests a minute.
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
/v1/find_official_places:
post:
operationId: find_official_places
summary: 'The official record: A&E departments, hospitals, GP practices, care homes and…'
description: 'What open map data doesn''t have, from the official registers. England (the Care Quality Commission''s register, our copy, with each place''s latest rating and date): A&E departments (NHS hospitals with a full emergency department: CQC rates their urgent and emergency services and critical care; with the A&E''s rating and the NHS trust that runs it), urgent care (urgent treatment centres and minor injuries units, including hospitals whose A&E became one), hospitals (NHS or independent), GP practices, care homes, nursing homes, dentists, hospices; and NHS community pharmacies from the NHS''s own register (England, Wales, Isle of Man; ODS code and UPRN, on their building where the register gives it). UK (the Food Standards Agency, live): food businesses with their hygiene rating. For up to 500 addresses or points (100 for food): the nearest (mode nearest), how many within a radius (count) or a list (list), straight-line km; or mode at: the registered place AT each address (send the business name as name), e.g. the hygiene rating of each restaurant on a customer list or the CQC rating of each care home, matched by name and postcode and saying how; a row that can''t be matched says why and lists what is registered there. Filter by rating (Outstanding, Good, Requires improvement, Inadequate, not rated), NHS or independent, food type, hygiene score. Each place carries its register IDs (CQC location, NHS ODS code, UPRN, FSA FHRS), a link to its official page and its source; CQC covers England and the NHS pharmacy register England and Wales; addresses outside a register are told so. Use find_nearby for everything else (shops, stations, parks).
Use when:
- "Nearest A&E to each site and who runs it"
- Care home ratings near an address
- The hygiene rating of each restaurant on a list
Not for:
- Shops, stations and other everyday places: find_nearby
Coverage: England for CQC, England and Wales for NHS pharmacies, the UK for food hygiene.
Reference: https://get-instamaps.com/mcp-server/tools/find_official_places'
tags:
- Around a place
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
kind:
type: string
enum:
- ae
- hospital
- urgent_care
- gp
- care_home
- nursing_home
- dentist
- hospice
- pharmacy
- food
mode:
type: string
enum:
- nearest
- count
- list
- at
default: nearest
description: 'at: the registered place at each address itself (send name).'
radius_km:
type: number
maximum: 100
description: 'How far to look. Defaults: A&E 60, hospital 30, GP 10, care home 10, pharmacy 5, food 1.'
n:
type: integer
minimum: 1
maximum: 50
description: How many places to return per record.
rating:
type: array
items:
type: string
description: CQC ratings to keep, e.g. ["Requires improvement", "Inadequate"]. For A&E, the rating of its urgent and emergency services.
nhs:
type: boolean
description: 'Hospitals: true for NHS only, false for independent only.'
include_specialist:
type: boolean
default: false
description: 'A&E: also the eye and children''s hospitals'' emergency departments (left out by default).'
food_type:
type: string
description: restaurant, takeaway, pub, supermarket, shop, hotel, school, caring, mobile or manufacturer.
min_hygiene:
type: integer
minimum: 0
maximum: 5
max_hygiene:
type: integer
minimum: 0
maximum: 5
records:
type: array
maxItems: 500
items:
type: object
properties:
id:
type: string
description: Your id for the row; results come back under it.
name:
type: string
description: What to call the place on the map.
address:
type: string
lat:
type: number
lng:
type: number
description: '{id, address} or {id, lat, lng}. Send your own ids to merge results back.'
addresses:
type: array
maxItems: 500
items:
type: string
description: Or plain addresses/postcodes, numbered from 1.
background:
type: boolean
description: 'With source: run as a background job and answer at once with job_id (automatic past 200 rows). Check with get_job; write_to_sheet with the job_id puts the results in the sheet as they finish.'
source:
type: object
description: 'Instead of typing rows: { sheet: "<Google Sheets link>", tab?: "Sites" } (shared with the InstaMaps service account, or viewable by anyone with the link), { file: "<Drive link to a CSV or Excel file>" }, or { run: "<run_id from an earlier answer>" }. Columns are found by their headers (id, name, address or its parts, lat/lng); name them if they aren''t obvious (id_column, address_column, lat_column, lng_column; from_column and to_column for road distances). Rows with coordinates are used as they are.'
properties:
sheet:
type: string
tab:
type: string
range:
type: string
description: e.g. "A1:H501"; the first row is the header.
file:
type: string
run:
type: string
id_column:
type: string
name_column:
type: string
address_column:
type: string
lat_column:
type: string
lng_column:
type: string
from_column:
type: string
to_column:
type: string
required:
- kind
example:
kind: gp
addresses:
- Leeds LS1 4AP
n: 2
responses:
'200':
description: 'The answer. For example: "GP practice (nearest, 10 km): 1 of 1 records have one · 0 of 1 high confidence (1 medium, 0 low). Caveats: postcode centre (1 row)."'
headers:
X-Lookups-Used:
schema:
type: integer
description: Lookups this call cost.
X-Lookups-Remaining:
schema:
type: integer
description: Free lookups left today.
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: The answer in one or two sentences.
additionalProperties: true
'400':
description: The request could not be answered; error says why.
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
'401':
description: No API key, or an unknown or revoked one.
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
'404':
description: No such endpoint.
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
'429':
description: Today's free lookups are used up (or the call needs more than are left), or too many requests a minute.
content:
application/json:
schema:
type: object
properties:
error:
type: string
required:
- error
components:
securitySchemes:
apiKey:
type: http
scheme: bearer
bearerFormat: im_live_…
description: 'Authorization: Bearer <your API key> (or X-API-Key). Keys are free: sign in with Google at /developers/portal.'
externalDocs:
description: Docs, pricing and examples
url: https://get-instamaps.com/developers