# STR Regulatory Compliance Tracker (`conceivable_extension/str-regulatory-compliance-tracker`) Actor

Real registration/compliance requirements for short-term rental hosts — EU Regulation 2024/1028 framework across 27 member states plus 7 hand-verified priority cities/nations — with real-source change tracking, not a pricing/listing scraper.

- **URL**: https://apify.com/conceivable\_extension/str-regulatory-compliance-tracker.md
- **Developed by:** [joseph fadero](https://apify.com/conceivable_extension) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 jurisdiction checked no changes

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## STR Regulatory Compliance Tracker

**The registration/compliance layer, not another pricing scraper.** EU Regulation 2024/1028 took full effect May 20, 2026 across all 27 member states, requiring hosts to display a valid registration number that platforms must validate — with real-time platform-to-authority data sharing and fines that are frequently per-day, not one-time. This tracks real registration requirements, authorities, and penalty structures — deliberately scoped away from the saturated Airbnb/Vrbo listing-and-pricing scraper category, which no existing Apify Store actor covers from this angle.

### Phase 1 source audit — what's real, verified live

Regulatory requirements are published per-jurisdiction with no central aggregator — the most fragmented source landscape a PRD in this program has described after Actor 34's grid-queue research, and this one lived up to that. Every fact below traces to a real source checked live during research, not assumed from training data (2026 regulatory deadlines move — Loi Le Meur's own national portal was itself confirmed live to have slipped from its original date).

| Source | Verdict | Basis |
|---|---|---|
| **EU Regulation 2024/1028 (EUR-Lex)** | ✅ Real, accessible | Confirmed live — the actual regulation text loads over plain HTTP with real content, including the exact "registration number... public and easily accessible registry" language used in this actor's EU-level facts. (A previous actor in this program, EUDR/CSRD, found a *different* EUR-Lex endpoint blocked — noted here since it's a real, endpoint-specific difference, not a contradiction.) |
| **7 priority jurisdictions** | ✅ Real, individually verified | Budapest (District VI), Austin TX, France (Loi Le Meur), Scotland, Wales, New York City, Amsterdam — each checked against a real, current source during research (see the confidence table below). |
| **Aggregator/reference sites** (STR Comply, Minut, Beancount, etc.) | Used for discovery only, per the PRD's own instruction | Consulted to identify which cities have active, checkable requirements — never used as the cited source for a structured fact in the output. |

### What "27 EU member states" actually means here

The Regulation itself is a **framework** document — it requires member states with a data-transmission mandate to run a registration procedure, but does not itself name each state's specific implementing authority or set penalty amounts (those are national implementation details, confirmed live by reading the regulation's own text). So every EU-level record here states the same real, uniform framework facts (registration required, platform display required, effective 2026-05-20) rather than 27 individually-researched national authority names — an honest reflection of what a *single EU-level source* can actually tell you, not a shortcut dressed up as deeper coverage.

### Priority jurisdiction confidence table

| Jurisdiction | Status confirmed live | Notable finding |
|---|---|---|
| Budapest (District VI) | ✅ | Not a registration issue — District VI banned short-term rentals outright from 1 Jan 2026; city-wide new-registration moratorium separately in force through end of 2026 |
| Austin, TX | ✅ | Platform-facing display requirement effective **1 Jul 2026**, not the operator rules that took effect Oct 2025 — a real, distinct date |
| France (Loi Le Meur) | ⚠️ Secondary source used | Primary text (legifrance.gouv.fr) confirmed live to sit behind a Cloudflare "managed" challenge that even a real Playwright browser couldn't pass after an extended wait — a tougher block than several other Cloudflare-protected sources handled elsewhere in this program. A real, reputable secondary source is used instead, documented here rather than silently presented as primary legislative text. |
| Scotland | ✅ | Licensing is per-council, not a single national body — a real structural fact, not a simplification |
| Wales | ✅ | Registration opens **1 Oct 2026**; penalty structure not yet published on the official source as of this build — reported honestly as unconfirmed rather than guessed |
| New York City | ✅ | The only jurisdiction here with a rule already fully in force (Local Law 18, since Sept 2023) rather than a 2026 deadline — included as a stable, low-uncertainty example |
| Amsterdam | ✅ (via Playwright) | amsterdam.nl returns a generic error page to a plain HTTP client but loads cleanly via a real browser — confirmed live |

