Permitypermit history for a property address

Property permit intelligence

What work has been permitted here,
and when.

Roofing, HVAC, electrical and plumbing. One address in, four dated answers out — each one saying where the date came from and how sure it is.

A real result

Longmont, CO
Boulder County
LONGMONT
full permit coverage
Roofing
2026
filed · low
2 permits
HVAC
no permit found
0 permits
Electrical
no permit found
0 permits
Plumbing
no permit found
0 permits
DateTagsDescription
2026-08-18filedroofingRemove and replace 16 sq roof. Owens corning duration storm shingles
2026-03-19filedroofingRe-roof

A real result, not a mock-up — address withheld. 2 permits on record. Open this report as a PDF — address absent from the file, not covered over.

Who this is for

Who asks this question

Anyone whose decision changes when they learn the roof is twenty years old rather than two.

Insurance

Underwriting, renewals and claims. Roof age decides whether a carrier writes it, and at what.

Real estate

What was done, when, and whether it was permitted — before it becomes a disclosure argument.

Construction

Verify prior work on a property before you quote it: what was permitted, when, and which authority issued it.

Property management

Track what has actually been done across a portfolio rather than what the file says.

Inspection and appraisal

A permit history alongside the walkthrough, and a record of the work you cannot see.

Lending and title

Unpermitted additions and open permits, found before closing rather than after.

The twenty-minute problem

Permit records live in hundreds of separate county and city systems, each with its own search, its own login, and its own idea of what a date means. Checking one property is twenty minutes. Checking eight hundred is not something anyone does.

Permity answers in about a second, and will answer for a whole list from a CSV.

What it is worth knowing

A twenty-year-old roof decides a renewal. An addition that raised replacement cost by forty thousand dollars against a limit that never moved is a claim waiting to happen. Work done without a permit is a disclosure problem for whoever sells the house next.

All of it is in the permit record, and none of it is in the file in front of you.

How to read it

An empty cell means two opposite things

This is the part most permit tools get wrong. “No roofing permit” and “this county does not report roofing permits” look identical if you render both as a blank. One of them prices a policy. The other sends an inspector. We never collapse them.

2019
found

A permit, and a year we can stand behind.

none found

No permit, and this jurisdiction reports well. Real signal: probably no permitted work.

found, undated

A permit exists with no usable date. Work happened; when is unknown.

?
no coverage

This jurisdiction barely reports. Absence here is not evidence of anything.

A 2012 filing is not a 2012 completion

A permit record carries up to four dates and rarely all of them. We take the first that exists and always report which one it was, so you know whether a year means the work finished or only that somebody applied.

We take the first field that has a date — and always say which one it was.final_datework completedpresent 24%issue_datepermit issuedpresent 51%file_datesomeone appliedpresent 86%start_datework startedpresent

Measured on 100 Colorado roofing permits. The most truthful field is missing three times in four, so a single field will not do — and a 2012 filing is not a 2012 completion.

The neighbours fill in what a permit cannot

The honest weakness of any permit product is that unpermitted work is invisible. The street fixes it. When most of a block pulled a roofing permit the same year and one house did not, that silence is worth a question.

2019×92020×2none×1← this property12 properties on this block. 11 pulled a roofing permit. This one did not.

Where it stops

What it will not tell you

Unpermitted work leaves no record. A roof replaced without a permit is invisible here, and always will be. Absence of a permit is not absence of work.

Not every jurisdiction reports. Where coverage is thin we say so on the response rather than returning a confident blank.

We do not guess a year. Where a property has no permit for a trade but does have a build date, that inference is returned separately and labelled, never merged into the measured year.

A tool that is wrong once in the expensive direction never gets opened again. Read the API reference for exactly what each field means, or the questions page, which answers these three properly and shows a full report on a real house.

Coverage stated, not implied

