{"openapi":"3.1.0","info":{"title":"PourWire","version":"0.1.0"},"paths":{"/api/v1/metros":{"get":{"summary":"Api Metros","operationId":"api_metros_api_v1_metros_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/signals":{"get":{"summary":"Api Signals","operationId":"api_signals_api_v1_signals_get","parameters":[{"name":"metro","in":"query","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/openings":{"get":{"summary":"Api Public Openings","operationId":"api_public_openings_api_public_openings_get","parameters":[{"name":"metro","in":"query","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp":{"post":{"summary":"Mcp Endpoint","operationId":"mcp_endpoint_mcp_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Mcp Page","operationId":"mcp_page_mcp_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/robots.txt":{"get":{"summary":"Robots","operationId":"robots_robots_txt_get","responses":{"200":{"description":"Successful Response"}}}},"/sitemap.xml":{"get":{"summary":"Sitemap","description":"Sitemap INDEX. Split when venue pages arrived: hundreds of venue URLs\nwith daily churn would otherwise drown the ~100 slower-moving list pages,\nand a child sitemap lets Search Console report indexing per tier.","operationId":"sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response"}}}},"/sitemap-pages.xml":{"get":{"summary":"Sitemap Pages","description":"Marketing surface + every pSEO list page that currently has data.\n\nGenerated, never hardcoded: a page whose slice fell below seo.MIN_ROWS is\nnoindex'd by the route and must drop out of here in the same pass, or the\ndeploy's IndexNow ping submits URLs that render as thin.","operationId":"sitemap_pages_sitemap_pages_xml_get","responses":{"200":{"description":"Successful Response"}}}},"/sitemap-venues.xml":{"get":{"summary":"Sitemap Venues","description":"Every venue past the hold, one URL each. Same feed the route reads, so\na page in here is never a redirect.","operationId":"sitemap_venues_sitemap_venues_xml_get","responses":{"200":{"description":"Successful Response"}}}},"/llms.txt":{"get":{"summary":"Llms Txt","description":"llms.txt — the emerging convention answer engines read first. The same\nopen-with-attribution posture as robots.txt: the public tier is citable,\nthe paid fields aren't there to cite.","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response"}}}},"/6c7b1896cfa3ff151627c3a3f8fe77f4.txt":{"get":{"summary":"Indexnow Key","description":"IndexNow domain-ownership proof (seo-index pack) — key is public.","operationId":"indexnow_key_6c7b1896cfa3ff151627c3a3f8fe77f4_txt_get","responses":{"200":{"description":"Successful Response"}}}},"/privacy":{"get":{"summary":"Privacy Page","operationId":"privacy_page_privacy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/terms":{"get":{"summary":"Terms Page","operationId":"terms_page_terms_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/.well-known/mcp-registry-auth":{"get":{"summary":"Mcp Registry Auth","operationId":"mcp_registry_auth__well_known_mcp_registry_auth_get","responses":{"200":{"description":"Successful Response"}}}},"/":{"get":{"summary":"Landing","operationId":"landing__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sample":{"get":{"summary":"Sample Index","operationId":"sample_index_sample_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/sample/{metro}":{"get":{"summary":"Sample","operationId":"sample_sample__metro__get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/wire":{"post":{"summary":"Wire Signup","description":"Email-only capture from the sample page. No password, no account — the\ncheapest way for an interested reader to leave a trace.","operationId":"wire_signup_wire_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_wire_signup_wire_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pricing":{"get":{"summary":"Pricing","operationId":"pricing_pricing_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/signup":{"get":{"summary":"Signup Page","operationId":"signup_page_signup_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Signup","operationId":"signup_signup_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_signup_signup_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/start":{"get":{"summary":"Start Page","operationId":"start_page_start_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Start Request","operationId":"start_request_start_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_start_request_start_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/t/start":{"post":{"summary":"Start Engage","operationId":"start_engage_t_start_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/start/go":{"get":{"summary":"Start Go","operationId":"start_go_start_go_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login":{"get":{"summary":"Login Page","operationId":"login_page_login_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Login","operationId":"login_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logout":{"get":{"summary":"Logout","operationId":"logout_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google":{"get":{"summary":"Google Start","description":"Kick off the flow: signed state out, matching nonce in a short cookie.","operationId":"google_start_auth_google_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google/callback":{"get":{"summary":"Google Callback","operationId":"google_callback_auth_google_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google/onetap":{"post":{"summary":"Google Onetap","description":"Google One Tap credential POST. Google posts the ID token as `credential`\nplus a double-submit `g_csrf_token` (body + cookie) that we must match — its\nbuilt-in login-CSRF guard, the One Tap analogue of the state/nonce pair on\nthe redirect flow.","operationId":"google_onetap_auth_google_onetap_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/subscribe":{"post":{"summary":"Subscribe","operationId":"subscribe_subscribe_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_subscribe_subscribe_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding":{"get":{"summary":"Onboarding Page","operationId":"onboarding_page_onboarding_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Onboarding Save","operationId":"onboarding_save_onboarding_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_onboarding_save_onboarding_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard":{"get":{"summary":"Dashboard","operationId":"dashboard_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/tour":{"post":{"summary":"Tour Event","description":"First-Wire tour telemetry + completion flag. tour_done is set on any\nexit (done or skip) so the auto-offer never fires twice; the funnel reads\ntour_start → tour_step → tour_done/tour_skip against trial→paid.","operationId":"tour_event_tour_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_tour_event_tour_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signal/{metro}/{vid}":{"get":{"summary":"Signal Detail","operationId":"signal_detail_signal__metro___vid__get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"vid","in":"path","required":true,"schema":{"type":"string","title":"Vid"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/export":{"get":{"summary":"Export Csv","operationId":"export_csv_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/settings":{"get":{"summary":"Settings","operationId":"settings_settings_get","parameters":[{"name":"new_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Key"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/settings/portal":{"post":{"summary":"Portal","operationId":"portal_settings_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/settings/upgrade":{"post":{"summary":"Upgrade","operationId":"upgrade_settings_upgrade_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_upgrade_settings_upgrade_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/fix":{"get":{"summary":"Billing Fix","description":"Signed link from the payment-failed email: straight to the card update,\nno login. A bad or expired link falls back to the logged-in path.","operationId":"billing_fix_billing_fix_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/done":{"get":{"summary":"Billing Done","description":"Where Stripe sends people back after the card update (ask-6602635b).\nThe Keep my wire link is login-free, so its readers must not land on\n/login: confirm here. Logged-in users keep the dashboard path.","operationId":"billing_done_billing_done_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/settings/apikey":{"post":{"summary":"Apikey Create","operationId":"apikey_create_settings_apikey_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/settings/apikey/revoke":{"post":{"summary":"Apikey Revoke","operationId":"apikey_revoke_settings_apikey_revoke_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_apikey_revoke_settings_apikey_revoke_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/settings/alerts":{"post":{"summary":"Alerts Save","operationId":"alerts_save_settings_alerts_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_alerts_save_settings_alerts_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/settings/webhook":{"post":{"summary":"Webhook Save","operationId":"webhook_save_settings_webhook_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_webhook_save_settings_webhook_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cancel":{"get":{"summary":"Cancel Page","operationId":"cancel_page_cancel_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/cancel/pause":{"post":{"summary":"Cancel Pause","operationId":"cancel_pause_cancel_pause_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_cancel_pause_cancel_pause_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/stripe":{"post":{"summary":"Stripe Webhook","operationId":"stripe_webhook_webhooks_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/e/o.gif":{"get":{"summary":"Drip Open","operationId":"drip_open_e_o_gif_get","parameters":[{"name":"c","in":"query","required":false,"schema":{"type":"string","default":"","title":"C"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/c":{"get":{"summary":"Drip Click","description":"Click hop. The signature is what stops this being an open redirect:\nonly URLs we ourselves signed into an email will forward.","operationId":"drip_click_e_c_get","parameters":[{"name":"c","in":"query","required":false,"schema":{"type":"string","default":"","title":"C"}},{"name":"u","in":"query","required":false,"schema":{"type":"string","default":"","title":"U"}},{"name":"s","in":"query","required":false,"schema":{"type":"string","default":"","title":"S"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/wo.gif":{"get":{"summary":"Wire Open","description":"Digest open pixel (ask-85042b6f). Soft signal: Apple MPP and mail\ngateways prefetch images, so read wire_click for real engagement.","operationId":"wire_open_e_wo_gif_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/w":{"get":{"summary":"Wire Click","description":"Digest link hop (ask-85042b6f). The target comes from a fixed allow-list,\nnever the query string, and a bad token still forwards: a tracking failure\nmust not break the reader's link.","operationId":"wire_click_e_w_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","default":"dashboard","title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/e/w/go":{"get":{"summary":"Wire Signin Get","description":"10-17: the button was an <a href> to this URL, so gateways that crawl the\nlanding page followed it and got a session (bmalone, 2 IPs 2s apart). A GET\nnever signs in now; it shows the button page again.","operationId":"wire_signin_get_e_w_go_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","default":"dashboard","title":"To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Wire Signin","operationId":"wire_signin_e_w_go_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/e/u":{"get":{"summary":"Drip Unsubscribe","description":"Opt out on GET. Mailbox link-scanners can trip this, but the failure\ndirection is right: an unwanted opt-out is recoverable from /settings,\na broken opt-out link is a compliance problem.","operationId":"drip_unsubscribe_e_u_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Drip Unsubscribe Post","description":"RFC 8058 one-click, the target of List-Unsubscribe-Post. Gmail and\nYahoo surface a native Unsubscribe button when this exists, and rank bulk\nsenders without one considerably harder.","operationId":"drip_unsubscribe_post_e_u_post","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/outreach-hook":{"post":{"summary":"Outreach Hook","description":"compoundexits' founder outreach (TQ's per-person emails) and the drip\nmail the same people; this is where the two meet. Events:\n  check  - read-only: is this account opted out, when did the drip last send\n  sent   - an outreach email went out: stamp founder_outreach_at, so the\n           drip stands down for drip.OUTREACH_QUIET_DAYS\n  stop   - the person replied STOP / asked to be deleted: opt them out of\n           marketing mail here too\nEvery event answers with the current state, so the sender can gate on it.\nUnknown addresses (cold leads with no account) answer known=false.","operationId":"outreach_hook_internal_outreach_hook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/leads/{cat}":{"get":{"summary":"Buyer Guide","operationId":"buyer_guide_leads__cat__get","parameters":[{"name":"cat","in":"path","required":true,"schema":{"type":"string","title":"Cat"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/texas/tabc-pending-applications-guide":{"get":{"summary":"Tabc Guide","description":"How to look up pending TABC applications, what the permit codes mean and\nhow long they stay pending (ask-00fd297a). \"texas\" is never a metro.","operationId":"tabc_guide_texas_tabc_pending_applications_guide_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/new-york/sla-pending-applications-guide":{"get":{"summary":"Sla Guide","description":"How long NYC liquor license applications wait at the SLA and how to look\nthem up (ask-d9b3d8f2). Explicit path, so it wins over /{metro}/... routes.","operationId":"sla_guide_new_york_sla_pending_applications_guide_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/los-angeles/abc-pending-applications-guide":{"get":{"summary":"Abc Guide","description":"How long LA liquor license applications take at CA ABC and how to look\nthem up (manager ev-1f528eac). Explicit path, so it wins over /{metro}/...","operationId":"abc_guide_los_angeles_abc_pending_applications_guide_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/guides/find-restaurants-before-they-open":{"get":{"summary":"Compare Guide","description":"Ways to find restaurants before they open, compared (pulse-81c11885).\nPer-metro volume is metro_stats' filed_30d, the number the sample shows.","operationId":"compare_guide_guides_find_restaurants_before_they_open_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/compare/{slug}":{"get":{"summary":"Vendor Compare","description":"'<Vendor> alternative': a factual side-by-side (growth ai-buyer-queries #11).","operationId":"vendor_compare_compare__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/openings":{"get":{"summary":"Seo Index","description":"Cluster index, and the nav's way in. Carries the cross-metro totals and\na combined opening curve — the one view no single metro page can show.","operationId":"seo_index_openings_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/{metro}/restaurants-opening-soon":{"get":{"summary":"Seo Metro","operationId":"seo_metro__metro__restaurants_opening_soon_get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{metro}/restaurants-opening/{period}":{"get":{"summary":"Seo Period","operationId":"seo_period__metro__restaurants_opening__period__get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"period","in":"path","required":true,"schema":{"type":"string","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{metro}/{area}/restaurants-opening-soon":{"get":{"summary":"Seo Area","description":"One route, two levels: an AREAS slug or a NEIGHBOURHOODS slug.\n\nThey share a URL shape because they are the same kind of page — a\ngeographic slice of the metro feed. Slugs are unique within a metro (a\ntest enforces it), so the lookup is unambiguous; areas resolve first.","operationId":"seo_area__metro___area__restaurants_opening_soon_get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"area","in":"path","required":true,"schema":{"type":"string","title":"Area"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{metro}/bars-opening-soon":{"get":{"summary":"Seo Vtype Metro","operationId":"seo_vtype_metro__metro__bars_opening_soon_get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{metro}/{place}/bars-opening-soon":{"get":{"summary":"Seo Vtype Place","operationId":"seo_vtype_place__metro___place__bars_opening_soon_get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"place","in":"path","required":true,"schema":{"type":"string","title":"Place"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{metro}/venue/{slug}":{"get":{"summary":"Seo Venue","description":"One public page per venue past the hold. The answer is the opening\nwindow; everything else exists so the page isn't thin.","operationId":"seo_venue__metro__venue__slug__get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{metro}/license/{slug}":{"get":{"summary":"Seo License","description":"Venues filtering to one license class.\n\nA real buying signal rather than a taxonomy exercise: full liquor and\nbeer-and-wine are different insurance risks, different POS configurations\nand different distributor accounts.","operationId":"seo_license__metro__license__slug__get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{metro}/stage/{slug}":{"get":{"summary":"Seo Stage","description":"Venues at one filing stage — how close they are to opening, which is\nalso how close the operator is to spending.","operationId":"seo_stage__metro__stage__slug__get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{metro}/liquor-license-applications":{"get":{"summary":"Seo Applications","description":"Every liquor license application in the window, newest filing first,\ntitled the way buyers ask for it (ask-5003ec88).","operationId":"seo_applications__metro__liquor_license_applications_get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{metro}/leads/{cat}":{"get":{"summary":"Seo Category","operationId":"seo_category__metro__leads__cat__get","parameters":[{"name":"metro","in":"path","required":true,"schema":{"type":"string","title":"Metro"}},{"name":"cat","in":"path","required":true,"schema":{"type":"string","title":"Cat"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_alerts_save_settings_alerts_post":{"properties":{"frequency":{"type":"string","title":"Frequency","default":"daily"}},"type":"object","title":"Body_alerts_save_settings_alerts_post"},"Body_apikey_revoke_settings_apikey_revoke_post":{"properties":{"key_hash":{"type":"string","title":"Key Hash"}},"type":"object","required":["key_hash"],"title":"Body_apikey_revoke_settings_apikey_revoke_post"},"Body_cancel_pause_cancel_pause_post":{"properties":{"sub_id":{"type":"string","title":"Sub Id"},"months":{"type":"integer","title":"Months","default":1}},"type":"object","required":["sub_id"],"title":"Body_cancel_pause_cancel_pause_post"},"Body_login_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"next":{"type":"string","title":"Next","default":""}},"type":"object","required":["email","password"],"title":"Body_login_login_post"},"Body_onboarding_save_onboarding_post":{"properties":{"frequency":{"type":"string","title":"Frequency","default":"daily"},"webhook_url":{"type":"string","title":"Webhook Url","default":""}},"type":"object","title":"Body_onboarding_save_onboarding_post"},"Body_signup_signup_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"metro":{"type":"string","title":"Metro","default":""}},"type":"object","required":["email","password"],"title":"Body_signup_signup_post"},"Body_start_request_start_post":{"properties":{"email":{"type":"string","title":"Email"},"metro":{"type":"string","title":"Metro","default":""},"category":{"type":"string","title":"Category","default":"pos"},"v":{"type":"string","title":"V","default":""},"pf":{"type":"string","title":"Pf","default":""},"t":{"type":"string","title":"T","default":""},"from":{"type":"string","title":"From","default":""}},"type":"object","required":["email"],"title":"Body_start_request_start_post"},"Body_subscribe_subscribe_post":{"properties":{"plan":{"type":"string","title":"Plan"},"interval":{"type":"string","title":"Interval","default":"month"},"metro":{"type":"string","title":"Metro"},"category":{"type":"string","title":"Category"}},"type":"object","required":["plan","metro","category"],"title":"Body_subscribe_subscribe_post"},"Body_tour_event_tour_post":{"properties":{"event":{"type":"string","title":"Event"},"step":{"type":"integer","title":"Step","default":0}},"type":"object","required":["event"],"title":"Body_tour_event_tour_post"},"Body_upgrade_settings_upgrade_post":{"properties":{"sub_id":{"type":"string","title":"Sub Id"}},"type":"object","required":["sub_id"],"title":"Body_upgrade_settings_upgrade_post"},"Body_webhook_save_settings_webhook_post":{"properties":{"webhook_url":{"type":"string","title":"Webhook Url","default":""},"action":{"type":"string","title":"Action","default":"save"}},"type":"object","title":"Body_webhook_save_settings_webhook_post"},"Body_wire_signup_wire_post":{"properties":{"email":{"type":"string","title":"Email"},"metro":{"type":"string","title":"Metro"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},"type":"object","required":["email","metro"],"title":"Body_wire_signup_wire_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"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"}}}}