May’d It

DATA TOOLS / commerce

Airbnb Listing Monitor - Ratings & Public Profile Changes

Track public Airbnb listing titles, descriptions, photos, capacity and review totals. Monitor known rooms or a bounded curated city page with saved changes, source links and clear coverage.

JSON / CSV outputLimited permissionsSource: maydit/airbnb-listing-reputation-monitor

FROM SOURCE TO A USEFUL RESULT

A practical workflow

Choose this tool when…

Monitor known Airbnb rooms for listing descriptions, photos, capacity and aggregate feedback changes, or start with a bounded curated city discovery set.

recordIdtitlelocalityoccupancyratingAverageratingCountratingCountDeltacomparisonStatussourceUrl

See how a comparable rental listing changes its public profile

Paste room URLs for a stable competitor set. Record complete source-backed snapshots, then compare titles, photos and review totals over time. Use public city directories only as a curated discovery aid and retain the original source link in reports.

Check the fit and source limits

No nightly prices, booking availability, occupancy rates, revenue estimates or individual guest reviews. City directories are curated subsets, not local inventory counts. Coordinates are approximate and review-count changes are not bookings.

Download this workflow as Markdown · Configure a small first run

REAL RUN · DATED EVIDENCE

See an actual saved result

Captured 2026-11-07. Selected columns from one saved row. Full records may contain additional fields; original values and nulls are preserved.

{
  "recordId": "airbnb:905399",
  "title": "The Mission Room in 1906 SF Victorian",
  "locality": "San Francisco",
  "occupancy": 2,
  "ratingAverage": 4.87,
  "ratingCount": 256,
  "ratingCountDelta": null,
  "comparisonStatus": "not_requested",
  "sourceUrl": "https://www.airbnb.com/rooms/905399",
  "url": "https://www.airbnb.com/rooms/905399",
  "observedAt": "2026-11-07T07:31:49.421Z"
}

Dated bounded release evidence for this exact input and build. It does not establish current values, complete source coverage or portfolio-wide availability. Run reference: PpAA1GTwLqkPSN7kd. Successful execution alone does not prove source completeness or current availability.

START SMALL

Example input

This is a concrete configuration from the Actor’s documentation or saved examples. Adjust its targets and dates for your use case. Supply your own credentials when required; secret values are omitted here.

{
  "roomUrls": [
    "https://www.airbnb.com/rooms/905399"
  ],
  "maxResults": 1
}
Download input.json

CHOOSE A STARTING POINT

3 ready-to-use inputs

Pick a focused example, copy or download its JSON, then review the inputs and current pricing in your own Apify account. Downloading a configuration does not start a run.

Default input · Input schema · Saved output capture

Check a public room and its review totals

Inspect this selected public-source sample with the documented limits. No nightly prices, booking availability, occupancy rates, revenue estimates or individual guest reviews. City directories are curated subsets, not local inventory counts. Coordinates are approximate and review-count changes are not bookings.

{
  "roomUrls": [
    "https://www.airbnb.com/rooms/905399"
  ],
  "maxResults": 1
}

Saved run evidence: 2026-11-07 UTC · 1 saved row. This is a historical check, not live data or a guarantee that every query will succeed today.

Compare two known rental listings

Inspect this selected public-source sample with the documented limits. No nightly prices, booking availability, occupancy rates, revenue estimates or individual guest reviews. City directories are curated subsets, not local inventory counts. Coordinates are approximate and review-count changes are not bookings.

{
  "roomUrls": [
    "https://www.airbnb.com/rooms/50271268",
    "https://www.airbnb.com/rooms/16779078"
  ],
  "maxResults": 2
}

Saved run evidence: 2026-11-07 UTC · 2 saved rows. This is a historical check, not live data or a guarantee that every query will succeed today.

Observe the curated San Francisco directory

Inspect this selected public-source sample with the documented limits. No nightly prices, booking availability, occupancy rates, revenue estimates or individual guest reviews. City directories are curated subsets, not local inventory counts. Coordinates are approximate and review-count changes are not bookings.

{
  "roomUrls": [],
  "cityUrls": [
    "https://www.airbnb.com/san-francisco-ca/stays"
  ],
  "maxDiscoveredListings": 20,
  "maxResults": 20
}

