curl --request GET \
--url https://api.homelogs.io/v1/signals/permit/stats \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.homelogs.io/v1/signals/permit/stats"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.homelogs.io/v1/signals/permit/stats', 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://api.homelogs.io/v1/signals/permit/stats",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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://api.homelogs.io/v1/signals/permit/stats"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.homelogs.io/v1/signals/permit/stats")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.homelogs.io/v1/signals/permit/stats")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"geo_id": "<string>",
"geo_type": "jurisdiction",
"scope": "permit",
"signal_keys": [
"<string>"
],
"max_freshness_days": 1825,
"total_active_leads": 1,
"signals_breakdown": [
{
"signal_key": "<string>",
"count": 1
}
],
"top_counties": [
{
"value": "<string>",
"count": 1
}
],
"top_cities": [
{
"value": "<string>",
"count": 1
}
],
"top_zips": [
{
"value": "<string>",
"count": 1
}
],
"confidence_distribution": {
"high": 1,
"medium": 1,
"low": 1
},
"freshness_distribution": {
"0_7": 1,
"8_14": 1,
"15_30": 1,
"31_plus": 1
}
}{
"message": "<string>"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "state must be a 2-letter code",
"request_id": "req-123"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "state must be a 2-letter code",
"request_id": "req-123"
}
}{
"message": "<string>"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "state must be a 2-letter code",
"request_id": "req-123"
}
}Permit Signal Stats
Fetch permit-scoped signal aggregates for a geo_id
curl --request GET \
--url https://api.homelogs.io/v1/signals/permit/stats \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.homelogs.io/v1/signals/permit/stats"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.homelogs.io/v1/signals/permit/stats', 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://api.homelogs.io/v1/signals/permit/stats",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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://api.homelogs.io/v1/signals/permit/stats"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.homelogs.io/v1/signals/permit/stats")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.homelogs.io/v1/signals/permit/stats")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"geo_id": "<string>",
"geo_type": "jurisdiction",
"scope": "permit",
"signal_keys": [
"<string>"
],
"max_freshness_days": 1825,
"total_active_leads": 1,
"signals_breakdown": [
{
"signal_key": "<string>",
"count": 1
}
],
"top_counties": [
{
"value": "<string>",
"count": 1
}
],
"top_cities": [
{
"value": "<string>",
"count": 1
}
],
"top_zips": [
{
"value": "<string>",
"count": 1
}
],
"confidence_distribution": {
"high": 1,
"medium": 1,
"low": 1
},
"freshness_distribution": {
"0_7": 1,
"8_14": 1,
"15_30": 1,
"31_plus": 1
}
}{
"message": "<string>"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "state must be a 2-letter code",
"request_id": "req-123"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "state must be a 2-letter code",
"request_id": "req-123"
}
}{
"message": "<string>"
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "state must be a 2-letter code",
"request_id": "req-123"
}
}geo_id.
It returns counts and distributions for selected permit signals, plus the effective freshness window used for the calculation.
Use this endpoint for monitoring and dashboard rollups; use Permit Signal Leads for actionable row-level leads.
Supported permit-pack keys are documented in Signals Catalog.
See also Permit Signal Leads.
Required input
geo_id(query, required, non-property geo)
Optional input
signal_keys(CSV list)from_date,to_date(YYYY-MM-DD)min_confidence(0..1)max_freshness_days(1..3650)include_stale(true|false)
Example request
curl -sS "$API_BASE_URL/v1/signals/permit/stats?geo_id=geo_county_6973f63e37a900040c0d&signal_keys=site_prep_issued_nowcast,new_construction_issued_nowcast&max_freshness_days=60" \
-H "x-api-key: $HOMELOGS_API_KEY"
Response shape
geo_id,geo_type,scope=permitsignal_keys[]max_freshness_daystotal_active_leadssignals_breakdown[]top_counties[],top_cities[],top_zips[]confidence_distributionfreshness_distribution
Authorizations
Query Parameters
Location identity token for a non-property geo scope.
"geo_county_6973f63e37a900040c0d"
Optional CSV list of customer-facing permit signal keys. Allowed values: site_prep_issued_nowcast, new_construction_issued_nowcast, framing_nowcast_early, framing_window_late, rough_in_nowcast_early, rough_in_window_late.
"framing_nowcast_early,rough_in_nowcast_early"
Optional lower bound in YYYY-MM-DD format.
Optional upper bound in YYYY-MM-DD format.
Optional minimum confidence between 0 and 1.
0 <= x <= 1Optional freshness window in days, between 1 and 3650. Defaults to 60 when include_stale is false.
1 <= x <= 3650When true, disables the default freshness filter.
Response
Permit-scoped aggregates and distributions.
jurisdiction, city, zip, county, state, null permit 1 <= x <= 3650x >= 0Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?

