Property data, ready for your AI agents.
Drop Plotted into Claude, ChatGPT, Gemini, or Cursor in 30 seconds. Every endpoint returns clean structured JSON, every tool definition is published, and rate-limit + credit metadata flows back so your agent knows when to slow down.
Connect Plotted to Claude (Desktop or Code)
Plotted ships an MCP (Model Context Protocol) server. Add it once to your Claude desktop config and every Claude conversation can call the API directly — no copy-pasting, no manual JSON.
Edit your Claude desktop config
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"plotted": {
"command": "npx",
"args": ["-y", "@plotted/mcp-server"],
"env": {
"PLOTTED_API_KEY": "plt_live_***"
}
}
}
}
Restart Claude desktop
The Plotted tool icon should appear in the input area. Click it to see all 15 available operations.
Just ask
Claude will pick the right endpoint automatically. Examples:
- "Find absentee owners within 2 miles of 4421 Gulf Shore Blvd N, Naples FL with phone numbers"
- "Who owns the trust-held parcels on Bayfront Place?"
- "Enrich this CSV of 200 addresses with owner email and year built"
Found 42 trust-owned parcels with phone numbers within 1 mile. The top 3 by assessed value:
- NAPLES BAY HOLDINGS TRUST — 4421 Gulf Shore Blvd N · $4.2M · (239) ***-1247
- DAVIS FAMILY REVOCABLE TRUST — 4501 Gulf Shore Blvd N · $3.8M · (614) ***-2103
- SHORE LANDING HOLDINGS TRUST — 4429 Gulf Shore Blvd N · $3.1M · (212) ***-9921
Connect Plotted to ChatGPT
Build a Custom GPT that uses Plotted as its action source. ChatGPT will call any of the 15 endpoints based on user prompts — works in ChatGPT Plus, Team, and Enterprise.
Create a new Custom GPT
In ChatGPT → Explore GPTs → Create → switch to the Configure tab.
Add a Plotted action
Scroll down to Actions → Create new action → in the Schema box, paste this URL:
https://plotted.to/openapi.json
ChatGPT auto-imports all 15 operations.
Add your API key
Under Authentication → pick API Key → Bearer → paste your plt_live_***.
Suggested system prompt
You are a U.S. property and homeowner research assistant powered by Plotted (150M+ records). When asked about properties, owners, or specific addresses: - Use /v1/geocode to resolve an address to lat/lon when needed. - Use /v1/parcels/nearby for radius searches around a point. - Use /v1/views/absentee, /v1/views/trust, /v1/views/homeowners for curated lead segments. - Combine filters: state, is_trust, has_contact, year_built_min, etc. - For bulk enrichment, use /v1/match (up to 10,000 addresses per call). Always cite parcel row_id when referencing specific properties. Redact phone/email digits in output unless the user explicitly asks for the unmasked value.
Connect Plotted to Gemini (Vertex AI or AI Studio)
Gemini's function-calling API accepts our endpoint definitions directly. Drop the Plotted tool declarations into your agent and Gemini will invoke them automatically.
Define the Plotted tool
import google.generativeai as genai plotted_tool = { "function_declarations": [ { "name": "plotted_nearby_parcels", "description": "Find parcels within radius_mi of a lat/lon. Filters: is_trust, is_homeowner, has_contact, owner, year_built_min/max.", "parameters": { "type": "object", "properties": { "lat": {"type": "number"}, "lon": {"type": "number"}, "radius_mi": {"type": "number"}, "is_trust": {"type": "boolean"}, "has_contact": {"type": "boolean"} }, "required": ["lat", "lon", "radius_mi"] } } # ... add the other 14 endpoints (or fetch via /openapi.json) ] } model = genai.GenerativeModel("gemini-2.0-pro", tools=[plotted_tool])
Handle the function call
import requests, os PLOTTED_KEY = os.environ["PLOTTED_KEY"] def call_plotted(name, args): endpoint_map = { "plotted_nearby_parcels": "/v1/parcels/nearby", # ... } r = requests.get( "https://api.plotted.to" + endpoint_map[name], params=args, headers={"Authorization": f"Bearer {PLOTTED_KEY}"} ) return r.json() response = model.generate_content( "Find trust-owned parcels within 1mi of 26.142, -81.795 with phone numbers" ) # If response.candidates[0].content.parts[0].function_call exists, call_plotted() and send back
Connect Plotted to Cursor (and any MCP-compatible IDE)
Cursor 0.42+ supports MCP servers natively. Same config as Claude Desktop. Lets you ask the AI inside your editor to enrich CSVs, generate property lookups, or build queries.
Open Cursor Settings → Features → Model Context Protocol
Or edit ~/.cursor/mcp.json directly. Add this block:
{
"mcpServers": {
"plotted": {
"command": "npx",
"args": ["-y", "@plotted/mcp-server"],
"env": { "PLOTTED_API_KEY": "plt_live_***" }
}
}
}
Restart Cursor, then ask in chat
Example: "Take the addresses in selected.csv, call Plotted's /v1/match for each, and add the owner_name + phone columns." Cursor handles the rest.
Other MCP-compatible IDEs
Same config works in: Continue, Zed AI, Cline, Roo Code, and other MCP-aware tools.
OpenAPI 3.1 — works with anything
If your AI tooling doesn't have a dedicated integration above, point it at our OpenAPI spec. Most agent frameworks (LangChain, LlamaIndex, AutoGPT, CrewAI, Pydantic AI, etc.) consume OpenAPI as a first-class input.
OpenAPI 3.1 spec
https://plotted.to/openapi.json
Auto-imports all 15 operations, request/response schemas, error envelopes, and the auth scheme (Bearer token).
LangChain
from langchain_community.tools.openapi.utils.openapi_utils import OpenAPISpec from langchain_community.agent_toolkits.openapi.toolkit import RequestsToolkit from langchain_community.utilities.requests import RequestsWrapper spec = OpenAPISpec.from_url("https://plotted.to/openapi.json") toolkit = RequestsToolkit( requests_wrapper=RequestsWrapper(headers={"Authorization": "Bearer " + KEY}), spec=spec, ) agent.tools.extend(toolkit.get_tools())
LlamaIndex
from llama_index.tools.openapi import OpenAPIToolSpec spec = OpenAPIToolSpec( url="https://plotted.to/openapi.json", auth_headers={"Authorization": "Bearer " + KEY}, ) tools = spec.to_tool_list()
Direct curl from any prompt-engineering harness
curl https://api.plotted.to/v1/parcels/nearby \ -G -d "lat=26.142&lon=-81.795&radius_mi=1&is_trust=true" \ -H "Authorization: Bearer $KEY"
Built for agentic workflows from day one.
Not just an API. Every design choice was made for AI agents reading and reasoning over the response.
Stable row_id primary key
Every parcel has a permanent integer ID. Agents can cite, deep-link, and re-fetch records across sessions without ambiguity.
Cost & remaining credits in every response
meta.credits_used and meta.credits_remaining on every call. The agent can plan a budget and back off when it's running low.
Stable, machine-friendly errors
Error responses carry a stable code string (insufficient_credits, rate_limited). Agents can branch on them, no string parsing.
Bulk endpoints that scale
POST 10,000 addresses to /v1/match in one call. Lets the agent enrich a whole spreadsheet in one tool call instead of 10K.
Sub-50ms p50 latency
Indexed for the common lookup patterns. Agents don't stall on tool calls — chains stay fast.
Free /v1/health
No auth, no credits. Agents can verify the integration without burning a credit on every check.