Developers
Everything in Mapvane is automatable: create projects, run trade-area studies, import data, export branded exhibits, manage share links. One key drives both a REST API and a remote MCP server for AI assistants. Included on every plan — no usage meters.
Authentication
Create an API key under Branding → API keys · MCP in the app, then send it as a Bearer token. Keys are scoped to your workspace.
curl https://www.mapvane.com/api/v1/projects \ -H "Authorization: Bearer mv_your_key"
REST API v1
Base URL /api/v1. The machine-readable spec lives at /api/v1/openapi.json (OpenAPI 3.1) — this page and that document are generated from the same schemas, so they can't disagree.
GET /projects
List projects
example request
curl https://www.mapvane.com/api/v1/projects \ -H "Authorization: Bearer mv_your_key"
POST /projects
Create a project
example request
curl -X POST https://www.mapvane.com/api/v1/projects \
-H "Authorization: Bearer mv_your_key" \
-H "Content-Type: application/json" \
-d '{"name":"NEC Main & 1st — Pad A"}'namebody · string · required — Project name, e.g. 'NEC Scottsdale & Shea'dealTypebody · stringaddressbody · string — Site address (optional; geocoded via the self-hosted geocoder)lonbody · number — Site longitude (optional)latbody · number — Site latitude (optional)
POST /projects/{projectId}/site
Set the site pin
example request
curl -X POST https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/site \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · requiredaddressbody · stringlonbody · numberlatbody · number
POST /projects/{projectId}/trade-area
Run a trade-area study
example request
curl -X POST https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/trade-area \
-H "Authorization: Bearer mv_your_key" \
-H "Content-Type: application/json" \
-d '{"method":"rings"}'projectIdpath · string · requiredmethodbody · string · requiredbandsbody · array — Optional band values, ascending: ring radii in miles (max 25) or drive times in minutes (max 60). Up to 3.donutbody · boolean — When true, each band reports only its increment (0–1, 1–3, 3–5 mi) instead of cumulative totals.
POST /projects/{projectId}/comps
Add numbered comp pins from addresses
example request
curl -X POST https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/comps \
-H "Authorization: Bearer mv_your_key" \
-H "Content-Type: application/json" \
-d '{"comps":[{"address":"201 N Central Ave, Phoenix, AZ"}]}'projectIdpath · string · requiredcompsbody · array · required
POST /projects/{projectId}/data
Import rows onto the data layer
example request
curl -X POST https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/data \
-H "Authorization: Bearer mv_your_key" \
-H "Content-Type: application/json" \
-d '{"rows":[{}]}'projectIdpath · string · requiredrowsbody · array · required
GET /projects/{projectId}/data
Export GeoJSON, KML, or report CSV
example request
curl https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/data \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · requiredformatquery · string — geojson (default) | kml — drawn layers. csv | report-geojson | report-kml — the latest study (report-* = band polygons + demographics; all require a prior study).
GET /projects/{projectId}/reports
List a project's studies
example request
curl https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/reports \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · required
GET /projects/{projectId}/reports/{reportId}
Read one study back
example request
curl https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/reports/665f1c2ab3d4e5f6a7b8c9d0 \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · requiredreportIdpath · string · required
GET /projects/{projectId}/reports/latest
Read the latest study
example request
curl https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/reports/latest \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · required
POST /projects/{projectId}/export
Export PDF/PNG/deck/PPTX
example request
curl -X POST https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/export \
-H "Authorization: Bearer mv_your_key" \
-H "Content-Type: application/json" \
-d '{"kind":"pdf"}'projectIdpath · string · requiredkindbody · string · requiredcoverbody · boolean — Deck only: prepend a branded cover page (title, logo, date).exhibitIdbody · string — Optional exhibit to render (defaults to the project's first exhibit)
POST /projects/{projectId}/share
Create a share link
example request
curl -X POST https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/share \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · requiredpasswordbody · string — Optional viewer password; omit to leave unchanged, empty string to clearexpiresAtbody · string — Optional ISO-8601 expiry (end of access). Pass null-as-absent; empty string clears.allowDownloadbody · boolean — Let viewers download the PDF from the share pageexhibitIdbody · string — Optional exhibit to surface on the share (default: first ordered). Clear with empty string.
DELETE /projects/{projectId}/share
Disable sharing
example request
curl -X DELETE https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/share \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · required
GET /projects/{projectId}/exhibits
List a project's exhibits
example request
curl https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/exhibits \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · required
POST /projects/{projectId}/exhibits
Create an exhibit
example request
curl -X POST https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/exhibits \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · requiredtitlebody · string — Exhibit title (optional)
PATCH /projects/{projectId}/exhibits/{exhibitId}
Update an exhibit
example request
curl -X PATCH https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/exhibits/665f1c2ab3d4e5f6a7b8c9d0 \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · requiredexhibitIdpath · string · required
DELETE /projects/{projectId}/exhibits/{exhibitId}
Delete an exhibit (not a project's last one)
example request
curl -X DELETE https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/exhibits/665f1c2ab3d4e5f6a7b8c9d0 \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · requiredexhibitIdpath · string · required
POST /projects/{projectId}/exhibits/{exhibitId}/duplicate
Duplicate an exhibit (keeps its framing)
example request
curl -X POST https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/exhibits/665f1c2ab3d4e5f6a7b8c9d0/duplicate \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · requiredexhibitIdpath · string · required
POST /projects/{projectId}/exhibits/{exhibitId}/reorder
Move an exhibit to a new position
example request
curl -X POST https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/exhibits/665f1c2ab3d4e5f6a7b8c9d0/reorder \
-H "Authorization: Bearer mv_your_key" \
-H "Content-Type: application/json" \
-d '{"toIndex":3}'projectIdpath · string · requiredexhibitIdpath · string · requiredtoIndexbody · integer · required — Zero-based target position; clamped to the valid range.
POST /projects/{projectId}/duplicate
Duplicate a project (layers + photos)
example request
curl -X POST https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0/duplicate \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · required
PATCH /projects/{projectId}
Update project meta (address, deal type)
example request
curl -X PATCH https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0 \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · required
DELETE /projects/{projectId}
Delete a project and everything in it
example request
curl -X DELETE https://www.mapvane.com/api/v1/projects/665f1c2ab3d4e5f6a7b8c9d0 \ -H "Authorization: Bearer mv_your_key"
projectIdpath · string · required
GET /shares
List live share links
example request
curl https://www.mapvane.com/api/v1/shares \ -H "Authorization: Bearer mv_your_key"
GET /leads
List share-page leads
example request
curl https://www.mapvane.com/api/v1/leads \ -H "Authorization: Bearer mv_your_key"
PATCH /leads/{leadId}
Set a lead's triage status
example request
curl -X PATCH https://www.mapvane.com/api/v1/leads/665f1c2ab3d4e5f6a7b8c9d0 \ -H "Authorization: Bearer mv_your_key"
leadIdpath · string · required
GET /geocode
Geocode an address
example request
curl https://www.mapvane.com/api/v1/geocode?q=201%20N%20Central%20Ave%2C%20Phoenix%2C%20AZ \ -H "Authorization: Bearer mv_your_key"
qquery · string · required — Address or place, e.g. '201 N Central Ave, Phoenix, AZ'
MCP server (AI assistants)
Point Claude, or any MCP-capable assistant, at https://www.mapvane.com/mcp with the same Bearer key. 25 tools cover the full broker workflow, plus project resources and analysis prompt templates.
list_projects— List the org's map projects (id, name, deal type, last update).geocode_address— Geocode an address or place name. Results marked persistable:true may be used as site coordinates; persistable:false results are for orientation only.create_project— Create a project for a listing/deal. Set its site by address (geocoded server-side) or by lon/lat. Returns the project id.set_site— Set or replace a project's site pin by address (geocoded server-side) or by lon/lat.update_project— Update a project's meta: name, address label, and/or deal type (e.g. sync from a CRM). Pass address:"" to clear it. Does NOT move the site pin or geocode — use set_site for that.run_trade_area— Run a trade-area study on a project's site: mile rings (default 1/3/5), drive/walk/bike-time minutes (default 5/10/15), or 'custom' (analyzes a site boundary polygon drawn in the app; ignores bands/donut), with demographics (population, households, income, age, tenure, home value, education) per band. Pass `bands` to customize the values. Returns the saved study's `id` and per-band demographics in the SAME shape as get_report, so you can chain straight to get_report/export_data.list_reports— List a project's recent trade-area studies (newest first): id, method, cumulative vs donut bands, band labels, and when each was run. Use get_report to read one back.get_report— Read a trade-area study back: per-band demographics (population, households, income, age, tenure, home value, education, daytime employment). Omit reportId for the latest study.export_exhibit— Render the project's branded exhibit (map + trade-area report) to PDF or PNG. Returns a download URL. Kind 'deck' renders EVERY exhibit into one combined PDF (optional branded cover via `cover`) — the full client deliverable; exhibitId is ignored for decks. Kind 'pptx' renders every exhibit as PowerPoint slides instead.add_comps— Add numbered comparable pins to a project from addresses (the classic comp exhibit). Geocodes via the app's own geocoder, appends to existing annotations (never replaces), and numbers continue from existing comps. Up to 50 rows; rate-limited per workspace.import_data— Import property/data rows onto a project's data layer (feeds the portfolio pins): each row is a flat object of columns. Location is decided PER IMPORT, not per row — if any rows carry lon+lat, the whole call uses coordinates and address-only rows are skipped (send them separately); otherwise the address column geocodes (max 50 rows). Appends (never replaces); up to 200 coordinate rows/call; shares the workspace import budget.list_shares— List the workspace's live share links (newest first): slug, projectId, view count, whether a password/expiry/download is set, and optional exhibitId pin. Use disable_share to kill one.disable_share— Turn sharing off for a project — the /m/ link stops resolving immediately.list_exhibits— List a project's exhibits (ordered): id, title, method binding, orientation/paper — the ids feed export_exhibit's exhibitId.create_exhibit— Create a new exhibit on a project (page setup from org defaults). Returns the exhibit projection.update_exhibit— Update an exhibit's title, method binding, overlay, basemap, or report-row whitelist. Same fields as the editor panel.delete_exhibit— Delete an exhibit from a project. Refuses to remove a project's only exhibit (every project keeps at least one).duplicate_exhibit— Duplicate an exhibit within a project, keeping its page setup, study method, overlay, and band labels (report-row curation is not copied). Refuses when the project is at its exhibit limit.reorder_exhibit— Move an exhibit to a new zero-based position within its project. Order drives deck assembly and the exhibit switcher.duplicate_project— Duplicate a project: copies its name, deal type, address, drawn layers, and site photos into a new project. Returns the new projectId. Studies, exports, exhibits, and shares are NOT copied.delete_project— Delete a project and EVERYTHING hanging off it (features, reports, exhibits, shares, exports, photos). Irreversible.list_leads— Read the workspace's share-page leads (newest first): who asked for details on which shared exhibit, with triage status — for CRM pulls.update_lead— Set a share-page lead's triage status (new | contacted | closed) — the write-back side of list_leads for a two-way CRM sync.export_data— Export a project's open formats: drawn layers as GeoJSON (default) or KML; the latest trade-area study as CSV, or as ENRICHED GeoJSON/KML ('report-geojson' / 'report-kml') where each band polygon carries its demographics as feature attributes — pull the whole study, numbers attached, into desktop mapping tools. Mirrors the editor download links.create_share_link— Create (or return the existing) public share link for a project's interactive map + report. Optional password, expiry (ISO date), and allowDownload match the editor share panel.
Limits & formats
- — Flat plans, no usage meters; rate limits protect abuse, not bill you.
- — Imports: CSV, XLSX, GeoJSON, KML/KMZ, zipped SHP. Exports: PDF, PNG, PPTX, KML, CSV.
- — Geocoding is address-in, coordinates-out; results you store are yours.