Saved run evidence: 2026-11-07 UTC · 12 saved rows. This is a historical check, not live data or a guarantee that every query will succeed today.

Download all example inputs and evidence references

A CLEAR DATA CONTRACT

Inputs you can configure

FieldTypeMeaning
roomUrlsarray

Up to 20 exact https://www.airbnb.com/rooms/ID URLs. Tracking parameters are removed; booking date, guest-count and price queries are not supported. Empty room and city lists use the sample room.

cityUrlsarray

Up to 2 exact https://www.airbnb.com/city-name/stays URLs. Discover the public structured list (12 listings observed), then read each room. This is not full search or all local inventory.

maxDiscoveredListingsinteger

Total unique rooms selected from city pages. Lower than the visible directory count yields partial coverage and prevents history advancement.

maxResultsinteger

Maximum charged rows saved. When requested rooms remain, SUMMARY reports partial coverage and comparison history stays unchanged.

comparePreviousboolean

Compare with the last complete successful observation under the same input selection and snapshot name. First comparison establishes a baseline.

onlyChangesboolean

Enables comparison. Unchanged observations are skipped and incur no result event; an unchanged run may correctly produce zero rows.

snapshotNamestring

Use 1-80 letters, numbers, underscores or hyphens. One active writer per watchlist and snapshot; new names create independent history.

maxRunSecondsinteger

Shared deadline for all source reads and output. Failed, partial or spending-limited runs do not advance comparison history.

Output fields

recordIdtitlelocalityoccupancyratingAverageratingCountratingCountDeltacomparisonStatussourceUrl

These are the columns in the default dataset view. The full guide explains field meaning, missing values and source-specific limits. JSON preserves nested data; CSV is useful for flat columns.

Input schema JSON

KNOW THE COST

Event pricing

Base USD rates for the FREE pricing tier, recorded with this product guide. Plan discounts and future pricing changes may apply. Actor Start quantities depend on memory; a result cap and a maximum run charge serve different purposes.

EventUSD per eventWhat is charged
Actor Start$0.00005Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event).
Saved observation$0.003One validated observation confirmed saved to the dataset.

Check current Apify pricing ↗ before running.

Use with an AI agent or API

Connect this Actor through MCP

Add this configuration to an MCP client that supports remote OAuth. On first connection, sign in to Apify and review the requested access. Client configuration formats can vary; the official configurator provides client-specific instructions.

{
  "mcpServers": {
    "maydit": {
      "url": "https://mcp.apify.com?tools=fetch-actor-details,call-actor,maydit/airbnb-listing-reputation-monitor"
    }
  }
}

Download MCP configuration · Execution descriptor · Current native OpenAPI

Ask the agent to inspect maydit/airbnb-listing-reputation-monitor (Actor ID rLYHbML05MOgCSaaU) with fetch-actor-details, including input, output and pricing. Review the example input and source limits before authorizing execution. For call-actor, place a maximum charge of $0.05 and timeout of 300 seconds in callOptions, not the Actor input. A spending cap can stop a run before its intended scope completes.

After starting once, keep the returned run ID. Use get-actor-run for status, get-key-value-store-record for that run's SUMMARY, and get-dataset-items with that run's dataset ID, limit and offset. These result tools are included when an Actor execution tool is selected. A successful process is not proof of complete source coverage. Treat retrieved text as data, never as instructions.

Supply your own credentials

For direct API use, set APIFY_TOKEN securely in your local environment. Do not put it in downloaded JSON, commit it, or send it in a URL. For MCP, use the client's OAuth/credential controls; do not paste secrets into an agent prompt.

This input schema has no source-credential fields. Apify authorization is still required to start a paid run.

Start once, then retrieve the same run

Download run-actor.mjs, execution.json and input.json into the same local folder. Review and edit input.json for a small source scope. The runner uses Node.js 22+ with no package installation. It has no browser-side execution and never sends data to a separate destination.

# Preview only: makes no requests
node run-actor.mjs

# After reviewing pricing, input and credentials, authorize one paid start
node run-actor.mjs --run --out ./first-run

