Recipes/Add a city and see the demand its events will create
Code Feed6 min

Add a city and see the demand its events will create

Events is the only Feed API with no import to launch: Veetal builds the dataset city by city, and your side is one step — register the location. What comes back is not an agenda, it is a demand forecast per night, per guest profile and per distance ring.

Add a city and see the demand its events will create

What you'll build

A year of Barcelona's events with, for each one, total roomnights, the booking window (which opens before the event does), daily pressure against city inventory, the split by hotel category and guest profile, and the geographic distribution by ring.

How it works

  1. 01The one thing you have to do
  2. 02Read the calendar
  3. 03The part that prices rooms
  4. 04Where in the city, not just how many
  5. 05Attendance is not demand
  6. 06The types that behave differently
  7. 07What happens next

Step by step

By the end you will be able to ask "what is happening in Barcelona and how much hotel demand will it create" and get an answer with roomnights per day, pressure against the city's inventory, and where in the city those rooms will be booked.

What you need: the destination registered as a location on your account. That's it.

What it costs: events are billed per location and per month, not per request. There is no import to launch and no schedule to configure — reading is the cheap part.

The one thing you have to do

Events is the odd one among the Feed APIs: there is no import. The dataset is produced by Veetal's own pipeline, city by city. Your side of the contract is a single step — tell us which city you care about.

On Locations, Add locations, and search the destination. The dialog states the purpose in its own subtitle: "You will use them to search events in the destination".

Four Barcelonas in four countries

Barcelona returns four candidates in four countries. Pick the wrong one and every event you read afterwards belongs to another city. Use Show Map if the name alone doesn't settle it.

⚠️ The name must be the real destination name — renaming it returns error 731.

The location registered, with its tier and coordinates

The row shows the tier and the coordinates the backend resolved. The id on that row is the location_id every events call takes.

Notice what the page does not have for this API: no Imports tab, no Schedules tab, no import to run. The Events feed page has only Locations, Events, Schedules and Requests, and its Events tab carries five charts — by type, by audience type, evolution, monthly and by attendance.

Read the calendar

GET /v2/feed/events/{location_id} with an optional date range and min_impact. Here is a real answer for Barcelona, trimmed to what matters:

JSON
{
  "name": "Smart City Expo World Congress",
  "acronym": "SCEWC",
  "type": "fair_convention",
  "subtype": "congress_technology",
  "status": "verified",
  "dates": { "start": "2026-11-03", "end": "2026-11-05", "duration_days": 3 },
  "location": {
    "venue": "Fira Barcelona - Recinte de Gran Via",
    "address": "Av. Joan Carles I, 64, 08908 Barcelona, Spain"
  },
  "attendance": { "unique_visitors": 27000, "magnitude": "medium" }
}

That much you could get from a listings site. The rest is what the dataset is actually for.

The part that prices rooms

JSON
"hotel_impact": {
  "level": "high",
  "score": 0.559,
  "total_roomnights": 63061,
  "booking_window": { "start": "2026-11-02", "end": "2026-11-06" },
  "city_pressure": {
    "city_inventory_rooms": 40000,
    "peak_pressure_pct": 0.5592,
    "avg_pressure_pct": 0.3153,
    "peak_day": "2026-11-03",
    "days_at_or_above_80pct": 0
  }
}

63.061 roomnights across a city with 40.000 rooms, peaking at 55,9 % of the entire inventory on 3 November. Pressure percentages are fractions from 0 to 1, and they can exceed 1 — that means the event demands more rooms than the city has.

Note the booking window opens on 2 November, the day before the congress starts. Delegates arrive the night before. If your rate calendar treats 2 November as an ordinary Monday, you have already left money on the table before the event begins.

Then it breaks the demand down day by day:

JSON
{
  "date": "2026-11-03",
  "roomnights": 22367,
  "pressure_pct": 0.5592,
  "by_category": { "budget_hotels": 1734, "mid_range_hotels": 12737, "luxury_hotels": 7896 },
  "by_profile": { "international_business": 17290, "national_business": 4592, "international_leisure": 276 }
}

