Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.permitcore.io/llms.txt

Use this file to discover all available pages before exploring further.

PermitCore refreshes permit data daily from each metro’s open-data portal. Cohort classification, DQ flagging, and parcel join happen in the same nightly pipeline.

Refresh cadence

  • Source pull: every metro’s open-data portal is pulled once per 24 hours, scheduled per metro to land before 02:00 local time.
  • Cohort classify + DQ flag: runs immediately after each source pull. Adds ~15 minutes per metro for the classifier pass.
  • Site + API publish: updated rows land in the API by 02:30 local time per metro. The cohort distribution endpoint caches 1 hour (Cache-Control: max-age=3600).

The as_of_utc field

Every API response that returns aggregated state includes an as_of_utc timestamp marking when the underlying data was last computed:
{
  "jurisdiction_slug": "nyc",
  "as_of_utc": "2026-05-24T02:00:00Z",
  ...
}
Use this to detect stale cached responses, drive your own UI freshness indicators, and reconcile multi-source pipelines.

ISR caching on the site

The PermitCore site (permitcore.io) consumes the same cohort distribution endpoint via Next.js ISR with revalidate: 3600. So the site’s cohort breakdowns lag the underlying data by at most 1 hour beyond the upstream pipeline’s own latency. For real-time-critical use cases (e.g., webhook-driven CRM lead loading), use the future /v1/permits endpoint directly + the webhook stream shipping in Bucket 2+.

Field-level data-quality flags

Every permit row carries up to 12 data-quality flags surfaced per field. These tell you which fields are measured vs inferred vs placeholder:
FlagMeaning
val_zeroValuation column is 0; treat as missing not as $0
val_missingValuation absent from source data
roof_estimatedRoof area estimated via parcel join; not measured
roof_missingRoof area unavailable
addr_unmatchedAddress didn’t match the parcel layer; geometry absent
type_ambiguousPermit type couldn’t be cleanly classified to one cohort
…and 6 more (see /v1/permits reference, shipping ~3 weeks)
DQ flags appear in permit-listing responses (future) but NOT in the cohort distribution endpoint, which is aggregate-only.

How freshness interacts with your billing

Tier-aware quotas reset on the first of each month UTC. Your usage counters update in near-real-time on cache invalidation (typically within 10 seconds of a successful request). See Rate limits → for current tier quotas.