{"openapi":"3.1.0","info":{"title":"Ivy public events API","version":"1.0.0","summary":"Read-only feed of public NYC events on Ivy (ivylink.co).","description":"Ivy aggregates NYC events from Luma, Partiful, Posh, Eventbrite, DICE and more, plus events created on Ivy itself. Every GET needs no key and returns only public event data.\n\nnode_count is the number of Ivy users who linked the event (\"Link This\"); link_count is an alias with the same value.\n\nRate limits: 60 requests per minute per IP. Over the limit you get 429 with a Retry-After header (seconds).\n\nCaching: 200 responses carry Cache-Control: public, s-maxage=60, stale-while-revalidate=300 and a weak ETag; send it back in If-None-Match to get 304 Not Modified.\n\nAttribution: events link back to their source; cite ivylink.co. Keep source, external_url and attribution when you show an event.\n\nA plain-text guide for LLMs and agents lives at https://www.ivylink.co/llms.txt (full field reference: /llms-full.txt). This document is served at /api/docs (HTML view: /api/docs?view=html). Human-readable developer guide: https://www.ivylink.co/developers.\n\nCalendar feeds: GET /api/feed and /feed/{slug}.ics return the next 30 days of events as an iCalendar (RFC 5545) feed you can subscribe to from Apple Calendar, Google Calendar or Outlook (https:// or webcal://).","contact":{"name":"Ivy","url":"https://www.ivylink.co","email":"hello@ivylink.co"}},"servers":[{"url":"https://www.ivylink.co"}],"tags":[{"name":"events","description":"Public NYC events"},{"name":"feeds","description":"Subscribable iCalendar (ICS) feeds"},{"name":"neighborhoods","description":"Neighborhood activity rollups"}],"paths":{"/api/public/events":{"get":{"operationId":"listEvents","tags":["events"],"summary":"List public events","description":"Public, active events in a date window (default: the next 7 days, America/New_York). Filters combine with AND. Results are paged with an opaque cursor: pass next_cursor from one page as cursor (with the same sort) to get the next page; next_cursor is null on the last page.","parameters":[{"name":"preset","in":"query","required":false,"description":"Named date window in America/New_York. today runs until 04:00 the next morning. all has no date bounds (Ivy-native events of any date plus aggregated events from today through the next 60 days). from / to override the matching bound.","schema":{"type":"string","enum":["all","past","today","next7","weekend","week","month"],"default":"next7"}},{"name":"from","in":"query","required":false,"description":"Inclusive lower bound on the event start, ISO 8601. Overrides the preset's start.","schema":{"type":"string","format":"date-time"},"example":"2030-05-03T00:00:00-04:00"},{"name":"to","in":"query","required":false,"description":"Exclusive upper bound on the event start, ISO 8601. Overrides the preset's end.","schema":{"type":"string","format":"date-time"},"example":"2030-05-10T00:00:00-04:00"},{"name":"type","in":"query","required":false,"description":"Event type slug (matches if any of the event's event_types matches). all means no filter. Legacy values music, theater, reading and talk are mapped onto live_music, comedy_performance and reading_talks; any other value is accepted but matches nothing.","schema":{"type":"string","enum":["all","party","live_music","art","reading_talks","tech","fitness_outdoor","food_drink","comedy_performance","film","markets_community","music","theater","reading","talk"],"default":"all"}},{"name":"category","in":"query","required":false,"description":"Exact match on the event's category, case-insensitive.","schema":{"type":"string"},"example":"film"},{"name":"neighborhood","in":"query","required":false,"description":"Neighborhood or area, by name or slug, case-insensitive. Matches the event's neighborhood, area.name or area.slug.","schema":{"type":"string"},"example":"williamsburg"},{"name":"q","in":"query","required":false,"description":"Case-insensitive substring of the title.","schema":{"type":"string"},"example":"jazz"},{"name":"sort","in":"query","required":false,"description":"date: start time ascending. links: node_count descending, then start time. newest: most recently added to Ivy first. trending: node_count_delta descending, then node_count descending, then start time. Falls back to links order if link timestamps are unavailable.","schema":{"type":"string","enum":["date","links","newest","trending"],"default":"date"}},{"name":"limit","in":"query","required":false,"description":"Page size. A positive integer; values above 200 are clamped to 200. 0, negatives and non-integers are a 400. Defaults to 5 with view=agent.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque next_cursor from the previous page. Only valid with the sort it was issued for; anything else is a 400.","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]+$"}},{"name":"view","in":"query","required":false,"description":"Response shape. `agent` returns a compact pre-formatted event list in America/New_York time. Omit or use `full` for the default response.","schema":{"type":"string","enum":["full","agent"],"default":"full"}}],"responses":{"200":{"description":"One page of events.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControlOk"},"ETag":{"$ref":"#/components/headers/ETag"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventList"},"example":{"as_of":"2030-05-03T16:00:00.000Z","count":1,"next_cursor":"eyJ2IjoxLCJzIjoiZGF0ZSIsImsiOlsxOTA0MDc5NjAwMDAwLCIxMTExMTExMS0xMTExLTQxMTEtODExMS0xMTExMTExMTExMTEiXX0","events":[{"id":"11111111-1111-4111-8111-111111111111","title":"Example Reading Night","date":"2030-05-03T23:00:00+00:00","end_date":"2030-05-04T01:00:00+00:00","image_url":"https://www.ivylink.co/example/reading-night.jpg","category":null,"event_types":["reading_talks"],"source":"luma","external_url":"https://luma.com/example-reading-night","price_text":"Free","location":null,"visibility":"discoverable","venue_name":"Example Bookshop","neighborhood":"Williamsburg","area":{"slug":"williamsburg","name":"Williamsburg"},"node_count":3,"link_count":3,"node_count_delta":1,"link_count_delta":1,"url":"https://www.ivylink.co/e/11111111-1111-4111-8111-111111111111","attribution":{"source":"luma","source_url":"https://luma.com/example-reading-night","text":"Via Luma"}}]}}}},"304":{"$ref":"#/components/responses/NotModified"},"400":{"description":"Invalid query parameter. error is one of: Invalid preset or date range, Invalid sort, Invalid limit, Invalid cursor.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControlNone"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Invalid limit"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"options":{"operationId":"listEventsPreflight","tags":["events"],"summary":"CORS preflight","responses":{"204":{"$ref":"#/components/responses/Preflight"}}}},"/api/public/events/{id}":{"parameters":[{"name":"id","in":"path","required":true,"description":"Event id (UUID).","schema":{"type":"string","format":"uuid"},"example":"e7c8fc2f-16d3-4e43-80ca-988a945024bc"}],"get":{"operationId":"getEvent","tags":["events"],"summary":"Get one public event","description":"One event with the same fields as the list items. Unknown ids, malformed ids and events that are not public all return the same 404.","responses":{"200":{"description":"The event.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControlOk"},"ETag":{"$ref":"#/components/headers/ETag"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"},"example":{"as_of":"2030-05-03T16:00:00.000Z","event":{"id":"11111111-1111-4111-8111-111111111111","title":"Example Reading Night","date":"2030-05-03T23:00:00+00:00","end_date":"2030-05-04T01:00:00+00:00","image_url":"https://www.ivylink.co/example/reading-night.jpg","category":null,"event_types":["reading_talks"],"source":"luma","external_url":"https://luma.com/example-reading-night","price_text":"Free","location":null,"visibility":"discoverable","venue_name":"Example Bookshop","neighborhood":"Williamsburg","area":{"slug":"williamsburg","name":"Williamsburg"},"node_count":3,"link_count":3,"node_count_delta":1,"link_count_delta":1,"url":"https://www.ivylink.co/e/11111111-1111-4111-8111-111111111111","attribution":{"source":"luma","source_url":"https://luma.com/example-reading-night","text":"Via Luma"}}}}}},"304":{"$ref":"#/components/responses/NotModified"},"404":{"description":"No public event with this id.","headers":{"Cache-Control":{"description":"public, s-maxage=60","schema":{"type":"string"},"example":"public, s-maxage=60"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Not found"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"options":{"operationId":"getEventPreflight","tags":["events"],"summary":"CORS preflight","responses":{"204":{"$ref":"#/components/responses/Preflight"}}}},"/api/public/summary":{"get":{"operationId":"getSummary","tags":["events"],"summary":"Live counts and starter questions for the next 7 days","description":"Returns event counts for the next 7 New York days (total, tonight, this weekend, by day, by type, busiest neighborhoods) and four suggested questions built from those counts. No params. Call it once at the start of a conversation, before fetching any events. Covers the same events as /api/public/events for preset=next7.","responses":{"200":{"description":"Summary.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControlSummary"},"ETag":{"$ref":"#/components/headers/ETag"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryResponse"},"example":{"as_of":"2030-05-03T16:00:00.000Z","window":{"from":"2030-05-03","to":"2030-05-09"},"event_count":4,"neighborhood_count":3,"tonight_count":1,"weekend_count":4,"busiest_neighborhoods":[{"slug":"williamsburg","name":"Williamsburg","count":2},{"slug":"east-village","name":"East Village","count":1},{"slug":"soho-tribeca","name":"SoHo / Tribeca","count":1}],"by_day":[{"date":"2030-05-03","weekday":"Friday","count":1},{"date":"2030-05-04","weekday":"Saturday","count":3},{"date":"2030-05-05","weekday":"Sunday","count":0},{"date":"2030-05-06","weekday":"Monday","count":0},{"date":"2030-05-07","weekday":"Tuesday","count":0},{"date":"2030-05-08","weekday":"Wednesday","count":0},{"date":"2030-05-09","weekday":"Thursday","count":0}],"by_type":[{"type":"art","count":1},{"type":"comedy_performance","count":1},{"type":"live_music","count":1},{"type":"reading_talks","count":1}],"suggested_questions":["What's on in Williamsburg tonight?","What's happening this weekend?","Any art shows this week?","What's on in Williamsburg on Saturday night?"]}}}},"304":{"$ref":"#/components/responses/NotModified"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}},"options":{"operationId":"getSummaryPreflight","tags":["events"],"summary":"CORS preflight","responses":{"204":{"$ref":"#/components/responses/Preflight"}}}},"/api/feed":{"get":{"operationId":"calendarFeed","tags":["feeds"],"summary":"iCalendar feed of upcoming events","description":"The next 30 days of public events (from now, max 200) as an RFC 5545 calendar. Subscribe with the https URL or the same URL with webcal://. Filters combine with AND. No auth; 60 requests per minute per IP, shared with the JSON API.","parameters":[{"name":"neighborhood","in":"query","required":false,"description":"A known NYC neighborhood or area, by name or slug, case-insensitive (Ivy's curated areas, their legacy names, and NYC 2020 Neighborhood Tabulation Area names). Matches the event's neighborhood, area.name or area.slug. An unknown neighborhood is a 404; a known one with no events returns an empty calendar.","schema":{"type":"string"},"example":"williamsburg"},{"name":"type","in":"query","required":false,"description":"Event type slug (matches if any of the event's event_types matches). all means no filter. Legacy values music, theater, reading and talk are mapped onto live_music, comedy_performance and reading_talks; any other value is accepted but matches nothing.","schema":{"type":"string","enum":["all","party","live_music","art","reading_talks","tech","fitness_outdoor","food_drink","comedy_performance","film","markets_community","music","theater","reading","talk"],"default":"all"}},{"name":"category","in":"query","required":false,"description":"Exact match on the event's category, case-insensitive.","schema":{"type":"string"},"example":"film"},{"name":"trending","in":"query","required":false,"description":"true (or 1) orders by node_count_delta (links in the last 24 hours) descending, then node_count descending, then start time, the same order as sort=trending on /api/public/events (links order if link timestamps are unavailable). Calendar apps display by date anyway, so this mostly matters with a small limit. false (or 0) or absent: start time ascending.","schema":{"type":"string","enum":["true","false","1","0"],"default":"false"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of events. A positive integer; values above 200 are clamped to 200. 0, negatives and non-integers are a 400.","schema":{"type":"integer","minimum":1,"maximum":200,"default":200}}],"responses":{"200":{"$ref":"#/components/responses/Calendar"},"400":{"$ref":"#/components/responses/FeedBadRequest"},"404":{"$ref":"#/components/responses/FeedNotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/FeedInternalError"}}},"options":{"operationId":"calendarFeedPreflight","tags":["feeds"],"summary":"CORS preflight","responses":{"204":{"$ref":"#/components/responses/Preflight"}}}},"/feed/{slug}.ics":{"get":{"operationId":"calendarFeedBySlug","tags":["feeds"],"summary":"Subscribable calendar feed by neighborhood","description":"Vanity URLs for GET /api/feed: /feed/all.ics, /feed/trending.ics and /feed/<neighborhood>.ics (same as /api/feed?neighborhood=<neighborhood>). Same calendar, headers and errors. Subscribe with webcal://www.ivylink.co/feed/williamsburg.ics.","parameters":[{"name":"slug","in":"path","required":true,"description":"all (every NYC event), trending (all NYC in trending order) or a known neighborhood or area slug such as williamsburg or east-village. The URL must end in .ics.","schema":{"type":"string"},"example":"williamsburg"},{"name":"trending","in":"query","required":false,"description":"true (or 1) orders by node_count_delta (links in the last 24 hours) descending, then node_count descending, then start time, the same order as sort=trending on /api/public/events (links order if link timestamps are unavailable). Calendar apps display by date anyway, so this mostly matters with a small limit. false (or 0) or absent: start time ascending.","schema":{"type":"string","enum":["true","false","1","0"],"default":"false"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of events. A positive integer; values above 200 are clamped to 200. 0, negatives and non-integers are a 400.","schema":{"type":"integer","minimum":1,"maximum":200,"default":200}}],"responses":{"200":{"$ref":"#/components/responses/Calendar"},"400":{"$ref":"#/components/responses/FeedBadRequest"},"404":{"$ref":"#/components/responses/FeedNotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/FeedInternalError"}}},"options":{"operationId":"calendarFeedBySlugPreflight","tags":["feeds"],"summary":"CORS preflight","responses":{"204":{"$ref":"#/components/responses/Preflight"}}}}},"components":{"schemas":{"Event":{"type":"object","description":"A public event. Only event data: no data about Ivy users is ever included.","required":["id","title","date","image_url","category","event_types","source","external_url","price_text","location","visibility","venue_name","neighborhood","area","node_count","link_count","url","attribution"],"properties":{"id":{"type":"string","format":"uuid","description":"Event id."},"title":{"type":"string","description":"Event title."},"date":{"type":"string","format":"date-time","description":"Start time, ISO 8601."},"end_date":{"type":"string","format":"date-time","description":"End time, ISO 8601. Omitted when the event has no end time."},"image_url":{"type":["string","null"],"description":"Cover image URL."},"category":{"type":["string","null"],"description":"Free-form category (mostly Ivy-native events)."},"event_types":{"type":"array","description":"Event type slugs, possibly empty.","items":{"type":"string","enum":["party","live_music","art","reading_talks","tech","fitness_outdoor","food_drink","comedy_performance","film","markets_community"]}},"source":{"type":["string","null"],"description":"Where the event comes from: native (created on Ivy) or the source platform, e.g. luma, partiful, posh, eventbrite, dice.","examples":["native","partiful"]},"external_url":{"type":["string","null"],"description":"The event's page on its source platform."},"price_text":{"type":["string","null"],"description":"Price as shown by the source, e.g. Free or $20."},"location":{"type":["string","null"],"description":"Location text."},"visibility":{"type":["string","null"],"enum":["discoverable","ambient_only",null],"description":"Visibility level of the event on Ivy."},"venue_name":{"type":["string","null"],"description":"Venue name."},"neighborhood":{"type":"string","description":"NYC neighborhood, or \"No location yet\" when unknown."},"area":{"$ref":"#/components/schemas/Area"},"node_count":{"type":"integer","minimum":0,"description":"Number of Ivy users who linked this event (\"Link This\")."},"link_count":{"type":"integer","minimum":0,"description":"Alias of node_count (same value)."},"node_count_delta":{"type":"integer","minimum":0,"description":"Links gained in the last 24 hours: current links created within 24h of as_of. Omitted if link timestamps are unavailable."},"link_count_delta":{"type":"integer","minimum":0,"description":"Alias of node_count_delta."},"url":{"type":"string","format":"uri","description":"The event's page on Ivy: https://www.ivylink.co/e/{id}."},"attribution":{"description":"Credit for aggregated events; null for events created on Ivy.","oneOf":[{"$ref":"#/components/schemas/Attribution"},{"type":"null"}]}}},"Area":{"type":"object","description":"The heatmap area the neighborhood belongs to.","required":["slug","name"],"properties":{"slug":{"type":"string","example":"bushwick"},"name":{"type":"string","example":"Bushwick"}}},"Attribution":{"type":"object","description":"Show text and link source_url when displaying the event.","required":["source","source_url","text"],"properties":{"source":{"type":"string","example":"partiful"},"source_url":{"type":["string","null"],"description":"HTTPS link to the event on its source, when available."},"text":{"type":"string","example":"Via Partiful"}}},"EventList":{"type":"object","required":["as_of","count","next_cursor","events"],"properties":{"as_of":{"type":"string","format":"date-time","description":"When the response was generated."},"count":{"type":"integer","minimum":0,"description":"Number of events in this page."},"next_cursor":{"type":["string","null"],"description":"Pass as cursor to get the next page; null on the last page."},"events":{"type":"array","items":{"$ref":"#/components/schemas/Event"}}}},"EventResponse":{"type":"object","required":["as_of","event"],"properties":{"as_of":{"type":"string","format":"date-time","description":"When the response was generated."},"event":{"$ref":"#/components/schemas/Event"}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message."}}},"AgentEvent":{"type":"object","required":["title","when","venue","neighborhood","url","via","via_url"],"properties":{"title":{"type":"string"},"when":{"type":"string","example":"Fri Oct 30, 6:00 PM"},"ends":{"type":"string","example":"9:00 PM"},"venue":{"type":["string","null"]},"neighborhood":{"type":"string"},"price":{"type":"string"},"url":{"type":"string","format":"uri"},"via":{"type":"string"},"via_url":{"type":"string","format":"uri"}}},"AgentEventList":{"type":"object","required":["as_of","timezone","count","events"],"properties":{"as_of":{"type":"string","format":"date-time"},"timezone":{"type":"string","example":"America/New_York"},"count":{"type":"integer"},"next_cursor":{"type":["string","null"]},"events":{"type":"array","items":{"$ref":"#/components/schemas/AgentEvent"}}}},"SummaryResponse":{"type":"object","description":"Counts for the next 7 New York days plus four starter questions built from them. Counts only: no event payloads.","required":["as_of","window","event_count","neighborhood_count","tonight_count","weekend_count","busiest_neighborhoods","by_day","by_type","suggested_questions"],"properties":{"as_of":{"type":"string","format":"date-time","description":"When the counts were taken (UTC)."},"window":{"type":"object","description":"The New York calendar dates covered, today through today + 6.","required":["from","to"],"properties":{"from":{"type":"string","format":"date"},"to":{"type":"string","format":"date"}}},"event_count":{"type":"integer","description":"Public events in the window."},"neighborhood_count":{"type":"integer","description":"Curated neighborhoods with at least one event in the window."},"tonight_count":{"type":"integer","description":"Events tonight (preset=today)."},"weekend_count":{"type":"integer","description":"Events this weekend (preset=weekend) that fall inside the window."},"busiest_neighborhoods":{"type":"array","items":{"type":"object","required":["slug","name","count"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"count":{"type":"integer"}}},"maxItems":5,"description":"Top 5 neighborhoods by event count; ties by slug."},"by_day":{"type":"array","items":{"type":"object","required":["date","weekday","count"],"properties":{"date":{"type":"string","format":"date"},"weekday":{"type":"string"},"count":{"type":"integer"}}},"minItems":7,"maxItems":7,"description":"One entry per New York date in the window, today first."},"by_type":{"type":"array","items":{"type":"object","required":["type","count"],"properties":{"type":{"type":"string"},"count":{"type":"integer"}}},"maxItems":5,"description":"Top 5 event types by count; events with no type are skipped."},"suggested_questions":{"type":"array","items":{"type":"string"},"minItems":4,"maxItems":4,"description":"Four starter questions built from the counts. No dates or holiday names."}}}},"headers":{"CacheControlOk":{"description":"public, s-maxage=60, stale-while-revalidate=300","schema":{"type":"string"},"example":"public, s-maxage=60, stale-while-revalidate=300"},"CacheControlSummary":{"description":"public, s-maxage=300, stale-while-revalidate=600","schema":{"type":"string"},"example":"public, s-maxage=300, stale-while-revalidate=600"},"CacheControlNone":{"description":"no-store","schema":{"type":"string"},"example":"no-store"},"ETag":{"description":"Weak validator for the response data (as_of is excluded). Send it back in If-None-Match to get a 304.","schema":{"type":"string"},"example":"W/\"3q2bMv8m9hS2l0bA4yYk1n0xZ9c\""},"RetryAfter":{"description":"Seconds until the rate limit window resets.","schema":{"type":"integer","minimum":0},"example":42},"AllowOrigin":{"description":"Always *: any origin may call the API.","schema":{"type":"string","const":"*"}},"CacheControlFeed":{"description":"public, s-maxage=900, stale-while-revalidate=3600","schema":{"type":"string"},"example":"public, s-maxage=900, stale-while-revalidate=3600"},"CacheControlFeedNotFound":{"description":"public, s-maxage=60","schema":{"type":"string"},"example":"public, s-maxage=60"},"ContentDisposition":{"description":"inline, with a filename like ivy-williamsburg.ics, ivy-all.ics or ivy-trending.ics.","schema":{"type":"string"},"example":"inline; filename=\"ivy-williamsburg.ics\""}},"responses":{"NotModified":{"description":"Not Modified: If-None-Match matched the current ETag. Empty body.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControlOk"},"ETag":{"$ref":"#/components/headers/ETag"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}}},"RateLimited":{"description":"Too Many Requests: more than 60 requests per minute from this IP.","headers":{"Retry-After":{"$ref":"#/components/headers/RetryAfter"},"Cache-Control":{"$ref":"#/components/headers/CacheControlNone"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Rate limit exceeded"}}}},"InternalError":{"description":"Unexpected server error. Retry later.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControlNone"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Internal error"}}}},"Preflight":{"description":"CORS preflight. No body.","headers":{"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"},"Access-Control-Allow-Methods":{"schema":{"type":"string"},"example":"GET, OPTIONS"},"Access-Control-Allow-Headers":{"schema":{"type":"string"},"example":"Content-Type, If-None-Match"},"Access-Control-Max-Age":{"schema":{"type":"string"},"example":"86400"},"Allow":{"schema":{"type":"string"},"example":"GET, OPTIONS"}}},"Calendar":{"description":"An iCalendar (RFC 5545) feed: one VCALENDAR (VERSION 2.0, PRODID -//Ivy//ivylink.co//EN, X-WR-CALNAME \"Ivy: <filter>\", X-WR-TIMEZONE America/New_York, REFRESH-INTERVAL and X-PUBLISHED-TTL of 1 hour) with one VEVENT per event: UID <id>@ivylink.co, DTSTAMP (response time), DTSTART and DTEND in UTC (DTEND is DTSTART + 2 hours when the event has no end time), SUMMARY, DESCRIPTION (link counts, price, the Ivy URL and the source credit and link), URL (the Ivy event page), LOCATION, CATEGORIES (event types), STATUS:CONFIRMED and TRANSP:TRANSPARENT. CRLF line endings, lines folded at 75 octets, UTF-8. No images and no user data. A known neighborhood with no events in the window returns an empty calendar.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControlFeed"},"Content-Disposition":{"$ref":"#/components/headers/ContentDisposition"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"text/calendar":{"schema":{"type":"string"},"example":"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Ivy//ivylink.co//EN\r\nCALSCALE:GREGORIAN\r\nMETHOD:PUBLISH\r\nX-WR-CALNAME:Ivy: Williamsburg\r\nX-WR-CALDESC:Williamsburg events on Ivy (ivylink.co)\\, the next 30 days. Up\r\n dated hourly.\r\nX-WR-TIMEZONE:America/New_York\r\nREFRESH-INTERVAL;VALUE=DURATION:PT1H\r\nX-PUBLISHED-TTL:PT1H\r\nBEGIN:VEVENT\r\nUID:11111111-1111-4111-8111-111111111111@ivylink.co\r\nDTSTAMP:20300503T160000Z\r\nDTSTART:20300503T230000Z\r\nDTEND:20300504T010000Z\r\nSUMMARY:Example Reading Night\r\nDESCRIPTION:3 links on Ivy (1 in the last 24h)\\nPrice: Free\\nOn Ivy: https:\r\n //www.ivylink.co/e/11111111-1111-4111-8111-111111111111\\nVia Luma: https:/\r\n /luma.com/example-reading-night\r\nURL:https://www.ivylink.co/e/11111111-1111-4111-8111-111111111111\r\nLOCATION:Example Bookshop\r\nCATEGORIES:Reading / talks\r\nSTATUS:CONFIRMED\r\nTRANSP:TRANSPARENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"}}},"FeedBadRequest":{"description":"Invalid query parameter. Plain text, one of: Invalid trending (use true or false), Invalid limit (1 to 200).","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControlNone"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"text/plain":{"schema":{"type":"string"},"example":"Invalid limit (1 to 200)\n"}}},"FeedNotFound":{"description":"Unknown neighborhood (plain text \"Unknown neighborhood\"), or for /feed/{slug}.ics a path without the .ics suffix (\"Not found\").","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControlFeedNotFound"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"text/plain":{"schema":{"type":"string"},"example":"Unknown neighborhood\n"}}},"FeedInternalError":{"description":"Unexpected server error (plain text \"Internal error\"). Retry later.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControlNone"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"text/plain":{"schema":{"type":"string"},"example":"Internal error\n"}}}}}}