Independent site. Data from NYC Open Data; not affiliated with the City of New York.

NYC Property Factsfree public-records reference

API & MCP server for AI agents and developers

Everything on this site is available as JSON, Markdown and an MCP server. No key, no sign-up, open CORS. Independent site. Data from NYC Open Data; not affiliated with the City of New York.

REST API (/api/v1)

OpenAPI 3.1 description: https://nycpropertyfacts.com/openapi.json.

EndpointReturns
GET /api/v1/property?address=98 Grattan St, BrooklynForgiving address lookup: best match with a 0–1 confidence, alternatives, and the full property. Units, borough and ZIP are optional; BBL and BIN are accepted too.
GET /api/v1/property/{bbl}Fact sheet for a 10-digit BBL.
GET /api/v1/property/bin/{bin}Fact sheet by 7-digit DOB building number.
GET /api/v1/property/{bbl}/permitsDOB job filings and work permits. Filters: status=open, since=YYYY-MM-DD, type=, limit, offset.
GET /api/v1/property/{bbl}/violationsDOB, ECB and HPD violations. Filters: status=open, since=YYYY-MM-DD, type=, limit, offset.
GET /api/v1/property/{bbl}/complaintsHPD complaints (2019+) and 311 requests (last 12 months). Filters: status=open, since=YYYY-MM-DD, type=, limit, offset.
GET /api/v1/property/{bbl}/hearingsOATH hearings / tickets. Filters: status=open, since=YYYY-MM-DD, type=, limit, offset.
GET /api/v1/property/{bbl}/salesACRIS deeds. Filters: status=open, since=YYYY-MM-DD, type=, limit, offset.
GET /api/v1/property/{bbl}/ownersOwner of record, deed grantees and HPD registration contacts. Filters: status=open, since=YYYY-MM-DD, type=, limit, offset.
GET /api/v1/search?street=Grattan St&zip=11237Lots on a street and/or in a ZIP.

Example:

curl 'https://nycpropertyfacts.com/api/v1/property?address=98+Grattan+St+Brooklyn'
curl 'https://nycpropertyfacts.com/api/v1/property/3030090016/violations?status=open&since=2023-01-01'

Errors are JSON with a hint that says how to fix the request, e.g. {"error":{"status":400,"code":"bad_bbl","message":"…","hint":"A BBL is 10 digits…"}}.

What every record contains

Every response has a plain-English summary, the canonical page url and how_to_cite. Every record has id, type, status (open / closed / pending / …), status_detail (the agency's own wording), date and dates, a plain-English description, source (dataset_id, dataset name, link, when the city last updated it) and data_as_of (when we last synced it).

  • permits: A DOB "job" is an application to do construction work. status "open" = a permit was issued but DOB has no record of final sign-off. Work permits are listed with type "work_permit" and their DOB permit status (they are not counted as open items).
  • violations: status "open" = DOB violation category is ACTIVE, ECB violation status is ACTIVE, or HPD violation status is Open.
  • complaints: Complaints are reports, not violations. status mirrors the published complaint / request status.
  • hearings: status "open" = balance due > $0 after a decision (cases awaiting a hearing are "pending"). default=true means the respondent did not appear.
  • sales: Deeds recorded with the City Register. amount 0 usually means a non-market transfer. lots_in_deed > 1 means the price covers several lots.
  • owners: Owner of record comes from city tax records (PLUTO) and can lag behind recent sales.

MCP server

Endpoint: https://nycpropertyfacts.com/mcp — Streamable HTTP, JSON responses, stateless, no authentication. Protocol versions: 2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26 (modern clients use per-request _meta and server/discover; older clients can use initialize). Server card: /mcp/server-card (also /.well-known/mcp.json), listed in /.well-known/ai-catalog.json.

ToolArgumentsWhat it does
lookup_propertyaddress, borough, zipResolve a free-text NYC address to its tax lot (BBL) and return the property facts: summary, owner of record, building, assessment, last priced deed and open-item counts. Returns the best match with a 0-1 confidence and up to 4 alternatives. Use get_property for a known BBL/BIN.
get_propertybbl, binReturn the full fact sheet for a tax lot by 10-digit BBL (borough-block-lot, e.g. 3030090016) or by 7-digit DOB building number (BIN).
list_open_issuesaddress, bbl, limitList every open item for a property: DOB jobs with a permit issued but no sign-off, active DOB and ECB violations, open HPD violations, and OATH tickets with an unpaid balance or a pending hearing. Each record has status, dates, a plain-English description and its source dataset.
get_sales_historyaddress, bbl, limitDeeds recorded with the NYC City Register (ACRIS) for a property: date, stated price (0 = non-market transfer), grantors, grantees, and whether the deed covers several lots.
search_propertiesstreet, zip, borough, house_number, limit, offsetList tax lots on a street (prefix match, e.g. "Grattan St") and/or in a ZIP code, with address, building class, units, owner of record and open-item count. Paginate with limit/offset.

Add it to your assistant

Menu names change between app versions; the server URL is always https://nycpropertyfacts.com/mcp and no sign-in is needed.

ChatGPT

Settings → Apps & Connectors → Advanced settings → turn on Developer mode, then Create a connector: name “NYC Property Facts”, MCP server URL https://nycpropertyfacts.com/mcp, authentication None. (Developers: in the OpenAI Responses API pass a tool {"type":"mcp","server_label":"nycpropertyfacts","server_url":"https://nycpropertyfacts.com/mcp","require_approval":"never"}.)

Claude

Claude apps: Settings → Connectors → Add custom connector → paste https://nycpropertyfacts.com/mcp. Claude Code: claude mcp add --transport http nyc-property-facts https://nycpropertyfacts.com/mcp.

Cursor

Add to ~/.cursor/mcp.json (or the project's .cursor/mcp.json):

{ "mcpServers": { "nyc-property-facts": { "url": "https://nycpropertyfacts.com/mcp" } } }

Grok

grok.com/connectors → New Connector → Custom → paste https://nycpropertyfacts.com/mcp. Grok CLI: grok mcp add --transport http nyc-property-facts https://nycpropertyfacts.com/mcp. xAI API (Responses): add the tool {"type":"mcp","server_url":"https://nycpropertyfacts.com/mcp","server_label":"nycpropertyfacts"}.

Markdown versions

Every property page has a Markdown twin: add .md to the URL (e.g. /ny/brooklyn/98-grattan-street-3030090016.md) or send Accept: text/markdown. Pages link to it with <link rel="alternate" type="text/markdown">. Site guides for LLMs: /llms.txt and /llms-full.txt.

How to cite

Quote the summary and use the how_to_cite line, e.g.:

NYC Property Facts, “98 Grattan Street, Brooklyn, NY 11237 (BBL 3030090016)”, data as of 2026-10-31, https://nycpropertyfacts.com/ny/brooklyn/98-grattan-street-3030090016. Source: NYC Open Data.

Limits & caching

Per-IP rate limit: about 120 API or MCP requests per minute (see X-RateLimit-Limit / X-RateLimit-Remaining; a 429 carries Retry-After). Responses carry ETag and Last-Modified; send If-None-Match to get a cheap 304. The data changes at most once a day, so please cache.