# Waity Live waits for ERs, urgent care, DMV offices, airport security lanes and land border crossings: the current posted wait, the usual wait for this hour, when it should drop, and nearby alternatives. Base URL: https://api-staging.waity.ai OpenAPI: https://api-staging.waity.ai/openapi.json MCP: https://api-staging.waity.ai/mcp (tools find_waits and get_wait) ## Keys and limits Keyless: 100 successful calls a day. A free key gives 1000 a day: POST https://api-staging.waity.ai/v1/keys with JSON {"email":"you@example.com"}, then send X-Api-Key: (or Authorization: Bearer ). The key is shown once. /v1/keys is limited to 5 requests a minute per IP and 3 a day per email; asking again for the same email emails a rotate link when email delivery is set up, otherwise it answers 409 key_exists. Failed calls never count. /v1/categories, /llms.txt, /openapi.json and /health are not counted. ## One shape for every place Every place, in a list, in instead, or as an airport or border lane, is the same object: { place: {id, name, category, parent, open_now, opens_at, closes_at, timezone, sample, lane, url, api_url}, summary, now, usual, distance, best_on_day, vs_requested, links } The single-place call adds next and instead, and a fuller place block (address, phone, lat, lng, h3_r8, hours, lanes_not_tracked). Every key is always present; null means "doesn't apply" or "unknown", never zero. The one exception is now.people_waiting. distance is {km, from} and null when no reference point was given; from is "you" or "this place". No drive time is ever returned. All times are ISO 8601 in the place's local time with its offset, e.g. 2026-10-29T20:43:16-04:00; place.timezone names the zone. ## view=minimal Add view=minimal to either call for the essentials. Minimal is a strict subset of full: same keys, same paths, fewer of them. item: { place: {id, name, category, parent, open_now, opens_at, closes_at, timezone, sample}, summary, now: {status, usable, value, unit, bound, reason, trend}, distance, links: {details, airport} } single: place, summary, now (as above), usual {value, compared}, next {under, under_status, under_by, best, summary}, distance, links forecast=true with view=minimal adds next.forecast as [{at, value}]. Every API link spells out view. Response links: self, full, minimal, details, page, plan_day (the next day's plan), alternatives (a list of nearby options), airport. ## Places GET https://api-staging.waity.ai/v1/places with one of: near lat,lng: places near a point, nearest first. Or send the header X-Waity-Location: lat,lng instead (preferred: it keeps the location out of URLs and logs). cell an H3 cell index instead of a point. q a place name, city, airport code or ZIP. query.match is exact or fuzzy. ids up to 25 place ids, comma-separated, returned in that order unless sort is given. An airport or port id stands for its tracked lanes. Filters: category er, urgent-care, dmv, airport, border. Comma-separate several; omit for all. open true or false. true = open right now. sort distance (default with a point), wait (places without a usable wait last), total (drive estimate plus wait, needs a point; the estimate ranks but is never returned). limit 1-25, default 10. view full (default) or minimal. A near search widens 15, 30, 60, 120 km until it finds enough places; query.searched_km says how far it looked, query.furthest_km how far the furthest result is. Coordinates in query and links are rounded to 3 decimals. coverage: live, no_live_data, all_closed (every place returned is closed), none_open (places exist but none is open; see warnings), none. ## One place GET https://api-staging.waity.ai/v1/places/{id} under minutes threshold for next.under_by. Defaults: er 30, urgent-care 30, dmv 20, airport 15, border 30. travel_min minutes to get there; adds next.leave_by. date YYYY-MM-DD local to the place, today to 7 days ahead: plan that day. near lat,lng of the user (or X-Waity-Location), for distances. forecast true adds a compact hourly forecast to view=minimal. view full (default) or minimal. An airport or border port id returns {place, summary, coverage, lanes[], distance, ...}: place is the group with open_now (any lane open), opens_at (the earliest lane opening), lanes_tracked and lanes_not_tracked. ## Reading the answer summary One line safe to repeat: "About 40 min, posted by the hospital, updated 5 min ago." / "Closed. Opens Fri 8:00 AM." / "No delay, posted by CBP, updated 12 min ago." now.usable true only for a fresh live reading. now.value is set only then. now.value minutes, or null. Null is never zero. 0 appears only where the source posts a real zero (CBP "no delay"). now.reason why there is no usable value: closed, feed_paused (the source stopped posting), source_not_reporting (the source posts a "no data" marker), not_published (the place doesn't post waits), out_of_date, no_recent_data. Null when usable. None of these is a gap in Waity: say what summary says. now.status live, stale, paused, closed, unknown. now.bound exact, upper (say "under N min"), lower (say "over N min"). now.trend rising, falling or steady over the last 30 minutes; change_30m is the change in minutes (full view). Null without an earlier reading or for feeds that post less often than every 15 minutes (CBP). now.last_value (full view) the last number posted, for context when not usable. Never present it as the current wait. now.basis median, average, estimate or max (the current longest wait): what the source posts. Different bases are not strictly comparable. now.measures what the number spans, in the source's words; null if unpublished. now.source {name, kind, attribution_required}. kind: operator (hospital system, airport authority, CBP), place (the place posts its own wait), visitors (reports from people who were there). now.people_waiting present only when the place posts a live count of people in line (some DMVs). Absent otherwise; absence is not a gap. usual the typical wait for this weekday and hour, or null when Waity has no history. usual.value is null below medium confidence; compared (worse, normal, better) only at medium or better. confidence is none, low, medium or high; days_of_history counts the days behind this hour's value. Waity's history is young: expect usual.value, forecast values, under_by and best to be null for most places for now. Quote live waits. next.forecast hourly slots {at, open, open_minutes, value}. Values only at medium or high confidence. next.under_status already (live wait at or below the threshold now), usually_under (no live reading, but this hour usually is), expected (under_by says when), not_expected, no_data, closed_all_day, closed_rest_of_day, not_published. next.best {from, to, value}: the quietest hour open at least 45 minutes. Null for ERs and urgent care (nobody should time an emergency) and when the day is flat. next.leave_by with travel_min: now when the line is already (or usually) short, else when to leave to arrive as it drops; null if it isn't expected to drop. instead alternatives (same item shape), ranked by drive estimate plus wait. vs_requested {wait_diff_min, extra_km}: the wait at the place asked about minus this one's (positive means this one is shorter), and the extra distance. Waits only; no drive time. Never a PreCheck, CLEAR, Ready or SENTRI lane for someone asking about a general or standard lane. For an ER, up to two urgent cares follow. notes lines to repeat. For ERs: the 911 line. warnings sentences to read to the user. diagnostics for you, not the user: unknown parameters, ids that don't exist, lanes from more than one airport. attribution lines you must show. Alternatives' sources get their own line. answer_id cites this answer later. ## Errors {"error":{"code","message","request_id","param"?}}. Codes: invalid_parameter (400, param names the field), missing_location (400), invalid_json (400), invalid_key (401), place_not_found (404), not_found (404), method_not_allowed (405), gone (410, retired routes), key_exists (409), unsupported_media_type (415), rate_limited (429, Retry-After), quota_exceeded (429, until UTC midnight), server_error (500), unavailable (503). Retry only 429, 500 and 503. ## MCP POST https://api-staging.waity.ai/mcp (JSON-RPC). Tools find_waits and get_wait mirror the two GET routes, default to view minimal, and return links as ready-made tool calls: {"tool":"get_wait","arguments":{...}}. place.api_url stays a REST URL. Send X-Api-Key on the HTTP request to use a key.