agentsclimarketplace

Stayingapi str market scan

Skill stayingapi/travel-skills/skills/stayingapi-str-market-scan

Scan a short-term-rental market — discover listings across platforms, price the top N for your dates, and append a normalized row-per-listing dataset to a Google Sheet. Powered by the StayingAPI REST API / MCP server.From its SKILL.md

Install
npx -y skills add stayingapi/travel-skills --skill stayingapi-str-market-scan

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its file declares

Copied from the file, not written here

The file declares its own license as Proprietary — see https://stayingapi.com/terms. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

5.7 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it

STR market scan → Google Sheet dataset

Underwriting a short-term-rental market means one repeatable dataset: what is listed, on which platform, at what price, with how many beds and what rating. This workflow fans a search across platforms to discover listings in your area and dates, keeps the top N, re-prices each precisely with the dedicated price endpoint, and appends a normalized row per listing — name, platform, beds, occupancy, rating (on its native scale), nightly and total price, and URL — to a Google Sheet or CSV. Re-run it on a cadence to build a time series for comps and occupancy signals.

Steps

  1. Define the market + dates — Give the workflow a location, the check-in / check-out dates, occupancy, which platforms to scan, how many results to discover per platform, and how many of them to price precisely.
  2. Discover listings across platforms — It calls GET /v1/search across the requested platforms and merges every match into one normalized Property list — the discovery pass.
  3. Price the top N precisely — It ranks the discovered listings, keeps the top N, and calls GET /v1/price for each with the exact dates and occupancy — a precise per-date quote per listing.
  4. Append the market dataset — Each listing becomes one normalized row (name, platform, beds, occupancy, rating + scale, nightly + total price, URL) appended to a Google Sheet or CSV — re-run on a cadence for a time series.

When to use this

The user (an STR investor/analyst or a data team) wants a repeatable market dataset: every listing in an area + dates, with price, beds, rating and URL, as rows to underwrite or trend.

How to do it (two passes)

  1. DiscoverGET /v1/search with location (+ checkIn/checkOut, platforms, limit, sort, currency). Merge data[] across platforms; each Property already carries a price, bedrooms, guestRating/ratingScale, url.
  2. Price precisely — for the top N listings, call GET /v1/price with platform + listingId (the platformListingId) + the exact dates. Use price.totalPrice; fall back to the search price if a quote is empty.
  3. Emit one normalized row per listing: name, platform, listingId, city, bedrooms, maxOccupancy, guestRating+ratingScale, nightlyPrice, totalPrice, currency, url.

Cost & scope control

Cost scales with the search breadth (limit × platforms) and the number of listings you price (topN). Start small; failed/empty legs are never billed and sandbox is free. Optionally enrich a row with GET /v1/listing/{platform}/{id} for amenities/photos.

Time series

Re-run on a schedule and append a run-date column to build a comps-and-occupancy time series.

Example — REST

# 1) Discover listings in the market
curl -sS "https://api.stayingapi.com/v1/search?location=Split,HR&checkIn=2026-07-13&checkOut=2026-07-20&platforms=airbnb,vrbo,booking&sort=price_asc&limit=20" \
  -H "Authorization: Bearer $STAYINGAPI_KEY"

# 2) Price one discovered listing precisely (repeat for your top N)
curl -sS "https://api.stayingapi.com/v1/price?platform=airbnb&listingId=42307961&checkIn=2026-07-13&checkOut=2026-07-20&adults=2&currency=EUR" \
  -H "Authorization: Bearer $STAYINGAPI_KEY"

Example — @stayingapi/sdk

import { StayingApiClient } from '@stayingapi/sdk';

const scout = new StayingApiClient({ apiKey: process.env.STAYINGAPI_KEY });
const dates = { checkIn: '2026-07-13', checkOut: '2026-07-20', adults: 2, currency: 'EUR' };

// 1) discover
const { data: listings } = await scout.search({
  location: 'Split, HR',
  platforms: ['airbnb', 'vrbo', 'booking'],
  sort: 'price_asc',
  limit: 20,
  ...dates,
});

// 2) price the top N and build a dataset row each
const topN = listings.slice(0, 10);
const rows = [];
for (const p of topN) {
  const { data: price } = await scout.price({
    platform: p.platform,
    listingId: p.platformListingId,
    ...dates,
  });
  rows.push({
    name: p.name,
    platform: p.platform,
    beds: p.bedrooms,
    rating: p.guestRating,
    total: price.totalPrice ?? p.price?.totalPrice,
    url: p.url,
  });
}
console.table(rows);

Async & partial failures

A live call that has to scrape returns 202 + a jobId; poll GET /v1/jobs/{jobId} (free) until data.status is completed, then read data.result. The @stayingapi/sdk auto-polls. On a fan-out, check meta.partial and meta.platformResults[] — report what succeeded and note any meta.warnings[].

Credit awareness

Costs are per-endpoint and metered by result (v3). Failed, empty and blocked calls are never billed, and sandbox (stay_test_) calls are always free. The exact, current costs live only in https://stayingapi.com/pricing and the machine-readable https://api.stayingapi.com/openapi.json — read them there, don't assume.


Get your free key → https://stayingapi.com/signup · Docs: https://stayingapi.com/docs · Workflow: https://stayingapi.com/workflows/str-market-scan

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 326,764. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.