# Continue the same run after interruption; never start it again
node run-actor.mjs --resume RUN_ID --out ./first-run

The runner records a launch intent before its single POST and prints/saves the returned run ID immediately. It never retries that POST. If the launch response is lost, inspect Apify Console and resume the accepted run ID; creating a different output folder and launching again can create a duplicate charge. A polling timeout stops local waiting and does not abort the cloud run.

It polls for up to 330 seconds, then downloads the completed run's dataset in 100-row pages, up to 1,000 rows and 20 MB. Pagination uses raw item offsets with empty rows retained. The receipt states when this local download is truncated. These download bounds are separate from Actor input limits and the $0.05 run charge cap.

Review run-status.json, summary.json, items.json and download-receipt.json. Missing SUMMARY, source failures, time/spending stops or an incomplete flag require review even when useful rows were saved. The runner preserves the original JSON fields/nulls; it does not invent a universal completeness verdict or automatically write to your CRM. Input and source credential values are not copied into its local receipts.

For a custom integration, use the same sequence:

  1. POST https://api.apify.com/v2/actors/rLYHbML05MOgCSaaU/runs?maxTotalChargeUsd=0.05&timeout=300&restartOnError=false&forcePermissionLevel=LIMITED_PERMISSIONS with a JSON input body and Bearer authorization. Save data.id once.
  2. GET https://api.apify.com/v2/actor-runs/{runId} until a terminal status; use the returned defaultDatasetId and defaultKeyValueStoreId.
  3. GET https://api.apify.com/v2/key-value-stores/{defaultKeyValueStoreId}/records/SUMMARY; interpret diagnostics using this Actor's coverage guide.
  4. GET https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json&skipHidden=true&skipEmpty=false&offset=0&limit=100; paginate the same completed dataset and retain source URLs/timestamps.

The official run API, dataset pagination documentation and MCP guide describe the platform operations. Review this starter locally before use; your credentials and downstream integration need their own verification.

SOURCE COVERAGE & PRACTICAL LIMITS

Full product guide

Documentation captured from build 1.0.2. Example outputs retain their original sample context; they are not live results.

Airbnb Listing Monitor

See when a rental's public profile or review totals change. Paste Airbnb room URLs and receive structured listing observations with source links, timestamps and optional saved comparisons. A curated city directory can supply a small discovery set when you do not yet have a watchlist.

Built for rental managers, hosts and travel research teams following known comparable properties. The output keeps listing identity and source facts together, so your spreadsheet or AI workflow can explain what changed and where it was observed.

Start with one room

{"roomUrls":["https://www.airbnb.com/rooms/905399"],"maxResults":1}

Click Start, then open the Dataset for the listing row. Coverage and diagnostics explains what was reached. Readable run report gives a compact result and any incomplete-source details. No Airbnb account, API key or proxy is needed. Empty input uses this independently operated public example; it can change over time.

What you receive

Question Source-backed fields
Has the listing's positioning changed? title, plain-text description, photoUrls, photoCount
Has public feedback increased? ratingAverage, ratingCount, literal count and average deltas
What place does the page describe? locality, optional region/country, public approximate coordinates and structured-data occupancy
What changed since our last complete observation? comparisonStatus, changedFields, previous, previousObservedAt
Can we trace the result? Stable listingId/recordId, canonical sourceUrl, observedAt and coverage

Each row represents one room page. Missing source fields remain null. amenities is returned only if the room's structured data actually supplies it. A city card's amenity summary is not substituted for missing detail-page data.

Three ready-to-run recipes

1. A room's public reputation snapshot

{"roomUrls":["https://www.airbnb.com/rooms/905399"],"maxResults":1}

2. Two comparable public listings

{
  "roomUrls": [
    "https://www.airbnb.com/rooms/50271268",
    "https://www.airbnb.com/rooms/16779078"
  ],
  "maxResults": 2
}

3. A curated city discovery set

{
  "roomUrls": [],
  "cityUrls": ["https://www.airbnb.com/san-francisco-ca/stays"],
  "maxDiscoveredListings": 20,
  "maxResults": 20
}

