Native MCP · OpenAPI 3.1 · Function calling — works with everything

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.

Step 01

Edit your Claude desktop config

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json

claude_desktop_config.jsonjson
{
  "mcpServers": {
    "plotted": {
      "command": "npx",
      "args": ["-y", "@plotted/mcp-server"],
      "env": {
        "PLOTTED_API_KEY": "plt_live_***"
      }
    }
  }
}
Step 02

Restart Claude desktop

The Plotted tool icon should appear in the input area. Click it to see all 15 available operations.

Step 03

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"
Example conversation
Find trust-owned properties within 1 mile of the Ritz-Carlton Naples that have phone numbers.
I'll search for that. [Calling plotted.geocode for "Ritz-Carlton Naples FL"] [Calling plotted.nearbyParcels with lat=26.142, lon=-81.795, radius_mi=1, is_trust=true, has_contact=true]

Found 42 trust-owned parcels with phone numbers within 1 mile. The top 3 by assessed value:
  1. NAPLES BAY HOLDINGS TRUST — 4421 Gulf Shore Blvd N · $4.2M · (239) ***-1247
  2. DAVIS FAMILY REVOCABLE TRUST — 4501 Gulf Shore Blvd N · $3.8M · (614) ***-2103
  3. SHORE LANDING HOLDINGS TRUST — 4429 Gulf Shore Blvd N · $3.1M · (212) ***-9921
⚡ 3 tool calls · 1 geocode + 1 nearby + 1 owner_search · 4 credits used · 280ms

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.

Step 01

Create a new Custom GPT

In ChatGPT → Explore GPTs → Create → switch to the Configure tab.

Step 02

Add a Plotted action

Scroll down to ActionsCreate new action → in the Schema box, paste this URL:

OpenAPI schema URLurl
https://plotted.to/openapi.json

ChatGPT auto-imports all 15 operations.

Step 03

Add your API key

Under Authentication → pick API KeyBearer → paste your plt_live_***.

Step 04

Suggested system prompt

Instructions
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.

Step 01

Define the Plotted tool

pythonpython
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])
Step 02

Handle the function call

pythonpython
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.

Step 01

Open Cursor Settings → Features → Model Context Protocol

Or edit ~/.cursor/mcp.json directly. Add this block:

~/.cursor/mcp.jsonjson
{
  "mcpServers": {
    "plotted": {
      "command": "npx",
      "args": ["-y", "@plotted/mcp-server"],
      "env": { "PLOTTED_API_KEY": "plt_live_***" }
    }
  }
}
Step 02

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.

Step 03

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.

URL

OpenAPI 3.1 spec

url
https://plotted.to/openapi.json

Auto-imports all 15 operations, request/response schemas, error envelopes, and the auth scheme (Bearer token).

Examples

LangChain

pythonpython
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

pythonpython
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

curlshell
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.