{"externalDocs":{"description":"Agent-facing integration notes and product guidance.","url":"https://gotplans.ai/docs/agents"},"info":{"description":"Austin-first local events with a public API, weekly email signup, and city-aware preferences built for humans and agents.","license":{"name":"Proprietary","url":"https://gotplans.ai/terms"},"title":"GotPlans public API","version":"1.0.0"},"openapi":"3.1.0","security":[],"servers":[{"description":"Production","url":"https://gotplans.ai"}],"tags":[{"description":"Entry points and machine-readable discovery surfaces.","name":"Discovery"},{"description":"Public Austin-first event reads for cities and event detail.","name":"Events"},{"description":"Newsletter subscriber creation and preference autosave.","name":"Subscribers"},{"description":"Public event submission intake for moderation.","name":"Submissions"},{"description":"Feedback and coverage request intake.","name":"Feedback"}],"components":{"schemas":{"PublicApiIndexResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"cities":{"type":"array","items":{"$ref":"#/components/schemas/PublicCitySummary"}},"contractVersion":{"type":"string"},"defaultCity":{"allOf":[{"$ref":"#/components/schemas/CitySlug"},{"type":["string","null"]}]},"description":{"type":"string"},"discovery":{"$ref":"#/components/schemas/PublicApiDiscovery"},"documentation":{"$ref":"#/components/schemas/PublicDocumentationLinks"},"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/PublicApiEndpoint"}},"filters":{"$ref":"#/components/schemas/PublicApiFilterCatalog"},"interests":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"name":{"type":"string"},"slug":{"$ref":"#/components/schemas/InterestSlug"}},"required":["description","name","slug"]}},"liveCities":{"type":"array","items":{"$ref":"#/components/schemas/CitySlug"}},"name":{"type":"string"},"rateLimits":{"$ref":"#/components/schemas/PublicRateLimitSummary"},"recommendedSubscriberFlow":{"$ref":"#/components/schemas/RecommendedSubscriberFlow"},"signupSources":{"type":"array","items":{"type":"string","enum":["website","api","cli"]}},"site":{"type":"string","format":"uri"}},"required":["ok","cities","contractVersion","defaultCity","description","discovery","documentation","endpoints","filters","interests","liveCities","name","rateLimits","recommendedSubscriberFlow","signupSources","site"]},"PublicCitySummary":{"type":"object","properties":{"apiHref":{"type":"string","format":"uri"},"blurb":{"type":"string"},"href":{"type":"string","format":"uri"},"launchOrder":{"type":"integer","minimum":1},"launchStage":{"type":"string","enum":["live","planned"]},"name":{"type":"string"},"slug":{"$ref":"#/components/schemas/CitySlug"},"stateCode":{"type":"string"},"timezone":{"type":"string"}},"required":["apiHref","blurb","href","launchOrder","launchStage","name","slug","stateCode","timezone"]},"CitySlug":{"type":"string","enum":["austin","dfw","houston","san-antonio","corpus-christi"],"example":"austin"},"PublicApiDiscovery":{"type":"object","properties":{"agentsPage":{"type":"string","format":"uri"},"apiDocs":{"type":"string","format":"uri"},"apiIndex":{"type":"string","format":"uri"},"llms":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"robots":{"type":"string","format":"uri"},"sitemap":{"type":"string","format":"uri"}},"required":["agentsPage","apiDocs","apiIndex","llms","openapi","robots","sitemap"]},"PublicDocumentationLinks":{"type":"object","properties":{"agents":{"type":"string","format":"uri"},"apiReference":{"type":"string","format":"uri"},"events":{"type":"string","format":"uri"},"home":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"quickstart":{"type":"string","format":"uri"},"rateLimits":{"type":"string","format":"uri"},"submissions":{"type":"string","format":"uri"},"subscribers":{"type":"string","format":"uri"}},"required":["agents","apiReference","events","home","openapi","quickstart","rateLimits","submissions","subscribers"]},"PublicApiEndpoint":{"type":"object","properties":{"description":{"type":"string"},"href":{"type":"string","format":"uri"},"method":{"type":"string","enum":["GET","POST"]},"path":{"type":"string"}},"required":["description","href","method","path"]},"PublicApiFilterCatalog":{"type":"object","properties":{"formats":{"type":"array","items":{"type":"string"}},"interests":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"name":{"type":"string"},"slug":{"$ref":"#/components/schemas/InterestSlug"}},"required":["description","name","slug"]}},"query":{"type":"array","items":{"type":"string","enum":["starts_after","starts_before","interest","format","free_only","q","page","limit"]}}},"required":["formats","interests","query"]},"InterestSlug":{"type":"string","enum":["run-clubs","music","comedy","food-drink","arts-culture","outdoors","wellness","tech-startups","family","free-cheap"],"example":"run-clubs"},"PublicRateLimitSummary":{"type":"object","properties":{"docs":{"type":"string","format":"uri"},"headers":{"type":"array","items":{"type":"string","enum":["X-RateLimit-Limit","X-RateLimit-Remaining","X-RateLimit-Reset","Retry-After","X-RateLimit-Bucket"]}},"policy":{"type":"string"},"read":{"$ref":"#/components/schemas/PublicRateLimitRead"},"writes":{"type":"array","items":{"$ref":"#/components/schemas/PublicRateLimitWrite"}}},"required":["docs","headers","policy","read","writes"]},"PublicRateLimitRead":{"type":"object","properties":{"bucket":{"type":"string"},"identifier":{"type":"string"},"limits":{"type":"array","items":{"type":"string"}},"routes":{"type":"array","items":{"type":"string"}}},"required":["bucket","identifier","limits","routes"]},"PublicRateLimitWrite":{"type":"object","properties":{"bucket":{"type":"string"},"identifier":{"type":"string"},"limits":{"type":"array","items":{"type":"string"}},"route":{"type":"string"}},"required":["bucket","identifier","limits","route"]},"RecommendedSubscriberFlow":{"type":"object","properties":{"pattern":{"type":"string"},"recommendation":{"type":"string"},"steps":{"type":"array","items":{"type":"string"}},"why":{"type":"array","items":{"type":"string"}}},"required":["pattern","recommendation","steps","why"]},"RateLimitError":{"type":"object","properties":{"bucket":{"type":"string"},"code":{"type":"string","enum":["rate_limited"]},"error":{"type":"string"},"ok":{"type":"boolean","enum":[false]},"retryAfterSeconds":{"type":"integer","minimum":1}},"required":["bucket","code","error","ok","retryAfterSeconds"]},"PublicCitiesResponse":{"type":"object","properties":{"cities":{"type":"array","items":{"$ref":"#/components/schemas/PublicCitySummary"}},"defaultCity":{"allOf":[{"$ref":"#/components/schemas/CitySlug"},{"type":["string","null"]}]},"ok":{"type":"boolean","enum":[true]}},"required":["cities","defaultCity","ok"]},"PublicCityEventsResponse":{"type":"object","properties":{"city":{"$ref":"#/components/schemas/PublicCitySummary"},"events":{"type":"array","items":{"$ref":"#/components/schemas/PublicEventListItem"}},"filters":{"$ref":"#/components/schemas/PublicEventListFilters"},"ok":{"type":"boolean","enum":[true]},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["city","events","filters","ok","pagination"]},"PublicEventListItem":{"type":"object","properties":{"canonicalUrl":{"type":["string","null"],"format":"uri"},"citySlug":{"$ref":"#/components/schemas/CitySlug"},"coverImageUrl":{"type":["string","null"],"format":"uri"},"currency":{"type":"string"},"format":{"type":["string","null"]},"href":{"type":["string","null"],"format":"uri"},"id":{"type":"string"},"interest":{"$ref":"#/components/schemas/PublicInterestSummary"},"isRecurring":{"type":"boolean"},"isFree":{"type":["boolean","null"]},"nextOccurrence":{"$ref":"#/components/schemas/PublicEventOccurrence"},"organizer":{"$ref":"#/components/schemas/PublicOrganizerSummary"},"priceMaxCents":{"type":["integer","null"]},"priceMinCents":{"type":["integer","null"]},"primarySourceUrl":{"type":["string","null"],"format":"uri"},"publishedAt":{"type":["string","null"]},"recurrenceDescription":{"type":["string","null"]},"shortDescription":{"type":["string","null"]},"slug":{"type":["string","null"]},"sourceLastVerifiedAt":{"type":["string","null"]},"sourceNextVerifyAt":{"type":["string","null"]},"sourceLinks":{"type":"array","items":{"$ref":"#/components/schemas/PublicEventSourceLink"}},"tags":{"type":"array","items":{"$ref":"#/components/schemas/PublicEventTag"}},"title":{"type":"string"}},"required":["canonicalUrl","citySlug","coverImageUrl","currency","format","href","id","interest","isRecurring","isFree","nextOccurrence","organizer","priceMaxCents","priceMinCents","primarySourceUrl","publishedAt","recurrenceDescription","shortDescription","slug","sourceLastVerifiedAt","sourceNextVerifyAt","sourceLinks","tags","title"]},"PublicInterestSummary":{"type":["object","null"],"properties":{"name":{"type":"string"},"slug":{"$ref":"#/components/schemas/InterestSlug"}},"required":["name","slug"]},"PublicEventOccurrence":{"type":["object","null"],"properties":{"capacity":{"type":["integer","null"]},"doorsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"id":{"type":"string"},"isCancelled":{"type":"boolean"},"isSoldOut":{"type":"boolean"},"sourceLinks":{"type":"array","items":{"$ref":"#/components/schemas/PublicEventSourceLink"}},"startsAt":{"type":"string"},"status":{"type":"string"},"ticketUrl":{"type":["string","null"],"format":"uri"},"timezone":{"type":"string"},"venue":{"$ref":"#/components/schemas/PublicVenueSummary"}},"required":["capacity","doorsAt","endsAt","id","isCancelled","isSoldOut","sourceLinks","startsAt","status","ticketUrl","timezone","venue"]},"PublicEventSourceLink":{"type":"object","properties":{"confidence":{"type":"number"},"href":{"type":["string","null"],"format":"uri"},"isPrimary":{"type":"boolean"},"source":{"$ref":"#/components/schemas/PublicEventSource"}},"required":["confidence","href","isPrimary","source"]},"PublicEventSource":{"type":["object","null"],"properties":{"baseUrl":{"type":["string","null"],"format":"uri"},"name":{"type":"string"},"slug":{"type":"string"}},"required":["baseUrl","name","slug"]},"PublicVenueSummary":{"type":["object","null"],"properties":{"addressLine1":{"type":["string","null"]},"addressLine2":{"type":["string","null"]},"countryCode":{"type":"string"},"id":{"type":"string"},"lat":{"type":["number","null"]},"lng":{"type":["number","null"]},"locality":{"type":["string","null"]},"name":{"type":"string"},"postalCode":{"type":["string","null"]},"region":{"type":["string","null"]},"slug":{"type":["string","null"]},"websiteUrl":{"type":["string","null"],"format":"uri"}},"required":["addressLine1","addressLine2","countryCode","id","lat","lng","locality","name","postalCode","region","slug","websiteUrl"]},"PublicOrganizerSummary":{"type":["object","null"],"properties":{"id":{"type":"string"},"instagramUrl":{"type":["string","null"],"format":"uri"},"name":{"type":"string"},"slug":{"type":["string","null"]},"type":{"type":"string"},"websiteUrl":{"type":["string","null"],"format":"uri"}},"required":["id","instagramUrl","name","slug","type","websiteUrl"]},"PublicEventTag":{"type":"object","properties":{"score":{"type":["number","null"]},"type":{"type":"string"},"value":{"type":"string"}},"required":["score","type","value"]},"PublicEventListFilters":{"type":"object","properties":{"format":{"type":"string"},"freeOnly":{"type":"boolean"},"interest":{"$ref":"#/components/schemas/InterestSlug"},"limit":{"type":"integer","minimum":1,"maximum":100},"page":{"type":"integer","minimum":1},"q":{"type":"string"},"startsAfter":{"type":"string"},"startsBefore":{"type":"string"}},"required":["freeOnly","limit","page"]},"Pagination":{"type":"object","properties":{"limit":{"type":"integer","minimum":1},"page":{"type":"integer","minimum":1},"total":{"type":"integer","minimum":0},"totalPages":{"type":"integer","minimum":0}},"required":["limit","page","total","totalPages"]},"PublicApiError":{"type":"object","properties":{"error":{"type":"string"},"ok":{"type":"boolean","enum":[false]}},"required":["error","ok"]},"PublicEventDetailResponse":{"type":"object","properties":{"event":{"$ref":"#/components/schemas/PublicEventDetail"},"ok":{"type":"boolean","enum":[true]}},"required":["event","ok"]},"PublicEventDetail":{"allOf":[{"$ref":"#/components/schemas/PublicEventListItem"},{"type":"object","properties":{"city":{"$ref":"#/components/schemas/PublicCitySummary"},"longDescription":{"type":["string","null"]},"occurrences":{"type":"array","items":{"$ref":"#/components/schemas/PublicEventOccurrence"}},"status":{"type":"string"}},"required":["city","longDescription","occurrences","status"]}]},"NewsletterSignupResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"signup":{"$ref":"#/components/schemas/NewsletterSignupResult"}},"required":["ok","signup"]},"NewsletterSignupResult":{"type":"object","properties":{"cadence":{"type":"string","enum":["weekly"]},"citySlugs":{"type":"array","items":{"$ref":"#/components/schemas/CitySlug"}},"contactSyncStatus":{"$ref":"#/components/schemas/ContactSyncStatus"},"email":{"type":"string","format":"email"},"interestSlugs":{"type":"array","items":{"$ref":"#/components/schemas/InterestSlug"}},"mocked":{"type":"boolean"},"source":{"type":"string","enum":["website","api","cli"]},"status":{"type":"string","enum":["created","updated","resubscribed"]},"storage":{"type":"string","enum":["supabase","github","mock"]}},"required":["cadence","citySlugs","contactSyncStatus","email","interestSlugs","mocked","source","status","storage"]},"ContactSyncStatus":{"type":"string","enum":["synced","degraded","skipped"]},"ValidationError":{"type":"object","properties":{"details":{"$ref":"#/components/schemas/ValidationErrorDetails"},"error":{"type":"string"}},"required":["error"]},"ValidationErrorDetails":{"type":"object","properties":{"fieldErrors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}},"formErrors":{"type":"array","items":{"type":"string"}}},"required":["fieldErrors","formErrors"]},"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]},"NewsletterSignupRequest":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"andrew@example.com"},"citySlug":{"$ref":"#/components/schemas/CitySlug"},"citySlugs":{"type":"array","items":{"$ref":"#/components/schemas/CitySlug"},"minItems":1,"maxItems":16},"interestSlugs":{"type":"array","items":{"$ref":"#/components/schemas/InterestSlug"},"maxItems":10,"default":[]},"source":{"type":"string","enum":["website","api","cli"],"default":"website"}},"required":["email"]},"SubmissionResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"submission":{"$ref":"#/components/schemas/SubmissionResult"}},"required":["ok","submission"]},"SubmissionResult":{"type":"object","properties":{"citySlug":{"$ref":"#/components/schemas/CitySlug"},"mocked":{"type":"boolean"},"reviewQueueId":{"type":"string"},"source":{"type":"string","enum":["website","api","cli"]},"status":{"type":"string","enum":["pending"]},"submissionId":{"type":"string"}},"required":["citySlug","mocked","reviewQueueId","source","status","submissionId"]},"SubmissionRequest":{"type":"object","properties":{"citySlug":{"$ref":"#/components/schemas/CitySlug"},"details":{"type":"string","minLength":20,"maxLength":2000},"eventDate":{"type":"string","maxLength":80},"locationHint":{"type":"string","maxLength":120},"source":{"type":"string","enum":["website","api","cli"],"default":"website"},"sourceUrl":{"type":"string","format":"uri"},"submitterEmail":{"type":"string","format":"email"},"submitterName":{"type":"string","maxLength":120},"title":{"type":"string","minLength":4,"maxLength":120}},"required":["citySlug","details","sourceUrl","title"]},"FeedbackResponse":{"type":"object","properties":{"issue":{"$ref":"#/components/schemas/FeedbackIssue"},"ok":{"type":"boolean","enum":[true]}},"required":["issue","ok"]},"FeedbackIssue":{"type":"object","properties":{"labels":{"type":"array","items":{"type":"string"}},"mocked":{"type":"boolean"},"number":{"type":"integer"},"title":{"type":"string"},"url":{"type":"string","format":"uri"}},"required":["labels","mocked","number","title","url"]},"FeedbackRequest":{"type":"object","properties":{"citySlug":{"$ref":"#/components/schemas/CitySlug"},"details":{"type":"string","minLength":20,"maxLength":2000},"eventDate":{"type":"string","maxLength":80},"kind":{"type":"string","enum":["event-submission","prompt-idea","feature-request","bug-report","coverage-request"]},"locationHint":{"type":"string","maxLength":120},"sourceUrl":{"type":"string","format":"uri"},"title":{"type":"string","minLength":4,"maxLength":120}},"required":["citySlug","details","kind","title"]}},"parameters":{}},"paths":{"/api/v1":{"get":{"description":"Machine-readable index of the public contract, discovery URLs, and filter catalogs.","operationId":"getPublicApiIndex","summary":"Get the public API index","tags":["Discovery"],"responses":{"200":{"description":"Public API index payload.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiIndexResponse"},"examples":{"default":{"value":{"ok":true,"cities":[{"apiHref":"https://gotplans.ai/api/v1/cities/austin/events","blurb":"Music, comedy, food pop-ups, startup chaos, and enough weirdness to keep the feed interesting.","href":"https://gotplans.ai/austin","launchOrder":1,"launchStage":"live","name":"Austin","slug":"austin","stateCode":"TX","timezone":"America/Chicago"},{"apiHref":"https://gotplans.ai/api/v1/cities/dfw/events","blurb":"A split-market launch city where neighborhoods matter as much as tags.","href":"https://gotplans.ai/dfw","launchOrder":2,"launchStage":"planned","name":"DFW","slug":"dfw","stateCode":"TX","timezone":"America/Chicago"},{"apiHref":"https://gotplans.ai/api/v1/cities/houston/events","blurb":"Massive sprawl, strong food and culture scenes, and a curation problem begging for tighter filters.","href":"https://gotplans.ai/houston","launchOrder":3,"launchStage":"planned","name":"Houston","slug":"houston","stateCode":"TX","timezone":"America/Chicago"},{"apiHref":"https://gotplans.ai/api/v1/cities/san-antonio/events","blurb":"Tourist gravity on the surface, local culture depth underneath, and plenty of room for better discovery.","href":"https://gotplans.ai/san-antonio","launchOrder":4,"launchStage":"planned","name":"San Antonio","slug":"san-antonio","stateCode":"TX","timezone":"America/Chicago"},{"apiHref":"https://gotplans.ai/api/v1/cities/corpus-christi/events","blurb":"The beach city in the launch cohort, where surf, festivals, and local gatherings need a cleaner signal layer.","href":"https://gotplans.ai/corpus-christi","launchOrder":5,"launchStage":"planned","name":"Corpus Christi","slug":"corpus-christi","stateCode":"TX","timezone":"America/Chicago"}],"contractVersion":"2026-03-11.2","defaultCity":"austin","description":"Austin-first local events with a public API, weekly email signup, and city-aware preferences built for humans and agents.","discovery":{"agentsPage":"https://gotplans.ai/for-agents","apiIndex":"https://gotplans.ai/api/v1","apiDocs":"https://gotplans.ai/docs/api","llms":"https://gotplans.ai/llms.txt","openapi":"https://gotplans.ai/openapi.json","robots":"https://gotplans.ai/robots.txt","sitemap":"https://gotplans.ai/sitemap.xml"},"documentation":{"agents":"https://gotplans.ai/docs/agents","apiReference":"https://gotplans.ai/docs/api","events":"https://gotplans.ai/docs/events","home":"https://gotplans.ai/docs","openapi":"https://gotplans.ai/openapi.json","quickstart":"https://gotplans.ai/docs/quickstart","rateLimits":"https://gotplans.ai/docs/rate-limits","submissions":"https://gotplans.ai/docs/submissions","subscribers":"https://gotplans.ai/docs/subscribers"},"endpoints":[{"description":"Machine-readable index of the public API, discovery URLs, and product recommendations.","href":"https://gotplans.ai/api/v1","method":"GET","path":"/api/v1"},{"description":"List configured markets and their site/API URLs.","href":"https://gotplans.ai/api/v1/cities","method":"GET","path":"/api/v1/cities"},{"description":"List a city's events with filters for date windows, interest, format, free-only, and query text, including occurrence time, venue, and source attribution.","href":"https://gotplans.ai/api/v1/cities/%7BcitySlug%7D/events","method":"GET","path":"/api/v1/cities/{citySlug}/events"},{"description":"Get one event with all currently known occurrences, source links, and summaries.","href":"https://gotplans.ai/api/v1/events/%7BeventId%7D","method":"GET","path":"/api/v1/events/{eventId}"},{"description":"Create or update one newsletter subscriber with city and interest preferences.","href":"https://gotplans.ai/api/v1/subscribers","method":"POST","path":"/api/v1/subscribers"},{"description":"Submit an event for moderation.","href":"https://gotplans.ai/api/v1/submissions","method":"POST","path":"/api/v1/submissions"},{"description":"Send product feedback or request new Austin coverage categories.","href":"https://gotplans.ai/api/feedback","method":"POST","path":"/api/feedback"},{"description":"Machine-readable OpenAPI 3.1 document for the public contract.","href":"https://gotplans.ai/openapi.json","method":"GET","path":"/openapi.json"}],"interests":[{"description":"Recurring run clubs, social miles, and Austin groups worth repeating.","name":"Run Clubs","slug":"run-clubs"},{"description":"Concerts, DJ nights, and the shows worth leaving home for.","name":"Music","slug":"music"},{"description":"Stand-up, improv, sketch, and recurring comedy rooms.","name":"Comedy","slug":"comedy"},{"description":"Pop-ups, tastings, chef nights, and neighborhood food moves.","name":"Food and Drink","slug":"food-drink"},{"description":"Museums, galleries, theater, film, and other cultural picks.","name":"Arts and Culture","slug":"arts-culture"},{"description":"Markets, runs, rides, and events that are better outside.","name":"Outdoors","slug":"outdoors"},{"description":"Yoga, recovery, movement, and wellness gatherings.","name":"Wellness","slug":"wellness"},{"description":"Founder events, meetups, launches, and startup-community signals.","name":"Tech and Startups","slug":"tech-startups"},{"description":"Kid-friendly plans that work for actual parents too.","name":"Family","slug":"family"},{"description":"The low-cost plans still worth showing up for.","name":"Free and Cheap","slug":"free-cheap"}],"liveCities":["austin"],"name":"GotPlans public API","rateLimits":{"docs":"https://gotplans.ai/docs/rate-limits","headers":["X-RateLimit-Limit","X-RateLimit-Remaining","X-RateLimit-Reset","Retry-After","X-RateLimit-Bucket"],"policy":"public-read-public-write-guarded","read":{"bucket":"public-read","identifier":"ip","limits":["120 requests / minute / IP","3,000 requests / day / IP"],"routes":["/api/v1","/api/v1/cities","/api/v1/cities/{citySlug}/events","/api/v1/events/{eventId}","/openapi.json"]},"writes":[{"bucket":"subscriber-write","identifier":"ip + normalized email hash","limits":["10 requests / 10 minutes / IP","5 requests / hour / email","20 requests / day / email"],"route":"/api/v1/subscribers"},{"bucket":"submission-write","identifier":"ip","limits":["5 requests / hour / IP","20 requests / day / IP"],"route":"/api/v1/submissions"},{"bucket":"feedback-write","identifier":"ip","limits":["10 requests / hour / IP","30 requests / day / IP"],"route":"/api/feedback"}]},"recommendedSubscriberFlow":{"pattern":"collect_email_and_core_preferences_together_then_confirm_with_manage_link","recommendation":"Collect email, city, and optional interests in the first step so the first record is immediately useful. After submit, send a confirmation email that doubles as a signed manage-preferences link.","steps":["Capture email plus city and optional interests in one request.","Send a confirmation email with a signed, single-use manage-preferences URL.","Land the user on a page where they can confirm and edit preferences without creating a password.","Reuse later signed links for preference changes, unsubscribe, and resubscribe."],"why":["Asking for preferences after the email creates drop-off and loses useful targeting data.","Waiting until after confirmation to collect everything adds friction before you know enough to personalize.","A signed manage link gives you account-like control without forcing password creation."]},"signupSources":["website","api","cli"],"site":"https://gotplans.ai","filters":{"formats":["festival"],"interests":[{"description":"Recurring run clubs, social miles, and Austin groups worth repeating.","name":"Run Clubs","slug":"run-clubs"},{"description":"Concerts, DJ nights, and the shows worth leaving home for.","name":"Music","slug":"music"},{"description":"Stand-up, improv, sketch, and recurring comedy rooms.","name":"Comedy","slug":"comedy"},{"description":"Pop-ups, tastings, chef nights, and neighborhood food moves.","name":"Food and Drink","slug":"food-drink"},{"description":"Museums, galleries, theater, film, and other cultural picks.","name":"Arts and Culture","slug":"arts-culture"},{"description":"Markets, runs, rides, and events that are better outside.","name":"Outdoors","slug":"outdoors"},{"description":"Yoga, recovery, movement, and wellness gatherings.","name":"Wellness","slug":"wellness"},{"description":"Founder events, meetups, launches, and startup-community signals.","name":"Tech and Startups","slug":"tech-startups"},{"description":"Kid-friendly plans that work for actual parents too.","name":"Family","slug":"family"},{"description":"The low-cost plans still worth showing up for.","name":"Free and Cheap","slug":"free-cheap"}],"query":["starts_after","starts_before","interest","format","free_only","q","page","limit"]}}}}}}},"429":{"description":"Request exceeded the public read rate limit.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/api/v1/cities":{"get":{"description":"Lists configured cities with launch stage and site/API URLs.","operationId":"listPublicCities","summary":"List configured cities","tags":["Discovery"],"responses":{"200":{"description":"Configured city list.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCitiesResponse"},"examples":{"default":{"value":{"cities":[{"apiHref":"https://gotplans.ai/api/v1/cities/austin/events","blurb":"Music, comedy, food pop-ups, startup chaos, and enough weirdness to keep the feed interesting.","href":"https://gotplans.ai/austin","launchOrder":1,"launchStage":"live","name":"Austin","slug":"austin","stateCode":"TX","timezone":"America/Chicago"},{"apiHref":"https://gotplans.ai/api/v1/cities/dfw/events","blurb":"A split-market launch city where neighborhoods matter as much as tags.","href":"https://gotplans.ai/dfw","launchOrder":2,"launchStage":"planned","name":"DFW","slug":"dfw","stateCode":"TX","timezone":"America/Chicago"},{"apiHref":"https://gotplans.ai/api/v1/cities/houston/events","blurb":"Massive sprawl, strong food and culture scenes, and a curation problem begging for tighter filters.","href":"https://gotplans.ai/houston","launchOrder":3,"launchStage":"planned","name":"Houston","slug":"houston","stateCode":"TX","timezone":"America/Chicago"},{"apiHref":"https://gotplans.ai/api/v1/cities/san-antonio/events","blurb":"Tourist gravity on the surface, local culture depth underneath, and plenty of room for better discovery.","href":"https://gotplans.ai/san-antonio","launchOrder":4,"launchStage":"planned","name":"San Antonio","slug":"san-antonio","stateCode":"TX","timezone":"America/Chicago"},{"apiHref":"https://gotplans.ai/api/v1/cities/corpus-christi/events","blurb":"The beach city in the launch cohort, where surf, festivals, and local gatherings need a cleaner signal layer.","href":"https://gotplans.ai/corpus-christi","launchOrder":5,"launchStage":"planned","name":"Corpus Christi","slug":"corpus-christi","stateCode":"TX","timezone":"America/Chicago"}],"defaultCity":"austin","ok":true}}}}}},"429":{"description":"Request exceeded the public read rate limit.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/api/v1/cities/{citySlug}/events":{"get":{"description":"Lists one city's events with filtering for dates, interests, free-only, and text query.","operationId":"listCityEvents","summary":"List a city's events","tags":["Events"],"parameters":[{"schema":{"$ref":"#/components/schemas/CitySlug"},"required":true,"description":"Configured city slug. Current values: austin, dfw, houston, san-antonio, corpus-christi.","name":"citySlug","in":"path"},{"schema":{"type":"string"},"required":false,"description":"Filter to one event format when provided.","name":"format","in":"query"},{"schema":{"type":"string","example":"true"},"required":false,"description":"Use true or 1 to keep only free events.","name":"free_only","in":"query"},{"schema":{"$ref":"#/components/schemas/InterestSlug"},"required":false,"description":"Filter by the primary event interest slug.","name":"interest","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"example":20},"required":false,"description":"Page size. Defaults to 20 and maxes out at 100.","name":"limit","in":"query"},{"schema":{"type":"integer","minimum":1,"example":1},"required":false,"description":"One-based page number.","name":"page","in":"query"},{"schema":{"type":"string"},"required":false,"description":"Simple text match against event title and descriptions.","name":"q","in":"query"},{"schema":{"type":"string","description":"ISO date or datetime string.","example":"2026-03-10T18:00:00.000Z"},"required":false,"description":"Only include occurrences starting on or after this instant.","name":"starts_after","in":"query"},{"schema":{"type":"string","description":"ISO date or datetime string.","example":"2026-03-10T18:00:00.000Z"},"required":false,"description":"Only include occurrences starting on or before this instant.","name":"starts_before","in":"query"}],"responses":{"200":{"description":"Paged city event list.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCityEventsResponse"},"examples":{"austinMusic":{"value":{"city":{"apiHref":"https://gotplans.ai/api/v1/cities/austin/events","blurb":"Music, comedy, food pop-ups, startup chaos, and enough weirdness to keep the feed interesting.","href":"https://gotplans.ai/austin","launchOrder":1,"launchStage":"live","name":"Austin","slug":"austin","stateCode":"TX","timezone":"America/Chicago"},"events":[{"canonicalUrl":"https://do512.com/events/2026/3/12/blues-on-the-green","citySlug":"austin","coverImageUrl":"https://images.example.com/blues-on-the-green.jpg","currency":"USD","format":"festival","href":"https://gotplans.ai/austin/events/blues-on-the-green","id":"b3c2a8a5-71dd-4f84-9f6b-6f80bc410d1d","interest":{"name":"Music","slug":"music"},"isRecurring":true,"isFree":true,"nextOccurrence":{"capacity":null,"doorsAt":"2026-03-12T23:00:00.000Z","endsAt":"2026-03-13T03:00:00.000Z","id":"a284f6fd-7999-4e1c-b440-21ae77c2a10d","isCancelled":false,"isSoldOut":false,"sourceLinks":[{"confidence":0.97,"href":"https://do512.com/events/2026/3/12/blues-on-the-green","isPrimary":true,"source":{"baseUrl":"https://do512.com","name":"Do512","slug":"do512"}}],"startsAt":"2026-03-13T00:00:00.000Z","status":"scheduled","ticketUrl":"https://do512.com/events/2026/3/12/blues-on-the-green","timezone":"America/Chicago","venue":{"addressLine1":"2100 Barton Springs Rd","addressLine2":null,"countryCode":"US","id":"3fe0f7d4-799f-4256-a6df-602d5dd7d82b","lat":30.2649,"lng":-97.7725,"locality":"Austin","name":"Zilker Park","postalCode":"78704","region":"TX","slug":"zilker-park","websiteUrl":"https://www.austintexas.gov/department/zilker-metropolitan-park"}},"organizer":null,"priceMaxCents":null,"priceMinCents":null,"primarySourceUrl":"https://do512.com/events/2026/3/12/blues-on-the-green","publishedAt":"2026-03-10T22:14:00.000Z","recurrenceDescription":"Recurring seasonal concert series in Austin.","shortDescription":"A classic Austin outdoor music night.","slug":"blues-on-the-green","sourceLastVerifiedAt":"2026-03-10T23:55:00.000Z","sourceNextVerifyAt":"2026-06-10T23:55:00.000Z","sourceLinks":[{"confidence":0.97,"href":"https://do512.com/events/2026/3/12/blues-on-the-green","isPrimary":true,"source":{"baseUrl":"https://do512.com","name":"Do512","slug":"do512"}}],"tags":[{"score":0.96,"type":"series","value":"blues-on-the-green"}],"title":"Blues on the Green"}],"filters":{"freeOnly":false,"interest":"music","limit":20,"page":1},"ok":true,"pagination":{"limit":20,"page":1,"total":1,"totalPages":1}}}}}}},"404":{"description":"Unknown city slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"422":{"description":"Invalid query parameter values.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"429":{"description":"Request exceeded the public read rate limit.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"500":{"description":"Unexpected public API failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}}}}},"/api/v1/events/{eventId}":{"get":{"description":"Loads one event with all known occurrences, venue summaries, and source attribution.","operationId":"getEventById","summary":"Get one event by id","tags":["Events"],"parameters":[{"schema":{"type":"string","description":"Canonical GotPlans event identifier.","example":"b3c2a8a5-71dd-4f84-9f6b-6f80bc410d1d"},"required":true,"description":"Canonical GotPlans event identifier.","name":"eventId","in":"path"}],"responses":{"200":{"description":"Single event detail payload.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEventDetailResponse"},"examples":{"default":{"value":{"event":{"canonicalUrl":"https://do512.com/events/2026/3/12/blues-on-the-green","citySlug":"austin","coverImageUrl":"https://images.example.com/blues-on-the-green.jpg","currency":"USD","format":"festival","href":"https://gotplans.ai/austin/events/blues-on-the-green","id":"b3c2a8a5-71dd-4f84-9f6b-6f80bc410d1d","interest":{"name":"Music","slug":"music"},"isRecurring":true,"isFree":true,"nextOccurrence":{"capacity":null,"doorsAt":"2026-03-12T23:00:00.000Z","endsAt":"2026-03-13T03:00:00.000Z","id":"a284f6fd-7999-4e1c-b440-21ae77c2a10d","isCancelled":false,"isSoldOut":false,"sourceLinks":[{"confidence":0.97,"href":"https://do512.com/events/2026/3/12/blues-on-the-green","isPrimary":true,"source":{"baseUrl":"https://do512.com","name":"Do512","slug":"do512"}}],"startsAt":"2026-03-13T00:00:00.000Z","status":"scheduled","ticketUrl":"https://do512.com/events/2026/3/12/blues-on-the-green","timezone":"America/Chicago","venue":{"addressLine1":"2100 Barton Springs Rd","addressLine2":null,"countryCode":"US","id":"3fe0f7d4-799f-4256-a6df-602d5dd7d82b","lat":30.2649,"lng":-97.7725,"locality":"Austin","name":"Zilker Park","postalCode":"78704","region":"TX","slug":"zilker-park","websiteUrl":"https://www.austintexas.gov/department/zilker-metropolitan-park"}},"organizer":null,"priceMaxCents":null,"priceMinCents":null,"primarySourceUrl":"https://do512.com/events/2026/3/12/blues-on-the-green","publishedAt":"2026-03-10T22:14:00.000Z","recurrenceDescription":"Recurring seasonal concert series in Austin.","shortDescription":"A classic Austin outdoor music night.","slug":"blues-on-the-green","sourceLastVerifiedAt":"2026-03-10T23:55:00.000Z","sourceNextVerifyAt":"2026-06-10T23:55:00.000Z","sourceLinks":[{"confidence":0.97,"href":"https://do512.com/events/2026/3/12/blues-on-the-green","isPrimary":true,"source":{"baseUrl":"https://do512.com","name":"Do512","slug":"do512"}}],"tags":[{"score":0.96,"type":"series","value":"blues-on-the-green"}],"title":"Blues on the Green","city":{"apiHref":"https://gotplans.ai/api/v1/cities/austin/events","blurb":"Music, comedy, food pop-ups, startup chaos, and enough weirdness to keep the feed interesting.","href":"https://gotplans.ai/austin","launchOrder":1,"launchStage":"live","name":"Austin","slug":"austin","stateCode":"TX","timezone":"America/Chicago"},"longDescription":"Free live music in Austin with recurring source coverage and a reliable weekly crowd.","occurrences":[{"capacity":null,"doorsAt":"2026-03-12T23:00:00.000Z","endsAt":"2026-03-13T03:00:00.000Z","id":"a284f6fd-7999-4e1c-b440-21ae77c2a10d","isCancelled":false,"isSoldOut":false,"sourceLinks":[{"confidence":0.97,"href":"https://do512.com/events/2026/3/12/blues-on-the-green","isPrimary":true,"source":{"baseUrl":"https://do512.com","name":"Do512","slug":"do512"}}],"startsAt":"2026-03-13T00:00:00.000Z","status":"scheduled","ticketUrl":"https://do512.com/events/2026/3/12/blues-on-the-green","timezone":"America/Chicago","venue":{"addressLine1":"2100 Barton Springs Rd","addressLine2":null,"countryCode":"US","id":"3fe0f7d4-799f-4256-a6df-602d5dd7d82b","lat":30.2649,"lng":-97.7725,"locality":"Austin","name":"Zilker Park","postalCode":"78704","region":"TX","slug":"zilker-park","websiteUrl":"https://www.austintexas.gov/department/zilker-metropolitan-park"}}],"status":"active"},"ok":true}}}}}},"404":{"description":"Unknown event id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"429":{"description":"Request exceeded the public read rate limit.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"500":{"description":"Unexpected public API failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}}}}},"/api/v1/subscribers":{"post":{"description":"Creates or updates a subscriber record and immediately persists city and interest preferences.","operationId":"upsertSubscriber","summary":"Create or update a subscriber","tags":["Subscribers"],"requestBody":{"description":"Full subscriber preference state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSignupRequest"},"examples":{"austinAutosave":{"value":{"citySlugs":["austin"],"email":"andrew@example.com","interestSlugs":["run-clubs","music"],"source":"api"}}}}}},"responses":{"200":{"description":"Existing subscriber updated.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSignupResponse"},"examples":{"updated":{"value":{"ok":true,"signup":{"cadence":"weekly","citySlugs":["austin"],"contactSyncStatus":"synced","email":"andrew@example.com","interestSlugs":["run-clubs","music"],"mocked":false,"source":"api","status":"updated","storage":"supabase"}}}}}}},"201":{"description":"New subscriber created.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSignupResponse"},"examples":{"created":{"value":{"ok":true,"signup":{"cadence":"weekly","citySlugs":["austin"],"contactSyncStatus":"synced","email":"andrew@example.com","interestSlugs":["run-clubs","music"],"mocked":false,"source":"api","status":"created","storage":"supabase"}}}}}}},"422":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Request exceeded the subscriber write rate limit.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"503":{"description":"Signup storage is not configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/submissions":{"post":{"description":"Creates a canonical event submission and queues it for moderation.","operationId":"createSubmission","summary":"Submit an event for moderation","tags":["Submissions"],"requestBody":{"description":"Public event submission payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionRequest"},"examples":{"austinRunClub":{"value":{"citySlug":"austin","details":"A recurring east side run club with a public signup page, consistent weekly timing, and beginner-friendly pacing.","eventDate":"Every Wednesday at 6:30 PM","locationHint":"East Austin","source":"api","sourceUrl":"https://example.com/run-club","submitterEmail":"andrew@example.com","submitterName":"Andrew","title":"East side weekly run club"}}}}}},"responses":{"201":{"description":"Submission accepted and queued.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResponse"},"examples":{"queued":{"value":{"ok":true,"submission":{"citySlug":"austin","mocked":false,"reviewQueueId":"1129c6b3-7e8a-4c4d-95e8-1b8f6ab438a8","source":"api","status":"pending","submissionId":"a9096c5f-c46c-4b06-bf80-229c8e12a2c8"}}}}}}},"422":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Request exceeded the submission write rate limit.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"503":{"description":"Submissions storage is not configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/feedback":{"post":{"description":"Creates a GitHub-backed feedback item for bugs, features, prompt ideas, or new Austin coverage requests.","operationId":"createFeedback","summary":"Create a public feedback item","tags":["Feedback"],"requestBody":{"description":"Public feedback payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"},"examples":{"coverageRequest":{"value":{"citySlug":"austin","details":"Please add more beginner-friendly trail runs and recurring social run clubs on the east side.","kind":"coverage-request","title":"Add more east side run club coverage"}}}}}},"responses":{"200":{"description":"Feedback issue created.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"},"examples":{"created":{"value":{"issue":{"labels":["feedback","source:web","city:austin","type:coverage-request"],"mocked":false,"number":42,"title":"[Austin][Coverage request] Add more east side run club coverage","url":"https://github.com/finnyclaude/finny-claude/issues/42"},"ok":true}}}}}},"422":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"429":{"description":"Request exceeded the feedback write rate limit.","headers":{"Retry-After":{"description":"Seconds until the request may be retried.","schema":{"type":"string"}},"X-RateLimit-Bucket":{"description":"The rate limit bucket currently governing the request.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests allowed in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the active bucket window.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the active bucket resets.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"503":{"description":"Feedback intake is not configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"webhooks":{}}