Orlando FL Code Enforcement Scraper — Code Violation Leads avatar

Orlando FL Code Enforcement Scraper — Code Violation Leads

Pricing

from $2.10 / 1,000 code enforcement cases

Go to Apify Store
Orlando FL Code Enforcement Scraper — Code Violation Leads

Orlando FL Code Enforcement Scraper — Code Violation Leads

Scrape City of Orlando, Florida code enforcement cases via the official open-data API: case number, status, case type (housing, lot, zoning, sign, business tax, tree, pool), violation, opened/resolved dates, address, parcel ID, neighborhood, lat/lon. Distressed-property and contractor leads.

Pricing

from $2.10 / 1,000 code enforcement cases

Rating

0.0

(0)

Developer

Groundplane Labs

Groundplane Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Features

Limited permissions

Share

The Orlando code enforcement cases scraper gives you one row per code enforcement case for Orlando, Florida, straight from the City of Orlando via the official open-data API. No login or coding needed: run it in your browser, on a schedule, or through the Apify API, and export results as JSON, CSV or Excel.

Get City of Orlando, Florida code enforcement cases as a clean, filterable list: housing, lot (overgrown / junk), zoning, sign, commercial, tree, pool, abatement and business-tax cases with status, dates, address, parcel ID and neighborhood. Data comes from the official open-data API (data.cityoforlando.net dataset k6e8-nw6w, "Code Enforcement Cases"). The city refreshes the dataset daily; the newest case opened date at the 2026-11-08 check was 2026-11-08 itself, so cases currently appear within a few days of opening. The lag varies: at the October 2026 build the newest case lagged about 3 weeks. Every run states the newest case date it found in its status message, and flags the run PARTIAL if that date is over 45 days old.

What you get

Each row is one code enforcement case as published by the City of Orlando (caseNumber is unique, ~262,000 cases; about 98% were opened from 2016 on, because the city keeps a rolling ~5 years of cases plus older cases that are still on file). Rows are sorted newest opened date first with a stable :id tiebreak, so large runs never skip or repeat rows.

Sample output (real run)

{
"caseNumber": "2026-14801Z",
"caseType": "Zoning",
"caseTypeCode": "Z",
"violation": "PARKING ON THE GRASS",
"status": "Open",
"stage": "Status Inspection",
"openedDate": "2026-09-23",
"resolvedDate": null,
"daysToResolve": null,
"address": "4712 BAY WILLOW CT",
"parcelId": "292207863402840",
"propertyClass": "Duplex",
"revenueClass": "RESIDENTIAL",
"assessedValue": 127736.0,
"neighborhood": "The Willows",
"commissionerDistrict": "5",
"commissioner": "Shan Rose",
"source": "Staff",
"comments": "VEHICLES BEING PARKED ON FRONT LAWN",
"locationNotes": null,
"latitude": 28.584735,
"longitude": -81.443687,
"dataSource": "City of Orlando Code Enforcement via data.cityoforlando.net"
}

Canary input

{ "maxItems": 5 }

Expected: the run ends Complete: 5 of N matched row(s) delivered, capped at maxItems 5, with the 5 newest cases in the source.

Output fields

FieldMeaning
caseNumberCase number (apno), unique
caseTypeCase type name as published (Housing, Lot, Zoning, ...)
caseTypeCodeCase type code (H, LOT, Z, ...)
violationCase name / violation as published
statusCase status (Open, Closed, Lien, CEB, ENF, Foreclose)
stageCurrent case stage as published
openedDateCase opened date (YYYY-MM-DD)
resolvedDateResolved date (YYYY-MM-DD), null while open
daysToResolveDays to resolve as published, null while open
addressProperty address, null if the city publishes none
parcelIdOrange County parcel ID
propertyClassProperty use description
revenueClassDept. of Revenue class (RESIDENTIAL, COMMERCIAL, ...)
assessedValueAssessed value as published
neighborhoodNeighborhood
commissionerDistrictCity commissioner district
commissionerThe district's elected city commissioner, as published by the city
sourceHow the case was reported (Staff, Citizen, ...)
commentsCase comments, free text written by city staff
locationNotesFree-text location notes from city staff (e.g. a cross street when there is no address)
latitude / longitudeWGS84 coordinates converted from the city's state-plane values
dataSourceProvenance line, constant

Use cases

  • Real-estate investors / wholesalers: distressed-property data, e.g. caseTypes: ["Housing", "Lot", "Abatement"], statuses: ["Open", "Lien", "CEB"].
  • Contractors (roofing, lawn care, junk removal, pool repair): textContains: "roof" or caseTypes: ["Pool"].
  • Property managers and researchers: case volume and time-to-resolve by neighborhood.

How to scrape Orlando code enforcement cases

  1. Click Try for free (or Start) on this page. A free Apify account is enough.
  2. Leave the prefilled input to get a quick sample, or set the filters described below.
  3. Set maxItems to cap how many rows (and how much) a run returns.
  4. Click Start and wait a few seconds to a minute.
  5. Download the results as JSON, CSV or Excel, or connect them to Google Sheets, Zapier, Make or a webhook.

Input