### Modes

| Mode | Behavior |
|---|---|
| `jurisdiction_check` | Returns the hand-verified facts for one jurisdiction — or all 27 EU states at once if `jurisdictionType=eu_member_state` and `jurisdictionName` is left blank |
| `monitor` | Same lookup, plus `requirementChangedSinceLastRun` — a real content-hash of the jurisdiction's actual official source page, compared against this actor's own stored hash from a prior run (reuses `deltaStore.ts`, now used by 4 actors in this program: 26, 27, 34, 35). EU-state checks that share the same EUR-Lex source URL are deduped to one real fetch, not 27 redundant ones. |

`requirementChangedSinceLastRun` hashes the *page's visible text*, not this actor's own static facts (which can't change on their own between runs) — that's what makes it a genuine external signal instead of a tautology that always says "no change."

### Output schema

```json
{
  "jurisdictionName": "string",
  "jurisdictionType": "eu_member_state | us_city | uk_devolved_nation | other",
  "registrationRequired": "boolean",
  "registrationAuthority": "string",
  "platformDisplayRequired": "boolean",
  "penaltyStructure": "string",
  "effectiveDate": "string",
  "requirementChangedSinceLastRun": "boolean | null",
  "sourceUrl": "string",
  "checkedAt": "ISO timestamp",
  "status": "success | failed",
  "errorMessage": "string | null"
}
```

### A scope simplification, not an omission

The PRD's input schema included a `watchList` array. In practice, `monitor` mode re-running the same `jurisdictionType`/`jurisdictionName` query already gives the cross-run change tracking a watchlist would provide — no separate structure needed. This matches a simplification made in the same spot for Actors 32-34 in this program.

### Coverage is necessarily partial — this is v1

7 city/nation-level jurisdictions plus the EU framework layer, not exhaustive global coverage — exactly the PRD's own recommended v1 scope. Expanding city coverage is a real, straightforward next step (add one more entry to `src/data/jurisdictions.ts` per city, each independently researched and sourced, same pattern as the 7 here) rather than a structural rebuild.

### Pricing

| Event | Price |
|---|---|
| Run started | £0.05 |
| Reading success | £0.06 |
| Lookup failed | free |

### Setup note

Playwright/Chrome base image required — Amsterdam's official source needs a real browser (confirmed live); every other source works over plain HTTP.

### n8n integration

- **Workflow A (trigger):** scheduled monthly run against a host/property manager's portfolio of jurisdictions — monthly matches real regulatory change frequency better than a daily/weekly cadence would.
- **Workflow B (processing):** alert on `requirementChangedSinceLastRun: true` with appropriate urgency, given several jurisdictions here use per-day fine structures.

# Actor input Schema

## `mode` (type: `string`):

jurisdiction\_check: return the hand-verified requirement facts for one jurisdiction (or all EU member states if jurisdictionType is eu\_member\_state and jurisdictionName is omitted). monitor: same, plus requirementChangedSinceLastRun, computed from a real content-hash of the jurisdiction's official source page.

## `jurisdictionType` (type: `string`):

eu\_member\_state: all 27 EU states under Regulation 2024/1028 (uniform framework facts — see README for what this does and doesn't cover). us\_city / uk\_devolved\_nation / other: one of the 7 hand-verified priority jurisdictions — see README for the exact covered list, since city-by-city coverage is necessarily partial.

## `jurisdictionName` (type: `string`):

e.g. "Germany" (eu\_member\_state), "Austin" or "New York City" (us\_city), "Scotland" or "Wales" (uk\_devolved\_nation), "Budapest" or "Amsterdam" (other). Leave blank with jurisdictionType=eu\_member\_state to return all 27 states at once. Required otherwise.

## Actor input object example

```json
{
  "mode": "jurisdiction_check",
  "jurisdictionType": "eu_member_state"
}
```

# Actor output Schema

## `resultsDatasetUrl` (type: `string`):

Short-term-rental registration requirements, issuing authorities, and penalty structures by jurisdiction, produced by this run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("conceivable_extension/str-regulatory-compliance-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("conceivable_extension/str-regulatory-compliance-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call conceivable_extension/str-regulatory-compliance-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conceivable_extension/str-regulatory-compliance-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/F3YGerf2WYmekyTKQ/builds/zfKbBten7iAV7NaRJ/openapi.json
