{"openapi":"3.1.0","info":{"title":"anyplot API","description":"Backend API for anyplot.ai — the open plot catalogue across 15 libraries in 4 languages.","version":"3.2.0"},"servers":[{"url":"https://api.anyplot.ai","description":"Production"}],"paths":{"/":{"get":{"tags":["health"],"summary":"Root","description":"Root endpoint.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Health Check","description":"Health check endpoint for Cloud Run.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/hello/{name}":{"get":{"tags":["health"],"summary":"Hello","description":"Simple hello endpoint for testing.","operationId":"hello_hello__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stats":{"get":{"tags":["stats"],"summary":"Get Stats","description":"Get platform statistics.\n\nReturns counts of specs, implementations (plots), libraries, and languages.","operationId":"get_stats_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsResponse"}}}}}}},"/specs":{"get":{"tags":["specs"],"summary":"Get Specs","description":"Get list of all specs with metadata (specs with at least one implementation).","operationId":"get_specs_specs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SpecListItem"},"type":"array","title":"Response Get Specs Specs Get"}}}}}}},"/specs/map":{"get":{"tags":["specs"],"summary":"Get Specs Map","description":"Get one row per spec (best-impl image + tag bag) for the /map clustering page.\n\nNOTE: must stay declared before /specs/{spec_id} so the path-parameter route doesn't capture \"map\".","operationId":"get_specs_map_specs_map_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SpecMapItem"},"type":"array","title":"Response Get Specs Map Specs Map Get"}}}}}}},"/specs/{spec_id}":{"get":{"tags":["specs"],"summary":"Get Spec","description":"Get detailed spec information including all implementations.","operationId":"get_spec_specs__spec_id__get","parameters":[{"name":"spec_id","in":"path","required":true,"schema":{"type":"string","title":"Spec Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpecDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/specs/{spec_id}/{library}/code":{"get":{"tags":["specs"],"summary":"Get Impl Code","description":"Get implementation code for a specific spec + library.\n\nCode field is deferred in the main `/specs/{id}` query so it must be\nfetched here on-demand. Library ids are globally unique across languages\n(core/constants.py), so the language is resolved from the registry when\nthe param is absent — the old `language=\"python\"` default made the obvious\nURL 404 for every R/Julia/JavaScript library. An explicit `language`\nstill wins for backwards compat with clients that send it.","operationId":"get_impl_code_specs__spec_id___library__code_get","parameters":[{"name":"spec_id","in":"path","required":true,"schema":{"type":"string","title":"Spec Id"}},{"name":"library","in":"path","required":true,"schema":{"type":"string","title":"Library"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/specs/{spec_id}/images":{"get":{"tags":["specs"],"summary":"Get Spec Images","description":"Get plot images for a specification across all libraries.","operationId":"get_spec_images_specs__spec_id__images_get","parameters":[{"name":"spec_id","in":"path","required":true,"schema":{"type":"string","title":"Spec Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/libraries":{"get":{"tags":["libraries"],"summary":"Get Libraries","description":"Get list of all supported plotting libraries.\n\nReturns library information including name, version, documentation URL, and description.","operationId":"get_libraries_libraries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/libraries/{library_id}/images":{"get":{"tags":["libraries"],"summary":"Get Library Images","description":"Get all plot images for a specific library across all specs.\n\nArgs:\n    library_id: The library ID (e.g., 'matplotlib', 'seaborn')\n\nReturns:\n    List of images with spec_id, preview_url, and html","operationId":"get_library_images_libraries__library_id__images_get","parameters":[{"name":"library_id","in":"path","required":true,"schema":{"type":"string","title":"Library Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/languages":{"get":{"tags":["languages"],"summary":"Get Languages","description":"Get list of all supported implementation languages.\n\nReturns language information including display name, file extension,\nruntime version, documentation URL, and a one-line description. Used by\nthe frontend to render language chips on library cards and the\nclickable language tooltip on plot cards (deep-link to upstream docs).","operationId":"get_languages_languages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/plots/filter":{"get":{"tags":["plots"],"summary":"Get Filtered Plots","description":"Get filtered plot images with counts for all filter categories.\n\nFilter logic:\n- Multiple values in same param: OR (lib=matplotlib,seaborn)\n- Multiple params with same name: AND (lib=matplotlib&lib=seaborn)\n- Different categories: AND (lib=matplotlib&plot=scatter)\n\nQuery params (comma-separated for OR, multiple params for AND):\n- lang: Language filter (python, r)\n- lib: Library filter (matplotlib, seaborn, etc.)\n- spec: Spec ID filter (scatter-basic, etc.)\n- plot: Plot type tag (scatter, bar, line, etc.)\n- data: Data type tag (numeric, categorical, etc.)\n- dom: Domain tag (statistics, finance, etc.)\n- feat: Features tag (basic, 3d, interactive, etc.)\n- dep: Impl dependencies filter (scipy, sklearn, etc.)\n- tech: Impl techniques filter (twin-axes, colorbar, etc.)\n- pat: Impl patterns filter (data-generation, etc.)\n- prep: Impl dataprep filter (kde, binning, etc.)\n- style: Impl styling filter (minimal-chrome, etc.)\n\nReturns:\n    FilteredPlotsResponse with images, counts, and orCounts per group","operationId":"get_filtered_plots_plots_filter_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilteredPlotsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/insights/dashboard":{"get":{"tags":["insights"],"summary":"Get Dashboard","description":"Get rich platform statistics for the public stats dashboard.\n\nIncludes per-library scores, coverage heatmap, top implementations,\ntag distribution, score histogram, and implementation timeline.","operationId":"get_dashboard_insights_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardResponse"}}}}}}},"/insights/plot-of-the-day":{"get":{"tags":["insights"],"summary":"Get Plot Of The Day","description":"Get the featured plot of the day.\n\nDeterministically selects a high-quality implementation (score >= 90)\nbased on today's date. Returns the same result for the entire day.","operationId":"get_plot_of_the_day_insights_plot_of_the_day_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PlotOfTheDayResponse"},{"type":"null"}],"title":"Response Get Plot Of The Day Insights Plot Of The Day Get"}}}}}}},"/insights/related/{spec_id}":{"get":{"tags":["insights"],"summary":"Get Related Specs","description":"Get specs related to the given spec, based on tag similarity.\n\nmode=spec: only spec-level tags (plot_type, domain, etc.)\nmode=full: spec tags + impl tags for the given library\nlibrary: in full mode, use this library's impl_tags (required for accurate tag matching)","operationId":"get_related_specs_insights_related__spec_id__get","parameters":[{"name":"spec_id","in":"path","required":true,"schema":{"type":"string","title":"Spec Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":6,"title":"Limit"}},{"name":"mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(spec|full)$","default":"spec","title":"Mode"}},{"name":"library","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Library"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelatedSpecsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/insights/visitors":{"get":{"tags":["insights"],"summary":"Get Visitors","description":"Get unique visitors per day for the last 28 days (Plausible Stats API).\n\nCached for ~1h via stale-while-revalidate so we stay well under Plausible's\n600-req/h rate limit even under traffic spikes on the public stats page.","operationId":"get_visitors_insights_visitors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisitorsResponse"}}}}}}},"/download/{spec_id}/{library}":{"get":{"tags":["download"],"summary":"Download Image","description":"Proxy download for plot images to avoid CORS issues.\n\nReturns the image as a downloadable file.","operationId":"download_image_download__spec_id___library__get","parameters":[{"name":"spec_id","in":"path","required":true,"schema":{"type":"string","title":"Spec Id"}},{"name":"library","in":"path","required":true,"schema":{"type":"string","title":"Library"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/robots.txt":{"get":{"tags":["seo"],"summary":"Get Robots","description":"Serve robots.txt for the API backend.\n\nThe read API is deliberately open. The previous blanket `Disallow: /`\n(with only `/og/` excepted) told every robots-compliant agent that the\nREST endpoints, `/openapi.json` and the MCP transport were off-limits —\non the very host `app/public/robots.txt` and llms.txt advertise as the\nmachine interface to the catalogue (AI-access audit 2026-08-19). The API\nis public, read-only and cached; there is nothing to protect by\nforbidding it, and compliant AI assistants were the only clients the\nDisallow actually stopped.\n\nOnly surfaces that are useless or hazardous to crawl stay disallowed:\n`/debug` (internal diagnostics) and `/proxy` (a parameterised fetch\nproxy — crawling it just re-downloads GCS objects through the API).\n\n`Disallow` lines are placed before the `Allow: /` catch-all: first-match\nparsers stop at the first matching rule, so the specific exclusions must\nprecede the blanket allow — the same ordering rule `app/public/robots.txt`\ndocuments. Specificity-compliant crawlers reach the same answer either way.\n\nThe comment head names the machine guide and the OpenAPI spec: this host\nis the one llms.txt advertises, so an agent that reaches it first — via\nthe README, a search result, a citation — must be able to get to the\nguide without guessing the convention (kurrentschrift finding\n2026-08-28). The Content-Signal line is the site's: one open policy,\nstated on every host it covers (contentsignals.org vocabulary only).","operationId":"get_robots_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap.xml":{"get":{"tags":["seo"],"summary":"Get Sitemap","description":"Generate dynamic XML sitemap for SEO.\n\nIncludes root, plots/specs pages, and all specs with implementations.","operationId":"get_sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms-full.txt":{"get":{"tags":["seo"],"summary":"Get Llms Full","description":"Serve the full catalogue index (llmstxt.org llms-full.txt convention).\n\nnginx serves anyplot.ai/llms-full.txt from this endpoint the same way it\nproxies the prerendered pages, so the file is reachable on the site's own\norigin for every client.","operationId":"get_llms_full_llms_full_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seo-proxy/":{"get":{"tags":["seo"],"summary":"Seo Home","description":"Bot-optimized home page: og:tags, site-level JSON-LD, and real body copy.\n\nPasses query params (e.g., ?lib=plotly&dom=statistics) to og:image URL for tracking.","operationId":"seo_home_seo_proxy__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seo-proxy/plots":{"get":{"tags":["seo"],"summary":"Seo Plots","description":"Bot-optimized plots page: og:tags plus a crawlable link to every spec hub.","operationId":"seo_plots_seo_proxy_plots_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seo-proxy/specs":{"get":{"tags":["seo"],"summary":"Seo Specs","description":"Bot-optimized specs page: og:tags plus a crawlable link to every spec hub.","operationId":"seo_specs_seo_proxy_specs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seo-proxy/libraries":{"get":{"tags":["seo"],"summary":"Seo Libraries","description":"Bot-optimized libraries page: the full registry, not just og:tags.","operationId":"seo_libraries_seo_proxy_libraries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seo-proxy/legal":{"get":{"tags":["seo"],"summary":"Seo Legal","description":"Bot-optimized legal page: operator, privacy and transparency facts.","operationId":"seo_legal_seo_proxy_legal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seo-proxy/mcp":{"get":{"tags":["seo"],"summary":"Seo Mcp","description":"Bot-optimized MCP page: endpoint, setup snippet and tool list, not just og:tags.","operationId":"seo_mcp_seo_proxy_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seo-proxy/about":{"get":{"tags":["seo"],"summary":"Seo About","description":"Bot-optimized about page: the pipeline story, not just og:tags.","operationId":"seo_about_seo_proxy_about_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seo-proxy/palette":{"get":{"tags":["seo"],"summary":"Seo Palette","description":"Bot-optimized palette page: the actual hex values, not just og:tags.","operationId":"seo_palette_seo_proxy_palette_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seo-proxy/map":{"get":{"tags":["seo"],"summary":"Seo Map","description":"Bot-optimized network map page with correct og:tags.","operationId":"seo_map_seo_proxy_map_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seo-proxy/stats":{"get":{"tags":["seo"],"summary":"Seo Stats","description":"Bot-optimized stats page: the live catalogue counts, not just og:tags.\n\nUses the same cache key the /stats endpoint populates (and the startup\nprewarm fills), so this adds no extra DB load. Without a DB the body\ndegrades to the registry-derived counts.","operationId":"seo_stats_seo_proxy_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/seo-proxy/{spec_id}":{"get":{"tags":["seo"],"summary":"Seo Spec Hub","description":"Bot-optimized cross-language spec hub.","operationId":"seo_spec_hub_seo_proxy__spec_id__get","parameters":[{"name":"spec_id","in":"path","required":true,"schema":{"type":"string","title":"Spec Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/seo-proxy/{spec_id}/{language}":{"get":{"tags":["seo"],"summary":"Seo Spec Language","description":"Permanent redirect: language-overview URLs are consolidated onto the hub.\n\nThe /{spec_id}/{language} tier was consolidated into /{spec_id} to eliminate\nduplicate content. Bots following this endpoint get a 301 to the public hub\nURL; humans get the SPA redirect configured in app/src/routes/index.tsx. The\n`language` query parameter is dropped because the hub's canonical tag does\nnot include it — Google should consolidate the page, not a filtered variant.","operationId":"seo_spec_language_seo_proxy__spec_id___language__get","parameters":[{"name":"spec_id","in":"path","required":true,"schema":{"type":"string","title":"Spec Id"}},{"name":"language","in":"path","required":true,"schema":{"type":"string","title":"Language"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/seo-proxy/{spec_id}/{language}/{library}":{"get":{"tags":["seo"],"summary":"Seo Spec Implementation","description":"Bot-optimized implementation detail.","operationId":"seo_spec_implementation_seo_proxy__spec_id___language___library__get","parameters":[{"name":"spec_id","in":"path","required":true,"schema":{"type":"string","title":"Spec Id"}},{"name":"language","in":"path","required":true,"schema":{"type":"string","title":"Language"}},{"name":"library","in":"path","required":true,"schema":{"type":"string","title":"Library"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/og/home.png":{"get":{"tags":["og-images"],"summary":"Get Home Og Image","description":"OG image for home page with tracking.\n\nSupports filter params (e.g., ?lib=plotly&dom=statistics) for tracking shared filtered URLs.","operationId":"get_home_og_image_og_home_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/og/plots.png":{"get":{"tags":["og-images"],"summary":"Get Plots Og Image","description":"OG image for plots page with tracking.","operationId":"get_plots_og_image_og_plots_png_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/og/{spec_id}/{language}/{library}.png":{"get":{"tags":["og-images"],"summary":"Get Branded Impl Image","description":"Get a branded OG image for an implementation.\n\nReturns a 1200x630 PNG with anyplot.ai header and the plot image.","operationId":"get_branded_impl_image_og__spec_id___language___library__png_get","parameters":[{"name":"spec_id","in":"path","required":true,"schema":{"type":"string","title":"Spec Id"}},{"name":"language","in":"path","required":true,"schema":{"type":"string","title":"Language"}},{"name":"library","in":"path","required":true,"schema":{"type":"string","title":"Library"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/og/{spec_id}.png":{"get":{"tags":["og-images"],"summary":"Get Spec Collage Image","description":"Get a collage OG image for a spec (showing top 6 implementations by quality).\n\nReturns a 1200x630 PNG with anyplot.ai branding and a 2x3 grid of implementations,\nsorted by quality_score descending.","operationId":"get_spec_collage_image_og__spec_id__png_get","parameters":[{"name":"spec_id","in":"path","required":true,"schema":{"type":"string","title":"Spec Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/proxy/html":{"get":{"tags":["proxy"],"summary":"Proxy Html","description":"Proxy an HTML file and inject size reporting script.\n\nThis endpoint fetches HTML from GCS, injects a script that reports\nthe content's actual dimensions via postMessage, and returns the\nmodified HTML. This allows the frontend to dynamically scale the\niframe based on actual content size.\n\nArgs:\n    url: The GCS URL to fetch (must be from allowed bucket)\n    origin: Target origin for postMessage (must be in ALLOWED_ORIGINS)\n\nReturns:\n    Modified HTML with size reporting script injected","operationId":"proxy_html_proxy_html_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"origin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/debug/status":{"get":{"tags":["debug"],"summary":"Get Debug Status","description":"Get comprehensive debug dashboard data.\n\nIncludes:\n- All specs with quality scores per library\n- Library statistics (avg/min/max scores, coverage)\n- Problem specs (low scores, old, missing data)\n- System health info","operationId":"get_debug_status_debug_status_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}},{"name":"Cf-Access-Jwt-Assertion","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cf-Access-Jwt-Assertion"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DebugStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/debug/ping":{"get":{"tags":["debug"],"summary":"Ping","description":"Ping the database with SELECT 1 and report round-trip latency.\n\nIntended for the debug dashboard's rolling response-time chart — cheap enough\nto poll every few seconds.","operationId":"ping_debug_ping_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}},{"name":"Cf-Access-Jwt-Assertion","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cf-Access-Jwt-Assertion"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/debug/cache/invalidate":{"post":{"tags":["debug"],"summary":"Invalidate Cache","description":"Flush the in-memory response cache.\n\nCalled by sync-postgres at the end of a successful sync so clients see\nfresh data without waiting for TTL expiry. Requires the shared token\n`CACHE_INVALIDATE_TOKEN` in the `X-Cache-Token` header; returns 503 if\nno token is configured on the server.","operationId":"invalidate_cache_debug_cache_invalidate_post","parameters":[{"name":"x-cache-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Cache-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheInvalidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/debug/feedback/top":{"get":{"tags":["debug"],"summary":"Feedback Top Pages","description":"Top pages by reaction count (thumbs_up / thumbs_down / idea / bug).","operationId":"feedback_top_pages_debug_feedback_top_get","parameters":[{"name":"reaction","in":"query","required":true,"schema":{"type":"string","title":"Reaction"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}},{"name":"Cf-Access-Jwt-Assertion","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cf-Access-Jwt-Assertion"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FeedbackTopPage"},"title":"Response Feedback Top Pages Debug Feedback Top Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/debug/feedback/messages":{"get":{"tags":["debug"],"summary":"Feedback Messages","description":"List feedback entries that carry a free-text message, newest first.\n\n`status=\"open\"` is a pseudo-value mapping to `('new', 'in_progress')` — the\ndefault view on /debug only shows the unresolved triage states.","operationId":"feedback_messages_debug_feedback_messages_get","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":50,"title":"Limit"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}},{"name":"Cf-Access-Jwt-Assertion","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cf-Access-Jwt-Assertion"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FeedbackMessageItem"},"title":"Response Feedback Messages Debug Feedback Messages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/debug/feedback/{entry_id}":{"patch":{"tags":["debug"],"summary":"Update Feedback Status","description":"Set the triage status on one feedback entry.","operationId":"update_feedback_status_debug_feedback__entry_id__patch","parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}},{"name":"Cf-Access-Jwt-Assertion","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cf-Access-Jwt-Assertion"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackMessageItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/feedback":{"post":{"tags":["feedback"],"summary":"Submit Feedback","description":"Accept a feedback entry from the in-app widget.","operationId":"submit_feedback_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"CacheInvalidateResponse":{"properties":{"cleared":{"type":"integer","title":"Cleared"},"maxsize":{"type":"integer","title":"Maxsize"},"ttl":{"type":"integer","title":"Ttl"}},"type":"object","required":["cleared","maxsize","ttl"],"title":"CacheInvalidateResponse"},"CoverageCell":{"properties":{"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"has_impl":{"type":"boolean","title":"Has Impl","default":false}},"type":"object","title":"CoverageCell","description":"Single cell in coverage heatmap."},"CoverageRow":{"properties":{"spec_id":{"type":"string","title":"Spec Id"},"title":{"type":"string","title":"Title"},"libraries":{"additionalProperties":{"$ref":"#/components/schemas/CoverageCell"},"type":"object","title":"Libraries"}},"type":"object","required":["spec_id","title","libraries"],"title":"CoverageRow","description":"One spec row in coverage heatmap."},"DashboardResponse":{"properties":{"total_specs":{"type":"integer","title":"Total Specs"},"total_implementations":{"type":"integer","title":"Total Implementations"},"total_interactive":{"type":"integer","title":"Total Interactive"},"total_lines_of_code":{"type":"integer","title":"Total Lines Of Code"},"avg_quality_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Quality Score"},"coverage_percent":{"type":"number","title":"Coverage Percent"},"library_stats":{"items":{"$ref":"#/components/schemas/LibraryDashboardStats"},"type":"array","title":"Library Stats"},"coverage_matrix":{"items":{"$ref":"#/components/schemas/CoverageRow"},"type":"array","title":"Coverage Matrix"},"top_implementations":{"items":{"$ref":"#/components/schemas/TopImpl"},"type":"array","title":"Top Implementations"},"tag_distribution":{"additionalProperties":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"object","title":"Tag Distribution"},"score_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Score Distribution"},"timeline":{"items":{"$ref":"#/components/schemas/TimelinePoint"},"type":"array","title":"Timeline"},"daily_impls":{"items":{"$ref":"#/components/schemas/api__routers__insights__DailyImplPoint"},"type":"array","title":"Daily Impls"}},"type":"object","required":["total_specs","total_implementations","total_interactive","total_lines_of_code","avg_quality_score","coverage_percent","library_stats","coverage_matrix","top_implementations","tag_distribution","score_distribution","timeline","daily_impls"],"title":"DashboardResponse","description":"Full dashboard statistics."},"DebugStatusResponse":{"properties":{"total_specs":{"type":"integer","title":"Total Specs"},"total_implementations":{"type":"integer","title":"Total Implementations"},"coverage_percent":{"type":"number","title":"Coverage Percent"},"library_stats":{"items":{"$ref":"#/components/schemas/LibraryStats"},"type":"array","title":"Library Stats"},"low_score_specs":{"items":{"$ref":"#/components/schemas/ProblemSpec"},"type":"array","title":"Low Score Specs"},"oldest_specs":{"items":{"$ref":"#/components/schemas/ProblemSpec"},"type":"array","title":"Oldest Specs"},"missing_preview_specs":{"items":{"$ref":"#/components/schemas/ProblemSpec"},"type":"array","title":"Missing Preview Specs"},"missing_tags_specs":{"items":{"$ref":"#/components/schemas/ProblemSpec"},"type":"array","title":"Missing Tags Specs"},"daily_impls":{"items":{"$ref":"#/components/schemas/api__routers__debug__DailyImplPoint"},"type":"array","title":"Daily Impls"},"recent_activity":{"items":{"$ref":"#/components/schemas/RecentActivity"},"type":"array","title":"Recent Activity"},"common_weaknesses":{"items":{"$ref":"#/components/schemas/WeaknessCount"},"type":"array","title":"Common Weaknesses"},"system":{"$ref":"#/components/schemas/SystemHealth"},"specs":{"items":{"$ref":"#/components/schemas/SpecStatusItem"},"type":"array","title":"Specs"}},"type":"object","required":["total_specs","total_implementations","coverage_percent","library_stats","low_score_specs","oldest_specs","missing_preview_specs","missing_tags_specs","daily_impls","recent_activity","common_weaknesses","system","specs"],"title":"DebugStatusResponse","description":"Debug dashboard data."},"FeedbackMessageItem":{"properties":{"id":{"type":"string","title":"Id"},"message":{"type":"string","title":"Message"},"reaction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reaction"},"contact":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"spec_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spec Id"},"viewport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewport"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","message","reaction","contact","path","spec_id","viewport","status","created_at"],"title":"FeedbackMessageItem","description":"A feedback entry with free-text message — surfaced to admins for triage."},"FeedbackRequest":{"properties":{"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"reaction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reaction"},"contact":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"spec_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spec Id"},"viewport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewport"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"}},"type":"object","title":"FeedbackRequest","description":"In-app quick feedback submission (issue #5662)."},"FeedbackResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"FeedbackResponse","description":"Response confirming feedback was accepted (no entry id is returned)."},"FeedbackStatusUpdate":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"FeedbackStatusUpdate","description":"Body of the PATCH endpoint."},"FeedbackTopPage":{"properties":{"path":{"type":"string","title":"Path"},"count":{"type":"integer","title":"Count"},"last_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen"}},"type":"object","required":["path","count","last_seen"],"title":"FeedbackTopPage","description":"Aggregated count of one reaction per page path."},"FilteredPlotsResponse":{"properties":{"total":{"type":"integer","title":"Total"},"images":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Images"},"counts":{"additionalProperties":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"object","title":"Counts"},"globalCounts":{"additionalProperties":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"object","title":"Globalcounts"},"orCounts":{"items":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"array","title":"Orcounts"},"specTitles":{"additionalProperties":{"type":"string"},"type":"object","title":"Spectitles","default":{}},"offset":{"type":"integer","title":"Offset","default":0},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},"type":"object","required":["total","images","counts","globalCounts","orCounts"],"title":"FilteredPlotsResponse","description":"Response for filtered plots endpoint."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImplementationResponse":{"properties":{"library_id":{"type":"string","title":"Library Id"},"library_name":{"type":"string","title":"Library Name"},"language":{"type":"string","title":"Language"},"preview_url_light":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url Light"},"preview_url_dark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url Dark"},"preview_html_light":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Html Light"},"preview_html_dark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Html Dark"},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url"},"preview_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Html"},"quality_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quality Score"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated At"},"updated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated"},"generated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated By"},"python_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Python Version"},"language_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Version"},"library_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Library Version"},"review_strengths":{"items":{"type":"string"},"type":"array","title":"Review Strengths","default":[]},"review_weaknesses":{"items":{"type":"string"},"type":"array","title":"Review Weaknesses","default":[]},"review_image_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Image Description"},"review_criteria_checklist":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Review Criteria Checklist"},"review_verdict":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Verdict"},"impl_tags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Impl Tags"}},"type":"object","required":["library_id","library_name","language"],"title":"ImplementationResponse","description":"Implementation details for a single library."},"LibraryDashboardStats":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"impl_count":{"type":"integer","title":"Impl Count"},"avg_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Score"},"min_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Score"},"max_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Score"},"score_buckets":{"additionalProperties":{"type":"integer"},"type":"object","title":"Score Buckets"},"loc_buckets":{"additionalProperties":{"type":"integer"},"type":"object","title":"Loc Buckets"},"avg_loc":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Loc"}},"type":"object","required":["id","name","impl_count","avg_score","min_score","max_score","score_buckets","loc_buckets","avg_loc"],"title":"LibraryDashboardStats","description":"Per-library statistics for the dashboard."},"LibraryStats":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"impl_count":{"type":"integer","title":"Impl Count"},"avg_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Score"},"min_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Score"},"max_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Score"}},"type":"object","required":["id","name","impl_count","avg_score","min_score","max_score"],"title":"LibraryStats","description":"Statistics for a single library."},"PingResponse":{"properties":{"database_connected":{"type":"boolean","title":"Database Connected"},"response_time_ms":{"type":"number","title":"Response Time Ms"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["database_connected","response_time_ms","timestamp"],"title":"PingResponse","description":"Lightweight DB round-trip measurement for response-time polling."},"PlotOfTheDayResponse":{"properties":{"spec_id":{"type":"string","title":"Spec Id"},"spec_title":{"type":"string","title":"Spec Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"library_id":{"type":"string","title":"Library Id"},"library_name":{"type":"string","title":"Library Name"},"language":{"type":"string","title":"Language"},"quality_score":{"type":"number","title":"Quality Score"},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url"},"preview_url_light":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url Light"},"preview_url_dark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url Dark"},"image_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Description"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"library_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Library Version"},"python_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Python Version"},"language_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Version"},"date":{"type":"string","title":"Date"}},"type":"object","required":["spec_id","spec_title","library_id","library_name","language","quality_score","date"],"title":"PlotOfTheDayResponse","description":"Daily featured plot."},"ProblemSpec":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"issue":{"type":"string","title":"Issue"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"}},"type":"object","required":["id","title","issue"],"title":"ProblemSpec","description":"A spec with issues."},"RecentActivity":{"properties":{"spec_id":{"type":"string","title":"Spec Id"},"spec_title":{"type":"string","title":"Spec Title"},"library_id":{"type":"string","title":"Library Id"},"language_id":{"type":"string","title":"Language Id"},"quality_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quality Score"},"generated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated By"},"updated":{"type":"string","title":"Updated"}},"type":"object","required":["spec_id","spec_title","library_id","language_id","quality_score","generated_by","updated"],"title":"RecentActivity","description":"A single recent implementation update entry."},"RelatedSpecItem":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url"},"preview_url_light":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url Light"},"preview_url_dark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url Dark"},"library_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Library Id"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"similarity":{"type":"number","title":"Similarity"},"shared_tags":{"items":{"type":"string"},"type":"array","title":"Shared Tags"}},"type":"object","required":["id","title","similarity","shared_tags"],"title":"RelatedSpecItem","description":"A related spec with similarity info."},"RelatedSpecsResponse":{"properties":{"related":{"items":{"$ref":"#/components/schemas/RelatedSpecItem"},"type":"array","title":"Related"}},"type":"object","required":["related"],"title":"RelatedSpecsResponse","description":"Related specs for a given spec."},"SpecDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"applications":{"items":{"type":"string"},"type":"array","title":"Applications","default":[]},"data":{"items":{"type":"string"},"type":"array","title":"Data","default":[]},"notes":{"items":{"type":"string"},"type":"array","title":"Notes","default":[]},"tags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tags"},"issue":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Issue"},"suggested":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested"},"created":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created"},"updated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated"},"implementations":{"items":{"$ref":"#/components/schemas/ImplementationResponse"},"type":"array","title":"Implementations","default":[]}},"type":"object","required":["id","title"],"title":"SpecDetailResponse","description":"Detailed spec response with implementations."},"SpecListItem":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tags"},"library_count":{"type":"integer","title":"Library Count","default":0}},"type":"object","required":["id","title"],"title":"SpecListItem","description":"Spec list item with summary info."},"SpecMapItem":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"preview_url_light":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url Light"},"preview_url_dark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url Dark"},"quality_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quality Score"},"tags":{"anyOf":[{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Tags"},"impl_tags":{"anyOf":[{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Impl Tags"}},"type":"object","required":["id","title"],"title":"SpecMapItem","description":"One row per spec for the /map page: best-impl preview + full tag bag for client-side similarity clustering."},"SpecStatusItem":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"updated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated"},"avg_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Score"},"altair":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Altair"},"bokeh":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bokeh"},"chartjs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Chartjs"},"d3":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"D3"},"echarts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Echarts"},"ggplot2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ggplot2"},"highcharts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Highcharts"},"letsplot":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Letsplot"},"makie":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Makie"},"matplotlib":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Matplotlib"},"muix":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Muix"},"plotly":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Plotly"},"plotnine":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Plotnine"},"pygal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pygal"},"seaborn":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Seaborn"}},"type":"object","required":["id","title","updated"],"title":"SpecStatusItem","description":"Status for a single specification with library scores."},"StatsResponse":{"properties":{"specs":{"type":"integer","title":"Specs"},"plots":{"type":"integer","title":"Plots"},"libraries":{"type":"integer","title":"Libraries"},"languages":{"type":"integer","title":"Languages","default":0},"lines_of_code":{"type":"integer","title":"Lines Of Code","default":0}},"type":"object","required":["specs","plots","libraries"],"title":"StatsResponse","description":"Platform statistics."},"SystemHealth":{"properties":{"database_connected":{"type":"boolean","title":"Database Connected"},"api_response_time_ms":{"type":"number","title":"Api Response Time Ms"},"timestamp":{"type":"string","title":"Timestamp"},"total_specs_in_db":{"type":"integer","title":"Total Specs In Db"},"total_impls_in_db":{"type":"integer","title":"Total Impls In Db"}},"type":"object","required":["database_connected","api_response_time_ms","timestamp","total_specs_in_db","total_impls_in_db"],"title":"SystemHealth","description":"System health information."},"TimelinePoint":{"properties":{"month":{"type":"string","title":"Month"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["month","count"],"title":"TimelinePoint","description":"Monthly implementation count."},"TopImpl":{"properties":{"spec_id":{"type":"string","title":"Spec Id"},"spec_title":{"type":"string","title":"Spec Title"},"spec_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Spec Description"},"library_id":{"type":"string","title":"Library Id"},"language":{"type":"string","title":"Language"},"quality_score":{"type":"number","title":"Quality Score"},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url"},"preview_url_light":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url Light"},"preview_url_dark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url Dark"}},"type":"object","required":["spec_id","spec_title","library_id","language","quality_score"],"title":"TopImpl","description":"A top-rated implementation."},"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"},"VisitorPoint":{"properties":{"date":{"type":"string","title":"Date"},"visitors":{"type":"integer","title":"Visitors"}},"type":"object","required":["date","visitors"],"title":"VisitorPoint","description":"Unique visitors on a single day, sourced from Plausible."},"VisitorsResponse":{"properties":{"points":{"items":{"$ref":"#/components/schemas/VisitorPoint"},"type":"array","title":"Points"}},"type":"object","required":["points"],"title":"VisitorsResponse","description":"Unique visitors per day for the public stats page."},"WeaknessCount":{"properties":{"text":{"type":"string","title":"Text"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["text","count"],"title":"WeaknessCount","description":"Aggregated occurrence of a weakness string across all impls."},"api__routers__debug__DailyImplPoint":{"properties":{"date":{"type":"string","title":"Date"},"impls_updated":{"type":"integer","title":"Impls Updated"}},"type":"object","required":["date","impls_updated"],"title":"DailyImplPoint","description":"Count of implementations updated on a single day."},"api__routers__insights__DailyImplPoint":{"properties":{"date":{"type":"string","title":"Date"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["date","count"],"title":"DailyImplPoint","description":"Implementation updates on a single day (last-28-days timeline).\n\nWindow matches the visitors chart on the stats page so the two strips\nread side-by-side. Distinct from `debug.DailyImplPoint` (which uses\n`impls_updated`) — kept separate because the public dashboard's consumer\nis the stats page bundle, not the admin debug view, and `count` is\nconsistent with `TimelinePoint`."}}}}