Peninsula Entitlement API

Query what can legally be built on a specific Silicon Valley lot: SB 9 status, ADU yield and FAR headroom per parcel, each cited to the municipal code it came from, joined to permits, listings and comparable sales.

What this API is, and what it is not

A national permit feed tells you who might sell. It is a commodity: several vendors sell per-record permit data across all 50 states, and if record volume is what you are buying, buy one of those. This API answers the other half, what can be built there, which is the half that actually prices a deal, and it answers it for the Peninsula and South Bay only.

What you get

  • Per-parcel SB 9 status and max units, with the reasons a lot is blocked
  • ADU feasibility, unit count and buildable square footage
  • FAR headroom: allowable floor area against what is standing today
  • The FAR envelope carries its ruleSource, ruleAsOf and ruleConfidence, so you can go read the code section we read
  • Hazard screens reaching you as developmentBlockers and sb9.blockReasons: very high fire severity, FEMA flood, fault zone, liquefaction, landslide, coastal zone, prime farmland
  • Issued permits, active listings and comparable sales for the same cities

What you do not get

  • National coverage. The scoring corpus is roughly 490,000 parcels across 16 Peninsula and South Bay cities, with permits from 20-plus jurisdictions on top.
  • A permit firehose. The permit record is deep rather than wide: several years of history in the cities we have backfilled, recent filings in the rest, and nothing outside the region.
  • Owner names, phones or mailing addresses. We hold no owner identity, so there is no skip trace here.
  • Imagery-derived condition. Condition is read out of listing text, never a photo or a satellite pass, so it exists for on-market stock only.
  • Commercial entitlement. Commercial parcels are ingested, but every score is a residential lever.

Parcel counts are as of September 2026 and grow as cities are added. The entitlement feeds below return listings joined to that parcel layer; the full off-market parcel corpus is not exposed through the API today.

Authentication

All API requests require an API key passed via the x-api-key header or as a query parameter ?apiKey=.

curl -H "x-api-key: YOUR_KEY" https://addressintel.co/api/v1/market-signals
Download OpenAPI Spec (JSON)Perfect for integrating with OpenAI Function Calling or LangChain.

Entitlement endpoints

Each of these returns active listings joined to the parcel layer and ranked on one development lever, with the blockers attached to the row. A result you disagree with can be argued with, because the reasons travel with the score.

GET/api/v1/sb9-inventoryFree Tier

Active listings that screen eligible or likely for an SB 9 lot split or duplex, ranked by maximum units and then teardown score. Lots that are blocked are excluded, and the reasons a lot screens the way it does come back in sb9.blockReasons rather than being collapsed into a number.

Query Parameters

  • status(Optional) eligible, likely or any. Defaults to any non-blocked lot.
  • minUnits(Optional) Only lots whose SB 9 maximum reaches this unit count.
  • excludeBlockers(Optional) true drops anything carrying a known development blocker.

Response

