Building Permits
curl --request POST \
--url https://win.oneshotagent.com/v1/tools/lookup/place-permitsimport requests
url = "https://win.oneshotagent.com/v1/tools/lookup/place-permits"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://win.oneshotagent.com/v1/tools/lookup/place-permits', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://win.oneshotagent.com/v1/tools/lookup/place-permits",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://win.oneshotagent.com/v1/tools/lookup/place-permits"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://win.oneshotagent.com/v1/tools/lookup/place-permits")
.asString();require 'uri'
require 'net/http'
url = URI("https://win.oneshotagent.com/v1/tools/lookup/place-permits")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodyResearch & Enrich
Building Permits
Look up recorded permits and contractor work at a covered US street address
POST
/
v1
/
tools
/
lookup
/
place-permits
Building Permits
curl --request POST \
--url https://win.oneshotagent.com/v1/tools/lookup/place-permitsimport requests
url = "https://win.oneshotagent.com/v1/tools/lookup/place-permits"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://win.oneshotagent.com/v1/tools/lookup/place-permits', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://win.oneshotagent.com/v1/tools/lookup/place-permits",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://win.oneshotagent.com/v1/tools/lookup/place-permits"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://win.oneshotagent.com/v1/tools/lookup/place-permits")
.asString();require 'uri'
require 'net/http'
url = URI("https://win.oneshotagent.com/v1/tools/lookup/place-permits")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodyReturns building permits from daily copies of public city records. Results normally return inline, with a request ID and receipt. Send an
For NYC, supply
Idempotency-Key to replay the saved answer without another charge. If payment confirmation is pending, 202 returns the request ID, receipt ID and key; retry with that same key while the original payment is confirmed.
Coverage starts with Chicago, Illinois and New York City’s five boroughs. NYC covers the legacy DOB permit issuance dataset, not DOB NOW. Chicago covers permits from 2006 onward and excludes permits voided or revoked after issuance. This is not nationwide coverage or a complete account of all work on a building.
await agent.tool('lookup/place-permits', {
street_address: '7529 N CLARK ST',
city: 'Chicago',
state: 'IL',
issued_from: '2024-01-01',
limit: 50,
});
city: 'New York City', state: 'NY', borough: 'Brooklyn', or use city: 'Brooklyn'. All five borough names are accepted. Supply only the site street address in street_address, including its number and directional prefix. Matching ignores case and repeated whitespace but does not geocode, expand street abbreviations, or strip apartment numbers. Use the source’s street spelling.
issued_from and issued_to are inclusive calendar dates (YYYY-MM-DD); permits without issue dates are excluded when either filter is present. permit_type matches the full source type, ignoring case. limit is 1–100 (default 50); offset is 0–10000 (default 0). Results sort newest issue date first, then source identifier, with undated permits last. total counts all matches before pagination. A refresh can change page contents between calls.
Each permit has number, address, district, permit_type, status, filed_date, issued_date, expiration_date, description, declared_value in USD, and contractors. Missing fields are null (or an empty contractor array). Declared value is reported construction cost, never permit fees. NYC does not publish description or declared value in this dataset. Status is the source’s recorded status; an expiration date does not establish current compliance. Contractors are published business names, excluding owner contact fields.
The result includes source, loaded_at (last successful load or unchanged-source check), and coverage. loaded_at is a check time, not the date of the permit or a claim that the city has updated every record.
An empty permits array means no exact recorded match within these sources and filters. It does not establish that no work occurred. A no-match call is charged.
Unsupported jurisdictions, an unspecified NYC borough, or conflicting city/borough inputs return 422 outside_coverage before payment. Invalid dates and other malformed inputs return 400 invalid_request. Missing data, an incomplete or failed refresh, or data not checked in 72 hours returns 503 data_unavailable. The answer, request and receipt are saved together before payment settles; a read or persistence failure aborts without charging. A keyed replay returns the saved answer even if source data later becomes unavailable.
The proposed price is $0.001 per call, pending owner confirmation before promotion.