Stayingapi cheapest link resolver
Skill stayingapi/travel-skills/skills/stayingapi-cheapest-link-resolver
Resolve a property + dates to the single cheapest bookable link (with price and OTA) as clean JSON — for a concierge bot, a "book now" button, or an internal tool. Powered by the StayingAPI REST API / MCP server.From its SKILL.md
npx -y skills add stayingapi/travel-skills --skill stayingapi-cheapest-link-resolverAssembled 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
4.9 KB, ~1.2k tokens by cl100k_base, as published. Nobody here has run it
Booking-ready cheapest-link resolver
Sometimes you do not want a report — you want the answer: the one cheapest bookable link for this property on these dates, as a clean object a bot or a button can act on. This workflow calls the flagship price-compare endpoint, keeps only offers that carry a bookable URL, sorts by total price, and returns the single cheapest — OTA, price, currency, deep link, and the savings versus the median. It is the "resolve to a deal link" primitive behind a concierge assistant, a checkout CTA, or an internal booking tool.
- Base URL:
https://api.stayingapi.com/v1(REST) · MCP:https://mcp.stayingapi.com/mcp - Auth:
Authorization: Bearer stay_live_…(free sandbox:stay_test_…). - Get a free key (no card): https://stayingapi.com/signup · Full machine contract: https://api.stayingapi.com/openapi.json
Steps
- Provide the property and dates — Give the workflow a property name (plus an optional location to disambiguate), check-in / check-out, occupancy and a currency.
- Compare every OTA offer — It calls GET /v1/price-compare, which resolves the property and returns every OTA offer for the dates, each with a bookable url, plus computed min and median.
- Resolve to the single cheapest link — The transform keeps only offers that carry a bookable URL, sorts by total price, and returns the single cheapest as a clean object — OTA, price, deep link, and savings vs. median.
- Return / deliver the deal link — The compact JSON is returned to a webhook (for a bot or a "book now" button) or posted to Slack/Telegram — a one-call primitive you can drop into any surface.
When to use this
The user wants the single cheapest bookable link for a known stay — not a report — to hand to a
bot, a "book now" button, or an internal tool. Use the flagship compare_prices /
GET /v1/price-compare endpoint and resolve to one deal link.
How to do it
- Resolve the property with one of
name,googleHotelId, orlocation(+checkIn,checkOut, optionaladults,currency). - Call
GET /v1/price-compare. - Keep only
data.offers[]that have aurland a numerictotalPrice; sort ascending; the first is your answer. Return{ ota, totalPrice, currency, bookUrl, savingsVsMedian }. - If no offer has a bookable url, return an explicit "no bookable offer" result — never a guess.
Keep it a primitive
Return the compact object (or just the bookUrl) — no prose — so a caller can render a button or
follow the link programmatically. Surface data.median only as an optional "you save X" badge.
Example — REST
curl -sS "https://api.stayingapi.com/v1/price-compare?name=Hotel%20X%20Sibenik&location=Sibenik,HR&checkIn=2026-07-13&checkOut=2026-07-20¤cy=EUR" \
-H "Authorization: Bearer $STAYINGAPI_KEY"
Example — @stayingapi/sdk
import { StayingApiClient } from '@stayingapi/sdk';
const scout = new StayingApiClient({ apiKey: process.env.STAYINGAPI_KEY });
const { data } = await scout.priceCompare({
name: 'Hotel X Sibenik',
location: 'Sibenik, HR',
checkIn: '2026-07-13',
checkOut: '2026-07-20',
currency: 'EUR',
});
const cheapest = data.offers
.filter((o) => o.url)
.sort((a, b) => a.totalPrice - b.totalPrice)[0];
console.log(cheapest.ota, cheapest.totalPrice, cheapest.url);
MCP (no key pasted into the agent)
On an MCP-capable runtime, connect the StayingAPI server at https://mcp.stayingapi.com/mcp (OAuth 2.1 + PKCE) and use:
compare_prices— compare one property across OTAs with computed min + median.
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/cheapest-link-resolver
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.