What you can use
Site MCP
Remote server at https://blbestate.com/mcp. No key. Search and read this site, query property records at the preview tier, and start a checkout.
Public-records MCP
Ships inside the Mac app and runs on your Mac. Five read-only tools: parcels, comps, ARV, property audits and drive routes.
Public-records API
REST at https://api.blbestate.com. Anonymous preview tier; a subscriber token raises the row cap.
Your other apps
One API key for 1,609 apps, including CRMs, Google Sheets and email, through a REST API, an MCP server and npm/pip SDKs.
Site MCP server
RemotePOST https://blbestate.com/mcp. MCP over Streamable HTTP (JSON-RPC 2.0). No registration, no credentials. Stay under one request per second; over-limit clients get HTTP 429.
| Tool | What it returns |
|---|---|
site_info | What this site is, with links to the sitemap, docs, contact and every discovery document. |
search_pages | Pages on blbestate.com whose URL path matches your words, with a match score. |
read_page | One blbestate.com page as Markdown or stripped text, up to 40,000 characters. |
estate_stats | Corpus totals: records, live and archived properties, states, counties, freshness. |
estate_coverage | Per-state county and property counts for the live tier, plus the archived tier. |
estate_search | Public property records, 25 rows per page (preview tier). Category, value, date and toggle filters need a location. |
estate_parcel | Exact parcel lookup by state and parcel ID. |
estate_owner | An owner's parcel portfolio by state and owner name. |
estate_property_audit | Latest dated public-record audit for a parcel (3-mile context; no appraisal, ARV or profit claim). |
list_products | Everything you can buy here, with Stripe-verified prices, billing terms and availability. |
create_checkout | Starts a purchase and returns a continue_url. It never charges anything; the buyer pays on the Stripe-hosted page. |
get_checkout | Reads a checkout started with create_checkout. |
curl https://blbestate.com/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Server card: /.well-known/mcp/server-card.json · Credentials: /auth.md · OpenAPI for the agent endpoints: /openapi.json. Setup for Claude, ChatGPT, Cursor and VS Code is on Integrations.
Public-records MCP (in the Mac app)
LocalThe Mac app includes an MCP server named blbestate. It runs on your Mac over stdio, so Claude Desktop, Claude Code, Cursor and VS Code can launch it. Nothing about it sends your pipeline, leads or deals to us. Every tool is read-only: none writes, harvests, deploys or spends.
Open the app, go to Settings → Claude / MCP and copy the configuration. The app fills in the exact path of its bundled Node.js runtime and server, and shows no configuration if the server is missing from the build. The block has this shape:
{
"mcpServers": {
"blbestate": {
"command": "<node path shown in the app>",
"args": ["<server.mjs path shown in the app>"]
}
}
}
| Tool | Inputs | What it does |
|---|---|---|
blbestate__search_parcels | state, county, city, zip, address, owner_name, q, category, min_value, max_value, sold_after, sold_before, absentee, owner_occupied, limit (1–2,000, default 25) | Searches the parcel index. Returns real county rows only; total is the true match count, count is what this call retrieved under your tier's row cap. A location is required. |
blbestate__get_comps | Location fields, subject_lat, subject_lng, radius_miles, lookback_months, min_sale_price, limit (default 200) | Recorded sold comparables from the deed roll. Rows with no positive sale price are dropped before any median, and the drop counts come back with the result. |
blbestate__calc_arv | subject {sqft, lat, lng}, rows or search, allow_assessed_estimate, radius_miles, lookback_months | After-repair value from recorded sold comps. When data is too thin it refuses with arv: null and a reason. Non-disclosure states (AL, TX, UT, …) can opt into a labeled assessed-area estimate that is never a comp. |
blbestate__get_property_audit | state (required), record_id or parcel_id | The latest stored public-record audit for one parcel: 3-mile neighbor statistics, consistency flags and the reasons any field is unknown. |
blbestate__plan_route | stops (required, up to 60: label, address, lat, lng), config canvasser|fleet, vehicles 2–8, depot | Orders stops into a drive route with legs, miles, minutes and a maps link, using the route optimizer service on your Mac (BLBESTATE_ROUTE_URL, default http://127.0.0.1:8766/api/route). Stops it cannot place come back in unroutable. |
Read the result, not the absence of one. A zero result is only returned when the lookup ran and found nothing, and it is marked verified-empty. Every failure throws an error. Check ok before reading arv, and check selection.dropped before trusting a comp count.
The server reads https://api.blbestate.com (/v1/search and /v1/property-audit). Without a token it runs at the public preview tier. To read at your plan's tier, set BLBESTATE_TOKEN_FILE in the server's environment to a file that holds your subscriber token; it is read at call time and never logged or returned.
Public-records REST API
Base URL https://api.blbestate.com · JSON · OpenAPI: /agent/estate-api-openapi.json
| Method | Path |
|---|---|
| GET | /v1/health · /v1/stats · /v1/coverage |
| GET | /v1/search · /v1/map · /v1/parcel · /v1/owner · /v1/property-audit |
| POST | /v1/ccpa-delete (public-record removal requests, no auth) |
curl "https://api.blbestate.com/v1/search?state=AZ&county=Maricopa&per_page=25"
- Anonymous (preview tier): no header; 25 rows per page, 240 expensive reads per minute per client.
- Subscriber token (pro and founder tiers): buy the app at /buy/mac or /buy/windows; the token is delivered to your app. Send
Authorization: Bearer <token>. - There is no self-serve key endpoint for agents. Details: /auth.md.
Connect your other apps
Property research rarely ends here. The shared Black Label platform behind Integrations gives you one key for 1,609 apps: CRMs such as HubSpot and Salesforce, Google Sheets, Gmail and Outlook, Slack and more. You connect each app once by signing in to it; the same connections then work from the REST API, the MCP server and the SDKs.
Get an API key (you sign in on the platform) · Connect your apps
REST API
Base URL https://tryacee.com/api/v1 · Authorization: Bearer ace_sk_… (or x-api-key) · JSON in and out · errors are {"error":{"code","message"}} · 120 requests a minute per key · spec: tryacee.com/openapi.json
| Method | Path | What it does |
|---|---|---|
| GET | /catalog | Public app catalog, no key |
| GET | /apps?search= | Search apps with your connection status |
| POST | /apps/{app}/connect | Sign-in link that connects the app |
| POST | /apps/{app}/request | Any endpoint of a connected app's own API |
| GET | /connections | Your connected apps |
| POST | /tools/find | Find tools for a task in plain words |
| GET | /tools/{tool} | One tool's input schema |
| POST | /tools/{tool}/run | Run it in a connected app |
| POST | /custom-connectors | Add any MCP server or REST API as your own connector |
| POST | /triggers | Watch an app event and receive signed webhooks |
| GET | /runs · /me | Your 25 latest runs · the account behind the key |
curl -X POST https://tryacee.com/api/v1/tools/find \
-H "Authorization: Bearer ace_sk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"task":"add a row to a Google Sheet"}'
The full list, including disconnect, trigger types and event history, is in the OpenAPI spec.
MCP for every app you connect
Remote MCP server at https://tryacee.com/mcp (Streamable HTTP) with Authorization: Bearer <key>, or the URL-only form https://tryacee.com/mcp/k/<key> for clients that take a single link. Six tools: search_apps, connect_app, list_connections, find_tools, get_tool, run_tool. The link form carries your key; treat it like a password.
claude mcp add --transport http ace https://tryacee.com/mcp \
--header "Authorization: Bearer ace_sk_YOUR_KEY"
Add it next to the blbestate MCP and one chat can pull parcels here and write them to your CRM or a sheet. Client-by-client setup is on Integrations.
SDKs
No dependencies. JavaScript runs in Node 18+, Deno, Bun, Workers and browsers; Python needs only the standard library. Both read ACE_API_KEY.
JavaScript
npm install https://tryacee.com/sdk/tryacee-sdk-1.0.0.tgz
import { Ace } from "@tryacee/sdk";
const ace = new Ace({ apiKey: process.env.ACE_API_KEY });
// 1. Connect an app (send your user to the link once)
const { url } = await ace.apps.connect("slack");
// 2. Find the tool for a task, in plain words
const { tools } = await ace.tools.find("post a message in #sales on Slack");
// 3. Run it
const result = await ace.tools.run("SLACK_SEND_MESSAGE", {
channel: "#sales",
markdown_text: "New teardown lead in Maricopa",
});
Python
pip install https://tryacee.com/sdk/tryacee-1.0.0-py3-none-any.whl
from tryacee import Ace
ace = Ace() # reads ACE_API_KEY
link = ace.apps.connect("hubspot")["url"] # send the user here once
found = ace.tools.find("create a contact in HubSpot")
result = ace.tools.run("HUBSPOT_CREATE_CONTACT", {"email": "pat@example.com"})
ace.tools.definitions() returns OpenAI or Anthropic tool definitions so your own model can call every connected app; pass its tool call back to ace.tools.run().
Limits and support
- Site MCP and agent endpoints: under one request per second per client.
- Public-records API preview tier: 25 rows per page, 240 expensive reads per minute per client.
- Platform REST API: 120 requests a minute per key. Keys can be revoked any time.
- Removal of a public record: see Contact. Security reports: Contact.
Questions: michael@blbestate.com.