Recipes/One feed, one schema, every property
Code Feed15 min

One feed, one schema, every property

A chain with twelve hotels has twelve extranets, each with its own definition of everything. The reason nobody compares properties is not indifference — it is that the numbers are not comparable. One API, one schema, the same hotel everywhere is the whole point.

One feed, one schema, every property

What you'll build

A portfolio view: every property on one line with its rate position, parity health, reputation and movement since the last run, sorted so the property that needs attention today is at the top.

Set this up first

Required

The endpoints don't take free text — they take your identifiers. This recipe assumes the things below already exist on your account; while one of them is missing the call answers empty, not with an error. Each point links to the recipe that walks it.

  1. 01

    Register the hotel in your dashboard

    Veetal resolves the property against Booking.com and assigns it a slug — and that slug, not the hotel name, is what every accommodation endpoint takes.

    Guide: Add your hotel and the comp set you price against →
  2. 02

    Fill in its comp set

    Up to ten competitors on the accommodation detail. Without them this recipe prints your own price list instead of a comparison, and the competitors block comes back empty.

  3. 03

    Run one import on the hotel

    A Feed dataset only contains what an import has written. Activate this API on the hotel, launch the first run by hand and read the credit estimate before you press — the cost grows with the comp set and with the OTAs.

    Guide: Import a hotel's reputation from Booking →

The same thing over the API, if you would rather not click:

cURL
curl -X POST "https://api.veetal.app/v2/account/accommodation" \
  -H "veetal-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ ... }'   # see the account reference for the body

To see whether an import has already finished, list them:

cURL
curl "https://api.veetal.app/v2/account/imports" \
  -H "veetal-api-key: YOUR_API_KEY"

Feed reads are not billed per request. The credits go on the imports that collect the data, which is why the estimate appears before you launch and not after.

How it works

  1. 01

    Get every property into the account

    The value only appears when the portfolio is complete. A view missing three hotels is a view nobody trusts, and one hotel imported differently from the rest breaks the comparison quietly.

  2. 02

    Import the same things everywhere

    Same OTAs, same schedule, same occupancy. Comparability is a configuration decision, not an analysis one.

  3. 03

    Ask for the exceptions, not the list

    Twelve rows of green is not information. Ask which properties are outside their usual band and why.

The call

One call per property, same shape every time. That sameness is the feature: the parsing you write once works for the whole portfolio.

cURL
curl "https://api.veetal.app/v2/feed/accommodation/YOUR_SLUG/rates?rate_year=2026&rate_month=10" \
  -H "veetal-api-key: YOUR_API_KEY"

Clone and run

Runnable

The whole recipe is one self-contained folder: Node 20, no build step, and a test suite that runs without a key.

Terminal
git clone https://github.com/Veetal-Connect/recipes.git
cd recipes/portfolio-monitor
cp .env.example .env          # your VEETAL_API_KEY
node --env-file=.env index.mjs YYYY-MM-DD YYYY-MM-DD   # put the window: first night, last night
View the repository ↗ Stack: Node 20 · JavaScript, sin dependencias

Check your key first

One call, five seconds. If this answers, the recipe will run.

cURL
curl "https://api.veetal.app/v2/feed/accommodation/YOUR_SLUG/rates?rate_year=2026&rate_month=10" \
  -H "veetal-api-key: YOUR_API_KEY"

Questions

Is ADR here the same as my PMS's ADR?

No, and do not present it as if it were. This is the rate published on the OTAs; your PMS knows what was actually sold, including direct and negotiated business. They answer different questions and the gap between them is itself informative.

What if properties are in different currencies?

Ask for one currency and for the conversion to be stated. A portfolio table mixing euros and pounds has caused more bad decisions than any missing dataset.

How many properties can it handle?

The API will serve as many as you import. The limit is attention: past about twenty rows, ask for exceptions rather than the full table.

Can it produce the Monday report?

That is the natural use. Schedule the same prompt weekly and have it name only what changed — a report that repeats last week's numbers stops being read by week four.

Build your own

Start free with 100 API credits. No credit card, no sales call.

Whatsapp