{"openapi":"3.1.0","info":{"title":"HyperStore API","description":"AI Apps Directory API","version":"0.1.0"},"paths":{"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/cdn/{path}":{"get":{"summary":"Cdn Proxy","description":"Proxy R2 images with in-memory cache and ETag support.","operationId":"cdn_proxy_cdn__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}},{"name":"if-none-match","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"If-None-Match"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cdn-stream/{path}":{"get":{"summary":"Cdn Stream","description":"Range-supported streaming proxy for large R2 media (videos).\n\nUnlike /cdn/, this does not buffer the whole object in memory — each request\nis fetched fresh (optionally with a Range) and streamed chunk-by-chunk.","operationId":"cdn_stream_cdn_stream__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}},{"name":"range","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Range"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/fo-verify.html":{"get":{"tags":["seo"],"summary":"Flexoffers Verify","operationId":"flexoffers_verify_fo_verify_html_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/robots.txt":{"get":{"tags":["seo"],"summary":"Robots Txt","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/sitemap.xml":{"get":{"tags":["seo"],"summary":"Sitemap Xml","description":"Root sitemap. Returns a sitemap-index that points to per-section\nfiles (apps, blog, tags, categories, static).\n\nRate-limit-free by design — crawlers (Google, Bing, IndexNow consumers,\nthird-party SEO tools) burst from shared IP ranges and a 429 here marks\nthe sitemap as broken in Search Console. Per-section caches keep DB\npressure flat regardless of crawl rate, and Cache-Control lets\nCloudflare/edge cache the response so most hits never reach the app.\n\nBackward-compat: when an operator has saved a full sitemap_xml override\n(legacy single-file shape), we serve that verbatim instead of the index\nso existing Search Console submissions don't break.","operationId":"sitemap_xml_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap-static.xml":{"get":{"tags":["seo"],"summary":"Sitemap Static Xml","operationId":"sitemap_static_xml_sitemap_static_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap-categories-{lang}.xml":{"get":{"tags":["seo"],"summary":"Sitemap Categories Xml","operationId":"sitemap_categories_xml_sitemap_categories__lang__xml_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap-apps-{spec}.xml":{"get":{"tags":["seo"],"summary":"Sitemap Apps Xml","operationId":"sitemap_apps_xml_sitemap_apps__spec__xml_get","parameters":[{"name":"spec","in":"path","required":true,"schema":{"type":"string","title":"Spec"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap-blog-{spec}.xml":{"get":{"tags":["seo"],"summary":"Sitemap Blog Xml","operationId":"sitemap_blog_xml_sitemap_blog__spec__xml_get","parameters":[{"name":"spec","in":"path","required":true,"schema":{"type":"string","title":"Spec"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap-pseo-{spec}.xml":{"get":{"tags":["seo"],"summary":"Sitemap Pseo Xml","description":"Programmatic-SEO landing pages (alternatives, audience, use-case).","operationId":"sitemap_pseo_xml_sitemap_pseo__spec__xml_get","parameters":[{"name":"spec","in":"path","required":true,"schema":{"type":"string","title":"Spec"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap-blog.xml":{"get":{"tags":["seo"],"summary":"Sitemap Legacy Section","operationId":"sitemap_legacy_section_sitemap_blog_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap-apps.xml":{"get":{"tags":["seo"],"summary":"Sitemap Legacy Section","operationId":"sitemap_legacy_section_sitemap_apps_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap-categories.xml":{"get":{"tags":["seo"],"summary":"Sitemap Legacy Section","operationId":"sitemap_legacy_section_sitemap_categories_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap-tags.xml":{"get":{"tags":["seo"],"summary":"Sitemap Tags Xml","operationId":"sitemap_tags_xml_sitemap_tags_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/mcp.json":{"get":{"tags":["seo"],"summary":"Well Known Mcp","description":"MCP server discovery endpoint (https://modelcontextprotocol.io).","operationId":"well_known_mcp__well_known_mcp_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/humans.txt":{"get":{"tags":["seo"],"summary":"Humans Txt","description":"Operator-managed humans.txt — empty default. When the operator\nsaves a body at /admin/seo-marketing it's served here; otherwise 404.","operationId":"humans_txt_humans_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/.well-known/security.txt":{"get":{"tags":["seo"],"summary":"Security Txt","description":"Operator-managed RFC 9116 security.txt. Served only when an\noverride is saved at /admin/seo-marketing; otherwise 404.","operationId":"security_txt__well_known_security_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms.txt":{"get":{"tags":["seo"],"summary":"Llms Txt","description":"Concise llms.txt. Operator override wins; otherwise a cached dynamic\nbuild (sitemap TTL). No rate limit by design — the per-section cache plus\nCache-Control keep DB pressure flat, and we *want* LLM crawlers\n(ChatGPT/Claude/Perplexity/Gemini) to fetch this freely for GEO.","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms-full.txt":{"get":{"tags":["seo"],"summary":"Llms Full Txt","description":"Exhaustive llms-full.txt (every published app). Operator override\nwins; otherwise a cached dynamic build (sitemap TTL).","operationId":"llms_full_txt_llms_full_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/{indexnow_key}.txt":{"get":{"tags":["seo"],"summary":"Indexnow Key File","description":"IndexNow ownership proof file.\n\nBing/Yandex/Seznam request /{key}.txt to verify we own the key listed\nin our ping payloads. The response body must be exactly the key. This\nis registered AFTER /robots.txt and /llms.txt so exact-match routes\nwin and only unmatched *.txt paths fall through here.","operationId":"indexnow_key_file__indexnow_key__txt_get","parameters":[{"name":"indexnow_key","in":"path","required":true,"schema":{"type":"string","title":"Indexnow Key"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/badge.svg":{"get":{"tags":["badge"],"summary":"Badge Svg","description":"Static, app-independent \"Featured on HyperStore\" badge.\n\n``variant`` ∈ {grad, dark, light, gradtext}; ``size`` ∈ {s, m, l}. Unknown\nvalues fall back to grad/m. Long cache + immutable: the geometry only\nchanges when this module ships, so external sites and any CDN in front can\nhold it for a day.","operationId":"badge_svg_badge_svg_get","parameters":[{"name":"variant","in":"query","required":false,"schema":{"type":"string","default":"grad","title":"Variant"}},{"name":"size","in":"query","required":false,"schema":{"type":"string","default":"m","title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__auth__LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/register":{"post":{"tags":["account"],"summary":"Register","description":"Create an email+password account and open a session (immediate activation).","operationId":"register_api_account_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/login":{"post":{"tags":["account"],"summary":"Login","description":"Authenticate email+password and open a session.","operationId":"login_api_account_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__account__LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/logout":{"post":{"tags":["account"],"summary":"Logout","operationId":"logout_api_account_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/account/me":{"get":{"tags":["account"],"summary":"Me","operationId":"me_api_account_me_get","parameters":[{"name":"eu_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/forgot-password":{"post":{"tags":["account"],"summary":"Forgot Password","description":"Email a one-time reset link. Always returns ok=True so the endpoint can't\nbe used to probe which emails have accounts.","operationId":"forgot_password_api_account_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/reset-password":{"post":{"tags":["account"],"summary":"Reset Password","description":"Set a new password from a reset token and open a session.","operationId":"reset_password_api_account_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/change-password":{"post":{"tags":["account"],"summary":"Change Password","description":"Change (or, for a Google-only account, set) the password while signed in.","operationId":"change_password_api_account_change_password_post","parameters":[{"name":"eu_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/profile":{"patch":{"tags":["account"],"summary":"Update Profile","description":"Update editable profile fields (currently just display name).","operationId":"update_profile_api_account_profile_patch","parameters":[{"name":"eu_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/avatar":{"post":{"tags":["account"],"summary":"Upload Avatar","description":"Upload a profile photo (drag & drop on the profile page). 256×256 WebP on R2.","operationId":"upload_avatar_api_account_avatar_post","parameters":[{"name":"eu_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Session"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_avatar_api_account_avatar_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account":{"delete":{"tags":["account"],"summary":"Delete Account","description":"Permanently delete the account and all saved apps (user_saves cascades).","operationId":"delete_account_api_account_delete","parameters":[{"name":"eu_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/saves":{"get":{"tags":["account"],"summary":"List Saves","description":"Saved apps for the signed-in user, newest first.","operationId":"list_saves_api_account_saves_get","parameters":[{"name":"eu_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["account"],"summary":"Add Save","description":"Save an app by slug. Idempotent.","operationId":"add_save_api_account_saves_post","parameters":[{"name":"eu_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/saves/{slug}":{"delete":{"tags":["account"],"summary":"Remove Save","description":"Unsave an app by slug. Idempotent.","operationId":"remove_save_api_account_saves__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"eu_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/saves/merge":{"post":{"tags":["account"],"summary":"Merge Saves","description":"Merge anonymous (localStorage) saves into the signed-in account. Slugs that\ndon't resolve to a live app are skipped silently. Returns the full server-side\ncollection so the client can replace its local state in one round-trip.","operationId":"merge_saves_api_account_saves_merge_post","parameters":[{"name":"eu_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eu Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/saves/resolve":{"get":{"tags":["account"],"summary":"Resolve Saves","description":"Public: resolve a comma-separated slug list into app cards. Used by the\ncollection page to render anonymous (localStorage) saves before sign-in.","operationId":"resolve_saves_api_account_saves_resolve_get","parameters":[{"name":"slugs","in":"query","required":false,"schema":{"type":"string","default":"","title":"Slugs"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/homepage":{"get":{"tags":["public"],"summary":"Get Homepage","description":"Returns categories sorted by app_count DESC.\nEach category has top 5 apps by rating then popularity.\nPage 1 reads from homepage_cache (built daily by HomepageBuilderAgent).\nPage 2+ uses a single optimized query.","operationId":"get_homepage_api_homepage_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps":{"get":{"tags":["public"],"summary":"List Apps","description":"Paginated apps list with optional search and filters. cursor = last app id.","operationId":"list_apps_api_apps_get","parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":48,"default":24,"title":"Limit"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Q"}},{"name":"pricing","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{slug}":{"get":{"tags":["public"],"summary":"Get App","operationId":"get_app_api_apps__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/apps/{slug}/save-count":{"post":{"tags":["public"],"summary":"Save Count","description":"Anonymous, account-free social-proof save counter.\n\nCloses the save side of the flywheel: when a visitor saves / un-saves an\napp (the heart button), bump the public ``apps.saves`` count — deduped per\nbrowser via the ``hs_saved`` cookie so repeated toggles can't inflate it,\nand never below zero. Independent of the per-user collection (user_saves):\nthis measures how many distinct browsers have saved the app, which is what\nthe badge + ranking_score consume.","operationId":"save_count_api_apps__slug__save_count_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveCountBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/categories":{"get":{"tags":["public"],"summary":"List Categories","operationId":"list_categories_api_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/categories/{slug}/apps":{"get":{"tags":["public"],"summary":"Get Category Apps","operationId":"get_category_apps_api_categories__slug__apps_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":48,"default":24,"title":"Limit"}},{"name":"pricing","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{slug}/alternatives":{"get":{"tags":["public"],"summary":"Get App Alternatives","description":"Curated alternatives to one app — the live graph behind /alternatives-to-{slug}.\nBounded set ordered by match confidence, so no cursor pagination.","operationId":"get_app_alternatives_api_apps__slug__alternatives_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":48,"default":24,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audiences":{"get":{"tags":["public"],"summary":"List Audiences","description":"Audience segments (lawyers, students, …) behind /best-ai-tools-for-{slug}.","operationId":"list_audiences_api_audiences_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/audiences/{slug}/apps":{"get":{"tags":["public"],"summary":"Get Audience Apps","description":"Best AI tools for one audience, ranked by relevance then popularity.","operationId":"get_audience_apps_api_audiences__slug__apps_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":48,"default":24,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/use-cases":{"get":{"tags":["public"],"summary":"List Use Cases","description":"Use-case taxonomies (legal-contracts, tiktok-shorts, …) behind /ai-tools-for-{slug}.","operationId":"list_use_cases_api_use_cases_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/use-cases/{slug}/apps":{"get":{"tags":["public"],"summary":"Get Use Case Apps","description":"AI tools for one use case, ranked by relevance then popularity.","operationId":"get_use_case_apps_api_use_cases__slug__apps_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":48,"default":24,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ai-search":{"post":{"tags":["public"],"summary":"Ai Search","description":"AI-powered semantic app search using embeddings with FTS fallback.","operationId":"ai_search_api_ai_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/search":{"get":{"tags":["public"],"summary":"Search Apps","operationId":"search_apps_api_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"title":"Q"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Offset"}},{"name":"pricing","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Pricing"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":48,"default":24,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/browse":{"get":{"tags":["public"],"summary":"Browse Apps","description":"A-Z directory listing. letter='#' returns apps starting with digits/symbols.","operationId":"browse_apps_api_browse_get","parameters":[{"name":"letter","in":"query","required":false,"schema":{"type":"string","maxLength":1,"default":"A","title":"Letter"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":48,"default":24,"title":"Limit"}},{"name":"pricing","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/listing-application/upload-image":{"post":{"tags":["public"],"summary":"Listing Upload Image","description":"Public image upload for the 'List Your App' form. Writes to CDN.","operationId":"listing_upload_image_api_listing_application_upload_image_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_listing_upload_image_api_listing_application_upload_image_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/listing-application":{"post":{"tags":["public"],"summary":"Create Listing Application","description":"Submit a new app listing application.","operationId":"create_listing_application_api_listing_application_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingApplicationCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/listing-application/{app_id}":{"put":{"tags":["public"],"summary":"Revise Listing Application","description":"Revise an existing application using its edit token.\n\nThe token is a shared secret emailed to the applicant — treat it as the only\nproof of ownership. Editing is only allowed while the application is still\nopen for review (pending or needs_revision); approved/rejected records stay\nimmutable so the audit trail is clean. On a successful revise we transition\nthe status back to 'pending' and clear admin_notes so stale feedback from a\nprior review cycle doesn't linger.","operationId":"revise_listing_application_api_listing_application__app_id__put","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","description":"Per-application edit token from the revision email","default":"","title":"Token"},"description":"Per-application edit token from the revision email"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingApplicationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["public"],"summary":"Get Listing Application","description":"Get listing application details (public, for status page).","operationId":"get_listing_application_api_listing_application__app_id__get","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/contact":{"post":{"tags":["public"],"summary":"Create Contact Message","description":"Submit a contact message.","operationId":"create_contact_message_api_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactMessageCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/track/blog-view":{"post":{"tags":["analytics"],"summary":"Track Blog View","operationId":"track_blog_view_api_track_blog_view_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogViewIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/track/blog-click":{"post":{"tags":["analytics"],"summary":"Track Blog Click","operationId":"track_blog_click_api_track_blog_click_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogClickIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/track/blog-impressions":{"post":{"tags":["analytics"],"summary":"Track Blog Impressions","description":"Record listing-page A/B impressions in batch. Dedupes via unique index.","operationId":"track_blog_impressions_api_track_blog_impressions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogImpressionsIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sidebar-counts":{"get":{"tags":["admin"],"summary":"Admin Sidebar Counts","description":"Return counts that drive notification badges on the admin sidebar.","operationId":"admin_sidebar_counts_api_admin_sidebar_counts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/openlimits/health":{"get":{"tags":["admin"],"summary":"Admin Openlimits Health","description":"Per-model OpenLimits health, quality-ordered, for the dashboard card.","operationId":"admin_openlimits_health_api_admin_openlimits_health_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/openlimits/health/probe":{"post":{"tags":["admin"],"summary":"Admin Openlimits Probe","description":"Trigger an immediate probe of all OpenLimits models (manual refresh).","operationId":"admin_openlimits_probe_api_admin_openlimits_health_probe_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/categories":{"get":{"tags":["admin"],"summary":"Admin List Categories","operationId":"admin_list_categories_api_admin_categories_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Create Category","operationId":"admin_create_category_api_admin_categories_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/categories/{cat_id}":{"put":{"tags":["admin"],"summary":"Admin Update Category","operationId":"admin_update_category_api_admin_categories__cat_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"integer","title":"Cat Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete Category","operationId":"admin_delete_category_api_admin_categories__cat_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"integer","title":"Cat Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tags":{"get":{"tags":["admin"],"summary":"Admin List Tags","operationId":"admin_list_tags_api_admin_tags_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Create Tag","operationId":"admin_create_tag_api_admin_tags_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tags/{tag_id}":{"delete":{"tags":["admin"],"summary":"Admin Delete Tag","operationId":"admin_delete_tag_api_admin_tags__tag_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"integer","title":"Tag Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/apps":{"get":{"tags":["admin"],"summary":"Admin List Apps","operationId":"admin_list_apps_api_admin_apps_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","title":"Q"}},{"name":"is_published","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Is Published"}},{"name":"pricing_model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing Model"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Is Active"}},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort By"}},{"name":"sort_dir","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort Dir"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Create App","operationId":"admin_create_app_api_admin_apps_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/apps/{app_id}":{"get":{"tags":["admin"],"summary":"Admin Get App","operationId":"admin_get_app_api_admin_apps__app_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Admin Update App","operationId":"admin_update_app_api_admin_apps__app_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete App","operationId":"admin_delete_app_api_admin_apps__app_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sources/check":{"get":{"tags":["admin"],"summary":"Check Source Crawlability","description":"Test if a URL is crawlable before saving it as a source.\nReturns status, bot-protection detection, and sitemap availability.","operationId":"check_source_crawlability_api_admin_sources_check_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sources":{"get":{"tags":["admin"],"summary":"Admin List Sources","operationId":"admin_list_sources_api_admin_sources_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Create Source","operationId":"admin_create_source_api_admin_sources_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sources/{source_id}":{"put":{"tags":["admin"],"summary":"Admin Update Source","operationId":"admin_update_source_api_admin_sources__source_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete Source","operationId":"admin_delete_source_api_admin_sources__source_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/llm-cost":{"get":{"tags":["admin"],"summary":"Admin Llm Cost","description":"Return Claude API spend (today, 7d, 30d) + breakdown by agent + recent\nfailures. Powered by HyperStore.llm_calls written by services.llm_client.","operationId":"admin_llm_cost_api_admin_llm_cost_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/llm-budget":{"get":{"tags":["admin"],"summary":"Admin Llm Budget Get","description":"Return the current daily LLM budget guard configuration.","operationId":"admin_llm_budget_get_api_admin_llm_budget_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Llm Budget Set","description":"Update the daily LLM budget guard. Pass either field; missing fields\nare left untouched. Triggers an immediate cache refresh in the wrapper.","operationId":"admin_llm_budget_set_api_admin_llm_budget_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmBudgetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/llm-routing":{"get":{"tags":["admin"],"summary":"Admin Llm Routing Get","description":"Return the active route, OpenLimits availability, and the per-module\nlist for the routing dashboard.","operationId":"admin_llm_routing_get_api_admin_llm_routing_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Llm Routing Set","description":"Flip the global LLM route. Persists to runtime_config and refreshes the\nrouter's in-process cache so workers pick it up within a tick.","operationId":"admin_llm_routing_set_api_admin_llm_routing_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmRouteUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prompts":{"get":{"tags":["admin"],"summary":"Admin Prompts List","description":"Return one row per managed agent with its currently active prompt\n(DB version if any, else code default).","operationId":"admin_prompts_list_api_admin_prompts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prompts/{agent}":{"get":{"tags":["admin"],"summary":"Admin Prompt Detail","description":"Return active + version history for a single agent.","operationId":"admin_prompt_detail_api_admin_prompts__agent__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent","in":"path","required":true,"schema":{"type":"string","title":"Agent"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Prompt Create","description":"Create a new version for `agent`. Pass activate=true to flip it on\nimmediately (deactivates the previous active row atomically).","operationId":"admin_prompt_create_api_admin_prompts__agent__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent","in":"path","required":true,"schema":{"type":"string","title":"Agent"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptVersionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prompts/{agent}/default":{"get":{"tags":["admin"],"summary":"Admin Prompt Default","description":"Return the in-code default for an agent — used by the admin UI to\npre-fill the 'New version' editor on the first version.","operationId":"admin_prompt_default_api_admin_prompts__agent__default_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent","in":"path","required":true,"schema":{"type":"string","title":"Agent"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prompts/{agent}/activate/{version_id}":{"post":{"tags":["admin"],"summary":"Admin Prompt Activate","description":"Mark a specific version as active. The previous active row in the\nsame agent is deactivated atomically.","operationId":"admin_prompt_activate_api_admin_prompts__agent__activate__version_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent","in":"path","required":true,"schema":{"type":"string","title":"Agent"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"integer","title":"Version Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/prompts/{agent}/active":{"delete":{"tags":["admin"],"summary":"Admin Prompt Deactivate","description":"Drop the active DB row so future calls fall back to the code default.\nUseful as an emergency rollback when a DB row produces bad output.","operationId":"admin_prompt_deactivate_api_admin_prompts__agent__active_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent","in":"path","required":true,"schema":{"type":"string","title":"Agent"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users":{"get":{"tags":["admin"],"summary":"Admin List Users","operationId":"admin_list_users_api_admin_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Create User","operationId":"admin_create_user_api_admin_users_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}":{"put":{"tags":["admin"],"summary":"Admin Update User","operationId":"admin_update_user_api_admin_users__user_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete User","operationId":"admin_delete_user_api_admin_users__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/members":{"get":{"tags":["admin"],"summary":"Admin List Members","description":"List end-user accounts (optionally filtered by email/name), newest first.","operationId":"admin_list_members_api_admin_members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/members/{member_id}":{"delete":{"tags":["admin"],"summary":"Admin Delete Member","description":"Delete an end-user account (user_saves cascade).","operationId":"admin_delete_member_api_admin_members__member_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/service-jobs":{"get":{"tags":["admin"],"summary":"Admin List Service Jobs","operationId":"admin_list_service_jobs_api_admin_service_jobs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"service","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/seo-content-stats":{"get":{"tags":["admin"],"summary":"Admin Seo Content Stats","description":"Per-content-type SEO/indexing overview for the dashboard table:\nURL count, sitemap inclusion, thin/noindex count, and per-language\nbreakdown. Cached (5 min) — pass ?force=true to recompute.","operationId":"admin_seo_content_stats_api_admin_seo_content_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/crawl/trigger":{"post":{"tags":["admin"],"summary":"Admin Trigger Crawl","operationId":"admin_trigger_crawl_api_admin_crawl_trigger_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"query","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/crawl/import-last-dataset":{"post":{"tags":["admin"],"summary":"Admin Import Last Dataset","description":"Import from the actor's last completed Apify run without triggering a new actor run.","operationId":"admin_import_last_dataset_api_admin_crawl_import_last_dataset_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_id","in":"query","required":true,"schema":{"type":"integer","title":"Source Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/image-service/trigger":{"post":{"tags":["admin"],"summary":"Admin Trigger Image Service","description":"Manually trigger Image Service (Website Visitor) to capture logos/screenshots.","operationId":"admin_trigger_image_service_api_admin_image_service_trigger_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/translation/content/trigger":{"post":{"tags":["admin"],"summary":"Admin Trigger Content Translation","description":"Translate DB content (apps/categories/static pages) into locales.\n\nOptional JSON body: {langs?: [...], scope?: [...], only_missing?: bool,\napp_limit?: int}. Runs in the background and reports via the 'translation'\nservice monitor channel.","operationId":"admin_trigger_content_translation_api_admin_translation_content_trigger_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/translation/ui/regenerate":{"post":{"tags":["admin"],"summary":"Admin Regenerate Ui Catalogs","description":"Regenerate i18n/{lang}.json UI catalogs from the default locale.\n\nOptional JSON body: {langs?: [...]}. Translates the default catalog into\neach target locale and reloads the in-memory catalog cache.","operationId":"admin_regenerate_ui_catalogs_api_admin_translation_ui_regenerate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/languages":{"get":{"tags":["admin"],"summary":"Admin List Languages","description":"Registry languages joined with DB activation_state + coverage counts.","operationId":"admin_list_languages_api_admin_languages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/backfill/status":{"get":{"tags":["admin"],"summary":"Admin Backfill Status","description":"Per-content-type translation gap status for the Backfill Console.\n\nFor each type, total = (eligible rows) × (non-default locales) and done =\ntranslation rows that exist, so 'remaining' is exactly the historical gap\nacross all languages that a backfill would fill.","operationId":"admin_backfill_status_api_admin_backfill_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/backfill/clear-error":{"post":{"tags":["admin"],"summary":"Admin Backfill Clear Error","description":"Dismiss the durable Backfill Console error alert.","operationId":"admin_backfill_clear_error_api_admin_backfill_clear_error_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/schedule/status":{"get":{"tags":["admin"],"summary":"Admin Schedule Status","description":"Scheduled-automation status for the Backfill Console: every registered\njob with its interval/cron, next run (from APScheduler) and last run (from\nruntime_config). Lets the admin confirm translation + embedding backfills\nrun automatically, not just on demand.","operationId":"admin_schedule_status_api_admin_schedule_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/languages/{code}/translations/ui-fill":{"post":{"tags":["admin"],"summary":"Admin Lang Ui Fill","description":"Wizard step — translate the UI catalog for one locale (synchronous).","operationId":"admin_lang_ui_fill_api_admin_languages__code__translations_ui_fill_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/languages/{code}/content/{scope}":{"post":{"tags":["admin"],"summary":"Admin Lang Content Fill","description":"Wizard step — translate a small bounded content scope for one locale\n(synchronous). Categories, static pages and the pSEO taxonomies (audiences,\nuse-cases, glossary) all qualify. Apps/blog go through the background trigger.","operationId":"admin_lang_content_fill_api_admin_languages__code__content__scope__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/languages/{code}/sitemap/verify":{"post":{"tags":["admin"],"summary":"Admin Lang Sitemap Verify","description":"Wizard step — count this locale's indexable app URLs and submit recent\nones to IndexNow (Bing/Yandex/Seznam). HyperStore uses one sitemap set with\nhreflang alternates, so 'verify' = coverage count + IndexNow ping.","operationId":"admin_lang_sitemap_verify_api_admin_languages__code__sitemap_verify_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/languages/{code}/activation-state":{"patch":{"tags":["admin"],"summary":"Admin Lang Activation State","description":"Persist one wizard step's outcome into languages.activation_state.","operationId":"admin_lang_activation_state_api_admin_languages__code__activation_state_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/image-service/visit/{app_id}":{"post":{"tags":["admin"],"summary":"Admin Visit Single App","description":"Visit a single app's website to capture logo + screenshot.","operationId":"admin_visit_single_app_api_admin_image_service_visit__app_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/image-service/recreate":{"post":{"tags":["admin"],"summary":"Admin Recreate Images","description":"Recreate images for apps. Modes:\n- 'all': Reset ALL apps for fresh browser visit (logo + screenshot)\n- 'missing': Only apps with missing/non-CDN logos or screenshots","operationId":"admin_recreate_images_api_admin_image_service_recreate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"missing","title":"Mode"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/image-service/recreate/{app_id}/logo":{"post":{"tags":["admin"],"summary":"Admin Recreate App Logo","description":"Recreate ONLY logo for a single app (synchronous, returns new URL).","operationId":"admin_recreate_app_logo_api_admin_image_service_recreate__app_id__logo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/image-service/recreate/{app_id}/screenshot":{"post":{"tags":["admin"],"summary":"Admin Recreate App Screenshot","description":"Recreate ONLY screenshot for a single app (synchronous, returns new URL).","operationId":"admin_recreate_app_screenshot_api_admin_image_service_recreate__app_id__screenshot_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/image-service/recreate-batch":{"post":{"tags":["admin"],"summary":"Admin Recreate Batch","description":"Batch recreate images with target/scope options.\ntarget: logos | screenshots | both\nscope: broken | all","operationId":"admin_recreate_batch_api_admin_image_service_recreate_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"target","in":"query","required":false,"schema":{"type":"string","default":"both","title":"Target"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"broken","title":"Scope"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/image-service/backfill-external-logos":{"post":{"tags":["admin"],"summary":"Admin Backfill External Logos","description":"For apps that have a base_domain but no external_logo_url,\ngenerate the Logo.dev URL and save it as the external fallback.","operationId":"admin_backfill_external_logos_api_admin_image_service_backfill_external_logos_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/image-service/migrate-logos":{"post":{"tags":["admin"],"summary":"Admin Migrate Logos To Cdn","description":"Download all non-CDN logo_url images, upload to R2, update DB with /cdn/ URLs.\nRuns as async task with progress tracking via service monitor.","operationId":"admin_migrate_logos_to_cdn_api_admin_image_service_migrate_logos_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/image-service/fix-cdn-urls":{"post":{"tags":["admin"],"summary":"Admin Fix Cdn Urls","description":"Migrate broken R2/old CDN URLs to relative proxy URLs (/cdn/...).\nFixes both logo_url in apps and url in app_screenshots.","operationId":"admin_fix_cdn_urls_api_admin_image_service_fix_cdn_urls_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/services/{service_id}/stop":{"post":{"tags":["admin"],"summary":"Admin Stop Service","description":"Request a running service to stop at its next checkpoint.","operationId":"admin_stop_service_api_admin_services__service_id__stop_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"string","title":"Service Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/queue/stats":{"get":{"tags":["admin"],"summary":"Admin Queue Stats","description":"Returns app image pipeline statistics.","operationId":"admin_queue_stats_api_admin_queue_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/service-config":{"get":{"tags":["admin"],"summary":"Admin Get Service Config","description":"Return current service interval/batch settings.","operationId":"admin_get_service_config_api_admin_service_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Admin Update Service Config","description":"Update service intervals in memory and reschedule jobs.","operationId":"admin_update_service_config_api_admin_service_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/services":{"get":{"tags":["admin"],"summary":"Admin Get Services","description":"Current state snapshot of all services.","operationId":"admin_get_services_api_admin_services_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/enrichment/trigger":{"post":{"tags":["admin"],"summary":"Admin Trigger Enrichment","operationId":"admin_trigger_enrichment_api_admin_enrichment_trigger_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/upload-image":{"post":{"tags":["admin"],"summary":"Admin Upload Image","description":"Upload an image file directly to CDN. Returns the CDN URL.","operationId":"admin_upload_image_api_admin_upload_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_upload_image_api_admin_upload_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/delete-image":{"delete":{"tags":["admin"],"summary":"Admin Delete Image","description":"Delete an image from CDN by its URL.","operationId":"admin_delete_image_api_admin_delete_image_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/embedding-backfill/trigger":{"post":{"tags":["admin"],"summary":"Admin Trigger Embedding Backfill","description":"Trigger embedding backfill as a managed service.\n\n`chunked` (no_token only): cap the run to EMBEDDING_BACKFILL_CHUNK apps so it\nstays under the OOM ceiling — the scheduler resumes the rest. Pass\nchunked=false to push every missing app in one (kill-prone) run.","operationId":"admin_trigger_embedding_backfill_api_admin_embedding_backfill_trigger_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mode","in":"query","required":false,"schema":{"type":"string","default":"no_token","title":"Mode"}},{"name":"chunked","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Chunked"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/category-backfill/trigger":{"post":{"tags":["admin"],"summary":"Admin Trigger Category Backfill","description":"Reassign categories for ALL apps using embedding similarity. Use after adding new categories.","operationId":"admin_trigger_category_backfill_api_admin_category_backfill_trigger_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/pseo/overview":{"get":{"tags":["admin"],"summary":"Admin Pseo Overview","description":"Coverage stats, per-entity status (audiences + use-cases), and today's\nrandomized schedule progress for the Programmatic SEO page.","operationId":"admin_pseo_overview_api_admin_pseo_overview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/pseo/enrich":{"post":{"tags":["admin"],"summary":"Admin Pseo Enrich","description":"Run embedding enrichment for audiences or use-cases (all, or one).\n`audience_id` kept for backwards-compat with the older button.","operationId":"admin_pseo_enrich_api_admin_pseo_enrich_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"audience","title":"Kind"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Entity Id"}},{"name":"audience_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audience Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/pseo/alternatives-backfill":{"post":{"tags":["admin"],"summary":"Admin Pseo Alternatives Backfill","description":"Resolve apps.alternatives → app_alternatives (powers /alternatives-to-{app}\nand /switch-from-{a}-to-{b}). Idempotent; safe to re-run after new crawls.","operationId":"admin_pseo_alternatives_backfill_api_admin_pseo_alternatives_backfill_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/pseo/alternatives-similarity-backfill":{"post":{"tags":["admin"],"summary":"Admin Pseo Alternatives Similarity","description":"Derive per-app alternatives from embedding similarity (cosine-nearest\nneighbours + same-category boost) and upsert them into app_alternatives.\n\nFixes the 'every niche app lists the same generic competitors' problem the\nscraped data has — additive and idempotent, so good domain matches survive.\nRun dry_run=true first to preview edge counts. Powers /alternatives-to-{app}\nand the 'Best {X} Alternatives' blog posts.","operationId":"admin_pseo_alternatives_similarity_api_admin_pseo_alternatives_similarity_backfill_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}},{"name":"top_k","in":"query","required":false,"schema":{"type":"integer","default":12,"title":"Top K"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/pseo/schedule":{"get":{"tags":["admin"],"summary":"Admin Pseo Get Schedule","operationId":"admin_pseo_get_schedule_api_admin_pseo_schedule_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Admin Pseo Save Schedule","operationId":"admin_pseo_save_schedule_api_admin_pseo_schedule_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PseoScheduleConfig"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/homepage-builder/trigger":{"post":{"tags":["admin"],"summary":"Admin Trigger Homepage Builder","description":"Manually trigger Homepage Builder to rebuild the daily snapshot.","operationId":"admin_trigger_homepage_builder_api_admin_homepage_builder_trigger_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blog-builder/trigger":{"post":{"tags":["admin"],"summary":"Admin Trigger Blog Builder","operationId":"admin_trigger_blog_builder_api_admin_blog_builder_trigger_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/static-pages":{"get":{"tags":["admin"],"summary":"Admin List Static Pages","operationId":"admin_list_static_pages_api_admin_static_pages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Create Static Page","operationId":"admin_create_static_page_api_admin_static_pages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPageCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/static-pages/{page_id}":{"get":{"tags":["admin"],"summary":"Admin Get Static Page","operationId":"admin_get_static_page_api_admin_static_pages__page_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","title":"Page Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Admin Update Static Page","operationId":"admin_update_static_page_api_admin_static_pages__page_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","title":"Page Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaticPageUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete Static Page","operationId":"admin_delete_static_page_api_admin_static_pages__page_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"integer","title":"Page Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/listing-applications":{"get":{"tags":["admin"],"summary":"Admin List Listing Applications","description":"List listing applications filtered by status.\n\nThe 'pending' filter returns both 'pending' and 'needs_revision' rows —\nboth states still require admin attention, so they share the same tab.","operationId":"admin_list_listing_applications_api_admin_listing_applications_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"pending","title":"Status"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/listing-applications/{app_id}":{"get":{"tags":["admin"],"summary":"Admin Get Listing Application","description":"Get single listing application detail.","operationId":"admin_get_listing_application_api_admin_listing_applications__app_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Admin Update Listing","description":"Edit a pending listing application before approving it.\n\nOnly pending applications can be edited; approved/rejected ones stay\nimmutable so the audit trail is clean.","operationId":"admin_update_listing_api_admin_listing_applications__app_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingApplicationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/listing-applications/{app_id}/approve":{"post":{"tags":["admin"],"summary":"Admin Approve Listing","description":"Approve a listing application: create an app from it.","operationId":"admin_approve_listing_api_admin_listing_applications__app_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/listing-applications/{app_id}/reject":{"post":{"tags":["admin"],"summary":"Admin Reject Listing","description":"Reject a listing application (from pending or needs_revision).","operationId":"admin_reject_listing_api_admin_listing_applications__app_id__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingRejectBody","default":{"notify_applicant":true}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/listing-applications/{app_id}/request-info":{"post":{"tags":["admin"],"summary":"Admin Request Info Listing","description":"Ask the applicant to revise and resubmit.\n\nTransitions the application to 'needs_revision' and emails the applicant a\ndeep link (with their edit token) to the revision form. The question is\nstored in admin_notes so it also shows up on the status page — a clearer\nrecord than email-only feedback was previously.","operationId":"admin_request_info_listing_api_admin_listing_applications__app_id__request_info_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListingInfoRequestBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/contact-messages":{"get":{"tags":["admin"],"summary":"Admin List Contact Messages","description":"List contact messages filtered by status.","operationId":"admin_list_contact_messages_api_admin_contact_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Status"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/contact-messages/{msg_id}":{"get":{"tags":["admin"],"summary":"Admin Get Contact Message","description":"Get single contact message detail.","operationId":"admin_get_contact_message_api_admin_contact_messages__msg_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"msg_id","in":"path","required":true,"schema":{"type":"integer","title":"Msg Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/contact-messages/{msg_id}/close":{"post":{"tags":["admin"],"summary":"Admin Close Contact Message","description":"Close a contact message.","operationId":"admin_close_contact_message_api_admin_contact_messages__msg_id__close_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"msg_id","in":"path","required":true,"schema":{"type":"integer","title":"Msg Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/contact-messages/{msg_id}/reply":{"post":{"tags":["admin"],"summary":"Admin Reply Contact Message","description":"Send an email reply to a contact message. Optionally closes it.","operationId":"admin_reply_contact_message_api_admin_contact_messages__msg_id__reply_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"msg_id","in":"path","required":true,"schema":{"type":"integer","title":"Msg Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactReplyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blog-posts":{"get":{"tags":["admin"],"summary":"Admin List Blog Posts","operationId":"admin_list_blog_posts_api_admin_blog_posts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Create Blog Post","operationId":"admin_create_blog_post_api_admin_blog_posts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogPostCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blog-posts/{post_id}":{"get":{"tags":["admin"],"summary":"Admin Get Blog Post","operationId":"admin_get_blog_post_api_admin_blog_posts__post_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Admin Update Blog Post","operationId":"admin_update_blog_post_api_admin_blog_posts__post_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogPostUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete Blog Post","description":"Soft-delete: flip status to 'deleted' so the post disappears from public\nviews and the draft/published tabs but is preserved under the Deleted tab\nfor review or restore.","operationId":"admin_delete_blog_post_api_admin_blog_posts__post_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blog-posts/{post_id}/restore":{"post":{"tags":["admin"],"summary":"Admin Restore Blog Post","description":"Restore a soft-deleted post back to draft.","operationId":"admin_restore_blog_post_api_admin_blog_posts__post_id__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blog-posts/{post_id}/permanent":{"delete":{"tags":["admin"],"summary":"Admin Permanent Delete Blog Post","description":"Hard-delete a post. Only allowed on posts already soft-deleted, so the\nDeleted tab acts as a two-step safety net.","operationId":"admin_permanent_delete_blog_post_api_admin_blog_posts__post_id__permanent_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blog-posts/{post_id}/regenerate-cover":{"post":{"tags":["admin"],"summary":"Admin Regenerate Blog Cover","description":"Rebuild the cover/OG image for an existing draft or published post.\n\nPicks the right composer based on post_type:\n  - app_review_post   → screenshot of /{app-slug} with logo-fallback\n  - app_compare_post  → VS composite from the first two linked apps\n  - app_category_post → grid collage from the linked apps (up to 10)\nOther post types aren't supported (covers there come from manual upload).\n\nUploads to R2 at blog-covers/{slug}.webp (overwriting) and updates\nfeatured_image_url in place.","operationId":"admin_regenerate_blog_cover_api_admin_blog_posts__post_id__regenerate_cover_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blog-posts/covers/backfill":{"post":{"tags":["admin"],"summary":"Admin Backfill Blog Covers","description":"Regenerate composed covers so they pick up the fixed title (no doubled\n'Best … AI Tools'), adaptive grid (no empty cells), site font (Lexend), and\nblank-logo dropping. Covers grid landings (alternatives/listicle/filter/\ncategory/audience/use_case/job) AND compare ('A vs B') posts. Review covers\nare left untouched (they're screenshots, not composed).\n\nProcessed in id order; pass `after_id` (the last id from the previous batch)\nto page through. `dry_run=true` reports what would change without rendering.","operationId":"admin_backfill_blog_covers_api_admin_blog_posts_covers_backfill_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limit"}},{"name":"after_id","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"After Id"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blog-posts/bulk-publish":{"post":{"tags":["admin"],"summary":"Admin Bulk Publish Blog Posts","description":"Publish multiple drafts at once. Pass either post_ids or all_drafts=true.","operationId":"admin_bulk_publish_blog_posts_api_admin_blog_posts_bulk_publish_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogBulkPublish"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blog-posts/{post_id}/stats":{"get":{"tags":["admin"],"summary":"Admin Blog Post Stats","description":"Lifetime + last-30-day analytics + A/B CTR + top referrers + top app clicks.","operationId":"admin_blog_post_stats_api_admin_blog_posts__post_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blog-posts/generate-seo":{"post":{"tags":["admin"],"summary":"Admin Blog Generate Seo","description":"Generate SEO meta_title + meta_description from title/excerpt/content using GPT-4o-mini.","operationId":"admin_blog_generate_seo_api_admin_blog_posts_generate_seo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogSeoGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/blog-posts/apps-picker":{"get":{"tags":["admin"],"summary":"Admin Blog Apps Picker","description":"App search endpoint for the Referenced Apps picker in the blog form.\n\nNamespaced under /blog-posts/ to avoid colliding with /apps/{app_id}.\nReturns empty list when q is blank — callers should avoid requesting\nunless the user has typed something.","operationId":"admin_blog_apps_picker_api_admin_blog_posts_apps_picker_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-generator/generate":{"post":{"tags":["admin"],"summary":"Admin Ai Generator Generate","description":"Enqueue a blog-post generation job and return its id immediately.\n\nThe actual LLM call + draft save run in a background task (see\n_run_ai_generator_job) so the browser never holds a long synchronous\nrequest open — that previously hit the edge gateway timeout on the slower\nOpenLimits route. Poll GET /ai-generator/job/{job_id} for the result.","operationId":"admin_ai_generator_generate_api_admin_ai_generator_generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIPostGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-generator/job/{job_id}":{"get":{"tags":["admin"],"summary":"Admin Ai Generator Job","description":"Poll the status of an AI Post Generator job. Returns the draft details\nonce status == 'done'.","operationId":"admin_ai_generator_job_api_admin_ai_generator_job__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/recommendations":{"get":{"tags":["admin"],"summary":"Admin List Recommendations","operationId":"admin_list_recommendations_api_admin_recommendations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Limit"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/recommendations/refresh":{"post":{"tags":["admin"],"summary":"Admin Refresh Recommendations","description":"Kick off a background research job; returns instantly with a job_id.\n\nThe actual Claude web_search call runs in an asyncio.create_task so long\nrequest times never hit edge-proxy timeouts. The frontend polls\nGET /recommendations/refresh-job/{job_id} until status is done or failed.","operationId":"admin_refresh_recommendations_api_admin_recommendations_refresh_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationRefresh"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/recommendations/refresh-job/{job_id}":{"get":{"tags":["admin"],"summary":"Admin Refresh Recommendations Job","description":"Poll the status of a background recommendation-research job.","operationId":"admin_refresh_recommendations_job_api_admin_recommendations_refresh_job__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/recommendations/{rec_id}":{"put":{"tags":["admin"],"summary":"Admin Update Recommendation","operationId":"admin_update_recommendation_api_admin_recommendations__rec_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rec_id","in":"path","required":true,"schema":{"type":"integer","title":"Rec Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete Recommendation","operationId":"admin_delete_recommendation_api_admin_recommendations__rec_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rec_id","in":"path","required":true,"schema":{"type":"integer","title":"Rec Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-app-review/apps-picker":{"get":{"tags":["admin"],"summary":"Admin Ai Review Apps Picker","description":"Search apps for the AI App Review generator. Mirrors the blog apps-picker\nbut lives under its own namespace so the feature is self-contained.","operationId":"admin_ai_review_apps_picker_api_admin_ai_app_review_apps_picker_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-app-review/job/{job_id}":{"get":{"tags":["admin"],"summary":"Admin App Review Job","description":"Poll an App Review / Comparison / Category generation job.","operationId":"admin_app_review_job_api_admin_ai_app_review_job__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","title":"Job Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-app-review/generate":{"post":{"tags":["admin"],"summary":"Admin Ai App Review Generate","description":"Enqueue a humanized, SEO-friendly app review (draft + humanize pipeline)\nand return a job id immediately. Poll GET /ai-app-review/job/{id}.","operationId":"admin_ai_app_review_generate_api_admin_ai_app_review_generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIAppReviewGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-app-review/compare":{"post":{"tags":["admin"],"summary":"Admin Ai App Compare Generate","description":"Generate a balanced \"App A vs App B\" comparison article as a blog draft.\n\nLong-tail \"vs\" queries are high-intent and usually low-competition. We\nreuse the same two-pass (draft + humanize) pipeline from the review\nendpoint, but feed the model two fact sheets and a comparison structure\nprompt. No screenshot — comparisons don't have a natural hero image.","operationId":"admin_ai_app_compare_generate_api_admin_ai_app_review_compare_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIAppCompareGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-app-review/categories-picker":{"get":{"tags":["admin"],"summary":"Admin Ai Review Categories Picker","description":"Search categories for the Category Primer tool. Blank q returns the\ntop N by app_count.","operationId":"admin_ai_review_categories_picker_api_admin_ai_app_review_categories_picker_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-app-review/category":{"post":{"tags":["admin"],"summary":"Admin Ai Category Generate","description":"Generate a broad primer article for a category + 1-paragraph embeds\nfor the top N apps in that category. Cover is a collage of those logos.","operationId":"admin_ai_category_generate_api_admin_ai_app_review_category_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIAppCategoryGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-app-review/audience":{"post":{"tags":["admin"],"summary":"Admin Ai Audience Generate","description":"Generate a 'Best AI Tools for {audience}' landing post + live app grid.\npublish=true publishes it and fans translations out to every locale.","operationId":"admin_ai_audience_generate_api_admin_ai_app_review_audience_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIAppAudienceGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-app-review/use-case":{"post":{"tags":["admin"],"summary":"Admin Ai Use Case Generate","description":"Generate an 'AI Tools for {use-case}' landing post + live app grid.\npublish=true publishes it and fans translations out to every locale.","operationId":"admin_ai_use_case_generate_api_admin_ai_app_review_use_case_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIAppUseCaseGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-app-review/job":{"post":{"tags":["admin"],"summary":"Admin Ai Job Generate","description":"Generate an 'AI Tools to {job}' landing post + live app grid.\npublish=true publishes it and fans translations out to every locale.","operationId":"admin_ai_job_generate_api_admin_ai_app_review_job_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIAppJobGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/jobs/backfill":{"post":{"tags":["admin"],"summary":"Admin Jobs Backfill","description":"Run the jobs-to-be-done backfill. By default clusters/assigns from already\nextracted phrases (fast, no LLM); pass extract=true to also run LLM extraction\nover apps missing jobs first. Progress streams on the 'jobs' monitor channel.","operationId":"admin_jobs_backfill_api_admin_jobs_backfill_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"extract","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Extract"}},{"name":"only_missing","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Only Missing"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-app-review/glossary":{"post":{"tags":["admin"],"summary":"Admin Ai Glossary Generate","description":"Generate a 'What is {term}?' glossary entry + publish/translate.","operationId":"admin_ai_glossary_generate_api_admin_ai_app_review_glossary_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIGlossaryGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-app-review/app-audience":{"post":{"tags":["admin"],"summary":"Admin Ai App Audience Generate","description":"Generate a '{App} for {Audience}' guide (top pairs only) + publish/translate.","operationId":"admin_ai_app_audience_generate_api_admin_ai_app_review_app_audience_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIAppAudiencePairGenerate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/trending-pins":{"get":{"tags":["admin"],"summary":"Admin List Trending Pins","description":"List all trending pins (active and inactive) plus the final mixed preview.","operationId":"admin_list_trending_pins_api_admin_trending_pins_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Create Trending Pin","operationId":"admin_create_trending_pin_api_admin_trending_pins_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrendingPinCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/trending-pins/{pin_id}":{"put":{"tags":["admin"],"summary":"Admin Update Trending Pin","operationId":"admin_update_trending_pin_api_admin_trending_pins__pin_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pin_id","in":"path","required":true,"schema":{"type":"integer","title":"Pin Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrendingPinUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Delete Trending Pin","operationId":"admin_delete_trending_pin_api_admin_trending_pins__pin_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pin_id","in":"path","required":true,"schema":{"type":"integer","title":"Pin Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/site-snippets":{"get":{"tags":["admin"],"summary":"List Site Snippets","description":"List every row (active + disabled). Includes ``enums`` so the UI\ndoesn't hard-code the choice lists.","operationId":"list_site_snippets_api_admin_site_snippets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create Site Snippet","description":"Create a snippet. Validator runs first — errors block; warnings\nblock UNLESS ``?force=true`` is passed (UI surfaces warnings, operator\ncan opt-in).","operationId":"create_site_snippet_api_admin_site_snippets_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnippetPayloadIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/site-snippets/{snippet_id}":{"get":{"tags":["admin"],"summary":"Get Site Snippet","operationId":"get_site_snippet_api_admin_site_snippets__snippet_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"snippet_id","in":"path","required":true,"schema":{"type":"integer","title":"Snippet Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Update Site Snippet","operationId":"update_site_snippet_api_admin_site_snippets__snippet_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"snippet_id","in":"path","required":true,"schema":{"type":"integer","title":"Snippet Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnippetPayloadIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Site Snippet","operationId":"delete_site_snippet_api_admin_site_snippets__snippet_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"snippet_id","in":"path","required":true,"schema":{"type":"integer","title":"Snippet Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/site-snippets/validate":{"post":{"tags":["admin"],"summary":"Validate Site Snippet","description":"Dry-run validator. UI calls this on debounce while the operator\nfills the form so they see conflicts before Save.","operationId":"validate_site_snippet_api_admin_site_snippets_validate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"editing_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Editing Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnippetPayloadIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/site-snippets/reorder":{"post":{"tags":["admin"],"summary":"Reorder Site Snippets","operationId":"reorder_site_snippets_api_admin_site_snippets_reorder_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnippetReorderIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/seo-files":{"get":{"tags":["admin"],"summary":"Admin Get Seo Files","description":"Returns ``{overrides, defaults}``. Defaults render the built-in\nbody so the operator can preview/diff before saving an override.\nDynamic files (sitemap.xml, llms.txt) return a placeholder marker\npointing at the live URL — the admin UI can't snapshot them without\nre-running the DB-backed builder per request.","operationId":"admin_get_seo_files_api_admin_seo_files_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin"],"summary":"Admin Put Seo Files","operationId":"admin_put_seo_files_api_admin_seo_files_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeoFilesPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/indexnow/status":{"get":{"tags":["admin"],"summary":"Indexnow Status","operationId":"indexnow_status_api_admin_indexnow_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/indexnow/submit-all":{"post":{"tags":["admin"],"summary":"Indexnow Submit All","description":"Manually push every public URL (marketing pages + all published\nblog posts + all published apps) to IndexNow.","operationId":"indexnow_submit_all_api_admin_indexnow_submit_all_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/media/search":{"get":{"tags":["admin-media"],"summary":"Search Media","description":"Unified Unsplash + Pexels search. Always returns 200 with any per-source\nerrors surfaced in the `errors` field so the UI can degrade gracefully.","operationId":"search_media_api_admin_media_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"title":"Q"}},{"name":"source","in":"query","required":false,"schema":{"enum":["both","unsplash","pexels"],"type":"string","default":"both","title":"Source"}},{"name":"type","in":"query","required":false,"schema":{"enum":["both","photo","video"],"type":"string","default":"both","title":"Type"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":40,"minimum":5,"default":20,"title":"Per Page"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/media/save":{"post":{"tags":["admin-media"],"summary":"Save Media","operationId":"save_media_api_admin_media_save_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaSaveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/media":{"get":{"tags":["admin-media"],"summary":"List Media","operationId":"list_media_api_admin_media_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Q"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"enum":["unsplash","pexels"],"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["photo","video"],"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":60,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/media/{media_id}":{"delete":{"tags":["admin-media"],"summary":"Delete Media","operationId":"delete_media_api_admin_media__media_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"integer","title":"Media Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/media/{media_id}/download":{"get":{"tags":["admin-media"],"summary":"Download Media","description":"Stream the stored asset to the caller as a file attachment.","operationId":"download_media_api_admin_media__media_id__download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"integer","title":"Media Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/notifications/badge":{"get":{"tags":["notifications"],"summary":"Badge","description":"Header bell badge counts. Polled every 30s.","operationId":"badge_api_admin_notifications_badge_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/notifications":{"get":{"tags":["notifications"],"summary":"List Notifications","operationId":"list_notifications_api_admin_notifications_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"pending","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/notifications/{nid}/action":{"post":{"tags":["notifications"],"summary":"Action","operationId":"action_api_admin_notifications__nid__action_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"integer","title":"Nid"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/search-landings":{"get":{"tags":["admin"],"summary":"List Search Landings","description":"Paginated ledger with demand/supply stats and the live index verdict.","operationId":"list_search_landings_api_admin_search_landings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|indexed|noindex|approved|blocked|seed|organic)$","default":"all","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/search-landings/{row_id}/approve":{"post":{"tags":["admin"],"summary":"Approve Search Landing","operationId":"approve_search_landing_api_admin_search_landings__row_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/search-landings/{row_id}/block":{"post":{"tags":["admin"],"summary":"Block Search Landing","operationId":"block_search_landing_api_admin_search_landings__row_id__block_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/search-landings/{row_id}":{"delete":{"tags":["admin"],"summary":"Delete Search Landing","operationId":"delete_search_landing_api_admin_search_landings__row_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"integer","title":"Row Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/search-landings/seed":{"post":{"tags":["admin"],"summary":"Seed Search Landings","description":"Run the curated popular-query seeder (idempotent). Returns batch stats.","operationId":"seed_search_landings_api_admin_search_landings_seed_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"min_results","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"title":"Min Results"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Homepage","operationId":"homepage__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/search":{"get":{"summary":"Search Page","operationId":"search_page_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search/{slug}":{"get":{"summary":"Search Landing Page","description":"Indexable landing for a promoted search query — the controlled,\ndemand-gated counterpart of the raw /search SERP.\n\nIndex hygiene is the whole point: a page is INDEXED only when its query\ncleared the strict supply+demand gate (``search_log.is_indexable``); every\nother case renders ``noindex,follow``, and a query with too few live results\n404s so no thin page exists at all. Only the indexed set is sitemapped, so we\nnever advertise a thin/duplicate internal-search page to Google.","operationId":"search_landing_page_search__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"}}}}}}},"/browse":{"get":{"summary":"Browse Page","operationId":"browse_page_browse_get","parameters":[{"name":"letter","in":"query","required":false,"schema":{"type":"string","default":"A","title":"Letter"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai-search":{"get":{"summary":"Ai Search Page","operationId":"ai_search_page_ai_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/categories":{"get":{"summary":"Categories Index","description":"Full category directory — every category with live app counts.","operationId":"categories_index_categories_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/landscape":{"get":{"summary":"Landscape Page","description":"Interactive ecosystem map — every category as a box of top-app logos.\n\nInspired by classic 'market landscape' grids: one tile per category, each\nshowing the top apps' logos, with client-side filters (free / open-source /\nAPI) and a live search. Pure SSR + a small inline script for filtering.","operationId":"landscape_page_landscape_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/category/{slug}":{"get":{"summary":"Category Page","operationId":"category_page_category__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"}}}}}}},"/set-language/{code}":{"get":{"summary":"Set Language","description":"Persist the visitor's language choice (hyperstore_lang cookie) then 302 to\nthe localized target. The language switcher routes through here so the cookie\nis set BEFORE the destination loads — otherwise the cookie-based auto-redirect\nin LocaleMiddleware would bounce a deliberate switch (e.g. back to English)\nstraight back to the previous language. ``next`` is the already-localized\ndestination path the switcher built (locale prefix + translated slug).","operationId":"set_language_set_language__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"/","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/contact":{"get":{"summary":"Contact Page","operationId":"contact_page_contact_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/mcp":{"get":{"summary":"Mcp Page","operationId":"mcp_page_mcp_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/brand":{"get":{"summary":"Brand Page","description":"Brand guidelines / media kit — logo, icon, color, type, the embeddable\nbadges, and do/don't usage. Static (no DB); linked from the footer.","operationId":"brand_page_brand_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/list-your-app":{"get":{"summary":"List Your App Page","operationId":"list_your_app_page_list_your_app_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/list-your-app/apply":{"get":{"summary":"Listing Form Page","operationId":"listing_form_page_list_your_app_apply_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/listing-application/{app_id}/edit":{"get":{"summary":"Listing Edit Page","description":"Applicant-facing revision form — requires the edit token from the email link.","operationId":"listing_edit_page_listing_application__app_id__edit_get","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/listing-application/{app_id}":{"get":{"summary":"Listing Status Page","operationId":"listing_status_page_listing_application__app_id__get","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/blog":{"get":{"summary":"Blog Index Page","operationId":"blog_index_page_blog_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blog/posts":{"get":{"summary":"Blog Posts Api","operationId":"blog_posts_api_api_blog_posts_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/blog/rss.xml":{"get":{"summary":"Blog Rss Feed","operationId":"blog_rss_feed_blog_rss_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/blog/tag/{tag_slug}":{"get":{"summary":"Blog Tag Page","operationId":"blog_tag_page_blog_tag__tag_slug__get","parameters":[{"name":"tag_slug","in":"path","required":true,"schema":{"type":"string","title":"Tag Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/blog/{slug}":{"get":{"summary":"Blog Post Page","operationId":"blog_post_page_blog__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"preview","in":"query","required":false,"schema":{"type":"string","default":"","title":"Preview"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/my-collection":{"get":{"summary":"My Collection Page","description":"My Collection — saved apps. Registered-only: guests are redirected to the\nlogin page. Signed-in users get a shell; the list loads client-side from\n/api/account/saves.","operationId":"my_collection_page_my_collection_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/login":{"get":{"summary":"Login Page","description":"Email+password sign-in (and Google button when configured).","operationId":"login_page_login_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/forgot-password":{"get":{"summary":"Forgot Password Page","description":"Request a password-reset email.","operationId":"forgot_password_page_forgot_password_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/account/reset-password":{"get":{"summary":"Reset Password Page","description":"Choose a new password from an emailed reset link.","operationId":"reset_password_page_account_reset_password_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signup":{"get":{"summary":"Signup Page","description":"Email+password registration (and Google button when configured).","operationId":"signup_page_signup_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/account":{"get":{"summary":"Account Page","description":"Profile page (avatar, name, email, delete). Sign-in required — bounce to\n/login when there's no valid eu_session cookie.","operationId":"account_page_account_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/account/google/login":{"get":{"summary":"Google Login","description":"Kick off the Google OAuth authorization-code flow.","operationId":"google_login_account_google_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account/google/callback":{"get":{"summary":"Google Callback","description":"Exchange the auth code, upsert the Google account, open a session.","operationId":"google_callback_account_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}},{"name":"g_oauth_state","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"G Oauth State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{slug}/review":{"get":{"summary":"App Review Page","description":"Canonical URL for an app's review: /{app-slug}/review.\n\nServes the most recent published review (blog_post where\nreviewed_app_id matches). 404s if the app doesn't exist or has no\npublished review yet.","operationId":"app_review_page__slug__review_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"}}}}}}},"/{slug}/pricing":{"get":{"summary":"App Pricing Page","description":"Computed pricing page: /{app-slug}/pricing — live pricing tiers + facts,\nno AI. 404 when the app has no usable pricing_tiers.","operationId":"app_pricing_page__slug__pricing_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"}}}}}}},"/{slug}":{"get":{"summary":"App Detail Page","operationId":"app_detail_page__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"}}}}}}},"/admin":{"get":{"summary":"Admin Root","operationId":"admin_root_admin_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/login":{"get":{"summary":"Admin Login Page","operationId":"admin_login_page_admin_login_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/dashboard":{"get":{"summary":"Admin Dashboard","operationId":"admin_dashboard_admin_dashboard_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/apps":{"get":{"summary":"Admin Apps Page","operationId":"admin_apps_page_admin_apps_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/categories":{"get":{"summary":"Admin Categories Page","operationId":"admin_categories_page_admin_categories_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/apps/{app_id}":{"get":{"summary":"Admin App Detail Page","operationId":"admin_app_detail_page_admin_apps__app_id__get","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/sources":{"get":{"summary":"Admin Sources Page","operationId":"admin_sources_page_admin_sources_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users":{"get":{"summary":"Admin Users Page","operationId":"admin_users_page_admin_users_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/members":{"get":{"summary":"Admin Members Page","operationId":"admin_members_page_admin_members_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/notifications":{"get":{"summary":"Admin Notifications Page","operationId":"admin_notifications_page_admin_notifications_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/services":{"get":{"summary":"Admin Services Page","operationId":"admin_services_page_admin_services_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/languages":{"get":{"summary":"Admin Languages Page","operationId":"admin_languages_page_admin_languages_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/programmatic-seo":{"get":{"summary":"Admin Pseo Page","operationId":"admin_pseo_page_admin_programmatic_seo_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/search-landings":{"get":{"summary":"Admin Search Landings Page","operationId":"admin_search_landings_page_admin_search_landings_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/translations":{"get":{"summary":"Admin Translations Page","operationId":"admin_translations_page_admin_translations_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/backfill-console":{"get":{"summary":"Admin Backfill Console Page","operationId":"admin_backfill_console_page_admin_backfill_console_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/llm-cost":{"get":{"summary":"Admin Llm Cost Page","operationId":"admin_llm_cost_page_admin_llm_cost_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/llm-routing":{"get":{"summary":"Admin Llm Routing Page","operationId":"admin_llm_routing_page_admin_llm_routing_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/prompts":{"get":{"summary":"Admin Prompts Page","operationId":"admin_prompts_page_admin_prompts_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/listings":{"get":{"summary":"Admin Listings Page","operationId":"admin_listings_page_admin_listings_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/listings/{app_id}":{"get":{"summary":"Admin Listing Detail Page","operationId":"admin_listing_detail_page_admin_listings__app_id__get","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"integer","title":"App Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/contacts":{"get":{"summary":"Admin Contacts Page","operationId":"admin_contacts_page_admin_contacts_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/contacts/{msg_id}":{"get":{"summary":"Admin Contact Detail Page","operationId":"admin_contact_detail_page_admin_contacts__msg_id__get","parameters":[{"name":"msg_id","in":"path","required":true,"schema":{"type":"integer","title":"Msg Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/contents":{"get":{"summary":"Admin Contents Page","operationId":"admin_contents_page_admin_contents_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/blog":{"get":{"summary":"Admin Blog Page","operationId":"admin_blog_page_admin_blog_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/media":{"get":{"summary":"Admin Media Page","operationId":"admin_media_page_admin_media_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/blog/new":{"get":{"summary":"Admin Blog New Page","operationId":"admin_blog_new_page_admin_blog_new_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/blog/{post_id}/edit":{"get":{"summary":"Admin Blog Edit Page","operationId":"admin_blog_edit_page_admin_blog__post_id__edit_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"integer","title":"Post Id"}},{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/ai-generator":{"get":{"summary":"Admin Ai Generator Page","operationId":"admin_ai_generator_page_admin_ai_generator_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/recommendations":{"get":{"summary":"Admin Recommendations Page","operationId":"admin_recommendations_page_admin_recommendations_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/ai-app-review":{"get":{"summary":"Admin Ai App Review Page","operationId":"admin_ai_app_review_page_admin_ai_app_review_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/trending":{"get":{"summary":"Admin Trending Page","operationId":"admin_trending_page_admin_trending_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/statics":{"get":{"summary":"Admin Statics Redirect","description":"Legacy URL — superseded by /admin/seo-marketing (mig 058 + cutover).\n301 so any bookmark / inbound link reaches the new hub.","operationId":"admin_statics_redirect_admin_statics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/seo-marketing":{"get":{"summary":"Admin Seo Marketing Page","description":"Unified SEO & Marketing hub — Tracking & Pixels (typed snippet\nregistry), SEO Files (robots/llms/humans/security/sitemap), and\nSearch Engines (IndexNow status + manual push). Replaces the legacy\n/admin/statics page.","operationId":"admin_seo_marketing_page_admin_seo_marketing_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"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":{"AIAppAudienceGenerate":{"properties":{"audience_id":{"type":"integer","title":"Audience Id"},"angle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Angle","default":""},"primary_keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Keyword"},"top_n":{"type":"integer","title":"Top N","default":12},"publish":{"type":"boolean","title":"Publish","default":false}},"type":"object","required":["audience_id"],"title":"AIAppAudienceGenerate"},"AIAppAudiencePairGenerate":{"properties":{"app_id":{"type":"integer","title":"App Id"},"audience_id":{"type":"integer","title":"Audience Id"},"publish":{"type":"boolean","title":"Publish","default":false}},"type":"object","required":["app_id","audience_id"],"title":"AIAppAudiencePairGenerate"},"AIAppCategoryGenerate":{"properties":{"category_id":{"type":"integer","title":"Category Id"},"angle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Angle","default":""},"primary_keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Keyword"},"top_n":{"type":"integer","title":"Top N","default":10}},"type":"object","required":["category_id"],"title":"AIAppCategoryGenerate"},"AIAppCompareGenerate":{"properties":{"app_id_a":{"type":"integer","title":"App Id A"},"app_id_b":{"type":"integer","title":"App Id B"},"angle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Angle","default":""},"primary_keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Keyword"}},"type":"object","required":["app_id_a","app_id_b"],"title":"AIAppCompareGenerate"},"AIAppJobGenerate":{"properties":{"job_id":{"type":"integer","title":"Job Id"},"angle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Angle","default":""},"primary_keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Keyword"},"top_n":{"type":"integer","title":"Top N","default":12},"publish":{"type":"boolean","title":"Publish","default":false}},"type":"object","required":["job_id"],"title":"AIAppJobGenerate"},"AIAppReviewGenerate":{"properties":{"app_id":{"type":"integer","title":"App Id"},"angle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Angle","default":""},"primary_keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Keyword"}},"type":"object","required":["app_id"],"title":"AIAppReviewGenerate"},"AIAppUseCaseGenerate":{"properties":{"use_case_id":{"type":"integer","title":"Use Case Id"},"angle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Angle","default":""},"primary_keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Keyword"},"top_n":{"type":"integer","title":"Top N","default":12},"publish":{"type":"boolean","title":"Publish","default":false}},"type":"object","required":["use_case_id"],"title":"AIAppUseCaseGenerate"},"AIGlossaryGenerate":{"properties":{"term_id":{"type":"integer","title":"Term Id"},"publish":{"type":"boolean","title":"Publish","default":false}},"type":"object","required":["term_id"],"title":"AIGlossaryGenerate"},"AIPostGenerate":{"properties":{"topic":{"type":"string","title":"Topic"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":""},"primary_keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Keyword"},"save_as_draft":{"type":"boolean","title":"Save As Draft","default":true}},"type":"object","required":["topic"],"title":"AIPostGenerate"},"ActionBody":{"properties":{"action":{"type":"string","title":"Action"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["action"],"title":"ActionBody"},"AiSearchRequest":{"properties":{"prompt":{"type":"string","maxLength":500,"minLength":2,"title":"Prompt"},"turnstile_token":{"type":"string","title":"Turnstile Token","default":""}},"type":"object","required":["prompt"],"title":"AiSearchRequest"},"AppCreate":{"properties":{"name":{"type":"string","title":"Name"},"website_url":{"type":"string","title":"Website Url"},"short_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Description"},"long_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Long Description"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"pricing_model":{"type":"string","title":"Pricing Model","default":"freemium"},"is_open_source":{"type":"boolean","title":"Is Open Source","default":false},"has_api":{"type":"boolean","title":"Has Api","default":false},"popularity_score":{"type":"integer","title":"Popularity Score","default":0},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating"},"category_ids":{"items":{"type":"integer"},"type":"array","title":"Category Ids","default":[]},"tag_ids":{"items":{"type":"integer"},"type":"array","title":"Tag Ids","default":[]},"features":{"items":{"type":"string"},"type":"array","title":"Features","default":[]},"screenshot_urls":{"items":{"type":"string"},"type":"array","title":"Screenshot Urls","default":[]},"pros":{"items":{"type":"string"},"type":"array","title":"Pros","default":[]},"cons":{"items":{"type":"string"},"type":"array","title":"Cons","default":[]},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","default":true},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published","default":false},"social_links":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Social Links"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"app_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Version"},"paid_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid From"},"billing_frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Frequency"},"alternatives":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Alternatives"},"also_used_for":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Also Used For"},"pricing_tiers":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Pricing Tiers"}},"type":"object","required":["name","website_url"],"title":"AppCreate"},"AppUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"short_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Description"},"long_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Long Description"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"pricing_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing Model"},"is_open_source":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Open Source"},"has_api":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Api"},"popularity_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Popularity Score"},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating"},"category_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Category Ids"},"tag_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Tag Ids"},"features":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Features"},"screenshot_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Screenshot Urls"},"pros":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pros"},"cons":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cons"},"source_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"},"social_links":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Social Links"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"app_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Version"},"paid_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid From"},"billing_frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Frequency"},"alternatives":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Alternatives"},"also_used_for":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Also Used For"},"pricing_tiers":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Pricing Tiers"}},"type":"object","title":"AppUpdate"},"BlogBulkPublish":{"properties":{"post_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Post Ids"},"all_drafts":{"type":"boolean","title":"All Drafts","default":false}},"type":"object","title":"BlogBulkPublish"},"BlogClickIn":{"properties":{"post_id":{"type":"integer","title":"Post Id"},"target_url":{"type":"string","title":"Target Url"},"app_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"App Id"}},"type":"object","required":["post_id","target_url"],"title":"BlogClickIn"},"BlogImpressionsIn":{"properties":{"post_ids":{"items":{"type":"integer"},"type":"array","title":"Post Ids"}},"type":"object","required":["post_ids"],"title":"BlogImpressionsIn"},"BlogPostCreate":{"properties":{"title":{"type":"string","title":"Title"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"excerpt":{"type":"string","title":"Excerpt","default":""},"content":{"type":"string","title":"Content","default":""},"featured_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Featured Image Url"},"status":{"type":"string","title":"Status","default":"draft"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"meta_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Title"},"meta_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Description"},"tag_ids":{"items":{"type":"integer"},"type":"array","title":"Tag Ids","default":[]},"new_tag_names":{"items":{"type":"string"},"type":"array","title":"New Tag Names","default":[]},"app_ids":{"items":{"type":"integer"},"type":"array","title":"App Ids","default":[]},"title_variant_b":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Variant B"},"ab_test_enabled":{"type":"boolean","title":"Ab Test Enabled","default":false},"post_type":{"type":"string","title":"Post Type","default":"blog_post"}},"type":"object","required":["title"],"title":"BlogPostCreate"},"BlogPostUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Excerpt"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"featured_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Featured Image Url"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"meta_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Title"},"meta_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Description"},"tag_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Tag Ids"},"new_tag_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"New Tag Names"},"app_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"App Ids"},"title_variant_b":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title Variant B"},"ab_test_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ab Test Enabled"},"post_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Type"}},"type":"object","title":"BlogPostUpdate"},"BlogSeoGenerate":{"properties":{"title":{"type":"string","title":"Title"},"excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Excerpt","default":""},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","default":""}},"type":"object","required":["title"],"title":"BlogSeoGenerate"},"BlogViewIn":{"properties":{"post_id":{"type":"integer","title":"Post Id"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer","default":""}},"type":"object","required":["post_id"],"title":"BlogViewIn"},"Body_admin_upload_image_api_admin_upload_image_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"image_type":{"type":"string","title":"Image Type","default":"logo"},"slug":{"type":"string","title":"Slug","default":"upload"}},"type":"object","required":["file"],"title":"Body_admin_upload_image_api_admin_upload_image_post"},"Body_listing_upload_image_api_listing_application_upload_image_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"image_type":{"type":"string","title":"Image Type","default":"logo"}},"type":"object","required":["file"],"title":"Body_listing_upload_image_api_listing_application_upload_image_post"},"Body_upload_avatar_api_account_avatar_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_avatar_api_account_avatar_post"},"CategoryCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"}},"type":"object","required":["name"],"title":"CategoryCreate"},"CategoryUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"}},"type":"object","title":"CategoryUpdate"},"ChangePasswordRequest":{"properties":{"current_password":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Current Password"},"new_password":{"type":"string","maxLength":200,"minLength":8,"title":"New Password"}},"type":"object","required":["new_password"],"title":"ChangePasswordRequest"},"ContactMessageCreate":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"message":{"type":"string","title":"Message"},"turnstile_token":{"type":"string","title":"Turnstile Token","default":""}},"type":"object","required":["name","email","message"],"title":"ContactMessageCreate"},"ContactReplyBody":{"properties":{"body":{"type":"string","title":"Body"},"close":{"type":"boolean","title":"Close","default":true}},"type":"object","required":["body"],"title":"ContactReplyBody"},"FlagBody":{"properties":{"value":{"type":"boolean","title":"Value","default":true}},"type":"object","title":"FlagBody"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ListingApplicationCreate":{"properties":{"name":{"type":"string","title":"Name"},"website_url":{"type":"string","title":"Website Url"},"short_description":{"type":"string","title":"Short Description"},"long_description":{"type":"string","minLength":1,"title":"Long Description"},"logo_url":{"type":"string","minLength":1,"title":"Logo Url"},"pricing_model":{"type":"string","title":"Pricing Model"},"is_open_source":{"type":"boolean","title":"Is Open Source","default":false},"has_api":{"type":"boolean","title":"Has Api","default":false},"categories":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Categories"},"features":{"items":{"type":"string"},"type":"array","title":"Features","default":[]},"screenshots":{"items":{"type":"string"},"type":"array","title":"Screenshots"},"pros":{"items":{"type":"string"},"type":"array","title":"Pros","default":[]},"cons":{"items":{"type":"string"},"type":"array","title":"Cons","default":[]},"applicant_name":{"type":"string","minLength":1,"title":"Applicant Name"},"applicant_email":{"type":"string","title":"Applicant Email"},"turnstile_token":{"type":"string","title":"Turnstile Token","default":""},"paid_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid From"},"billing_frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Frequency"},"pricing_tiers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Pricing Tiers","default":[]}},"type":"object","required":["name","website_url","short_description","long_description","logo_url","pricing_model","applicant_name","applicant_email"],"title":"ListingApplicationCreate"},"ListingApplicationUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"short_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Short Description"},"long_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Long Description"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"pricing_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing Model"},"is_open_source":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Open Source"},"has_api":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Api"},"categories":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Categories"},"features":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Features"},"screenshots":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Screenshots"},"pros":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pros"},"cons":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cons"},"paid_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid From"},"billing_frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Frequency"},"pricing_tiers":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Pricing Tiers"}},"type":"object","title":"ListingApplicationUpdate","description":"Partial update for a pending listing_application (admin-only).\n\nAll fields optional — callers send only what they want to change. Field\nvalidators mirror the public ListingApplicationCreate model so data stays\nconsistent whether a user submits or an admin fixes things up."},"ListingInfoRequestBody":{"properties":{"question":{"type":"string","title":"Question"}},"type":"object","required":["question"],"title":"ListingInfoRequestBody"},"ListingRejectBody":{"properties":{"admin_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Notes"},"notify_applicant":{"type":"boolean","title":"Notify Applicant","default":true}},"type":"object","title":"ListingRejectBody"},"LlmBudgetUpdate":{"properties":{"daily_budget_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Daily Budget Usd"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"LlmBudgetUpdate"},"LlmRouteUpdate":{"properties":{"route":{"type":"string","title":"Route"}},"type":"object","required":["route"],"title":"LlmRouteUpdate"},"MediaSaveRequest":{"properties":{"source":{"type":"string","enum":["unsplash","pexels"],"title":"Source"},"source_id":{"type":"string","maxLength":100,"minLength":1,"title":"Source Id"},"media_type":{"type":"string","enum":["photo","video"],"title":"Media Type"}},"type":"object","required":["source","source_id","media_type"],"title":"MediaSaveRequest"},"MergeRequest":{"properties":{"slugs":{"items":{"type":"string"},"type":"array","title":"Slugs"}},"type":"object","title":"MergeRequest"},"ProfileUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name"}},"type":"object","title":"ProfileUpdate"},"PromptVersionCreate":{"properties":{"system_text":{"type":"string","title":"System Text"},"tools_json":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Tools Json"},"tool_choice":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tool Choice"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"activate":{"type":"boolean","title":"Activate","default":false}},"type":"object","required":["system_text"],"title":"PromptVersionCreate"},"PseoScheduleConfig":{"properties":{"pseo_is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pseo Is Active"},"pseo_daily_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pseo Daily Min"},"pseo_daily_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pseo Daily Max"}},"type":"object","title":"PseoScheduleConfig"},"RecommendationRefresh":{"properties":{"count":{"type":"integer","title":"Count","default":8}},"type":"object","title":"RecommendationRefresh"},"RecommendationUpdate":{"properties":{"status":{"type":"string","title":"Status"},"generated_post_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Generated Post Id"}},"type":"object","required":["status"],"title":"RecommendationUpdate"},"RegisterRequest":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email"},"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"},"name":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Name"}},"type":"object","required":["email","password"],"title":"RegisterRequest"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","maxLength":200,"minLength":1,"title":"Token"},"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"}},"type":"object","required":["token","password"],"title":"ResetPasswordRequest"},"SaveCountBody":{"properties":{"saved":{"type":"boolean","title":"Saved","default":true}},"type":"object","title":"SaveCountBody"},"SaveRequest":{"properties":{"slug":{"type":"string","maxLength":200,"minLength":1,"title":"Slug"}},"type":"object","required":["slug"],"title":"SaveRequest"},"SeoFilesPayload":{"properties":{"robots_txt":{"type":"string","title":"Robots Txt","default":""},"llms_txt":{"type":"string","title":"Llms Txt","default":""},"llms_full_txt":{"type":"string","title":"Llms Full Txt","default":""},"humans_txt":{"type":"string","title":"Humans Txt","default":""},"security_txt":{"type":"string","title":"Security Txt","default":""},"sitemap_xml":{"type":"string","title":"Sitemap Xml","default":""}},"type":"object","title":"SeoFilesPayload"},"ServiceConfigUpdate":{"properties":{"crawl_interval_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Crawl Interval Hours"},"website_visitor_interval_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Website Visitor Interval Minutes"},"website_visitor_batch_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Website Visitor Batch Size"},"website_visitor_concurrency":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Website Visitor Concurrency"},"enrichment_cron_hour":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Enrichment Cron Hour"},"enrichment_cron_minute":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Enrichment Cron Minute"},"embedding_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embedding Mode"},"blog_builder_cron_hour":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Blog Builder Cron Hour"},"blog_builder_cron_minute":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Blog Builder Cron Minute"},"blog_builder_app_review":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Blog Builder App Review"},"blog_builder_app_category":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Blog Builder App Category"},"blog_builder_is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Blog Builder Is Active"},"blog_builder_skip_humanize":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Blog Builder Skip Humanize"}},"type":"object","title":"ServiceConfigUpdate"},"SnippetPayloadIn":{"properties":{"name":{"type":"string","title":"Name"},"provider":{"type":"string","title":"Provider"},"payload":{"additionalProperties":true,"type":"object","title":"Payload","default":{}},"position":{"type":"string","title":"Position"},"scope_kind":{"type":"string","title":"Scope Kind","default":"site_wide"},"scope_routes":{"items":{"type":"string"},"type":"array","title":"Scope Routes","default":[]},"consent_category":{"type":"string","title":"Consent Category","default":"marketing"},"enabled":{"type":"boolean","title":"Enabled","default":true},"order_index":{"type":"integer","title":"Order Index","default":100},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["name","provider","position"],"title":"SnippetPayloadIn"},"SnippetReorderIn":{"properties":{"position":{"type":"string","title":"Position"},"ordered_ids":{"items":{"type":"integer"},"type":"array","title":"Ordered Ids","default":[]}},"type":"object","required":["position"],"title":"SnippetReorderIn"},"SourceCreate":{"properties":{"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url","default":""},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source_type":{"type":"string","title":"Source Type","default":"apify"},"actor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Id"},"requires_browser":{"type":"boolean","title":"Requires Browser","default":false},"example_app_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Example App Url"},"actor_input":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Actor Input"},"field_mapping":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Field Mapping"}},"type":"object","required":["name"],"title":"SourceCreate"},"SourceUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"actor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Id"},"requires_browser":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Requires Browser"},"example_app_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Example App Url"},"actor_input":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Actor Input"},"field_mapping":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Field Mapping"}},"type":"object","title":"SourceUpdate"},"StaticPageCreate":{"properties":{"title":{"type":"string","title":"Title"},"slug":{"type":"string","title":"Slug"},"content":{"type":"string","title":"Content","default":""},"is_published":{"type":"boolean","title":"Is Published","default":false}},"type":"object","required":["title","slug"],"title":"StaticPageCreate"},"StaticPageUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"}},"type":"object","title":"StaticPageUpdate"},"TagCreate":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"TagCreate"},"TrendingPinCreate":{"properties":{"app_id":{"type":"integer","title":"App Id"},"position":{"type":"integer","title":"Position"},"is_active":{"type":"boolean","title":"Is Active","default":true},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["app_id","position"],"title":"TrendingPinCreate"},"TrendingPinUpdate":{"properties":{"app_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"App Id"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"TrendingPinUpdate"},"UserCreate":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"telegram":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telegram"}},"type":"object","required":["username","password"],"title":"UserCreate"},"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"},"api__account__LoginRequest":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email"},"password":{"type":"string","maxLength":200,"title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"api__auth__LoginRequest":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","password"],"title":"LoginRequest"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}