NYC Building Permits API (DOB NOW) – Contractor Leads avatar

NYC Building Permits API (DOB NOW) – Contractor Leads

Pricing

from $2.50 / 1,000 results

Go to Apify Store
NYC Building Permits API (DOB NOW) – Contractor Leads

NYC Building Permits API (DOB NOW) – Contractor Leads

NYC DOB NOW building permits API: construction leads with permittee business, license, estimated cost, coordinates and trade tags (plumbing, HVAC, GC). Permit data CSV/JSON. Renewals excluded.

Pricing

from $2.50 / 1,000 results

Rating

0.0

(0)

Developer

Blake Runckel

Blake Runckel

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

NYC Department of Buildings DOB NOW: Build work permits from NYC Open Data (dataset rbx6-tga4): permittee business, license type and number, estimated job cost, coordinates, and sub-trade tags with provenance. Renewals are excluded by default, so you get new issuances, not re-issued old jobs. No owner or personal names.

Not included: Electrical, Elevator and Limited Alteration Application (LAA) permits. DOB publishes those in separate datasets, so this Actor is not a source of electrical or solar leads, and those trades are not offered in the trade filter.

Use it for: contractor leads and construction leads (new jobs by trade), a building permits API for your CRM, or a permit data CSV/Excel export for market research. Runs on a schedule; export CSV, Excel, JSON or call the API.

Sample rows (table)

issueDateaddressworkTypecontractorNamevaluationtrades
2026-10-1617 LOUIS PLACE, Brooklyn, NY 11233Mechanical SystemsHERITAGE V LLC$3,000HVAC
2026-10-162150 ATLANTIC AVENUE, Brooklyn, NY 11233Mechanical SystemsHERITAGE V LLC$3,000HVAC
2026-10-161940 SHORE PARKWAY, Brooklyn, NY 11214StandpipeAMOK INCfire/life-safety, plumbing
2026-10-16374 WORTMAN AVENUE, Brooklyn, NY 11207PlumbingFJP MECHANICAL INC$96,621plumbing
2026-10-16177 ARDSLEY LOOP, Brooklyn, NY 11239Mechanical SystemsDJH MECHANICAL CORP$50,000HVAC

Quick start

Example input (also prefilled in the input form):

{
"days": 7,
"boroughs": [
"Brooklyn",
"Queens"
],
"trades": [
"plumbing",
"HVAC"
],
"excludeRenewals": true,
"maxItems": 100,
"explicitTradesOnly": true
}

Input

FieldDescription
daysHow many days back from today to include, by permit issue date (1-366).
tradesOnly return permits tagged with at least one of these trades. Leave empty for all trades. Electrical, solar and elevator are not offered: this DOB NOW dataset excludes Electrical, Elevator and LAA permits (DOB publishes those separately).
explicitTradesOnlyWhen filtering by trade, match only trades stated by the permit type, a listed contractor role or the description, and ignore 'implied' tags (e.g. roofing implied by a new house). On by default for lead generation; turn off to include implied new-build trades.
boroughsLimit to these boroughs (filtered at the source). Empty = all five.
excludeRenewalsSkip permit renewals/reinstatements (often old jobs re-issued). Recommended for lead generation.
excludeStaleApprovalsSkip permits whose approvedDate is before 2025-01-01 (old jobs only now being issued). Default on. Permits with no approval date are kept and flagged approvalDateMissing: true.
dedupePermitsOne row per permit ID (default on). DOB lists one line per work type on the same permit; the extra lines are merged into workTypes, trades and contractors. Turn off for one row per permit line.
dateFromEarliest issue date, YYYY-MM-DD. When set, overrides 'Days back'.
dateToLatest issue date, YYYY-MM-DD. Defaults to today.
minValuationOnly permits with a declared valuation at or above this amount. Rows with no or zero valuation are dropped when this is set (note: many NYC sub-permits such as Foundation, Structural, Standpipe and Scaffold carry $0 because the cost sits on the parent GC permit).
excludeNonBuildingSkip administrative and non-building records (administrative changes, reinstatement-only and similar no-work records).
maxItemsMaximum number of records to return (1-50,000).

Fields

Every Ledger permit Actor (Deschutes/Bend, Chicago, NYC) outputs the same fields:

FieldMeaning
recordIdUnique row key. One job can produce several rows (NYC: one per work type; Bend: one per sub-permit such as building, electrical, plumbing, mechanical). Dedupe on permitID if you want one row per permit.
permitIDThe agency's permit/application number.
jurisdictionCity or county that issued the permit.
addressSite address as published.
parcelTax lot / PIN / BBL (see completeness).
latitude, longitudeWGS84 coordinates where the source publishes them (Chicago, NYC); null for Deschutes/Bend.
workTypeThe agency's work/permit-type label (e.g. Plumbing, Electrical, New - Single Family Dwelling).
permitType, permitSubtypeThe agency's broader permit category and subtype (see "Source mapping").
filingReason, isRenewalWhy it was filed; true for renewals/reinstatements (usually old jobs).
descriptionFree-text scope of work.
statusPermit status as published. A value ending in "(inferred: …)" means the source left it blank and we derived it.
contractorNameThe agency's main contractor field (general contractor where known). Never a record the agency labels as owner.
contractorsAll contractor roles listed on the permit, [{role, name}].
contractorLicense{type, number} where published (NYC).
valuationDeclared job value in USD (null if not published).
squareFeetSquare footage where published.
applicationDate, approvedDate, issueDate, expirationDate, finalDateISO dates (YYYY-MM-DD); null when the source doesn't publish that date. approvalDateMissing is true when approvedDate is null.
tradesAll sub-trades the job likely needs, including implied ones.
explicitTradesOnly trades stated by the permit type, a listed contractor role, or the description.
tradeDetails[{trade, source, confidence}]: source permitType/contractorRole (high), keyword (medium), implied (low, e.g. a new house implies roofing).
sourceUrlLink to the record (or the official export containing it) at the source.
sourcePublisher and dataset name.