{
  "success": true,
  "count": 1,
  "data": [
    {
      "id": "abc-123",
      "address": "123 Main St",
      "city": "Menlo Park",
      "zip": "94025",
      "price": 2400000,
      "status": "Active",
      "teardownScore": 95.5,
      "sb9": {
        "status": "eligible",
        "maxUnits": 4,
        "blockReasons": []
      },
      "lotSqft": 14500,
      "zoning": "R-1-U",
      "developmentBlockers": [],
      "unlockPathways": ["sb9_lot_split", "adu_plus_jadu"],
      "entitlementRiskScore": 22
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 118,
    "returned": 1,
    "nextOffset": 1
  },
  "asOf": "2026-09-11T15:30:00.000Z"
}
GET/api/v1/redevelopment-leadsFree Tier

Underbuilt lots: small, older houses using a low share of the floor area their zoning allows. The useful field is buildableHeadroomSqft, the gap between what is standing and what the envelope permits, and it arrives with the code section it was derived from, the date that rule was read, and a confidence rating.

Query Parameters

  • minScore(Optional) Minimum redevelopment score, 0 to 100. Defaults to 60.
  • class(Optional) teardown_candidate or expansion.
  • excludeBlockers(Optional) true drops anything carrying a known development blocker.

Response

{
  "success": true,
  "count": 1,
  "data": [
    {
      "id": "abc-123",
      "address": "123 Main St",
      "city": "Menlo Park",
      "zip": "94025",
      "price": 2400000,
      "status": "Active",
      "livingSqft": 1100,
      "yearBuilt": 1948,
      "redevelopment": {
        "score": 88,
        "class": "teardown_candidate",
        "farUtilizationPct": 24.4,
        "buildableHeadroomSqft": 3410,
        "allowableFloorAreaSqft": 4510,
        "ruleSource": "Menlo Park Municipal Code 16.20.040",
        "ruleAsOf": "2026-06-01",
        "ruleConfidence": "high"
      },
      "lotSqft": 14500,
      "zoning": "R-1-U",
      "sb9Status": "eligible",
      "developmentBlockers": [],
      "unlockPathways": ["sb9_lot_split"]
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 264,
    "returned": 1,
    "nextOffset": 1
  },
  "asOf": "2026-09-11T15:30:00.000Z"
}
GET/api/v1/adu-leadsFree Tier

Lots ranked by ADU feasibility, with the estimated unit count and buildable square footage, plus the lot geometry the estimate rests on: frontage, depth, shape, corner status and existing coverage.

Query Parameters

  • minScore(Optional) Minimum ADU feasibility score, 0 to 100. Defaults to 60.
  • excludeBlockers(Optional) true drops anything carrying a known development blocker.

Response

{
  "success": true,
  "count": 1,
  "data": [
    {
      "id": "abc-123",
      "address": "123 Main St",
      "city": "Menlo Park",
      "zip": "94025",
      "price": 2400000,
      "status": "Active",
      "adu": {
        "feasibilityScore": 84,
        "maxUnits": 2,
        "estSqft": 1200,
        "existingCoveragePct": 18.6
      },
      "lot": {
        "shape": "rectangular",
        "frontageFt": 100,
        "depthFt": 145,
        "aspectRatio": 1.45,
        "cornerLot": false,
        "streetFrontages": 1
      },
      "lotSqft": 14500,
      "zoning": "R-1-U",
      "developmentBlockers": [],
      "unlockPathways": ["adu_plus_jadu"],
      "entitlementRiskScore": 22
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 91,
    "returned": 1,
    "nextOffset": 1
  },
  "asOf": "2026-09-11T15:30:00.000Z"
}

Supporting endpoints

The market, property and permit feeds are the inputs the entitlement math runs on. They are useful on their own, and they are not the part that is hard to buy elsewhere.

GET/api/v1/market-signals

Retrieves top investment opportunities scored by our proprietary engine on teardown potential, across the Silicon Valley cities AddressIntel ingests. Nantucket listings are served with permit, sales and market data but carry no proprietary score today.

Query Parameters

  • market(Optional) Filter by market ("peninsula" or "nantucket"). Defaults to peninsula.
  • city(Optional) Filter by city name (e.g., "Atherton")
  • address(Optional) Search for a specific address

Response

{
  "success": true,
  "count": 25,
  "data": [
    {
      "id": "abc-123",
      "address": "123 Main St",
      "city": "Menlo Park",
      "price": 2400000,
      "status": "Active",
      "teardownScore": 95.5,
      "flippabilityScore": 0,
      "conditionScore": 3.5,
      "visionAnalysis": "...",
      "proformaROI": -11.3,
      "proforma": {
        "roiPct": -11.3,
        "buildSqft": 3000,
        "arvPerSqft": 1325,
        "capital": 3775000,
        "resaleNet": 3776250,
        "compCount": 9,
        "compsCityMatched": true,
        "compsTypeMatched": true,
        "unmodellableReason": null,
        "assumptions": {
          "costPerSqft": 550,
          "softCosts": 150000,
          "demoCost": 25000,
          "sellingCostPct": 5,
          "carryRatePct": 7,
          "holdMonths": 33,
          "carryBasis": "simple interest on the purchase price plus half the build budget",
          "newBuildPremium": 1.05,
          "buildSizeBasis": "zoning envelope (allowableFloorAreaSqft), capped at 4x existing"
        }
      },
      "metadata": {
        "sqft": 1100,
        "lotSize": 14500,
        "daysOnMarket": 4
      }
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 480,
    "returned": 25,
    "nextOffset": 25
  },
  "asOf": "2026-06-20T15:30:00.000Z"
}

Interactive Playground

Test the API directly from your browser. Click the button below to fetch live data using a demo API key.

GET/api/v1/market-signals?apiKey=demo

Click "Run Request" to see a live demo of the API response.

Using the demo API key restricts results to 2 items.

GET/api/v1/properties/:idFree Tier

Retrieves detailed intelligence for a single property, including aggregated comp data and proprietary scores.

Path Parameters

  • idThe unique identifier of the property

Response

{
  "success": true,
  "data": {
    "id": "abc-123",
    "address": "123 Main St",
    "city": "Menlo Park",
    "price": 2400000,
    "intelligence": {
      "teardownScore": 95.5,
      "flippabilityScore": 0,
      "marketHeatIndex": 82,
      "biddingWarPredictor": 65
    },
    "comparables": {
      "recentSalesCount": 5,
      "avgPricePerSqft": 1250
    }
  }
}
GET/api/v1/permitsFree Tier

Searches issued building permits across our Peninsula and South Bay coverage. This is a deep local record, not a national one: if you need per-record permit volume across many states, a national permit vendor is the cheaper answer. What it does carry that a national feed usually does not is the scope description alongside the project type, which matters because several cities file nearly every job under one generic type label and only the description says what the work actually is, and a permit number that resolves to a page on this site.

Query Parameters

  • city(Optional) Filter by city name (e.g., "Menlo Park"). Partial matches allowed.
  • q(Optional) Keyword matched against address, project type, scope description, contractor, architect and permit number.
  • minValuation(Optional) Only permits valued at or above this dollar amount. Permits filed without a valuation are excluded when this is set.

Response

{
  "success": true,
  "count": 1,
  "data": [
    {
      "permitId": "B26-0499",
      "city": "Menlo Park",
      "address": "123 Main St",
      "projectType": "Demolition",
      "description": "Demolish existing SFR",
      "valuation": 150000,
      "sqft": 2100,
      "psf": 71.4,
      "contractor": "Acme Builders",
      "architect": null,
      "issuedDate": "2026-07-14",
      "status": "Issued",
      "permitUrl": "https://addressintel.co/permit/menlo-park/B26-0499"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 312,
    "returned": 1,
    "nextOffset": 1,
    "truncated": false
  },
  "asOf": "2026-08-05T15:30:00.000Z"
}

Every endpoint above is also exposed as a read-only Model Context Protocol server, so Claude, ChatGPT or your own agent can answer entitlement and parcel questions directly instead of you writing glue code. Ask "which Menlo Park listings could be split under SB 9, and what is blocking the rest?" and the agent calls the API itself.

Tools

  • list_sb9_inventoryListings eligible for an SB 9 lot split or duplex, with block reasons for those that are not.
  • list_redevelopment_leadsUnderbuilt parcels scored against their allowable building envelope.
  • list_adu_leadsParcels ranked by ADU feasibility, with estimated units and buildable square footage.
  • list_market_signalsListings ranked by teardown or flip potential.
  • get_property_intelligenceFull scores and comparable sales for a single property id.
  • search_permitsIssued building permits by city, keyword, or minimum valuation.

Setup

No install step: npx fetches the server on demand. It runs locally over stdio and calls this API with your key, so your plan's rate limits and row ceilings apply unchanged. Without a key it falls back to the demo tier, so you can try it before you have one.

claude mcp add addressintel \
  -e ADDRESSINTEL_API_KEY=YOUR_KEY \
  -- npx -y addressintel-mcp

Source and tool reference: addressintel-mcp on npm. Need a key? Grab a free one and it will be emailed to you.

Usage & Limits

Limits are enforced per API key based on your plan. Exceeding your rate limit returns a 429.

Demo

  • Up to 5 results per request
  • 10 requests / minute
  • Full history
  • No webhooks

Free

Self-serve
  • Up to 25 results per request
  • 30 requests / minute
  • Last 30 days of permits and sales
  • No webhooks

Pro

  • Up to 500 results per request
  • 120 requests / minute
  • Full history
  • Real-time webhooks

Pagination

Use the limit and offset query parameters to page through results. Every list response includes a pagination object with total and a nextOffset (null on the last page), plus an asOf timestamp indicating data freshness.

History Window

Free keys read a rolling 30 day window of dated records: permits by issue date, and sold properties by sale date. Active listings are never windowed, so the inventory feeds return in full on every plan. Pro reads the complete corpus.

When a window applies, the response carries a historyWindow object with the days and the oldest date included, so a quiet 30 days is distinguishable from an empty result. It is null when no window was applied. Free keys issued before 4 September 2026 keep full history and continue to see null.

Rate Limit Headers

Every response carries X-RateLimit-Limit and X-RateLimit-Remaining headers. When you exceed your plan's per-minute limit the API responds with 429.

Error Handling

Errors use standard HTTP status codes and a consistent JSON envelope: success: false, a human-readable error message, and a stable machine-readable code.

{
  "success": false,
  "error": "Unauthorized. Missing API Key.",
  "code": "unauthorized"
}

Real-time Webhooks

Pro

Push real estate intelligence directly into your CRM or internal systems. Subscribe to webhook events to receive real-time notifications when major construction or demolition permits are filed. Webhook registration requires a Pro API key.

Subscribing to Webhooks

You can register your webhook endpoint via the API or using the form below.

Register via UI
Register via API
curl -X POST https://addressintel.co/api/v1/webhooks/register \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://your-domain.com/webhook"}'

Supported Events

  • permit.created - Fired when a new high-value permit is recorded
  • property.score_updated - Fired when a property's teardown or flippability score changes

Example Payloads

{
  "event": "permit.created",
  "market": "sf-peninsula",
  "data": {
    "permitId": "B24-1052",
    "type": "Demolition",
    "address": "123 Main St, Menlo Park",
    "estimatedValue": 150000,
    "status": "Issued"
  },
  "timestamp": "2026-06-12T15:30:00Z"
}

Verifying Signatures

Every delivery is signed. Compute an HMAC-SHA256 of the raw request body using the signingSecret returned at registration, and compare it (constant-time) against the X-AddressIntel-Signature header. Reject any request that doesn't match.

import crypto from "crypto";

// `secret` is the signingSecret returned when you registered the webhook.
function verify(rawBody, signatureHeader, secret) {
  const expected = "sha256=" + crypto
    .createHmac("sha256", secret)
    .update(rawBody)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(signatureHeader),
    Buffer.from(expected)
  );
}

// In your handler:
const ok = verify(rawBody, req.headers["x-addressintel-signature"], secret);
if (!ok) return res.status(401).end();

Plans & Pricing

Start with a free key and the last 30 days of permits and sales. Go Pro for the full history, real-time webhooks and the limits a production integration needs.

Free

$0/mo
  • 25 results per request
  • 30 requests / minute
  • Last 30 days of permits and sales
  • Community support
  • Key delivered to your inbox
Full Access

Pro API

$249/mo
  • 500 results per request
  • 120 requests / minute
  • Real-time webhooks
  • Full permit and sales history
  • Full screener and parcel scores on the site
  • Priority support

Enter your email for a Free or Pro key. The free key is emailed to you; Pro checks out through Stripe.

Build on Peninsula entitlement math

The AddressIntel API exposes the same parcel layer that powers our real estate investment screener and building permit tracker: SB 9 status, ADU yield, FAR headroom, teardown scores and a deterministic ROI proforma, each tied to a specific lot in a specific Peninsula city rather than to a national average. Use it to screen deals, enrich your CRM, or answer the question a listing page cannot, which is what the zoning would let you build on that lot.

New to how we score properties? The developer guides walk through teardown ROI, Floor Area Ratio, SB 9 and the demolition permit process that underpin every value in these endpoints.

Explore the platform

See the parcel layer in action across the AddressIntel product before you integrate.