Denver, CO
Adams County
ADAMS COUNTY
little or no reporting
Roofing
?
not reported here
0 permits
HVAC
2012
issued · low
1 permit
Electrical
2024
completed · low
5 permits
Plumbing
?
not reported here
0 permits
DateTagsDescription
2024-11-08completedelectrical, telecomRemove 15 rrhs, 12 antennas, install 9 antennas, 1 bbu, 12 rrhs, relocates 1 antenna
2022-04-18issuedelectrical, telecomThe scope of work being proposed with this project includes the following details: rooftop work: • remove (2) existing antennas • replace with (6) c-band antennas • install (2) dc9 squids additional equipment changes will take place inside the enclosed equipment shelter with no additional shelter footprint.
2019-05-22issuedelectrical, telecomRemove & replace 6 new antennas, 2 per sector *remove and replace 6 remote radioheads (rrh), 2 per sector *remove 3 rrh's, 1 per sector
2016-03-16issuedtelecomComm- cell site

A real result, not a mock-up — address withheld. 8 permits on record. Open this report as a PDF — address absent from the file, not covered over.

What it does

Beyond one address at a time

A lookup is the start. The rest is what turns it from something you check into something that tells you what changed.

BuiltRun a whole list

Upload a CSV and get a table back, your own columns carried through. Nobody wants one roof age — they want to know which of eight hundred renewals are sitting on twenty-year-old roofs before somebody else notices.

Download a template, drop in your addresses, get a CSV with four dated answers per row.

BuiltCompare to the street

Unpermitted work is invisible to any permit product. The neighbours are the fix: when most of a block pulled a roofing permit the same year and one house did not, that silence is worth a question.

Every comparison states its denominator, so "3 of 22" never gets reported as "3".

BuiltWatch an address

A quote in flight, a claim in progress, a renewal in ninety days. A permit appearing means something changed at that property, and you find out when it lands rather than at renewal.

Webhook or dashboard. Only genuinely new permits notify — the existing ones are recorded at setup.

BuiltShare without an account

A signed, expiring link an underwriter, a client or a buyer can open. This work runs on forwarding documents to people who will never log in to your software.

Seven days by default, re-issuable, and the PDF renders from the stored data so it can never disagree with it.

BuiltWhich authority stands behind it

Every dated answer names the authority standing behind it and how far that authority has published. Where two records of the same trade disagree, the report prints both counts rather than quietly choosing one.

On the report, under the trade it belongs to. No owner or contractor name is stored, so none is reported.

NextWatch a whole book

Point it at every address you already service and let it tell you what changed. An addition that raised replacement cost against a limit that never moved is a liability sitting in your own file.

Existing customers, so no cold-contact problem and no new data to buy.

Integrations

It already works with what you use

No app to install and no SDK to wait for. One authenticated POST, from wherever your work already happens.

Zapier

Webhooks by Zapier → Custom Request. Nested fields flatten, so trades.roofing.year arrives as Trades Roofing Year.

POST  https://permity.valyaai.us
        /v1/permits/lookup
X-API-Key: $PERMITY_KEY
{"address": "{{address}}"}
Make

HTTP → Make a request, then a Router on status. The parsed body is a collection, so {{2.trades.roofing.year}} addresses it directly.

Method   POST
Body     Raw / JSON
Parse    Yes
Router   ok | ambiguous | else
Code

Anything that speaks HTTP. Signed webhooks, idempotency keys and a delivery log for when something goes wrong at 2am.

const r = await fetch(url, {
  method: "POST",
  headers: { "X-API-Key": key },
  body: JSON.stringify({ address }),
})

Capabilities

There is an API, and it is the same answer

Everything the screens do is one authenticated POST away. Built for the tools this work actually runs on — no proprietary app to install, no SDK to wait for.

  • One endpoint for a lookup. Address in, the full trade summary and permit history out.
  • Batch a CSV of addresses and get a table back, your own columns carried through.
  • Watch an address and get told when a new permit lands on it.
  • Signed PDF reports at an expiring URL, ready to forward to someone without an account.
  • Webhooks with an HMAC signature and a delivery log, so you can see every attempt.
  • Idempotency keys, because low-code tools retry and you should not pay twice.
  • Zapier and Make via a plain HTTP step — no app to install and nothing to break on their release cycle.
  • Honest status codes: a negative result is a 200, and a lapsed subscription is not an error.

Try it on a house you know

It is how everyone tests this, and the fastest way to find out whether it is worth anything to you.