{"openapi":"3.1.0","info":{"title":"Waity API","version":"1.0.0","termsOfService":"https://waity.ai/terms","description":"Waity gives AI agents live wait times for places with a line: the posted wait now, the usual wait, when it should drop, and shorter options nearby. Current coverage: GET /v1/categories. Guide: /llms.txt. ER and urgent care: Waity tracks only some, so their lists are coverage partial: never call the results the nearest. For chest pain, stroke signs, trouble breathing or a serious injury, tell the user to call 911 or go to the nearest ER, whatever the waits say; serious symptoms are seen first. An ER wait is the time until a provider first sees you, not the whole visit; sources measure it differently, so never compare minutes across sources. A freestanding ER (place.facility freestanding_ed) has no inpatient beds or surgery. Urgent care: for minor illness or injury only, never for an emergency. Border crossings: waits are for entering the US only; Waity has none for leaving the US. Place-specific rules (the gates a checkpoint serves, what a DMV number counts) come in each answer's notes: repeat them."},"servers":[{"url":"https://api.waity.ai"}],"security":[{},{"apiKey":[]},{"bearer":[]}],"paths":{"/v1/places":{"get":{"operationId":"findWaits","summary":"Places with their current wait: near a point, by q, or by id","description":"One of near, cell, q or ids (or the X-Waity-Location header) is required. A q that asks for places near the caller with no location (\"near me\", \"ER near me\") is answered around the approximate city of the caller's network only when the caller is a person's own tool (curl, a browser) on a home broadband network and q has no words Waity can't read; query.resolved.source is then ip, the first warnings say so, and the response is Cache-Control: no-store. Servers, apps (a web page's script included), agents, MCP, VPNs and mobile networks never get a guessed location: send near or the header, or a city or ZIP in q. X-Waity-Location: none opts out of the guess.","parameters":[{"name":"near","in":"query","required":false,"description":"Latitude,longitude.","example":"40.77,-73.96","schema":{"type":"string"}},{"name":"cell","in":"query","required":false,"description":"An H3 cell instead of a point.","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Place name, city, airport code or ZIP.","example":"San Ysidro","schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"ids","in":"query","required":false,"description":"Up to 25 place ids, comma-separated, returned in that order.","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"One or more category ids, comma-separated. A parent (health, travel, government, ...) stands for the categories under it that Waity covers; one Waity doesn't cover yet is answered with coverage none. GET /v1/categories lists them.","example":"er,urgent-care","schema":{"type":"array","items":{"type":"string","enum":["er","urgent-care","dmv","airport","border"]}},"style":"form","explode":false},{"name":"open","in":"query","required":false,"description":"true: only places open now.","schema":{"type":"string","enum":["true","false"]}},{"name":"limit","in":"query","required":false,"description":"1 to 25, default 10.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["distance","wait","total"]}},{"name":"view","in":"query","required":false,"description":"full (default) or minimal.","schema":{"type":"string","enum":["full","minimal"]}},{"name":"X-Waity-Location","in":"header","required":false,"description":"latitude,longitude of the user, accepted in place of near (preferred: it keeps the location out of URLs and logs). The value none opts out of a location guessed from the caller's network and is otherwise treated as no location.","schema":{"type":"string","example":"40.77,-73.96"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ListFull"},{"$ref":"#/components/schemas/ListMinimal"}]}}},"headers":{"Cache-Control":{"description":"private, max-age=60 (no-store for a location guessed from the caller's network). How long now.value itself holds is now.usable_until.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"503":{"$ref":"#/components/responses/Error"}}}},"/v1/places/{id}":{"get":{"operationId":"getWait","summary":"One place: now, usual, next and instead; a group id returns its lanes or departments","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^pl_[a-z0-9]{10}$"},"example":"pl_xaed7pr1f5"},{"name":"under","in":"query","required":false,"description":"Threshold in minutes for next.under_by. Defaults per category.","schema":{"type":"string"}},{"name":"travel_min","in":"query","required":false,"description":"Travel time in minutes; adds next.leave_by.","schema":{"type":"string"}},{"name":"date","in":"query","required":false,"description":"Plan a local day, today to 7 days ahead.","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},{"name":"near","in":"query","required":false,"description":"Latitude,longitude.","example":"40.77,-73.96","schema":{"type":"string"}},{"name":"forecast","in":"query","required":false,"description":"With view=minimal, adds a compact forecast.","schema":{"type":"string","enum":["true","false"]}},{"name":"view","in":"query","required":false,"description":"full (default) or minimal.","schema":{"type":"string","enum":["full","minimal"]}},{"name":"X-Waity-Location","in":"header","required":false,"description":"latitude,longitude of the user, accepted in place of near (preferred: it keeps the location out of URLs and logs). The value none opts out of a location guessed from the caller's network and is otherwise treated as no location.","schema":{"type":"string","example":"40.77,-73.96"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/SingleFull"},{"$ref":"#/components/schemas/SingleMinimal"},{"$ref":"#/components/schemas/GroupFull"},{"$ref":"#/components/schemas/GroupMinimal"}]}}},"headers":{"Cache-Control":{"description":"private, max-age=60 (no-store for a location guessed from the caller's network). How long now.value itself holds is now.usable_until.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"503":{"$ref":"#/components/responses/Error"}}}},"/v1/places/{id}/history":{"get":{"operationId":"getHistory","x-plan-history-days":{"free":30,"plus":365,"pro":365,"team":null},"summary":"What one place's posted waits were: raw readings, or hourly or daily aggregates","description":"Descriptive only: past waits never predict a visit (ER answers say so in notes). Needs an API key; keyless calls get 401 key_required (before any quota check, never counted). How far back a plan reads: free 30 days, plus 365 days, pro 365 days, team unlimited. A wider range is clipped, not refused: range.clipped is true and range.clipped_reason plan_history_window. Pages hold at most 1000 raw rows, 336 hours or 366 days; pass page.next_cursor as cursor for the next page (the cursor carries from, to, granularity and tier; pass limit again). The hour and the local day in progress are included, from the readings so far, with partial: true. Counted as one call per request. A range that ended over 6 hours ago is Cache-Control: private, max-age=86400.","parameters":[{"name":"id","in":"path","required":true,"description":"One place, lane or department (a group id is refused with its lane ids).","schema":{"type":"string","pattern":"^pl_[a-z0-9]{10}$"},"example":"pl_xaed7pr1f5"},{"name":"from","in":"query","required":false,"description":"Start, inclusive: a date YYYY-MM-DD (local midnight at the place) or an ISO 8601 date-time (with an offset, else local to the place). Default: 7 days before to.","schema":{"type":"string"},"example":"2026-10-25"},{"name":"to","in":"query","required":false,"description":"End, exclusive; a date means the end of that local day. Default and maximum: now.","schema":{"type":"string"},"example":"2026-10-31T12:00:00-04:00"},{"name":"granularity","in":"query","required":false,"description":"hour (default): one bucket per UTC hour with data. day: one per local day (from and to snap to local midnight). raw: every posted reading.","schema":{"type":"string","enum":["raw","hour","day"]}},{"name":"tier","in":"query","required":false,"description":"The kind of source. Default: the tier of the place's displayed source.","schema":{"type":"string","enum":["official","place","agent"]}},{"name":"cursor","in":"query","required":false,"description":"page.next_cursor from the previous page, as is. It carries from, to, granularity and tier.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Rows per page. raw: default 500, at most 1000; hour: 168, at most 336; day: 92, at most 366.","schema":{"type":"integer","minimum":1,"maximum":1000}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/HistoryRaw"},{"$ref":"#/components/schemas/HistoryAggregate"}]}}},"headers":{"Cache-Control":{"description":"private, max-age=60; private, max-age=86400 once the range ended over 6 hours ago.","schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"503":{"$ref":"#/components/responses/Error"}}}},"/v1/categories":{"get":{"operationId":"listCategories","summary":"The categories Waity covers now, with counts and default under thresholds; tree=true adds the covered branches of the category tree","security":[{}],"parameters":[{"name":"tree","in":"query","required":false,"description":"true: add the covered branches of the category tree.","schema":{"type":"string","enum":["true","false"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Categories"}}}}}}},"/v1/plans":{"get":{"operationId":"listPlans","summary":"The plans: price, daily call limit, keys and features. Paid plans are open.","security":[{}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"plans":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","enum":["free","plus","pro","team"]},"name":{"type":"string"},"price_monthly_usd":{"type":"number"},"daily_limit":{"type":"integer"},"max_keys":{"type":"integer"},"features":{"type":"array","items":{"type":"string"}}}}}}}}}}}}},"/v1/keys":{"post":{"operationId":"createKey","summary":"A free API key, shown once","description":"Limited to 5 a minute per IP and 3 a day per email.","security":[{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"}},"required":["email"]}}}},"responses":{"201":{"description":"Created; the key is shown once","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string"},"tier":{"type":"string"},"daily_limit":{"type":"integer"},"header":{"type":"string"}}}}}},"202":{"description":"A rotate link was emailed to the address"},"400":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"415":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"503":{"$ref":"#/components/responses/Error"}}}},"/v1/keys/rotate":{"post":{"operationId":"rotateKey","summary":"Swaps the key behind an emailed rotate link for a new one","description":"The new key is shown once and the old one stops working. The token is single-use and valid 30 minutes.","security":[{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"The rotate query parameter of the emailed link."}},"required":["token"]}}}},"responses":{"200":{"description":"The new key, shown once","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string"},"tier":{"type":"string"},"daily_limit":{"type":"integer"},"header":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/Error"},"415":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"}}}},"/mcp":{"post":{"operationId":"mcp","summary":"MCP (streamable HTTP): tools find_waits, get_wait and get_history","description":"Protocol versions 2025-03-26, 2025-06-18, 2025-11-25 and 2026-07-28. A request with an Origin header is accepted only from an allowlist and gets 403 otherwise; browser apps should call the REST routes. Details: /llms-full.txt.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"202":{"description":"Notification accepted"}}}},"/llms.txt":{"get":{"operationId":"llmsTxt","summary":"Short guide for agents","security":[{}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms-full.txt":{"get":{"operationId":"llmsFullTxt","summary":"Full guide for agents","security":[{}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/v1/changelog":{"get":{"operationId":"changelog","summary":"What changed in the API, MCP, data and accounts, newest first","description":"Not counted against any limit. Cached 60 s with an ETag; send If-None-Match for a 304.","security":[{}],"parameters":[{"name":"limit","in":"query","required":false,"description":"How many entries, newest first.","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["rev","updated_at","links","entries"],"properties":{"rev":{"type":"integer"},"updated_at":{"type":["string","null"]},"links":{"type":"object","properties":{"page":{"type":"string"},"markdown":{"type":"string"},"atom":{"type":"string"}}},"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"version":{"type":"string"},"date":{"type":"string"},"title":{"type":"string"},"areas":{"type":"array","items":{"type":"string","enum":["api","mcp","data","site","accounts"]}},"breaking":{"type":"boolean"},"url":{"type":"string"},"html":{"type":"string"},"markdown":{"type":"string"},"media":{"type":"array","items":{"type":"object"}}}}}}}}},"headers":{"ETag":{"schema":{"type":"string"}}}},"304":{"description":"Not modified (If-None-Match matched)"},"400":{"$ref":"#/components/responses/Error"}}}},"/health":{"get":{"operationId":"health","summary":"Service health: API and live data status","security":[{}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}},"503":{"$ref":"#/components/responses/Error"}}}}},"components":{"schemas":{"Now":{"type":"object","properties":{"status":{"type":"string","enum":["live","stale","paused","closed","unknown"]},"usable":{"type":"boolean"},"value":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Minutes; set only when usable."},"unit":{"type":"string","const":"min"},"bound":{"anyOf":[{"type":"string","enum":["exact","upper","lower","range"]},{"type":"null"}],"description":"exact; upper (\"Under 5 min\"); lower (\"Over 60 min\": some sources post any ER wait over an hour as 60+); range (value_low to value, \"6–9 min\")."},"value_low":{"description":"With bound range, the low end: \"6–9 min\" is value_low 6, value 9. Absent otherwise.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"reason":{"anyOf":[{"type":"string","enum":["closed","feed_paused","source_not_reporting","not_published","out_of_date","no_recent_data"]},{"type":"null"}]},"trend":{"anyOf":[{"type":"string","enum":["rising","falling","steady"]},{"type":"null"}]},"basis":{"anyOf":[{"type":"string","enum":["median","average","estimate","max"]},{"type":"null"}],"description":"What the source posts: median, average, estimate, or max (the current longest wait). Waits with different bases or sources are not comparable: compare minutes only within one source."},"measured_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}],"description":"When the number was posted; null when none was (closed, source_not_reporting)."},"usable_until":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}],"description":"When now.value stops being usable (measured_at + stale_after_s); after it, ask again. Null when there is no usable value."},"change_30m":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"last_value":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"measures":{"type":["string","null"]},"read_ago_s":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Seconds since measured_at: the age of the posted reading. With measured_at null (source_not_reporting) it is the seconds since Waity last read the source, not a reading's age. Null when closed, paused or no_recent_data."},"stale_after_s":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Seconds a posted reading stays usable after measured_at: the source's own window, except border lanes (posted hourly: stale after 90 minutes). Null when there is no reading."},"tier":{"anyOf":[{"type":"string","enum":["official","place","agent","inferred"]},{"type":"null"}],"description":"The kind of source behind the number, most to least authoritative: official (an operator's own feed), place (the place posts its own wait), agent (reported through an agent), inferred (estimated, not posted). Null without a source."},"source":{"anyOf":[{"type":"object","properties":{"name":{"type":"string","description":"Who posted the number, by kind: \"the hospital\", \"the airport\", \"the border agency\". Sources are not named."},"short":{"type":"string","description":"An opaque source id, e.g. \"src_7qm2\": equal ids mean the same publisher and method. Stable across REST, MCP and history; it names no one. Minutes compare only between waits with the same source.short and basis."},"kind":{"type":"string","enum":["operator","place","visitors"]},"attribution_required":{"type":"boolean"}},"required":["name","short","kind","attribution_required"],"additionalProperties":false},{"type":"null"}]},"people_waiting":{"description":"Present only when the place posts a live count.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["status","usable","value","unit","bound","reason","trend","basis","measured_at","usable_until","change_30m","last_value","measures","read_ago_s","stale_after_s","tier","source"],"additionalProperties":false},"Usual":{"type":"object","properties":{"value":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"unit":{"type":"string","const":"min"},"for":{"type":"string","example":"thu 21:00"},"compared":{"anyOf":[{"type":"string","enum":["worse","normal","better"]},{"type":"null"}]},"basis":{"type":"string","enum":["history","typical"]},"confidence":{"type":"string","enum":["none","low","medium","high"]},"days_of_history":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["value","unit","for","compared","basis","confidence","days_of_history"],"additionalProperties":false},"ItemFull":{"type":"object","properties":{"place":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","description":"A category id from the category tree, e.g. er, urgent-care, dmv, airport, border. GET /v1/categories lists the covered ones."},"parent":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"open_now":{"type":"boolean"},"opens_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"closes_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"timezone":{"type":"string"},"sample":{"type":"boolean"},"facility":{"description":"ERs only: hospital_ed (an ER in a hospital) or freestanding_ed (a freestanding ER with no inpatient beds or surgery; a serious case is transferred to a hospital). Null for every other place, urgent cares included. A place's hand-curated note (a lane restriction, the gates a checkpoint serves) is in the answer's notes.","anyOf":[{"type":"string","enum":["hospital_ed","freestanding_ed"]},{"type":"null"}]},"audience":{"type":"string","enum":["all","children","women"],"description":"Who the place serves: \"children\" for a children-only ER or urgent care (a pediatric ER, a children's hospital), never to be suggested for an adult; \"women\" for an obstetric ER at a women's hospital (pregnancy emergencies), never a general ER; \"all\" otherwise."},"lane":{"anyOf":[{"type":"string","enum":["general","precheck","clear","standard","ready","sentri","nexus"]},{"type":"null"}]},"url":{"type":"string"},"api_url":{"type":"string"}},"required":["id","name","category","parent","open_now","opens_at","closes_at","timezone","sample","audience","lane","url","api_url"],"additionalProperties":false},"summary":{"type":"string"},"now":{"$ref":"#/components/schemas/Now"},"usual":{"anyOf":[{"$ref":"#/components/schemas/Usual"},{"type":"null"}]},"distance":{"anyOf":[{"type":"object","properties":{"km":{"type":"number"},"from":{"type":"string","description":"Where the distance is measured from: \"you\" (near or the location header), \"this place\" (alternatives with no caller point), or the label of the city or ZIP q was read as (query.resolved.label, e.g. \"Brooklyn, NY\"), or \"<city> (approximate)\" for a location guessed from the caller's network (query.resolved.source ip)."}},"required":["km","from"],"additionalProperties":false},{"type":"null"}]},"best_on_day":{"anyOf":[{"type":"object","properties":{"date":{"type":"string"},"from":{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},"to":{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["date","from","to","value"],"additionalProperties":false},{"type":"null"}]},"vs_requested":{"anyOf":[{"type":"object","properties":{"wait_diff_min":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"The place asked about minus this one, waits only."},"extra_km":{"type":"number"},"note":{"description":"Why wait_diff_min is null (the two waits come from systems that measure differently, or the asked place's wait is over a cap or unknown), or what to know about this alternative (a freestanding ER, urgent care).","type":["string","null"]}},"required":["wait_diff_min","extra_km"],"additionalProperties":false},{"type":"null"}]},"links":{"type":"object","properties":{"details":{"type":"string"},"page":{"type":"string"},"airport":{"description":"The lane's airport; null for border lanes.","type":["string","null"]},"group":{"description":"The lane's airport or border port.","type":["string","null"]}},"required":["details","page","airport","group"],"additionalProperties":false}},"required":["place","summary","now","usual","distance","best_on_day","vs_requested","links"],"additionalProperties":false},"ItemMinimal":{"type":"object","properties":{"place":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","description":"A category id from the category tree, e.g. er, urgent-care, dmv, airport, border. GET /v1/categories lists the covered ones."},"parent":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"open_now":{"type":"boolean"},"opens_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"closes_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"timezone":{"type":"string"},"sample":{"type":"boolean"},"facility":{"description":"ERs only: hospital_ed (an ER in a hospital) or freestanding_ed (a freestanding ER with no inpatient beds or surgery; a serious case is transferred to a hospital). Null for every other place, urgent cares included. A place's hand-curated note (a lane restriction, the gates a checkpoint serves) is in the answer's notes.","anyOf":[{"type":"string","enum":["hospital_ed","freestanding_ed"]},{"type":"null"}]},"audience":{"type":"string","enum":["all","children","women"],"description":"Who the place serves: \"children\" for a children-only ER or urgent care (a pediatric ER, a children's hospital), never to be suggested for an adult; \"women\" for an obstetric ER at a women's hospital (pregnancy emergencies), never a general ER; \"all\" otherwise."}},"required":["id","name","category","parent","open_now","opens_at","closes_at","timezone","sample","audience"],"additionalProperties":false},"summary":{"type":"string"},"now":{"type":"object","properties":{"status":{"type":"string","enum":["live","stale","paused","closed","unknown"]},"usable":{"type":"boolean"},"value":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Minutes; set only when usable."},"unit":{"type":"string","const":"min"},"bound":{"anyOf":[{"type":"string","enum":["exact","upper","lower","range"]},{"type":"null"}],"description":"exact; upper (\"Under 5 min\"); lower (\"Over 60 min\": some sources post any ER wait over an hour as 60+); range (value_low to value, \"6–9 min\")."},"value_low":{"description":"With bound range, the low end: \"6–9 min\" is value_low 6, value 9. Absent otherwise.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"reason":{"anyOf":[{"type":"string","enum":["closed","feed_paused","source_not_reporting","not_published","out_of_date","no_recent_data"]},{"type":"null"}]},"trend":{"anyOf":[{"type":"string","enum":["rising","falling","steady"]},{"type":"null"}]},"basis":{"anyOf":[{"type":"string","enum":["median","average","estimate","max"]},{"type":"null"}],"description":"What the source posts: median, average, estimate, or max (the current longest wait). Waits with different bases or sources are not comparable: compare minutes only within one source."},"measured_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}],"description":"When the number was posted; null when none was (closed, source_not_reporting)."},"usable_until":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}],"description":"When now.value stops being usable (measured_at + stale_after_s); after it, ask again. Null when there is no usable value."},"source":{"anyOf":[{"type":"object","properties":{"short":{"type":"string","description":"An opaque source id, e.g. \"src_7qm2\": equal ids mean the same publisher and method. Stable across REST, MCP and history; it names no one. Minutes compare only between waits with the same source.short and basis."}},"required":["short"],"additionalProperties":false},{"type":"null"}],"description":"The opaque source id, the same as now.source.short in view=full. Null when there is no source."}},"required":["status","usable","value","unit","bound","reason","trend","basis","measured_at","usable_until","source"],"additionalProperties":false},"distance":{"anyOf":[{"type":"object","properties":{"km":{"type":"number"},"from":{"type":"string","description":"Where the distance is measured from: \"you\" (near or the location header), \"this place\" (alternatives with no caller point), or the label of the city or ZIP q was read as (query.resolved.label, e.g. \"Brooklyn, NY\"), or \"<city> (approximate)\" for a location guessed from the caller's network (query.resolved.source ip)."}},"required":["km","from"],"additionalProperties":false},{"type":"null"}]},"links":{"type":"object","properties":{"details":{"type":"string"},"airport":{"type":["string","null"]},"group":{"type":["string","null"]}},"required":["details","airport","group"],"additionalProperties":false}},"required":["place","summary","now","distance","links"],"additionalProperties":false},"ListFull":{"type":"object","properties":{"query":{"type":"object","properties":{"near":{"type":["string","null"]},"cell":{"type":["string","null"]},"q":{"type":["string","null"]},"ids":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"match":{"anyOf":[{"type":"string","enum":["exact","fuzzy","location"]},{"type":"null"}],"description":"location: q named a city or ZIP and was searched as a point: the Census point for that ZIP or city, or the centroid of Waity's places there. query.resolved names it."},"total":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"How many places matched before limit cut the list; null for ids."},"category":{"anyOf":[{"type":"array","items":{"type":"string","description":"A category id from the category tree, e.g. er, urgent-care, dmv, airport, border. GET /v1/categories lists the covered ones."}},{"type":"null"}]},"open":{"type":["boolean","null"]},"sort":{"anyOf":[{"type":"string","enum":["distance","wait","total"]},{"type":"null"}]},"limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"view":{"type":"string","enum":["full","minimal"]},"searched_km":{"type":["number","null"]},"furthest_km":{"type":["number","null"]},"resolved":{"anyOf":[{"type":"object","properties":{"label":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"source":{"type":"string","enum":["q","ip"],"description":"q: a city or ZIP in q. ip: q asked for places near the caller with no location, so Waity used the approximate city of the caller's network (REST only, for a person's own tool such as curl or a browser on a home broadband network; never for servers, apps, agents, MCP, VPNs or mobile networks). Say the city to the user and ask for their location before directing them anywhere."},"approx_km":{"description":"How far off the point can be, in km, when source is ip (null for q).","type":["number","null"]}},"required":["label","lat","lng","source","approx_km"],"additionalProperties":false},{"type":"null"}],"description":"The point the list is around when no near was given: a city or ZIP in q (match \"location\", 3 decimals), or the approximate location from the caller's network (source ip, 2 decimals; match null). Distances without near are from here."}},"required":["near","cell","q","ids","match","total","category","open","sort","limit","view","searched_km","furthest_km","resolved"],"additionalProperties":false},"coverage":{"type":"string","enum":["live","no_live_data","all_closed","partial","none_open","none"]},"places":{"type":"array","items":{"$ref":"#/components/schemas/ItemFull"}},"notes":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"},"description":"Sentences to read to the user."},"diagnostics":{"type":"array","items":{"type":"string"},"description":"For the agent or developer: unknown parameters and the like."},"answer_id":{"type":"string"},"attribution":{"type":"array","items":{"type":"string"},"description":"Lines to show with the data: \"Data by Waity\"."},"links":{"type":"object","properties":{"self":{"type":"string"},"full":{"type":"string"},"minimal":{"type":"string"},"suggested":{"description":"Only on an empty answer: a ready follow-up call for what q most likely meant (the city a misspelling names, with the categories read from q; or the lanes Waity tracks at the port or airport q named). Confirm with the user before making it.","type":"string"}},"required":["self","full","minimal"],"additionalProperties":false}},"required":["query","coverage","places","notes","warnings","diagnostics","answer_id","attribution","links"],"additionalProperties":false},"ListMinimal":{"type":"object","properties":{"query":{"type":"object","properties":{"near":{"type":["string","null"]},"cell":{"type":["string","null"]},"q":{"type":["string","null"]},"ids":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"match":{"anyOf":[{"type":"string","enum":["exact","fuzzy","location"]},{"type":"null"}],"description":"location: q named a city or ZIP and was searched as a point: the Census point for that ZIP or city, or the centroid of Waity's places there. query.resolved names it."},"total":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"How many places matched before limit cut the list; null for ids."},"category":{"anyOf":[{"type":"array","items":{"type":"string","description":"A category id from the category tree, e.g. er, urgent-care, dmv, airport, border. GET /v1/categories lists the covered ones."}},{"type":"null"}]},"open":{"type":["boolean","null"]},"sort":{"anyOf":[{"type":"string","enum":["distance","wait","total"]},{"type":"null"}]},"limit":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"view":{"type":"string","enum":["full","minimal"]},"searched_km":{"type":["number","null"]},"furthest_km":{"type":["number","null"]},"resolved":{"anyOf":[{"type":"object","properties":{"label":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"source":{"type":"string","enum":["q","ip"],"description":"q: a city or ZIP in q. ip: q asked for places near the caller with no location, so Waity used the approximate city of the caller's network (REST only, for a person's own tool such as curl or a browser on a home broadband network; never for servers, apps, agents, MCP, VPNs or mobile networks). Say the city to the user and ask for their location before directing them anywhere."},"approx_km":{"description":"How far off the point can be, in km, when source is ip (null for q).","type":["number","null"]}},"required":["label","lat","lng","source","approx_km"],"additionalProperties":false},{"type":"null"}],"description":"The point the list is around when no near was given: a city or ZIP in q (match \"location\", 3 decimals), or the approximate location from the caller's network (source ip, 2 decimals; match null). Distances without near are from here."}},"required":["near","cell","q","ids","match","total","category","open","sort","limit","view","searched_km","furthest_km","resolved"],"additionalProperties":false},"coverage":{"type":"string","enum":["live","no_live_data","all_closed","partial","none_open","none"]},"places":{"type":"array","items":{"$ref":"#/components/schemas/ItemMinimal"}},"notes":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"},"description":"Sentences to read to the user."},"diagnostics":{"type":"array","items":{"type":"string"},"description":"For the agent or developer: unknown parameters and the like."},"answer_id":{"type":"string"},"attribution":{"type":"array","items":{"type":"string"},"description":"Lines to show with the data: \"Data by Waity\"."},"links":{"type":"object","properties":{"self":{"type":"string"},"full":{"type":"string"},"minimal":{"type":"string"},"suggested":{"description":"Only on an empty answer: a ready follow-up call for what q most likely meant (the city a misspelling names, with the categories read from q; or the lanes Waity tracks at the port or airport q named). Confirm with the user before making it.","type":"string"}},"required":["self","full","minimal"],"additionalProperties":false}},"required":["query","coverage","places","notes","warnings","diagnostics","answer_id","attribution","links"],"additionalProperties":false},"SingleFull":{"type":"object","properties":{"place":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","description":"A category id from the category tree, e.g. er, urgent-care, dmv, airport, border. GET /v1/categories lists the covered ones."},"parent":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"open_now":{"type":"boolean"},"opens_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"closes_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"timezone":{"type":"string"},"sample":{"type":"boolean"},"facility":{"description":"ERs only: hospital_ed (an ER in a hospital) or freestanding_ed (a freestanding ER with no inpatient beds or surgery; a serious case is transferred to a hospital). Null for every other place, urgent cares included. A place's hand-curated note (a lane restriction, the gates a checkpoint serves) is in the answer's notes.","anyOf":[{"type":"string","enum":["hospital_ed","freestanding_ed"]},{"type":"null"}]},"audience":{"type":"string","enum":["all","children","women"],"description":"Who the place serves: \"children\" for a children-only ER or urgent care (a pediatric ER, a children's hospital), never to be suggested for an adult; \"women\" for an obstetric ER at a women's hospital (pregnancy emergencies), never a general ER; \"all\" otherwise."},"lane":{"anyOf":[{"type":"string","enum":["general","precheck","clear","standard","ready","sentri","nexus"]},{"type":"null"}]},"url":{"type":"string"},"api_url":{"type":"string"},"address":{"type":["string","null"]},"phone":{"type":["string","null"]},"lat":{"type":"number"},"lng":{"type":"number"},"h3_r8":{"type":"string"},"hours":{"anyOf":[{"anyOf":[{"type":"string","const":"24/7"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}]},{"type":"null"}],"description":"Posted weekly hours. Null while the source reports a 24/7 place closed: no schedule is known until it reopens."},"lanes_not_tracked":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]}},"required":["id","name","category","parent","open_now","opens_at","closes_at","timezone","sample","audience","lane","url","api_url","address","phone","lat","lng","h3_r8","hours","lanes_not_tracked"],"additionalProperties":false},"summary":{"type":"string"},"now":{"$ref":"#/components/schemas/Now"},"usual":{"anyOf":[{"$ref":"#/components/schemas/Usual"},{"type":"null"}]},"next":{"type":"object","properties":{"for_date":{"type":["string","null"]},"summary":{"type":["string","null"]},"based_on":{"anyOf":[{"type":"string","enum":["live","usual"]},{"type":"null"}]},"under":{"type":"number"},"under_status":{"type":"string","enum":["already","usually_under","expected","not_expected","not_now","no_data","closed_all_day","closed_rest_of_day","not_published"]},"under_by":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"best":{"anyOf":[{"type":"object","properties":{"from":{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},"to":{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["from","to","value"],"additionalProperties":false},{"type":"null"}]},"leave_by":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"confidence":{"type":"string","enum":["none","low","medium","high"]},"days_of_history":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"forecast":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},"open":{"description":"Null when unknown: the source says closed now and doesn't say when it reopens.","type":["boolean","null"]},"open_minutes":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"value":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["at","open","open_minutes","value"],"additionalProperties":false}}},"required":["for_date","summary","based_on","under","under_status","under_by","best","leave_by","confidence","days_of_history","forecast"],"additionalProperties":false},"instead":{"type":"array","items":{"$ref":"#/components/schemas/ItemFull"}},"distance":{"anyOf":[{"type":"object","properties":{"km":{"type":"number"},"from":{"type":"string","description":"Where the distance is measured from: \"you\" (near or the location header), \"this place\" (alternatives with no caller point), or the label of the city or ZIP q was read as (query.resolved.label, e.g. \"Brooklyn, NY\"), or \"<city> (approximate)\" for a location guessed from the caller's network (query.resolved.source ip)."}},"required":["km","from"],"additionalProperties":false},{"type":"null"}]},"best_on_day":{"type":"null"},"vs_requested":{"type":"null"},"notes":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"},"description":"Sentences to read to the user."},"diagnostics":{"type":"array","items":{"type":"string"},"description":"For the agent or developer: unknown parameters and the like."},"answer_id":{"type":"string"},"attribution":{"type":"array","items":{"type":"string"},"description":"Lines to show with the data: \"Data by Waity\"."},"links":{"type":"object","properties":{"self":{"type":"string"},"full":{"type":"string"},"minimal":{"type":"string"},"details":{"type":"string"},"page":{"type":"string"},"plan_day":{"type":["string","null"]},"alternatives":{"type":["string","null"]},"airport":{"type":["string","null"]},"group":{"type":["string","null"]}},"required":["self","full","minimal","details","page","plan_day","alternatives","airport","group"],"additionalProperties":false}},"required":["place","summary","now","usual","next","instead","distance","best_on_day","vs_requested","notes","warnings","diagnostics","answer_id","attribution","links"],"additionalProperties":false},"SingleMinimal":{"type":"object","properties":{"place":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","description":"A category id from the category tree, e.g. er, urgent-care, dmv, airport, border. GET /v1/categories lists the covered ones."},"parent":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"open_now":{"type":"boolean"},"opens_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"closes_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"timezone":{"type":"string"},"sample":{"type":"boolean"},"facility":{"description":"ERs only: hospital_ed (an ER in a hospital) or freestanding_ed (a freestanding ER with no inpatient beds or surgery; a serious case is transferred to a hospital). Null for every other place, urgent cares included. A place's hand-curated note (a lane restriction, the gates a checkpoint serves) is in the answer's notes.","anyOf":[{"type":"string","enum":["hospital_ed","freestanding_ed"]},{"type":"null"}]},"audience":{"type":"string","enum":["all","children","women"],"description":"Who the place serves: \"children\" for a children-only ER or urgent care (a pediatric ER, a children's hospital), never to be suggested for an adult; \"women\" for an obstetric ER at a women's hospital (pregnancy emergencies), never a general ER; \"all\" otherwise."}},"required":["id","name","category","parent","open_now","opens_at","closes_at","timezone","sample","audience"],"additionalProperties":false},"summary":{"type":"string"},"now":{"type":"object","properties":{"status":{"type":"string","enum":["live","stale","paused","closed","unknown"]},"usable":{"type":"boolean"},"value":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Minutes; set only when usable."},"unit":{"type":"string","const":"min"},"bound":{"anyOf":[{"type":"string","enum":["exact","upper","lower","range"]},{"type":"null"}],"description":"exact; upper (\"Under 5 min\"); lower (\"Over 60 min\": some sources post any ER wait over an hour as 60+); range (value_low to value, \"6–9 min\")."},"value_low":{"description":"With bound range, the low end: \"6–9 min\" is value_low 6, value 9. Absent otherwise.","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"reason":{"anyOf":[{"type":"string","enum":["closed","feed_paused","source_not_reporting","not_published","out_of_date","no_recent_data"]},{"type":"null"}]},"trend":{"anyOf":[{"type":"string","enum":["rising","falling","steady"]},{"type":"null"}]},"basis":{"anyOf":[{"type":"string","enum":["median","average","estimate","max"]},{"type":"null"}],"description":"What the source posts: median, average, estimate, or max (the current longest wait). Waits with different bases or sources are not comparable: compare minutes only within one source."},"measured_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}],"description":"When the number was posted; null when none was (closed, source_not_reporting)."},"usable_until":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}],"description":"When now.value stops being usable (measured_at + stale_after_s); after it, ask again. Null when there is no usable value."},"source":{"anyOf":[{"type":"object","properties":{"short":{"type":"string","description":"An opaque source id, e.g. \"src_7qm2\": equal ids mean the same publisher and method. Stable across REST, MCP and history; it names no one. Minutes compare only between waits with the same source.short and basis."}},"required":["short"],"additionalProperties":false},{"type":"null"}],"description":"The opaque source id, the same as now.source.short in view=full. Null when there is no source."}},"required":["status","usable","value","unit","bound","reason","trend","basis","measured_at","usable_until","source"],"additionalProperties":false},"usual":{"anyOf":[{"type":"object","properties":{"value":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"compared":{"anyOf":[{"type":"string","enum":["worse","normal","better"]},{"type":"null"}]}},"required":["value","compared"],"additionalProperties":false},{"type":"null"}]},"next":{"type":"object","properties":{"under":{"type":"number"},"under_status":{"type":"string","enum":["already","usually_under","expected","not_expected","not_now","no_data","closed_all_day","closed_rest_of_day","not_published"]},"under_by":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"best":{"anyOf":[{"type":"object","properties":{"from":{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},"to":{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},"value":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["from","to","value"],"additionalProperties":false},{"type":"null"}]},"summary":{"type":["string","null"]},"leave_by":{"description":"Present only when travel_min is given.","anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"forecast":{"type":"array","items":{"type":"object","properties":{"at":{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},"value":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["at","value"],"additionalProperties":false}}},"required":["under","under_status","under_by","best","summary"],"additionalProperties":false},"distance":{"anyOf":[{"type":"object","properties":{"km":{"type":"number"},"from":{"type":"string","description":"Where the distance is measured from: \"you\" (near or the location header), \"this place\" (alternatives with no caller point), or the label of the city or ZIP q was read as (query.resolved.label, e.g. \"Brooklyn, NY\"), or \"<city> (approximate)\" for a location guessed from the caller's network (query.resolved.source ip)."}},"required":["km","from"],"additionalProperties":false},{"type":"null"}]},"notes":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"},"description":"Sentences to read to the user."},"diagnostics":{"type":"array","items":{"type":"string"},"description":"For the agent or developer: unknown parameters and the like."},"answer_id":{"type":"string"},"attribution":{"type":"array","items":{"type":"string"},"description":"Lines to show with the data: \"Data by Waity\"."},"links":{"type":"object","properties":{"self":{"type":"string"},"full":{"type":"string"},"minimal":{"type":"string"},"details":{"type":"string"},"page":{"type":"string"},"plan_day":{"type":["string","null"]},"alternatives":{"type":["string","null"]},"airport":{"type":["string","null"]},"group":{"type":["string","null"]}},"required":["self","full","minimal","details","page","plan_day","alternatives","airport","group"],"additionalProperties":false}},"required":["place","summary","now","usual","next","distance","notes","warnings","diagnostics","answer_id","attribution","links"],"additionalProperties":false},"GroupFull":{"type":"object","properties":{"place":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","description":"A category id from the category tree, e.g. er, urgent-care, dmv, airport, border. GET /v1/categories lists the covered ones."},"parent":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"open_now":{"type":"boolean"},"opens_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"closes_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"timezone":{"type":"string"},"sample":{"type":"boolean"},"facility":{"description":"ERs only: hospital_ed (an ER in a hospital) or freestanding_ed (a freestanding ER with no inpatient beds or surgery; a serious case is transferred to a hospital). Null for every other place, urgent cares included. A place's hand-curated note (a lane restriction, the gates a checkpoint serves) is in the answer's notes.","anyOf":[{"type":"string","enum":["hospital_ed","freestanding_ed"]},{"type":"null"}]},"audience":{"type":"string","enum":["all","children","women"],"description":"Who the place serves: \"children\" for a children-only ER or urgent care (a pediatric ER, a children's hospital), never to be suggested for an adult; \"women\" for an obstetric ER at a women's hospital (pregnancy emergencies), never a general ER; \"all\" otherwise."},"lanes_tracked":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"lane":{"type":"null"},"url":{"type":"string"},"api_url":{"type":"string"},"lanes_not_tracked":{"type":"array","items":{"type":"string"}}},"required":["id","name","category","parent","open_now","opens_at","closes_at","timezone","sample","audience","lanes_tracked","lane","url","api_url","lanes_not_tracked"],"additionalProperties":false},"summary":{"type":"string"},"coverage":{"type":"string","enum":["live","no_live_data","all_closed","partial","none_open","none"]},"lanes":{"type":"array","items":{"$ref":"#/components/schemas/ItemFull"}},"distance":{"anyOf":[{"type":"object","properties":{"km":{"type":"number"},"from":{"type":"string","description":"Where the distance is measured from: \"you\" (near or the location header), \"this place\" (alternatives with no caller point), or the label of the city or ZIP q was read as (query.resolved.label, e.g. \"Brooklyn, NY\"), or \"<city> (approximate)\" for a location guessed from the caller's network (query.resolved.source ip)."}},"required":["km","from"],"additionalProperties":false},{"type":"null"}]},"notes":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"},"description":"Sentences to read to the user."},"diagnostics":{"type":"array","items":{"type":"string"},"description":"For the agent or developer: unknown parameters and the like."},"answer_id":{"type":"string"},"attribution":{"type":"array","items":{"type":"string"},"description":"Lines to show with the data: \"Data by Waity\"."},"links":{"type":"object","properties":{"self":{"type":"string"},"full":{"type":"string"},"minimal":{"type":"string"},"details":{"type":"string"},"page":{"type":"string"},"plan_day":{"type":["string","null"]},"alternatives":{"type":["string","null"]},"airport":{"type":["string","null"]},"group":{"type":["string","null"]}},"required":["self","full","minimal","details","page","plan_day","alternatives","airport","group"],"additionalProperties":false}},"required":["place","summary","coverage","lanes","distance","notes","warnings","diagnostics","answer_id","attribution","links"],"additionalProperties":false},"GroupMinimal":{"type":"object","properties":{"place":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","description":"A category id from the category tree, e.g. er, urgent-care, dmv, airport, border. GET /v1/categories lists the covered ones."},"parent":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"open_now":{"type":"boolean"},"opens_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"closes_at":{"anyOf":[{"type":"string","description":"ISO 8601 local time with offset, e.g. 2026-10-29T21:03:16-04:00"},{"type":"null"}]},"timezone":{"type":"string"},"sample":{"type":"boolean"},"facility":{"description":"ERs only: hospital_ed (an ER in a hospital) or freestanding_ed (a freestanding ER with no inpatient beds or surgery; a serious case is transferred to a hospital). Null for every other place, urgent cares included. A place's hand-curated note (a lane restriction, the gates a checkpoint serves) is in the answer's notes.","anyOf":[{"type":"string","enum":["hospital_ed","freestanding_ed"]},{"type":"null"}]},"audience":{"type":"string","enum":["all","children","women"],"description":"Who the place serves: \"children\" for a children-only ER or urgent care (a pediatric ER, a children's hospital), never to be suggested for an adult; \"women\" for an obstetric ER at a women's hospital (pregnancy emergencies), never a general ER; \"all\" otherwise."},"lanes_tracked":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","name","category","parent","open_now","opens_at","closes_at","timezone","sample","audience","lanes_tracked"],"additionalProperties":false},"summary":{"type":"string"},"coverage":{"type":"string","enum":["live","no_live_data","all_closed","partial","none_open","none"]},"lanes":{"type":"array","items":{"$ref":"#/components/schemas/ItemMinimal"}},"distance":{"anyOf":[{"type":"object","properties":{"km":{"type":"number"},"from":{"type":"string","description":"Where the distance is measured from: \"you\" (near or the location header), \"this place\" (alternatives with no caller point), or the label of the city or ZIP q was read as (query.resolved.label, e.g. \"Brooklyn, NY\"), or \"<city> (approximate)\" for a location guessed from the caller's network (query.resolved.source ip)."}},"required":["km","from"],"additionalProperties":false},{"type":"null"}]},"notes":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"},"description":"Sentences to read to the user."},"diagnostics":{"type":"array","items":{"type":"string"},"description":"For the agent or developer: unknown parameters and the like."},"answer_id":{"type":"string"},"attribution":{"type":"array","items":{"type":"string"},"description":"Lines to show with the data: \"Data by Waity\"."},"links":{"type":"object","properties":{"self":{"type":"string"},"full":{"type":"string"},"minimal":{"type":"string"},"details":{"type":"string"},"page":{"type":"string"},"plan_day":{"type":["string","null"]},"alternatives":{"type":["string","null"]},"airport":{"type":["string","null"]},"group":{"type":["string","null"]}},"required":["self","full","minimal","details","page","plan_day","alternatives","airport","group"],"additionalProperties":false}},"required":["place","summary","coverage","lanes","distance","notes","warnings","diagnostics","answer_id","attribution","links"],"additionalProperties":false},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_parameter","missing_location","invalid_json","invalid_key","unauthorized","key_required","place_not_found","not_found","invalid_promo","method_not_allowed","gone","key_exists","key_limit","already_subscribed","no_subscription","unsupported_media_type","rate_limited","quota_exceeded","server_error","unavailable","accounts_closed"]},"message":{"type":"string"},"request_id":{"type":"string"},"param":{"type":"string"},"retry_after_s":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["code","message","request_id"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"Categories":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A category id from the category tree, e.g. er, urgent-care, dmv, airport, border. GET /v1/categories lists the covered ones."},"label":{"type":"string"},"plural":{"type":"string","description":"e.g. \"emergency rooms\"."},"parent":{"description":"The parent category id (health, travel, government, ...); null for a top-level group.","type":["string","null"]},"group":{"type":"string","description":"The top-level group: health, travel, government, ..."},"default_under":{"type":"number"},"unit":{"type":"string","const":"minutes"},"emergency":{"type":"boolean","description":"true for emergency categories (ERs): answers lead with the 911 line; never call results the nearest."},"places":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Places and lanes Waity lists in this category today."},"live_places":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"How many of them have a live wait feed."},"coverage":{"type":"string","enum":["live","no_live_data","none"],"description":"live: some places post live waits. no_live_data: places are listed but none posts a live wait. none: Waity doesn't cover this category yet."}},"required":["id","label","plural","parent","group","default_under","unit","emergency","places","live_places","coverage"],"additionalProperties":false},"description":"The categories Waity covers now (an enabled source feeds places in them), in tree order. Any other category id is accepted and answered with coverage none."},"tree":{"description":"With tree=true: the covered branches of the category tree, top-level groups first, with counts.","type":"array","items":{"$ref":"#/components/schemas/__shared#/$defs/schema0"}}},"required":["categories"],"additionalProperties":false},"Health":{"type":"object","properties":{"status":{"type":"string","enum":["ok","degraded"],"description":"degraded when any live data feed is failing or late; the API still answers (affected places show stale or no live waits)."},"time":{"type":"string","description":"UTC, ISO 8601 with Z, e.g. 2026-10-30T18:18:42Z."},"live_data":{"type":"object","properties":{"status":{"type":"string","enum":["ok","delayed","down"],"description":"ok: every live feed is current. delayed: some are failing or late. down: all are."},"freshest_age_s":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Seconds since the newest good live update."},"delayed_count":{"description":"How many feeds are delayed; present only when some are.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["status","freshest_age_s"],"additionalProperties":false},"api":{"type":"string","const":"ok"},"conditions":{"type":"object","properties":{"status":{"type":"string","enum":["ok","delayed","unknown"]}},"required":["status"],"additionalProperties":false,"description":"Background jobs that collect weather, alerts and calendar data for analysis. They never change status: no answer uses them."}},"required":["status","time","live_data","api","conditions"],"additionalProperties":false},"__shared":{"$defs":{"schema0":{"type":"object","properties":{"id":{"type":"string","description":"A category id from the category tree, e.g. er, urgent-care, dmv, airport, border. GET /v1/categories lists the covered ones."},"label":{"type":"string"},"plural":{"type":"string"},"places":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Places and lanes in this category and every one under it."},"live_places":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"children":{"type":"array","items":{"$ref":"#/components/schemas/__shared#/$defs/schema0"}}},"required":["id","label","plural","places","live_places","children"],"additionalProperties":false}}},"HistoryRaw":{"type":"object","properties":{"place":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string"},"parent":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"timezone":{"type":"string"},"lane":{"anyOf":[{"type":"string","enum":["general","precheck","clear","standard","ready","sentri","nexus"]},{"type":"null"}]},"facility":{"anyOf":[{"type":"string","enum":["hospital_ed","freestanding_ed"]},{"type":"null"}],"description":"ERs only. freestanding_ed: no inpatient beds or surgery; say freestanding."},"audience":{"type":"string","enum":["all","children","women"],"description":"children: children only; never send an adult. women: pregnancy emergencies only."},"url":{"type":"string","format":"uri"},"api_url":{"type":"string","format":"uri"}},"required":["id","name","category","parent","timezone","lane","facility","audience","url","api_url"],"additionalProperties":false},"summary":{"type":"string"},"range":{"type":"object","properties":{"from":{"type":"string","description":"ISO 8601, the place's local time with offset"},"to":{"type":"string","description":"Exclusive."},"granularity":{"type":"string","enum":["raw","hour","day"]},"tier":{"type":"string"},"timezone":{"type":"string"},"clipped":{"type":"boolean","description":"true: the plan reads less far back than asked; from moved."},"clipped_reason":{"anyOf":[{"type":"string","enum":["plan_history_window"]},{"type":"null"}]},"plan":{"type":"string"},"window_days":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"How many days back the plan reads; null is unlimited."},"earliest_allowed":{"anyOf":[{"type":"string","description":"ISO 8601, the place's local time with offset"},{"type":"null"}]},"data_from":{"anyOf":[{"type":"string","description":"ISO 8601, the place's local time with offset"},{"type":"null"}],"description":"Where Waity's history for this place starts."}},"required":["from","to","granularity","tier","timezone","clipped","clipped_reason","plan","window_days","earliest_allowed","data_from"],"additionalProperties":false},"page":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"returned":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}},"required":["limit","returned","has_more","next_cursor"],"additionalProperties":false},"sources":{"type":"array","items":{"type":"object","properties":{"short":{"type":"string","description":"An opaque source id (\"src_7qm2\"): equal ids mean the same publisher and method; it names no one. Minutes compare only within one source and basis."},"name":{"type":"string"},"tier":{"type":"string","enum":["official","place","agent","inferred"]},"basis":{"anyOf":[{"type":"string","enum":["median","average","estimate","max","typical"]},{"type":"null"}]}},"required":["short","name","tier","basis"],"additionalProperties":false}},"notes":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"diagnostics":{"type":"array","items":{"type":"string"}},"links":{"type":"object","properties":{"self":{"anyOf":[{"type":"object","properties":{"tool":{"type":"string","const":"get_history"},"arguments":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["tool","arguments"],"additionalProperties":false},{"type":"string","format":"uri"}]},"next":{"type":["string","null"],"format":"uri","description":"The next page, or null."},"place":{"anyOf":[{"type":"object","properties":{"tool":{"type":"string","const":"get_wait"},"arguments":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["tool","arguments"],"additionalProperties":false},{"type":"string","format":"uri"}]}},"required":["self","next","place"],"additionalProperties":false},"attribution":{"type":"array","items":{"type":"string"}},"observations":{"type":"array","items":{"type":"object","properties":{"t":{"type":"string","description":"When the number was posted."},"value":{"type":["number","null"]},"value_low":{"type":["number","null"]},"unit":{"type":"string","const":"min"},"bound":{"anyOf":[{"type":"string","enum":["exact","upper","lower","range"],"description":"upper: \"Under N min\". lower: \"Over N min\", never an exact figure. range: \"value_low-value min\"."},{"type":"null"}]},"status":{"type":"string"},"basis":{"anyOf":[{"type":"string","enum":["median","average","estimate","max","typical"]},{"type":"null"}]},"people_waiting":{"type":"integer","minimum":0,"maximum":9007199254740991},"source":{"type":"object","properties":{"short":{"type":"string","description":"An opaque source id (\"src_7qm2\"): equal ids mean the same publisher and method; it names no one. Minutes compare only within one source and basis."}},"required":["short"],"additionalProperties":false}},"required":["t","value","unit","bound","status","basis","source"],"additionalProperties":false}}},"required":["place","summary","range","page","sources","notes","warnings","links","attribution","observations"],"additionalProperties":false},"HistoryAggregate":{"type":"object","properties":{"place":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string"},"parent":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"timezone":{"type":"string"},"lane":{"anyOf":[{"type":"string","enum":["general","precheck","clear","standard","ready","sentri","nexus"]},{"type":"null"}]},"facility":{"anyOf":[{"type":"string","enum":["hospital_ed","freestanding_ed"]},{"type":"null"}],"description":"ERs only. freestanding_ed: no inpatient beds or surgery; say freestanding."},"audience":{"type":"string","enum":["all","children","women"],"description":"children: children only; never send an adult. women: pregnancy emergencies only."},"url":{"type":"string","format":"uri"},"api_url":{"type":"string","format":"uri"}},"required":["id","name","category","parent","timezone","lane","facility","audience","url","api_url"],"additionalProperties":false},"summary":{"type":"string"},"range":{"type":"object","properties":{"from":{"type":"string","description":"ISO 8601, the place's local time with offset"},"to":{"type":"string","description":"Exclusive."},"granularity":{"type":"string","enum":["raw","hour","day"]},"tier":{"type":"string"},"timezone":{"type":"string"},"clipped":{"type":"boolean","description":"true: the plan reads less far back than asked; from moved."},"clipped_reason":{"anyOf":[{"type":"string","enum":["plan_history_window"]},{"type":"null"}]},"plan":{"type":"string"},"window_days":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"How many days back the plan reads; null is unlimited."},"earliest_allowed":{"anyOf":[{"type":"string","description":"ISO 8601, the place's local time with offset"},{"type":"null"}]},"data_from":{"anyOf":[{"type":"string","description":"ISO 8601, the place's local time with offset"},{"type":"null"}],"description":"Where Waity's history for this place starts."}},"required":["from","to","granularity","tier","timezone","clipped","clipped_reason","plan","window_days","earliest_allowed","data_from"],"additionalProperties":false},"page":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"returned":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}},"required":["limit","returned","has_more","next_cursor"],"additionalProperties":false},"sources":{"type":"array","items":{"type":"object","properties":{"short":{"type":"string","description":"An opaque source id (\"src_7qm2\"): equal ids mean the same publisher and method; it names no one. Minutes compare only within one source and basis."},"name":{"type":"string"},"tier":{"type":"string","enum":["official","place","agent","inferred"]},"basis":{"anyOf":[{"type":"string","enum":["median","average","estimate","max","typical"]},{"type":"null"}]}},"required":["short","name","tier","basis"],"additionalProperties":false}},"notes":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}},"diagnostics":{"type":"array","items":{"type":"string"}},"links":{"type":"object","properties":{"self":{"anyOf":[{"type":"object","properties":{"tool":{"type":"string","const":"get_history"},"arguments":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["tool","arguments"],"additionalProperties":false},{"type":"string","format":"uri"}]},"next":{"type":["string","null"],"format":"uri","description":"The next page, or null."},"place":{"anyOf":[{"type":"object","properties":{"tool":{"type":"string","const":"get_wait"},"arguments":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["tool","arguments"],"additionalProperties":false},{"type":"string","format":"uri"}]}},"required":["self","next","place"],"additionalProperties":false},"attribution":{"type":"array","items":{"type":"string"}},"buckets":{"type":"array","items":{"type":"object","properties":{"t":{"type":"string","description":"Start of the hour or local day."},"date":{"type":"string"},"avg":{"description":"Time-weighted mean while open.","type":["number","null"]},"median":{"type":["number","null"]},"p90":{"type":["number","null"]},"min":{"type":["number","null"]},"max":{"type":["number","null"]},"n":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Posted updates."},"open_share":{"type":"number","minimum":0,"maximum":1},"hours":{"type":"integer","minimum":0,"maximum":9007199254740991},"partial":{"type":"boolean","description":"True for the hour or day still in progress: n counts updates so far and open_share is over the part gone by."},"unit":{"type":"string","const":"min"}},"required":["t","avg","median","p90","min","max","n","open_share","partial","unit"],"additionalProperties":false}}},"required":["place","summary","range","page","sources","notes","warnings","links","attribution","buckets"],"additionalProperties":false}},"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-Api-Key"},"bearer":{"type":"http","scheme":"bearer"}},"responses":{"Error":{"description":"Error. Codes: invalid_parameter (400), missing_location (400), invalid_json (400), invalid_key (401), unauthorized (401), key_required (401), place_not_found (404), not_found (404), invalid_promo (404), method_not_allowed (405), gone (410), key_exists (409), key_limit (409), already_subscribed (409), no_subscription (409), unsupported_media_type (415), rate_limited (429), quota_exceeded (429), server_error (500), unavailable (503), accounts_closed (503).","headers":{"Retry-After":{"description":"On 429 (rate_limited, the burst limit, or quota_exceeded, the daily quota; both with the RateLimit headers) and 503: seconds to wait.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}