17.290 of those roomnights are international business. That is a completely different guest — and a completely different price ceiling — from a leisure peak of the same size.

Where in the city, not just how many

JSON
"geographic_distribution": {
  "weighted_radius_km": 4.9,
  "concentration": "near_venue",
  "shares": { "at_venue": 0.092, "near_venue": 0.656, "regional": 0.025 },
  "rings": {
    "2000-5000": {
      "mid_range_hotels": { "roomnights": 20073, "impact": "high" },
      "luxury_hotels":    { "roomnights": 12909, "impact": "high" }
    }
  }
}

65,6 % of the demand lands near the venue, with a weighted radius of 4,9 km, concentrated in mid-range and luxury hotels in the 2-5 km ring. If you are a mid-range hotel two kilometres from Fira Gran Via, this event is yours. If you are a budget hotel on the other side of the city, the same event barely moves you — and the dataset says so instead of leaving you to guess.

Attendance is not demand

Compare two Barcelona events from the same feed:

Smart City ExpoManga Barcelona
Visitors27.000167.000
Roomnights63.06174.226
Peak pressure55,9 %48,3 %
Concentrationnear_venue (4,9 km)mixed_city (7,2 km)

Manga Barcelona draws six times more people and generates only marginally more roomnights, at lower pressure and spread wider across the city. The reason is in the audience mix: 26.936 of its attendees are local_no_stay — they go home to sleep. A congress of 27.000 international delegates fills more hotel rooms than a fair of 167.000 locals, and this is exactly the mistake that reading a "biggest events" list gets you into.

The types that behave differently

  • type: "cruise" adds a cruise block with the ship-by-ship call list: for 16-20 October, 24 ships, 81.232 embarking passengers, 51.988 roomnights, each call with its date, ship and pax. These are pre- and post-cruise nights, estimated from the port schedule.
  • type: "holiday" is informational and carries no hotel impact. There is also a dedicated route, GET /v2/feed/events/{location_id}/holidays, for official holidays and source-market school breaks.
  • Recurring events carry an editions array with previous years, so you can compare this edition against the last two before trusting the forecast.

What happens next

Filter with min_impact (high and above is usually the actionable set) and event_type, and walk the year with from_date/to_date. The natural pairing is with the destination market feed: events tell you when demand arrives and what kind, the location search feed tells you what your competitors are charging for it.

Questions

Do I have to launch an import to get events?

No, and there isn't one to launch. Events is the only Feed API with no import and no import tab: Veetal's own pipeline builds the dataset city by city. You register the location and read.

The endpoint returns an empty array. What's wrong?

Either the location isn't one Veetal covers yet, or your date range falls outside what has been built. Check that the location is the right one — Barcelona exists in four countries — and widen from_date/to_date before concluding there is nothing there.

What does a pressure percentage above 1 mean?

That the event needs more rooms than the city has. Pressure is expressed as a fraction of city_inventory_rooms from 0 to 1, and it is allowed to go over: it is a demand estimate, not an occupancy reading. Anything approaching 1 is a night to price aggressively.

Why does an event with more visitors generate fewer roomnights?

Because attendance counts people and roomnights count beds. Look at audience_mix: attendees classed as local_no_stay sleep at home. Manga Barcelona brings 167.000 visitors but 26.936 of them are local, so it produces barely more roomnights than a 27.000-delegate international congress.

What is the booking window for?

It is the range of nights the event actually generates, and it usually starts before the event does — delegates arrive the night before. That first night is the one most rate calendars miss.

How do I know whether an event affects my hotel specifically?

Use geographic_distribution. concentration and weighted_radius_km tell you how tight the demand is around the venue, and rings breaks the roomnights down by distance band crossed with hotel category. A near_venue event at 4,9 km with high impact on mid_range in the 2-5 km ring is a very different proposition depending on where you are.

Build your own

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

Whatsapp