API reference
Smart Zero exposes a national title-data plant — 100M+ parcels across 22 states, owner contacts via ZipLock, recorded instruments, comparable sales, distress flags. Two surfaces: a REST API at /api/v1/* and an MCP server at /api/mcp for Claude Code.
Quickstart
- Issue an API key from the dashboard
- Hit a free endpoint to confirm auth works
- Top up credits via /billing/top-up to unlock metered endpoints
curl https://smart.worldclasstitle.com/api/v1/account \
-H "Authorization: Bearer wct_live_..."Authentication
Every request needs a bearer key. For embeddable surfaces (MapLibre tile sources) the key can ride in the URL via ?token=….
Authorization: Bearer wct_live_…
# OR (tiles only)
GET /api/v1/parcels/tiles/15/8688/12556?token=wct_live_…Keys are SHA-256 hashed at rest. Plaintext is returned ONCE at creation time. Revoke and re-issue from the dashboard if lost.
Tiers & rate limits
Tier is derived from lifetime spend plus card-on-file. Endpoint gating + rate limits scale by tier.
| Tier | Triggered by | Endpoint access | Rate |
|---|---|---|---|
| free | email-verified | Aurora-resident endpoints, tiles | 60/hr |
| verified | card on file | + skip-trace, taxes, instruments | 60/min |
| standard | $50 lifetime | + chain, distress, custom layers | 120/min |
| pro | $500 lifetime | + motivation, comps, webhooks, ask, prelim search | 600/min |
| enterprise | contract | SLA + custom limits + white-label | custom |
Credits & pricing
1 credit = $0.10. Bigger packs discount up to 44%. Purchased credits never expire; WCT-issued comp credits expire in 90 days. Top up at /billing/top-up.
| Endpoint | Cost (credits) | Min tier |
|---|---|---|
| parcels.get / by_address / search / owner / tiles | 0 | free |
| coverage / requests / roadmap | 0 | free |
| parcels.taxes / distress | 1 | verified |
| parcels.instruments / chain / comps | 5 | verified–pro |
| parcels.contacts | 5 cached / 10 fresh | verified |
| parcels.motivation / ask | 30 | pro |
| webhooks.fire | 1 per delivered event | pro |
| preliminary_search | 300 (refunded on fail) | pro |
Pre-flight cost: POST /v1/cost-estimate tells you exactly what a call will burn before you make it.
Response envelope
Every /v1/* response wraps in:
{
"data": { /* endpoint-specific payload */ },
"_meta": {
"cost_credits": 10,
"balance_after": 1234,
"cached": false,
"data_fetched_at": "2026-04-12T14:31Z",
"freshness_days": 47,
"tier": "verified",
"coverage": { "available": true }
}
}Errors set data: null + an error object. Coverage gaps return 200 with coverage_gap + request URL.
Parcel data
/v1/parcels/{parcel_id}— Full parcel record + coverage badge. Free./v1/parcels/by-address?address=…— Fuzzy address → parcel resolver (top 5). Free./v1/parcels/search— Filter by bbox / county / zip / absentee / value / sale window. Cursor pagination, max 500/call. Free./v1/parcels/{id}/owner— Owner of record (assessor data). Free — the fraud-prevention layer./v1/parcels/{id}/contacts— ZipLock skip-trace phones + emails. 5 cached / 10 fresh./v1/parcels/{id}/instruments— Recorded mortgages, deeds, liens, releases. 5 credits./v1/parcels/{id}/chain— Reverse-chronological chain of title. 5 credits./v1/parcels/{id}/taxes— Tax status + FL tax certificates. 1 credit./v1/parcels/{id}/distress— Distress flags: delinquency, foreclosure, lis pendens. 1 credit./v1/parcels/{id}/comps— Comparable sales within radius. 5 credits (Pro)./v1/parcels/{id}/motivation— Probate / divorce / code violations / NOD. 30 credits (Pro).Vector tiles
MapLibre-compatible MVTs. Drop into any map without a backend integration.
map.addSource("smartzero-parcels", {
type: "vector",
tiles: [
"https://smart.worldclasstitle.com/api/v1/parcels/tiles/{z}/{x}/{y}.mvt?token=wct_live_…"
],
minzoom: 10,
maxzoom: 18
});
map.addLayer({
id: "smartzero-parcels-fill",
type: "fill",
source: "smartzero-parcels",
"source-layer": "parcels",
paint: {
"fill-color": ["case",
["get", "is_absentee"], "#f97316",
"#3b82f6"
],
"fill-opacity": 0.3
}
});Custom layers
Upload a CSV keyed by parcel_id — get an embeddable MVT tile source with your data joined to parcel geometry. Numeric properties are typed for MapLibre expressions. Free, standard tier.
/v1/layers?name=…— Upload (text/csv or JSON {name, csv}). Returns layer_id + tile URL template./v1/layers— List mine./v1/layers/{id}— Delete + cascade features./v1/layers/{id}/tiles/{z}/{x}/{y}.mvt— Vector tile with your data joined to parcels.geom.Webhooks
Outbound HTTP POSTs when parcels move. Each delivered event costs 1 credit. Pro tier. Events: recorded_instrument, new_mortgage, new_lien, foreclosure_filing, tax_delinquency, owner_change, last_sale_change.
/v1/webhooks— Register. Returns plaintext secret ONCE./v1/webhooks— List mine./v1/webhooks/{id}— Toggle enabled / update fields./v1/webhooks/{id}— Remove./v1/webhooks/{id}/deliveries— Delivery audit log + last error.Signature verification (Node.js):
import { createHash, createHmac, timingSafeEqual } from "crypto";
function verify(secret, rawBody, signatureHeader) {
const parts = Object.fromEntries(
signatureHeader.split(",").map(p => p.split("="))
);
const key = createHash("sha256").update(secret).digest("hex");
const expected = createHmac("sha256", key)
.update(`${parts.t}.${rawBody}`).digest("hex");
return timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}Retries follow ~0s, 30s, 2min, 10min, 1h. 20 consecutive failures auto-disables the sub (re-enable in the dashboard).
Preliminary title search
Full ATSE-pipeline title search: chain of title, lien resolution, owner cascade, commitment-ready output. 300 credits / search, refunded automatically if the pipeline fails. Pro tier. Async — kickoff returns a job_id, poll for completion.
/v1/preliminary-search— Kicks off. Body: {"parcel_id":"…"}. Returns 202 + job_id./v1/preliminary-search/{job_id}— Poll status. Auto-refunds on terminal failure. Free.Suggested poll: every 30s for 5 minutes, then 2min. Status flows queued → running → complete / failed / refunded.
Coverage & roadmap
/v1/coverage[?state=&county=]— Capability matrix — which counties have what data. Free./v1/roadmap— Planned / building / shipped requests, grouped. Free./v1/requests— Submit a feature / county / capability request. Free, verified tier./v1/requests/{id}/vote— Upvote — weighted by your tier.Ask AI
Natural-language Q&A grounded on a parcel — chain of title, distress, valuation context. 30 credits / call, Pro tier.
curl -X POST https://smart.worldclasstitle.com/api/v1/ask \
-H "Authorization: Bearer wct_live_…" \
-H "Content-Type: application/json" \
-d '{"parcel_id":"010-123456","question":"Walk me through the title chain."}'Billing & account
/v1/account— Balance, tier, lifetime stats, auto-recharge config. Free./v1/cost-estimate— Pre-flight cost calc for any endpoint. Free.MCP server
Same data, same credit ledger, exposed as Claude Code tools over Streamable HTTP. One command and Claude can call 27 tools — search parcels, skip-trace, register webhooks, upload layers, run preliminary searches, all from a conversation.
claude mcp add --transport http smart-zero \
--url https://smart.worldclasstitle.com/api/mcp \
--header "Authorization: Bearer wct_live_…"Tool descriptions explain credit costs inline so the model can budget. Use estimate_cost before bulk operations.
Errors
| Code | Meaning |
|---|---|
| unauthorized | Missing / invalid bearer (or ?token=…) — 401 |
| tier_required | Your tier can't reach this endpoint — 403 |
| insufficient_credits | Balance below required — 402, top_up_url returned |
| not_found | Parcel / resource doesn't exist — 404 |
| rate_limited | Tier's rate window exceeded — 429, Retry-After set |
| invalid_request | Bad body / missing field — 400 |
| internal_error | Upstream / unhandled — 502 or 500 |