US STR Permit Registry & Market Evidence avatar

US STR Permit Registry & Market Evidence

Pricing

from $2.40 / 1,000 results

Go to Apify Store
US STR Permit Registry & Market Evidence

US STR Permit Registry & Market Evidence

Check 1–25 addresses against complete official STR permit queries, export normalized records across 32 US jurisdictions, or reconcile rights-bound market observations. Includes source links, publisher and retrieval clocks, receipts, and opt-in change monitoring; not a legal determination.

Pricing

from $2.40 / 1,000 results

Rating

0.0

(0)

Developer

Bryan

Bryan

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

1

Monthly active users

3 days ago

Last modified

Share

STR Permit Registry — Reconciled Official Short-Term Rental Evidence

This Actor refines fragmented official government permit, licence, registration, eligibility, address, and parcel data into one source-bound record model. It preserves publisher semantics: an internal row or address identifier stays a source_record_id, never a fabricated permit_id. Complementary official rows are coalesced by stable identity, newest publisher evidence wins, older rows fill only empty fields, and disagreements remain visible conflicts. CivicDataForge differentiates on that custody trail, privacy stripping, honest nulls, complete-scope monitoring where supported, and hash-bound evidence and change receipts for compliance, property diligence, and enforcement research.

One address in, one source-bound answer out

Set outputMode to address_evidence, choose exactly one city, and provide 1-25 addresses. The Actor fetches the complete selected publisher query and returns one row per submitted address:

  • EVIDENCE_FOUND — exact normalized address match in the published source;
  • REVIEW_REQUIRED — invalid input or a plausible non-exact candidate that needs human review;
  • NO_PUBLISHED_MATCH — no exact match in the complete selected publisher query;
  • SCOPE_INCOMPLETE — reserved for bounded-file evaluations, never emitted as a complete-source negative.

Every decision includes the source, observation time, scope completeness, match basis, record fingerprints where present, and a deterministic decision_receipt_hash. A no-published-match result is not proof of illegality, ineligibility, or absence from every authority.

{
"outputMode": "address_evidence",
"cities": ["orlando"],
"addresses": ["1100 Briercliff Drive, Orlando, FL"]
}

Reconcile lawful market observations without importing a competitor

Set outputMode to market_evidence to join independently acquired official, openly licensed, customer-authorized, or contracted market observations to one complete official registry. CivicDataForge does not promote a listing claim into a government permit: the output labels exact permit claims, exact-address evidence, conflicts, ambiguous identities, coordinate-only discovery candidates, and honest no-match results separately.

Every market source must carry a source-rights receipt recording its acquisition method, evidence URL, review clock, and an allowed commercial-use and redistribution basis. review_required and not_allowed fail closed before any customer row is emitted. Host names, owner names, email addresses, phone numbers, payout data, guest data, and messages are rejected at any input depth. URLs containing embedded credentials or secret-bearing query parameters are also rejected instead of being copied into receipts. Google or another search engine may help find an official publisher, but the production source URL and rights evidence must point to the actual publisher or authorized provider.

{
"outputMode": "market_evidence",
"cities": ["orlando"],
"marketSources": [{
"source_id": "customer-pms-export",
"publisher": "Customer-authorized property management system",
"source_url": "https://customer.example/export",
"access_method": "customer_authorized",
"observed_at": "2026-08-25T12:00:00.000Z",
"rights": {
"commercial_use": "allowed",
"redistribution": "allowed",
"basis": "The customer authorized processing and return of its portfolio records.",
"evidence_url": "https://customer.example/authorization",
"reviewed_at": "2026-08-25T12:00:00.000Z",
"asserted_by": "customer"
},
"observations": [{
"reference_id": "property-1",
"platform": "customer-pms",
"listing_id": "listing-1",
"claimed_permit_id": "STR-1118212",
"address": "120 E Hazel Street, Orlando, FL",
"address_precision": "exact",
"observed_at": "2026-08-25T12:00:00.000Z"
}]
}]
}

The Actor fetches the complete selected official registry itself. It accepts the market observations as a rights-bound packet, returns one reconciliation row per observation, and writes a hashed MARKET-EVIDENCE-MANIFEST. Approximate addresses never participate in automatic address matching, and coordinates within 100 metres remain review candidates rather than proof.

55 sources live, all data-layer verified + freshness-gated (updated 2026):