Source mapping

Source fieldLedger field
work_typeworkType and permitType
filing_reason (Initial Permit / Renewal…)filingReason, isRenewal
approved_date / issued_date / expired_dateapprovedDate / issueDate / expirationDate (this dataset publishes no filing date, so applicationDate is null)
applicant_business_name, permittee_s_license_type, applicant_licensecontractorName, contractorLicense
estimated_job_costs, latitude, longitude, bblvaluation, latitude, longitude, parcel
One job filing often has several work permits (plumbing, mechanical, sprinklers…), so expect several rows per job with different recordIds.

Zero-cost sub-permits: Foundation, Structural, Earth Work, Standpipe and Scaffold permits filed "in conjunction with" a GC application often show valuation 0 because the cost sits on the parent GC permit. minValuation drops them.

Old approval dates: about 5% of non-renewal records are initial permits approved in 2023–2024 but issued now. They are genuine new issuances (filing reason "Initial Permit"); filter on approvedDate if you want only recent approvals.

Completeness

Measured on 5,000 records issued 2026-10-01 to 2026-10-16 (default filters, renewals excluded):

Contractor (permittee business)Valuation > 0Parcel (BBL)Lat/lonDistinct permits
100%81%94%99%4,201 of 5,000 rows

Sample output

(Generated 2026-10-19 by the current version.)

{
"recordId": "B00590900-I1-MS|Mechanical Systems|1|571971443",
"permitID": "B00590900-I1-MS",
"jurisdiction": "New York City",
"address": "17 LOUIS PLACE, Brooklyn, NY 11233",
"latitude": 40.677301,
"longitude": -73.917332,
"workType": "Mechanical Systems",
"permitType": "Mechanical Systems",
"isRenewal": false,
"description": "Affordable House Development, HUB Consultation Meeting Accepted 07/07/21. File mechanical work in conjunction with NB# 321600601.",
"status": "Permit Issued",
"contractorName": "HERITAGE V LLC",
"contractors": [
{
"role": "permittee (GC)",
"name": "HERITAGE V LLC"
}
],
"valuation": 3000.0,
"issueDate": "2026-10-16",
"trades": [
"HVAC"
],
"explicitTrades": [
"HVAC"
],
"tradeDetails": [
{
"trade": "HVAC",
"source": "permitType",
"confidence": "high"
}
],
"sourceUrl": "https://data.cityofnewyork.us/resource/rbx6-tga4.json?work_permit=B00590900-I1-MS"
}

Pricing

Pay per result: $2.50 per 1,000 permit records ($0.0025 per result), plus a $0.00005 Apify start fee per run. You pay only for rows written to your dataset; Apify platform usage (compute) is included in that price, not billed separately. Set a maximum cost per run in Apify Console or the API and the run stops at that limit. Users on the Apify free plan can try it within their free monthly credit.

Privacy

Owner and homeowner records are not included: no field or contact role that the agency labels as owner is exported. Personal phone numbers and emails are not exported either. Contractor names are the agency's contractor field as published. Most are businesses, but some are sole proprietors or individual licensees. Treat contractor contact as B2B. Follow the TCPA, CAN-SPAM, do-not-call rules and the source's terms; contact at a permit address should be by mail only unless you have consent.

Reliability

Each run reads the official feed live. Requests retry up to 3 times with backoff (2 s, 4 s, 8 s) on rate limits, server errors and timeouts. If a run finds 0 matching records it pushes nothing and sets a status message saying so. A change in the source's columns stops the run with a clear error.

Limitations

  • Trade tags are rules applied to permit types, contractor roles and descriptions, so they are not guaranteed. With a trade filter set, only explicit (stated) trades match by default; set explicitTradesOnly to false to include implied new-build trades.
  • Not affiliated with or endorsed by the data publisher.

Attribution and terms

Source: NYC Department of Buildings via NYC Open Data, dataset rbx6-tga4 (DOB NOW: Build - Approved Permits), current version at time of run. Modifications: fields renamed to the Ledger permit schema, owner and personal-name fields removed, rows without an issued work permit excluded, renewals excluded unless excludeRenewals is false, permits approved before 2025-01-01 excluded unless excludeStaleApprovals is false, lines of the same permit merged into one row unless dedupePermits is false, and trade tags added.