NSW ePlanning scraper
One undocumented endpoint covers all 128 NSW councils, found via a Planning Portal inspection. Polite rate-limiting, a daily cron, and a 45-day backfill to populate every region at launch.
Case study · crow_code_
DA Notice sends NSW tradies a weekly SMS of council development approvals, filtered to their trade and their suburbs. Built, deployed, and loaded with real data in a single sprint. Four councils, over a thousand approvals, no team, no agency, no pre-existing codebase.
The opportunity
Every council approval is on public record the moment it is lodged. Tradies who find jobs early win them. Nobody was connecting those two facts.
NSW tradies find work by word of mouth, cold calls, and driving past sites. The planning portal exists, but it means knowing what to search, how to filter, and checking it by hand every week.
A plumber who hears about a dwelling approval first knocks on the door first. Nobody was doing that systematically.
Every Monday morning a text arrives. Filtered to trade, filtered to suburb. Real addresses, real approval types, real lodgement dates. Thirty seconds to read.
One job from a single lead covers six months of the subscription. The economics are obvious without explanation.
The product
A progressive web app that installs from the browser. Fat tile buttons made for a tradie's hands on a worksite.


What was built
Six systems, every layer built from the ground up in 28 hours of wall-clock time.
One undocumented endpoint covers all 128 NSW councils, found via a Planning Portal inspection. Polite rate-limiting, a daily cron, and a 45-day backfill to populate every region at launch.
Maps raw approval text to twelve trade slugs: builder, electrician, plumber, carpenter, roofer, and more. Runs on insert, stored so a single approval can serve several trades.
Maps raw API address strings to suburb slugs via postcode-plus-longest-substring matching. Handles title-casing, multi-suburb postcodes, and name collisions across 283 suburbs in five regions.
No passwords. The subscriber enters a mobile number, gets a single-use SMS link valid for ten minutes, and a session on verification. A dev bypass keeps testing off Stripe and Twilio.
The subscriber is created pending, sent to Stripe hosted checkout, and activated on a signature-verified webhook. No PII stored beyond what delivery needs.
Saved, Chasing, Quoted, Done, Won: every stage change is a form POST, no JavaScript required. A contact manager per job, address copy, map deep-links, and SMS share on every approval.
What was overcome
Getting the data. NSW councils use fragmented systems with no obvious central API.
One undocumented endpoint covers all 128 NSW councils, found in twenty minutes, no API key required.
One scraper handles every current and future council. Adding a new one is a 30-minute task: a suburbs file, two lines of registry, a seed, a backfill.
A mobile UI for tradies that feels native, not a web form on a phone.
Native radio and checkbox inputs are 20px on mobile, so the first service-area selector looked broken even with the logic correctly wired.
Every input is visually hidden and the whole label becomes a 44px hit target. Suburb tiles, trade tiles, scope tiles: fat squares built for big thumbs, with a fallback for older browsers.
DA Notice is live at danotice.com. Four councils, over a thousand approvals, a subscriber feed, a built-in job pipeline, and a weekly SMS engine that fires every Monday, built in 28 hours by one operator with no team and no pre-existing codebase.
View the live product