CityStatusCompany operatorExpirationParcel
Seattle, WA✅—✅—
Orlando, FL✅✅✅✅
New Orleans, LA✅✅✅✅
Denver, CO✅—✅✅
Chicago, IL✅✅✅—
Marin County, CA✅✅—✅
Norfolk, VA——✅✅
Nashville, TN✅✅✅✅
Osceola County, FL✅✅✅—
Polk County, FL✅✅✅✅
Austin, TX✅———
Houston, TX✅—✅✅
Sacramento, CA✅✅✅✅
San Bernardino County, CA✅✅✅✅
Bend, OR—✅—✅
Aspen, CO—✅—✅
Philadelphia, PA✅✅✅✅
Albuquerque, NM✅✅✅—
Asheville, NC✅✅—✅
Louisville, KY—✅——
Arlington, TX✅✅—✅
San Diego, CA—✅✅—
Scottsdale, AZ—✅✅✅
Huntington Beach, CA——✅✅
Coconino County, AZ—✅—✅
San Juan County, WA✅✅—✅
Chattanooga, TN✅—✅✅
Boston, MA✅——✅
Las Vegas, NV✅✅✅✅
Kansas City, MO✅—✅✅
Washington, DC✅—✅✅
Honolulu, HI✅—✅✅
Honolulu, HI (approved NUCs)✅—✅✅
Big Bear Lake, CA✅✅✅✅
Clear Creek County, CO✅✅✅✅
Corpus Christi, TX✅✅✅—
Cambridge, MA✅——✅
Columbus, GA✅—✅—
Cook County, MN✅✅—✅
Little Rock, AR✅✅——
Cody, WY✅✅——
Green Bay, WI—✅—✅
Key West, FL✅✅—✅
Covington, KY✅✅—✅
Shreveport, LA✅———
North Las Vegas, NV—✅—✅
Summit County, CO✅——✅
Breckenridge, CO✅——✅
Placer County, CA✅—✅✅
Belton, TX————
Bedford, TX——✅—
Baldwin County, GA✅——✅
Ruidoso, NM——✅—
Long Lake Township, MI————
South Haven, MI✅———

Field coverage reflects exactly what each city publishes, never faked; a blank always carries its reason in field_gaps. Company operator shows a business name only: a person's name is never shown. Parcel includes numbers read from the official county or city parcel map at the rental's point (parcel_source says which).

What you get (unified schema)