FieldDescription
caseSinceOptional real date, YYYY-MM-DD. Invalid dates fail fast with a clear message. Empty = all cases, newest first
caseTypesCode or name, matched exactly (case-insensitive), see the case type table below. Other text of 4+ characters falls back to a partial name match (e.g. Towing); note partial text such as Zoni also matches Towing and Zoning Endpoints (DMV), so use Z or Zoning for regular zoning cases only
statusesOpen, Closed, Lien, CEB (Code Enforcement Board), ENF, Foreclose (rare, 2 cases). ~97% of cases are Closed
neighborhoodse.g. Parramore, College Park. ~25-30% of recent cases have no neighborhood
textContainsMatches the violation name and case comments
excludeNoAddressDefault false. On drops cases with no street address: "No Address" and blank/whitespace-only addresses (mostly parking tickets, ~24% of recent cases). Many of these still carry locationNotes
maxItemsDefault 200. Must be a whole number of 1 or more; 0, negatives and fractions fail the run with a clear message

Case types (code / name as published, case count at the 2026-11-08 check)

CodeNameCasesNotes
ZZoning64,531
LOTLot38,410overgrown lots, junk, debris
HHousing38,133
TKTTicket34,142mostly parking tickets, often no address
SGNSign30,125
BUS + BTRBusiness Tax Receipt19,635 + 11,834two codes for the same type; Business Tax Receipt returns both
COUCertificate of Use9,164
DMVTowing and Zoning Endpoints6,683towing / vehicle cases, not regular Zoning
COMMCommercial4,491
AAbatement2,387
TREETree1,788
POOLPool776
AMSAfter Midnight Alcohol Sales277

Pricing (pay per event)

$3 per 1,000 cases ($0.003 each) plus Apify's minimal $0.00005 start fee. Example: 200 cases = 200 × $0.003 + $0.00005 ≈ $0.60; all cases from a typical month (~1,800-2,600, median ~2,000) ≈ $5.40-$7.80, about $6 at the median. If a run hits your max charge limit, it stops and reports PARTIAL with the rows it delivered.

Troubleshooting

  • The run says PARTIAL and mentions stale data: the city's newest case is over 45 days old, so the feed may have stalled at the city. The rows delivered are still the newest the city has published.
  • Zero matches: a healthy empty result reads Complete: 0 row(s) matched your filters. Loosen the filters (case types match exactly; a misspelled type returns nothing). If the source itself were empty or its columns renamed, the run fails loudly and names the problem instead of reporting zero.
  • Rows with null fields: the city omits a field when it has no value (for example resolvedDate while a case is open, or neighborhood on about a quarter of cases). A null is the city's own record, not a scrape error. If a value arrives in a format the actor cannot parse (a non-ISO date, a currency-formatted value), it ships null and the run reports PARTIAL with the count.
  • Caps: maxItems caps delivered rows and is stated inside the status. The max charge limit stops a run early with a PARTIAL status; raise maxTotalChargeUsd in the run options to get more rows.
  • Still stuck? If this keeps happening, please open an issue on this actor's Issues tab and we'll fix it fast.

Data caveats

Data is provided as published by the City of Orlando. address is the city's derived address with the trailing "ORLANDO FL" removed ("No Address" and city-only remnants become null). latitude/longitude (WGS84) are converted from the city's state-plane gpsx/gpsy (NAD83 Florida East, US feet, EPSG:2236); 0 or missing becomes null (about 76% of 2026 cases have coordinates). The city's own geocode column has been empty since 2022-05-18 and is only used as a fallback for older rows. locationNotes is free text from staff (e.g. a cross street or the address as reported). assessedValue, propertyClass and revenueClass come from the parcel record attached by the city. Case comments are free text written by staff about the property and the violation; they may contain abbreviations or typos and can occasionally mention people. commissioner is the elected city commissioner for the case's district, published by the city as part of the case record. A case is an allegation/inspection record, not proof of a violation; check the case status.

Changelog

  • 0.2 (2026-11-08): deep-audit fix round. Added the core-column sentinel and per-row validation (a renamed source column now fails the run loudly instead of shipping hollow rows; off-format dates and values ship null and are counted, never silently wrong); the Complete/PARTIAL status contract with delivered/matched/scanned counts and the source's newest case date on every status; a freshness check (PARTIAL when the newest case is over 45 days old); the fleet retry standard; explicit maxItems parsing. Refreshed the case counts and freshness notes to the 2026-11-08 source check.
  • 0.1: first release.

License and disclaimer

Source: City of Orlando Open Data (public records). This actor uses only the official public open-data API and is not affiliated with or endorsed by the City of Orlando.

FAQ

How much does it cost to scrape Orlando code enforcement cases?

You pay $0.003 per result ($3 per 1,000) plus a $0.00005 start fee, and nothing else. That is the free-plan price: on paid Apify plans you pay less per result (Bronze 10%, Silver 20%, Gold and above 30% off). Apify's free plan includes $5 of monthly credit, which covers about 1,600 results. See Pricing above for a worked example.

This Actor reads public records from the City of Orlando via the official open-data API, using only public endpoints (no login, no CAPTCHA bypass, no private accounts). See the source/license section above for the dataset's terms. You are responsible for how you use the data; this is not legal advice.

How fresh is the data?

Each run reads the source live, so you get whatever the agency has published at that moment. How often the agency updates, and any known lag, is described in the data caveats/notes section above.

Can I use it via API, on a schedule, or with Google Sheets?

Yes. Every Apify Actor has a REST API and client libraries for Python and JavaScript. You can schedule daily or weekly runs, and send results to Google Sheets, Slack, Zapier, Make, n8n, webhooks, or an AI agent via the Apify MCP server.

I need another city, county or field. Can you add it?

Open an issue on the Issues tab with the city or data source you need. We build new public-records scrapers regularly.

More public-records scrapers by Groundplanes

Same clean output, pay-per-result pricing and official public data sources:

Restaurant & food inspections

Code violations & distressed property leads

Business licenses & new business leads