{"openapi":"3.1.0","info":{"title":"312Deals API","description":"Chicago food & drink deals — REST API backed by SQLite. 13,800+ deals across 11,500+ venues in 128 Chicago neighborhoods. Covers happy hours, daily specials, brunch deals, late-night food, and chain promotions.","version":"1.1.0"},"paths":{"/api/v1/analytics/webmcp":{"post":{"summary":"Ingest Analytics","description":"Receive batched WebMCP analytics events from the client.","operationId":"ingest_analytics_api_v1_analytics_webmcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/analytics/webmcp/summary":{"get":{"summary":"Analytics Summary","description":"Get WebMCP analytics summary for admin dashboard.","operationId":"analytics_summary_api_v1_analytics_webmcp_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/webmcp.json":{"get":{"summary":"Webmcp Discovery","operationId":"webmcp_discovery__well_known_webmcp_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/chat":{"post":{"tags":["chat"],"summary":"Chat","description":"AI-powered deal recommendations using Claude with tool use.","operationId":"chat_api_v1_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health":{"get":{"summary":"Health Check","description":"Health check — verifies DB connectivity.","operationId":"health_check_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/deals/search":{"get":{"summary":"Search Deals","description":"Search deals across all Chicago neighborhoods.","operationId":"search_deals_api_v1_deals_search_get","parameters":[{"name":"neighborhood","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chicago neighborhood name or slug","title":"Neighborhood"},"description":"Chicago neighborhood name or slug"},{"name":"day","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Day of week or 'today'","title":"Day"},"description":"Day of week or 'today'"},{"name":"deal_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Deal type filter","title":"Deal Type"},"description":"Deal type filter"},{"name":"cuisine","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cuisine filter","title":"Cuisine"},"description":"Cuisine filter"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text search","title":"Q"},"description":"Free-text search"},{"name":"active_now","in":"query","required":false,"schema":{"type":"boolean","description":"Only show currently active deals","default":false,"title":"Active Now"},"description":"Only show currently active deals"},{"name":"chain_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"'chain' for chains only, 'local' for local spots only","title":"Chain Filter"},"description":"'chain' for chains only, 'local' for local spots only"},{"name":"gluten_free","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to gluten-free deals only","title":"Gluten Free"},"description":"Filter to gluten-free deals only"},{"name":"has_patio","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to venues with patio/outdoor seating","title":"Has Patio"},"description":"Filter to venues with patio/outdoor seating"},{"name":"price_range","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Price filter: under5, under10, under15, under20, any","title":"Price Range"},"description":"Price filter: under5, under10, under15, under20, any"},{"name":"min_rating","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5.0,"minimum":1.0},{"type":"null"}],"description":"Minimum venue Google rating","title":"Min Rating"},"description":"Minimum venue Google rating"},{"name":"time_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time window: lunch, happy_hour, dinner, late_night","title":"Time Filter"},"description":"Time window: lunch, happy_hour, dinner, late_night"},{"name":"ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated deal IDs to fetch specific deals","title":"Ids"},"description":"Comma-separated deal IDs to fetch specific deals"},{"name":"zone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by zone: 'city', 'suburbs', or specific zone slug","title":"Zone"},"description":"Filter by zone: 'city', 'suburbs', or specific zone slug"},{"name":"exclude_venue_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated venue IDs to exclude","title":"Exclude Venue Ids"},"description":"Comma-separated venue IDs to exclude"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort order: best_match, highest_rated, recently_updated, most_deals","title":"Sort"},"description":"Sort order: best_match, highest_rated, recently_updated, most_deals"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deals/nearby":{"get":{"summary":"Deals Nearby","description":"Find deals near a location. Provide lat/lng or address (geocoding requires Google Maps MCP).","operationId":"deals_nearby_api_v1_deals_nearby_get","parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Address or place name to geocode","title":"Address"},"description":"Address or place name to geocode"},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Latitude","title":"Lat"},"description":"Latitude"},{"name":"lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Longitude","title":"Lng"},"description":"Longitude"},{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","maximum":25.0,"minimum":0.1,"description":"Search radius in miles","default":1.5,"title":"Radius Miles"},"description":"Search radius in miles"},{"name":"active_now","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Active Now"}},{"name":"gluten_free","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to gluten-free deals only","title":"Gluten Free"},"description":"Filter to gluten-free deals only"},{"name":"has_patio","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to venues with patio/outdoor seating","title":"Has Patio"},"description":"Filter to venues with patio/outdoor seating"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deals/deal-of-the-day":{"get":{"summary":"Deal Of The Day","description":"Get today's featured deal — highest quality score deal active today.","operationId":"deal_of_the_day_api_v1_deals_deal_of_the_day_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/deals/chains":{"get":{"summary":"Chain Deals","description":"Get national chain deals available in Chicago.","operationId":"chain_deals_api_v1_deals_chains_get","parameters":[{"name":"brand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Chain brand slug filter","title":"Brand"},"description":"Chain brand slug filter"},{"name":"app_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only app-exclusive deals","default":false,"title":"App Only"},"description":"Only app-exclusive deals"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deals/plan-crawl":{"get":{"summary":"Plan Crawl","description":"Plan a multi-stop deal crawl through a neighborhood.","operationId":"plan_crawl_api_v1_deals_plan_crawl_get","parameters":[{"name":"neighborhood","in":"query","required":true,"schema":{"type":"string","description":"Starting neighborhood","title":"Neighborhood"},"description":"Starting neighborhood"},{"name":"budget","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Budget level: $, $$, $$$, $$$$","title":"Budget"},"description":"Budget level: $, $$, $$$, $$$$"},{"name":"hours","in":"query","required":false,"schema":{"type":"number","maximum":8.0,"minimum":1.0,"description":"Hours available","default":3.0,"title":"Hours"},"description":"Hours available"},{"name":"group_size","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":2,"title":"Group Size"}},{"name":"preferences","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated: cocktails, oysters, tacos","title":"Preferences"},"description":"Comma-separated: cocktails, oysters, tacos"},{"name":"gluten_free","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to gluten-free deals only","title":"Gluten Free"},"description":"Filter to gluten-free deals only"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deals/world-cup":{"get":{"summary":"World Cup Deals","description":"Find deals near Soldier Field for FIFA World Cup 2026.\n\nChicago hosts World Cup matches at Soldier Field (June 11 - July 19, 2026).\nThis endpoint returns deals sorted by distance from the stadium, with venue\ncoordinates and distance included for map display.","operationId":"world_cup_deals_api_v1_deals_world_cup_get","parameters":[{"name":"radius_miles","in":"query","required":false,"schema":{"type":"number","maximum":10.0,"minimum":0.5,"description":"Search radius from Soldier Field in miles","default":2.0,"title":"Radius Miles"},"description":"Search radius from Soldier Field in miles"},{"name":"day","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Day of week or 'today'","title":"Day"},"description":"Day of week or 'today'"},{"name":"deal_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Deal type filter","title":"Deal Type"},"description":"Deal type filter"},{"name":"active_now","in":"query","required":false,"schema":{"type":"boolean","description":"Only show currently active deals","default":false,"title":"Active Now"},"description":"Only show currently active deals"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/suggest":{"get":{"summary":"Search Suggest","description":"Autocomplete suggestions for search — returns matching neighborhoods, venues, and popular terms.","operationId":"search_suggest_api_v1_search_suggest_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Search query prefix","title":"Q"},"description":"Search query prefix"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/venues/search":{"get":{"summary":"Search Venues","description":"Search venues with their deals.","operationId":"search_venues_api_v1_venues_search_get","parameters":[{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Venue name search","title":"Name"},"description":"Venue name search"},{"name":"neighborhood","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"}},{"name":"cuisine","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cuisine"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated fields to return (e.g. 'slug' for sitemap)","title":"Fields"},"description":"Comma-separated fields to return (e.g. 'slug' for sitemap)"},{"name":"has_deals","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to venues with active deals (for sitemap)","title":"Has Deals"},"description":"Filter to venues with active deals (for sitemap)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/venues/college-bars":{"get":{"summary":"Get College Bars","description":"Returns venues with college team affiliations, optionally filtered by team or neighborhood.","operationId":"get_college_bars_api_v1_venues_college_bars_get","parameters":[{"name":"team","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by team name (partial match)","title":"Team"},"description":"Filter by team name (partial match)"},{"name":"neighborhood","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by neighborhood slug","title":"Neighborhood"},"description":"Filter by neighborhood slug"},{"name":"include_deals","in":"query","required":false,"schema":{"type":"boolean","description":"Include active deals for each venue","default":true,"title":"Include Deals"},"description":"Include active deals for each venue"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/venues/{slug}":{"get":{"summary":"Get Venue","description":"Get a single venue with all its deals.","operationId":"get_venue_api_v1_venues__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/neighborhoods":{"get":{"summary":"List Neighborhoods","description":"List all neighborhoods with deal counts.","operationId":"list_neighborhoods_api_v1_neighborhoods_get","parameters":[{"name":"zone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by zone: city, north_shore, etc.","title":"Zone"},"description":"Filter by zone: city, north_shore, etc."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/neighborhoods/summary":{"get":{"summary":"Neighborhood Summary","description":"Get deal summary stats per neighborhood — designed for AI agent consumption.","operationId":"neighborhood_summary_api_v1_neighborhoods_summary_get","parameters":[{"name":"neighborhood","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Specific neighborhood, or all","title":"Neighborhood"},"description":"Specific neighborhood, or all"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/neighborhoods/deal-types":{"get":{"summary":"Neighborhood Deal Types","description":"Return all neighborhood × deal_type combos with 2+ active deals. Used for sitemap generation.","operationId":"neighborhood_deal_types_api_v1_neighborhoods_deal_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/submissions":{"post":{"summary":"Submit Deal","description":"Submit a deal tip from a user or AI agent.","operationId":"submit_deal_api_v1_submissions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deals/{deal_id}/report":{"post":{"summary":"Report Deal","description":"Report a deal as outdated or confirm it's still active. No login required.","operationId":"report_deal_api_v1_deals__deal_id__report_post","parameters":[{"name":"deal_id","in":"path","required":true,"schema":{"type":"integer","title":"Deal Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DealReportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/submissions":{"get":{"summary":"List Submissions","description":"List deal submissions by status.","operationId":"list_submissions_api_v1_admin_submissions_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: pending, approved, rejected, all","default":"pending","title":"Status"},"description":"Filter: pending, approved, rejected, all"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"x-admin-key","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/submissions/{submission_id}/approve":{"post":{"summary":"Approve Submission","description":"Approve a submission: match/create venue, create deal, update status.","operationId":"approve_submission_api_v1_admin_submissions__submission_id__approve_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"integer","title":"Submission Id"}},{"name":"x-admin-key","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/submissions/{submission_id}/reject":{"post":{"summary":"Reject Submission","description":"Reject a submission with optional reason.","operationId":"reject_submission_api_v1_admin_submissions__submission_id__reject_post","parameters":[{"name":"submission_id","in":"path","required":true,"schema":{"type":"integer","title":"Submission Id"}},{"name":"x-admin-key","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/_export_user_writes":{"get":{"summary":"Export User Writes","description":"Dump rows from tables that LIVE on prod (form submissions, subscribers, deal reports).\nUsed by `scripts/pull_live_user_writes.py` to merge into the local DB before\nevery `git push data/chideals.db` so we never overwrite real user data.\n\nIncludes only tables where USERS write directly through the public API.\nSchema-aware: returns rows as plain dicts so the merge script can upsert by id+created_at.","operationId":"export_user_writes_api_v1_admin__export_user_writes_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO timestamp; default = last 60 days","title":"Since"},"description":"ISO timestamp; default = last 60 days"},{"name":"x-admin-key","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/email/subscribe":{"post":{"summary":"Email Subscribe","description":"Subscribe an email to The Deal Sheet newsletter.","operationId":"email_subscribe_api_v1_email_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/email/unsubscribe":{"get":{"summary":"Email Unsubscribe","description":"Unsubscribe via browser link click.","operationId":"email_unsubscribe_api_v1_email_unsubscribe_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Email Unsubscribe Post","description":"RFC 8058 one-click unsubscribe (Gmail/Apple Mail send POST).","operationId":"email_unsubscribe_post_api_v1_email_unsubscribe_post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/email/webhook":{"post":{"summary":"Email Webhook","description":"Handle Resend webhook events: bounce, complaint → suppress subscriber.","operationId":"email_webhook_api_v1_email_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/webhooks/agentmail":{"post":{"summary":"Agentmail Webhook","description":"Handle incoming newsletter emails from AgentMail.\n\nWhen a newsletter arrives at 312deals-newsletters@agentmail.to,\nAgentMail fires this webhook with the full email content.\nWe extract deals via Claude and upsert them into the database.","operationId":"agentmail_webhook_api_v1_webhooks_agentmail_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ChatRequest":{"properties":{"message":{"type":"string","title":"Message"},"conversation_history":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Conversation History","default":[]},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"}},"type":"object","required":["message"],"title":"ChatRequest"},"ChatResponse":{"properties":{"response":{"type":"string","title":"Response"},"deals_referenced":{"items":{"$ref":"#/components/schemas/DealReference"},"type":"array","title":"Deals Referenced","default":[]},"follow_up_suggestions":{"items":{"type":"string"},"type":"array","title":"Follow Up Suggestions","default":[]}},"type":"object","required":["response"],"title":"ChatResponse"},"DealReference":{"properties":{"deal_id":{"type":"integer","title":"Deal Id"},"venue_name":{"type":"string","title":"Venue Name"},"title":{"type":"string","title":"Title"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"}},"type":"object","required":["deal_id","venue_name","title"],"title":"DealReference"},"DealReportRequest":{"properties":{"action":{"type":"string","pattern":"^(report_outdated|confirm_active)$","title":"Action"},"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"}},"type":"object","required":["action"],"title":"DealReportRequest"},"EmailSubscribeRequest":{"properties":{"email":{"type":"string","maxLength":254,"minLength":5,"title":"Email"},"source":{"type":"string","pattern":"^(website|exit_intent|footer|submission)$","title":"Source","default":"website"}},"type":"object","required":["email"],"title":"EmailSubscribeRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"RejectRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"RejectRequest"},"SubmissionRequest":{"properties":{"venue_name":{"type":"string","maxLength":200,"minLength":1,"title":"Venue Name"},"deal_description":{"type":"string","maxLength":2000,"minLength":5,"title":"Deal Description"},"venue_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Address"},"deal_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deal Type"},"days":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Days"},"times":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Times"},"submitter_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submitter Email"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","required":["venue_name","deal_description"],"title":"SubmissionRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}