fieldexample
permit_idSTR-1118212
source_record_idstable publisher row identity when no public permit number exists
record_kindpublisher-semantic type: permit, licence, eligibility, business licence, or NUC certificate
identifier_kinddistinguishes a real permit/licence number from a source-record identity
statusActive / Inactive / License Issued - Active / Closed
address120 E HAZEL ST, Orlando, FL
owner_or_operatorSunny Stays LLC (a business name only; a person's name is never shown)
parcel0510235019000 (Denver)
property_typeShort Term Rental / Single Family Home
expiration_date2026-08-25
issued_date2025-05-23 (where published)
city / stateOrlando / FL
source_urlthe city open-data endpoint the record came from
evidence_sourcesevery official source that contributed to the reconciled record
field_provenancesource responsible for each normalized field
reconciliation_conflictsdisagreements retained for review, never silently overwritten
source_updated_atpublisher clock where the transport exposes one
source_content_sha256exact content digest for file-based sources
rawthe city's original record, minus personal phone, email, people's names and owners' mailing addresses
parcel_sourcewhere a parcel number we added came from, e.g. gis2.arlingtontx.gov:TaxPIN (blank when the city published it)
field_gapswhy each blank column is blank, e.g. {"expiration_date": "not_published_by_source"}
field_noteswhat a value means when it is not the obvious thing, e.g. Norfolk's expiration_date is a renewal-due date

Every run also writes OUTPUT.xlsx and OUTPUT.csv to the run's key-value store: one row per permit, the same columns in the same order for every city, dates as YYYY-MM-DD, blanks explained in plain words, raw left out. The workbook has an "About these columns" tab, a "Cities" tab with fill rates per source, and a "Status words" tab showing how each city's own status word was read (active, expired, pending, closed or unknown).

Records are ordered so current/active permits surface first, and you can filter to active-only.

Who uses this

  • STR analytics & data platforms — join permit legality onto listing data.
  • Compliance vendors & municipalities — enforcement-side address/parcel matching.
  • Property diligence teams — verify whether a property's rental permit is published as active.
  • Researchers and market analysts — study licensed supply and permit-status changes.

Match a property portfolio

Need permit evidence for a list of properties instead of a whole-city export? Start with the CivicDataForge Permit Match Audit. One accepted proof-of-fit matches up to 25 submitted addresses in one supported jurisdiction for $99. The delivered evidence bundle separates exact published matches, human-review candidates, invalid input, and honest no-match findings; it also retains official source links, record fingerprints, and a hash-bound manifest.

The founding 30-day monitoring pilot is $500 for one supported jurisdiction and up to 500 submitted addresses, with a complete baseline, one scheduled comparison, change rows, integrity quarantine, and one buyer-selected handoff design. The $99 audit is credited toward an accepted $500 pilot. A no-match is never presented as proof that a property is illegal or ineligible.

Input

{ "cities": ["orlando"], "status": "active", "maxRecordsPerCity": 25, "snapshot": false }

That bounded example is the safest first run. It returns useful records quickly and writes hashed RUN-RECEIPT and CHANGE-RECEIPT objects alongside the dataset. The run receipt states that the coverage is bounded; it never presents a capped pull as a complete registry.

Complete change monitoring

Monitoring is deliberately stricter than an ordinary lookup. It is opt-in, is stored in a named key-value store inside the calling Apify account, and accepts only complete selected-city pulls:

{
"cities": ["orlando"],
"status": "all",
"maxRecordsPerCity": null,
"resolveJurisdiction": true,
"snapshot": true
}

Run that exact input on a schedule. The first healthy run creates a version-3 baseline. Later runs compare only with a baseline having the same city, status filter, and jurisdiction-resolution setting. A published permit+unit pair remains stable across address corrections. When a publisher reuses one group licence across multiple properties without unit IDs, address remains part of identity so valid properties are not merged. Intraday runs have append-only timestamped keys and cannot overwrite one another.

The change receipt reports appeared, disappeared, status-changed, and other tracked-field changes. Each accepted comparison also stores the complete machine-readable before/after change rows behind the full_changes_key in the receipt. Count collapse, empty results, field loss, or publisher-schema drift quarantines the candidate snapshot: its diagnostic receipt is retained, but it cannot replace the last healthy baseline or become a confirmed customer change feed.

If snapshot is true while maxRecordsPerCity is set, the run fails before fetching data. This is an intentional integrity gate: a capped page is not evidence that records outside the page disappeared. Changing active to all creates a separate baseline instead of producing a false diff.

At pay-per-result pricing, complete pulls can cost materially more than the 25-row example. Start with one jurisdiction, inspect its complete record count and cost, and set an Apify spending limit before scheduling. The limit must cover every record in the selected complete pull. If Apify exposes a paid-dataset ceiling that is lower than the fetched record count, snapshot monitoring fails before storing a new baseline or receipt instead of labeling a platform-truncated dataset complete.

Receipts and automation

  • RUN-RECEIPT binds the selected cities, filters, coverage, counts, monitoring state, and change-receipt hash.
  • CHANGE-RECEIPT says disabled, complete_baseline_created, compared_with_prior_complete_snapshot, integrity_quarantined, or completed_with_quarantined_scopes; it carries summaries plus the keys and hashes of full changes.
  • The named str-registry-history-v3 store retains append-only snapshots, full before/after change rows, and quarantined candidates. Version-2 history is left intact rather than silently reinterpreted.
  • Each receipt contains a canonical SHA-256 so downstream systems can detect alteration.
  • Use Apify schedules for recurrence and webhooks to route the receipt into Slack, email, a database, or a review queue.

Customer-owned case workflow

Address-evidence mode can also set caseWorkflow to true. The Actor then writes a portable CASE-BUNDLE with one case per caller reference. Each case binds the current decision receipt to a hashed subject reference and a hash-chained human-disposition history; the case file does not store the submitted address. Customers retain the bundle in their own system and return applicable priorCases on the next run, avoiding a shared developer-owned property watchlist.

caseActions use optimistic locking and require a reviewer reference, reason, timestamp, expected version, and expected case receipt. Forged or stale writes fail closed. A changed official-source decision automatically reopens a resolved case, preserving the earlier disposition and the complete transition chain instead of silently overwriting it.

Optional webhookUrl and secret webhookSecret inputs deliver the exact bundle to a public HTTPS endpoint using one stable idempotency key, HMAC-SHA256 signing, and up to three attempts. Internal or IP-literal targets, redirects, embedded credentials, and non-HTTPS endpoints are rejected. The redacted WEBHOOK-DELIVERY receipt distinguishes downstream acceptance from transport failure.

The workflow records evidence and human handling; it does not send enforcement letters, collect tax, decide illegality, or replace municipal due process.

Getting the data

Download a run's results as JSON, CSV, Excel or XML from the run's dataset, or fetch them through the Apify API. Connect them to other tools with Apify integrations, and get notified when a run finishes with Apify webhooks. Every run also writes a ready-to-open OUTPUT.xlsx and OUTPUT.csv to its key-value store.

Source & legality

Data comes from official city and county open-data portals and GIS layers, accessed logged-out. Each run reads every city's list live. Each row shows when the city last changed its list (source_updated_at, where the city exposes it) and when we read it (last_verified_at). Personal contact fields (phone, email) and the owner's mailing address are stripped from output, including raw. owner_or_operator shows a business name only; where the city lists a person, the field is blank and field_gaps says "person's name not shown".

This product is not a consumer report and must not be used to determine an individual's eligibility for credit, insurance, employment, or housing. Hilton Head and Beaufort are not included in this version.