Checking availability through the API

After reading this article you can ask the API whether one room or all rooms of a workspace are free in a window — with the list of conflicts, a lead time buffer and the context you need to read the answer correctly.

With the GET /api/v1/availability endpoint your own system asks Univents whether a period is free: for a single room or for every room of a workspace. That lets your website, your planning tool or another system give an answer without creating a booking.

The statement is the same one the booking page and the assistant use: booked events, run-of-show items, room groups, open enquiries and blocked periods all count.

Key and permission

You need an API key with the Read locations permission. You create it under Integrations → Developer → API keys — the setup is described in the API keys article. Send it with every request as Authorization: Bearer <key>. A key without that permission gets a refusal, not an empty result.

The request

GET /api/v1/availability?from=2026-10-01&to=2026-10-03
GET /api/v1/availability?from=2026-10-01T18:00&to=2026-10-01T23:00&location_id=<room id>
GET /api/v1/availability?from=2026-10-01&to=2026-10-03&buffer_minutes=120&include_soft_holds=false
ParameterRequiredMeaning
fromyesStart of the period. A date (2026-10-01) or a date with a time (2026-10-01T18:00).
toyesEnd of the period, written the same way. A plain date means the whole day.
location_idnoThis one room. Without it the answer covers every room of the workspace.
buffer_minutesnoLead and follow-up time in minutes (setup, teardown). 0 (the default) checks the requested period literally.
include_soft_holdsnoDefaults to true: open, undecided enquiries hold the room — exactly as when a booking is submitted.

Without a time zone, date and time are read in your workspace's time zone. If you append a Z or an offset (2026-10-01T18:00Z), the value is taken literally.

The answer

{
  "available": false,
  "window": {
    "requested_from": "2026-10-01",
    "requested_to": "2026-10-03",
    "from": "2026-09-30T22:00:00.000Z",
    "to": "2026-10-03T22:00:00.000Z",
    "buffer_minutes": 120
  },
  "free_location_ids": ["…"],
  "locationAvailable": false,
  "conflicts": [
    {
      "type": "event_overlap",
      "location_id": "…",
      "from": "2026-10-02T15:00:00.000Z",
      "to": "2026-10-02T22:00:00.000Z",
      "confirmed": true
    },
    {
      "type": "soft_hold",
      "location_id": "…",
      "from": null,
      "to": null
    }
  ],
  "notes": ["Soft holds (open, non-archived requests) are counted per day …"]
}
  • available — free or not, across every room that was checked. When you asked for a single room, locationAvailable is added for that room.
  • window — what was actually checked. With a buffer the window is wider on both sides than what you asked for; requested_from/requested_to still show what you sent.
  • free_location_ids — the rooms that are free in the window.
  • conflicts — what is in the way. type says what it is:
typeMeaning
event_overlapAn event sits inside the window. confirmed tells you whether it is confirmed yet.
schedule_item_overlapA run-of-show item (setup, teardown, delivery) occupies the room.
group_cascadeAnother room of the same room group is taken — the group is held as a whole.
soft_holdAn open enquiry is pending.
capacityThe limit for parallel enquiries is reached within the window.
blocked_periodA blocked period applies. location_id is null here when the block covers the whole workspace.
  • degraded — present only when part of the check could not be read. The answer is then not conclusive: do not treat it as a commitment, ask again.
  • notes — the fine print you need in order to read the answer correctly; see below.

What the answer is not

  • Not a booking. The call reserves nothing. Between the request and your booking another process can take the room — the booking itself checks again.
  • No personal data. The answer names room identifiers and periods, no names, no contacts, no contact persons.
  • No page-level limit. The limit for parallel enquiries is configured per booking page, and an API call has no page context. That is why it is not part of this answer — its absence is not a zero.
  • The day that is not the minute. Blocked periods and open enquiries are evaluated per calendar day in the workspace's time zone, while events are compared to the minute. That makes the result never more permissive than the booking page, but it can be stricter. The notes in the answer say so for the case at hand.

Error cases

ResponseMeaning
400from/to are missing, unreadable or the wrong way round; location_id is not a valid identifier; buffer_minutes is negative or above 1440. The answer names the reason.
401No key, or an unknown one.
403The key does not have the Read locations permission.
429Too many requests in a short time.

An empty window or a typo in the date never turns into "free" — such requests are rejected. You find the full description of the endpoint, including all of its parameters, in the API reference at /api/v1/docs.

Univents newsletter

Product news and practical tips for event and catering businesses. Roughly once a month, no more.