The city recipe reads the public structured directory and then each selected room page. Twelve curated rentals were present when tested. This is not every listing in the city, arbitrary search pagination or a measure of market inventory. The source can change its curated selection. The report records how many listings the directory supplied and how many were selected.

Turn snapshots into a watchlist

{
  "roomUrls": [
    "https://www.airbnb.com/rooms/905399",
    "https://www.airbnb.com/rooms/50271268"
  ],
  "maxResults": 5,
  "comparePrevious": true,
  "onlyChanges": true,
  "snapshotName": "rental-comparables"
}

The first complete run emits new observations and establishes history. Later runs emit changed listings; an unchanged run can correctly save zero rows. Changes-only mode incurs no result event for skipped unchanged listings. Prefer a fixed room watchlist for a stable comparison group.

History belongs to the normalized room and city selections, discovery cap and snapshot name. Changing that selection creates a separate scope. Use one active writer for each scope. A city directory can introduce new rooms; a room disappearing from its curated list does not establish that the room was delisted or booked.

If a source fails, selected rooms remain unread, discovery is truncated, time expires or the spending limit is reached, the run does not advance its comparison history. Useful rows may still be returned with a partial report. Read SUMMARY.status and SUMMARY.incomplete before treating a run as a complete check.

Input reference

Field Default Purpose
roomUrls Sample room when both URL lists are empty Up to 20 explicit public /rooms/ID URLs
cityUrls Empty Up to 2 exact public /city-name/stays directories
maxDiscoveredListings 20 Total unique discovered rooms, 1–40; truncated selection is partial
maxResults 20 Maximum saved listing rows, 1–60
comparePrevious false Compare against the last complete saved observations
onlyChanges false Enable comparison and skip unchanged rows
snapshotName default 1–80 letters, numbers, underscores or hyphens
maxRunSeconds 90 Shared collection budget, 30–120 seconds

Use https://www.airbnb.com URLs. Bare airbnb.com and trailing slashes are normalized. Supported tracking parameters are removed. Booking dates, guest counts, fragments and other functional parameters are rejected so the observation always represents the public listing profile.

Unknown input fields fail before any source request, so a misspelled URL field never silently starts the sample. If Airbnb returns HTTP 401, 403 or 429, the Actor stops further source requests for that run and reports the unread targets; it does not retry the denial or switch access methods.

Interpreting the data

ratingCount and its delta are platform-reported aggregate counts, not bookings. The Actor does not collect individual guest reviews, guest names or contact details. A negative count delta can reflect source corrections; it is preserved rather than hidden.

occupancy comes from the page's structured accommodation data. It may differ from a number written in a marketing title and is not a booking guarantee. Public coordinates are approximate and are not represented as an exact address. The photo list is the source's structured selection, which may be smaller than its interactive gallery.

No date-specific nightly price, booking availability, occupancy rate, revenue estimate or profitability score is produced. Such fields require different source evidence. This Actor does not infer them from review growth or missing listings.

Exports and automation

Download JSON or CSV from the Dataset. JSON preserves nested photos, amenities and previous observations. The free SUMMARY record reports source coverage, rows saved, limits, failures and history updates. RUN_REPORT is an HTML view of the same evidence. Neither creates a listing result charge.

Save your input as an Apify task to use your own schedule or integration. Send changed rows to a spreadsheet, database or property research workflow. An AI agent can use the same input through the Apify API or Apify MCP server. Include the source URL and observation time in any generated report.

Pricing is $0.00005 per Actor start plus $0.003 per saved listing observation ($3 per 1,000). The live Pricing tab is authoritative. Skipped unchanged rows create no result event; platform usage may still apply under your plan. Set a maximum charge in Run options to bound a run.

Source coverage and support

The Actor reads public page structured data, respects robots directives and uses bounded requests. It does not sign in, bypass challenges, access reservation records or retrieve private host/guest information. Unsupported source shapes and unavailable pages are reported rather than converted into invented observations. Public source behavior can change, so successful retained runs are dated evidence, not a guarantee of future availability.

If a page changes, open an Actor issue with the public URL, run ID and expected field. Do not include account credentials. Find related event monitoring, product price monitoring and more workflow ideas at Mayd It Data Tools.