Back to developer dashboard

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

  1. Issue an API key from the dashboard
  2. Hit a free endpoint to confirm auth works
  3. 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.

TierTriggered byEndpoint accessRate
freeemail-verifiedAurora-resident endpoints, tiles60/hr
verifiedcard on file+ skip-trace, taxes, instruments60/min
standard$50 lifetime+ chain, distress, custom layers120/min
pro$500 lifetime+ motivation, comps, webhooks, ask, prelim search600/min
enterprisecontractSLA + custom limits + white-labelcustom

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.

EndpointCost (credits)Min tier
parcels.get / by_address / search / owner / tiles0free
coverage / requests / roadmap0free
parcels.taxes / distress1verified
parcels.instruments / chain / comps5verified–pro
parcels.contacts5 cached / 10 freshverified
parcels.motivation / ask30pro
webhooks.fire1 per delivered eventpro
preliminary_search300 (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

GET/v1/parcels/{parcel_id}Full parcel record + coverage badge. Free.
GET/v1/parcels/by-address?address=…Fuzzy address → parcel resolver (top 5). Free.
POST/v1/parcels/searchFilter by bbox / county / zip / absentee / value / sale window. Cursor pagination, max 500/call. Free.
GET/v1/parcels/{id}/ownerOwner of record (assessor data). Free — the fraud-prevention layer.
GET/v1/parcels/{id}/contactsZipLock skip-trace phones + emails. 5 cached / 10 fresh.
GET/v1/parcels/{id}/instrumentsRecorded mortgages, deeds, liens, releases. 5 credits.
GET/v1/parcels/{id}/chainReverse-chronological chain of title. 5 credits.
GET/v1/parcels/{id}/taxesTax status + FL tax certificates. 1 credit.
GET/v1/parcels/{id}/distressDistress flags: delinquency, foreclosure, lis pendens. 1 credit.
GET/v1/parcels/{id}/compsComparable sales within radius. 5 credits (Pro).
GET/v1/parcels/{id}/motivationProbate / 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.

POST/v1/layers?name=…Upload (text/csv or JSON {name, csv}). Returns layer_id + tile URL template.
GET/v1/layersList mine.
DELETE/v1/layers/{id}Delete + cascade features.
GET/v1/layers/{id}/tiles/{z}/{x}/{y}.mvtVector 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.

POST/v1/webhooksRegister. Returns plaintext secret ONCE.
GET/v1/webhooksList mine.
PATCH/v1/webhooks/{id}Toggle enabled / update fields.
DELETE/v1/webhooks/{id}Remove.
GET/v1/webhooks/{id}/deliveriesDelivery 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).

Coverage & roadmap

GET/v1/coverage[?state=&county=]Capability matrix — which counties have what data. Free.
GET/v1/roadmapPlanned / building / shipped requests, grouped. Free.
POST/v1/requestsSubmit a feature / county / capability request. Free, verified tier.
POST/v1/requests/{id}/voteUpvote — 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

GET/v1/accountBalance, tier, lifetime stats, auto-recharge config. Free.
POST/v1/cost-estimatePre-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

CodeMeaning
unauthorizedMissing / invalid bearer (or ?token=…) — 401
tier_requiredYour tier can't reach this endpoint — 403
insufficient_creditsBalance below required — 402, top_up_url returned
not_foundParcel / resource doesn't exist — 404
rate_limitedTier's rate window exceeded — 429, Retry-After set
invalid_requestBad body / missing field — 400
internal_errorUpstream / unhandled — 502 or 500
Hit a gap, want a county, or have ideas?
Open the roadmap →