· 14 min read
NYC DOB Permits & Violations Scraper: Up to 1,000 Free Results a Month
Every permit record carries 59 fields, including specialized details like zoning districts, permittee license types, and owner business classifications. The Actor interfaces directly with the NYC Open Data API to query approximately 4 million permit issuances and 2.5 million violation records. You can filter by borough, tax block, or specific equipment device numbers for elevators and boilers. A thousand results cost $5.00 on the free-plan price, and the system supports exact lookups using job or violation numbers. This Actor is designed for real estate analysts and compliance officers needing property history, but not for anyone who needs OATH/ECB summons records, which are hosted in a separate NYC dataset.
Try it: open NYC DOB Permits & Violations Scraper on Apify, sign in on the free plan and run the prefilled example.
Can you try NYC DOB Permits & Violations Scraper before paying?
Yes. Apify's free plan includes $5.00 of prepaid usage every month and asks for no credit card. At $0.005 per result, that covers up to 1,000 results of NYC DOB Permits & Violations Scraper a month, before run-start charges and platform usage.
NYC DOB Permits & Violations Scraper was last updated on 2026-07-13. It is one of 1,725 Actors CrawlerBros publishes on Apify, which together have 692,561 lifetime public runs and an average rating of 4.63 out of 5 across 416 reviews.
What does it cost to run NYC DOB Permits & Violations Scraper?
Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.
| Apify plan | Per result | Per 1,000 results |
|---|---|---|
| FREE | $0.005 | $5.00 |
| BRONZE | $0.00433 | $4.33 |
| SILVER | $0.00367 | $3.67 |
| GOLD | $0.003 | $3.00 |
| PLATINUM | $0.003 | $3.00 |
| DIAMOND | $0.003 | $3.00 |
The maxItems control has the most direct impact on your bill because it caps the number of records written to the dataset. To keep test spend low, set this cap to a small value like 20 until you confirm your borough, address, or keyword filters match the exact records you need. Using exact lookups via jobNumbers or violationNumbers avoids scanning wide date ranges and prevents paying for unwanted result items.
How do you run NYC DOB Permits & Violations Scraper from the API?
The schema marks 1 of its 33 controls as required: mode. Nothing in the payload below is illustrative. Those are the schema's prefilled defaults for NYC DOB Permits & Violations Scraper, so the request works once your token is in place.
Call the synchronous endpoint to start a run and receive dataset items in one request:
curl -X POST "https://api.apify.com/v2/acts/crawlerbros~nyc-dob-permits-violations-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"permits","borough":"MANHATTAN"}'
The same run from Python, using the official client:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"mode": "permits",
"borough": "MANHATTAN"
}
run = client.actor("crawlerbros~nyc-dob-permits-violations-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
And from Node.js:
import { ApifyClient } from 'apify-client'
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
const input = {
"mode": "permits",
"borough": "MANHATTAN"
}
const run = await client.actor('crawlerbros~nyc-dob-permits-violations-scraper').call(input)
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)
Because the call is synchronous, your client waits for the whole run. Keep it for exploration. For scheduled work, start the run without waiting and collect the dataset afterwards, so network trouble costs you a retry rather than the results.
Which NYC DOB Permits & Violations Scraper inputs matter, and which can you skip?
The mode control determines whether you query permit issuances or the violation dataset, making it the primary driver of your run structure. Location filters like bin or houseNumber combined with streetName narrow the search to specific properties. Leave appToken blank for initial runs unless you hit Socrata rate limits during large batch operations.
mode(string): What to fetch. Default:"permits".borough(string): Filter to a single NYC borough (mode=permits / mode=violations). Default:"".houseNumber(string): Street/house number, e.g.60(mode=permits / mode=violations). Combine withstreetNamefor an exact address lookup.streetName(string): Street name as it appears in DOB records, e.g.BAY 34 ST(mode=permits / mode=violations). Case-insensitive.bin(string): NYC Building Identification Number, e.g.3185434(mode=permits / mode=violations).block(string): Borough-Block-Lot (BBL) tax block number (mode=permits / mode=violations). Combine withlot.lot(string): Borough-Block-Lot (BBL) tax lot number (mode=permits / mode=violations). Combine withblock.zipCode(string): Filter permits to a single 5-digit NYC ZIP code, e.g.10013.jobType(string): Filter by DOB job type classification. Default:"".permitType(string): Filter by DOB permit type. Default:"".permitSubtype(string): Filter by the more specific permit subtype (subset of equipment-work / construction-equipment permit types). Default:"".workType(string): Filter by the DOB-designated work type covered by the permit. Default:"".
The other 21 controls, with their defaults, are listed in the input schema on NYC DOB Permits & Violations Scraper on Apify.
Fixed-choice controls: mode accepts permits (Search / filter permits), permitsByJob (Lookup permits by job number(s)), violations (Search / filter violations), violationsByNumber (Lookup violations by violation number(s)); borough accepts "" (Any borough), MANHATTAN, BROOKLYN, QUEENS, BRONX, STATEN ISLAND; jobType accepts "" (Any job type), A1 (Major Alteration), A2 (Minor Alteration), A3 (Minor Alteration (limited scope)), DM (Demolition), NB (New Building), SG (Sign); permitType accepts 9 values (default ""), including "" (Any permit type), AL (Alteration), DM (Demolition), EQ (Equipment); permitSubtype accepts 16 values (default ""), including "" (Any subtype), BL (Boiler), CH (Chute), EA (Earthwork); workType accepts 14 values (default ""), including "" (Any work type), BL (Boiler), CC (Curb Cut), EQ (Construction Equipment).
What does NYC DOB Permits & Violations Scraper return?
The returned records are structured for property compliance audits, showing detailed licensee classifications, permit status histories, and violation descriptions. The records conspicuously do not contain owner phone numbers or direct email addresses, as the public NYC DOB dataset does not publish them.
Output: per permit (mode = permits / permitsByJob)
recordType: "permit",scrapedAtborough,houseNumber,streetName,address,bin,block,lot,bblzipCode,communityBoard,councilDistrict,censusTract,ntaName,specialDistrict1,specialDistrict2jobNumber,jobDocNumber,jobType,permitType,permitSubtype,permitSequencepermitStatus,filingStatus,workType,buildingTyperesidential,selfCertified,ownerNonProfit- booleanssiteFill,oilGasfilingDate,issuanceDate,expirationDate,jobStartDate,dobRunDate-YYYY-MM-DDpermitteeName,permitteeBusinessName,permitteePhone,permitteeLicenseType,permitteeLicenseNumber,hicLicenseactAsSuperintendent,superintendentName,superintendentBusinessNamesiteSafetyManagerName,siteSafetyManagerBusinessNameownerBusinessType,ownerBusinessName,ownerName,ownerAddress,ownerCity,ownerState,ownerZipCodelatitude,longitudepermitSiNo,sourceUrl
Output: per violation (mode = violations / violationsByNumber)
recordType: "violation",scrapedAtisn- internal DOB BIS violation IDborough,bin,block,lot,bbl(derived - see FAQ)houseNumber,street,addressissueDate,dispositionDate-YYYY-MM-DDdispositionCommentsviolationTypeCode,violationType,violationNumber,violationCategory,numberdeviceNumber,ecbNumber(cross-reference to the DOB ECB Violations dataset - present on ~8% of records),descriptionsourceUrl
These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.
How do you build the workflow end to end?
Open NYC DOB Permits & Violations Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.
- Select between permits and violations by setting the mode control to the specific dataset you need.
- Define your geographic scope using the borough dropdown or by entering specific houseNumber and streetName values for a pinpoint address lookup.
- Narrow the temporal scope using dateFrom and dateTo in YYYY-MM-DD format to avoid fetching millions of historical records.
- Apply domain-specific filters such as jobType or permitType for construction records, or violationTypeCode for equipment-specific issues like elevators.
- Set the maxItems limit to a small value like 20 for your first run to verify the schema and field presence.
- Review the recordType field in the dataset to ensure you are receiving the expected document type before scaling.
- Identify the bbl or bin values in the output if you need to cross-reference these records with other NYC property datasets.
- Increase the maxItems cap and optionally add a Socrata appToken to the appToken field if you plan to fetch thousands of records in a single session.
How do you apply it? Three worked playbooks
These are NYC DOB Permits & Violations Scraper's own documented use cases, each worked through as an operating pattern rather than a description.
Use case 1: Real estate due diligence
Outcome: Pull a property's full permit and violation history before acquisition
Configure: Set mode to permits and violations in separate runs, using bin or block and lot for the specific property address, with maxItems set to 1000.
Working method: Perform two runs for the target address to capture both datasets. Compare the expirationDate on permits against active violationCategory entries to identify unclosed work. Review the ownerBusinessName to confirm current ownership matches official records.
Deliverable: A consolidated CSV of all historical construction filings and outstanding code violations for a single Building Identification Number.
Stop condition: The run returns zero results for a known existing building, suggesting an incorrect houseNumber or streetName format.
Use case 2: Contractor / permittee research
Outcome: Track a licensed contractor's active and historical permits
Configure: Set mode to permits and enter the contractor name in the keyword field or filter by permitteeLicenseType like GC or MP.
Working method: Filter by filingDate using the dateFrom control to see recent activity. Group the results by permitStatus to distinguish between issued work and revoked or expired filings. Use the address field to map their current geographic footprint.
Deliverable: A list of active job sites and historical performance records for a specific NYC licensed professional.
Stop condition: The keyword search returns unrelated businesses due to common naming conventions in the permitteeBusinessName field.
Use case 3: Compliance monitoring
Outcome: Watch for new violations by borough, category, or device type (elevators, boilers)
Configure: Set mode to violations, choose a borough, and select a specific violationTypeCode such as E for elevators or B for boilers.
Working method: Schedule the run to check a specific dateFrom range covering the last 24 hours. Monitor the description field for specific safety keywords. Filter for VH-VIOLATION HAZARDOUS - ACTIVE to prioritize urgent life-safety issues.
Deliverable: A daily report of new high-priority safety violations issued within a specific geographic or equipment category.
Stop condition: The dataset contains mostly dismissed records because the violationCategory was not restricted to active status.
What breaks, and how do you design around it?
When an address search fails to return records, search instead by the Building Identification Number (bin) or tax block and lot to bypass street name formatting discrepancies. If your pipeline encounters request throttling on wide date ranges, register a free Socrata token and pass it into appToken to lift API rate limits.
When should you not use NYC DOB Permits & Violations Scraper?
Do not use this Actor if you need building permit data outside New York City; use specialized tools like the SF Building Permit Scraper or the Chicago Building Permits Scraper instead. If your deliverable requires restaurant sanitary grades rather than construction safety, use the NYC Restaurant Inspection Scraper. This tool queries DOB-issued civil penalties and does not include summonses adjudicated by OATH/ECB; teams needing ECB summonses must query the city's separate ECB dataset directly. For non-construction retail and commercial licenses, use the NYC Business License Scraper.
What should you check before trusting the output?
- Verify that the bbl field is present; it is omitted on violation records where the borough, block, or lot data is missing or ambiguous.
- Check for borough values; legacy records with invalid internal codes will result in this field being omitted.
- Monitor the ecbNumber field, which is expected to be present on only approximately 8% of violation records.
- Validate that all date fields like filingDate or issueDate follow the YYYY-MM-DD format regardless of the source dataset.
- Ensure the recordType matches your selected mode to prevent processing permits as violations in your downstream pipeline.
- Stop the run if the result count hits your maxItems exactly, as this suggests your filters may be too broad for the intended result set.
None of this proves a record is correct. It gives a scheduled NYC DOB Permits & Violations Scraper run defined points where it should stop instead of quietly passing bad data downstream.
Frequently asked questions
What is the cost for a typical property search?
On the free-plan price, retrieving 1,000 results costs $5.00. For a single property search where you might fetch 50 historical permits and 20 violations, the result charge is roughly $0.35. Apify also bills platform usage for memory and run duration on top of per-result charges.
How reliable is the data provided by this scraper?
The scraper pulls directly from the live NYC Open Data API, providing official city records without intermediate caching. Because it communicates via the Socrata HTTP API rather than scraping HTML markup, data delivery remains structured and stable across runs.
Do I need a credit card to try this out?
No, you can use Apify's free plan which includes $5.00 of monthly usage. This covers up to 1,000 results of this Actor at the standard rate. You can test all 33 controls and various modes without upfront payment.
Why are some fields like borough missing from some records?
Some legacy records in the NYC DOB database contain ambiguous or invalid borough codes that cannot be mapped accurately. To prevent providing incorrect data, the Actor omits the borough field entirely for these specific rows rather than guessing.
How do I fetch permits for a specific contractor?
Set the mode control to permits and use the keyword field to enter the contractor business name. For more precise results, you can also filter by permitteeLicenseType to focus on specific professions like General Contractors (GC) or Master Plumbers (MP).
Where to go next
When you are ready to run it, open NYC DOB Permits & Violations Scraper on Apify; the free plan covers up to 1,000 results a month.
Start with the NYC DOB Permits & Violations Scraper Actor page for the current input schema, pricing tier, and run history.
Other Actors we maintain for related data:
- SF Building Permit Scraper: Scrape the official San Francisco Department of Building Inspection permit dataset.
- NYC Restaurant Inspection Scraper: Scrape the official NYC DOHMH Restaurant Inspection Results open dataset.
- Chicago Building Permits Scraper: Scrape City of Chicago building permit records from the public Socrata Open Data API.
- Austin Building Permits Scraper: Scrape the City of Austin issued construction permits dataset (Building, Electrical, Mechanical, Plumbing, Driveway/Sidewalk).
- Los Angeles Building Permits Scraper: Scrape LA Dept. of Building & Safety permits.
- Dallas Building Permits Scraper: Scrape City of Dallas building permit records from the official Dallas Open Data portal (dallasopendata.com).
- Seattle Building Permits Scraper: Scrape live building, trade, and land-use permit records from the City of Seattle's official permit portal.
- NYC Business License Scraper: Search New York City's official business license registry - find active and historical licensed businesses by name, category, borough, license status, or phone number.
Related guides:
- JobsDB Scraper: 33 Data Fields, Up to 1,000 Free Results/Month (2026)
- Copart Public Search Scraper: 39 Data Fields per Record (2026)
- United Real Estate Homes for Sale Scraper: 3 Practical Use Cases
- PadMapper Scraper: 3 Practical Use Cases
Resources
Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-28.
Actor last updated by its maintainers on 2026-07-13.
Run outcome figures cover the 30 day public window ending 2026-09-28.
Featured actors
NYC DOB Permits & Violations Scraper
Scrape NYC Department of Buildings (DOB) construction permits and code violations from the public NYC Open Data API. Filter by borough, address, BIN, block/lot, job/permit type, permit status, violation category, and date range.
Run on Apify ↗