{"openapi":"3.1.0","info":{"title":"WiseRecipes API","description":"Skill marketplace & recipe sharing API for WiseChef ecosystem.","version":"0.5.0"},"paths":{"/api/telemetry":{"post":{"tags":["telemetry"],"summary":"Post Telemetry","description":"Record a telemetry event.\n\nAccepts two modes (both may be combined):\n- **Typed mode**: typed fields (goal_class, duration_seconds, retry_count,\n  user_intervention, agent_class_hash) land in dedicated columns.\n- **Legacy mode**: ``payload`` dict is JSON-serialised into the ``payload``\n  text column. Existing callers continue to work unchanged.\n\nValidation (raises 422 on failure):\n- ``event_type`` ∈ {install, first_use, task_completed, task_failed, replaced}\n- ``duration_seconds`` 0..86400\n- ``agent_class_hash`` regex ^[a-f0-9]{8,64}$ if present\n\nRaises 404 if ``skill_slug`` is provided but not found in the skills table.","operationId":"post_telemetry_api_telemetry_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryEventOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats":{"get":{"tags":["meta"],"summary":"Marketplace Stats","description":"Public marketplace transparency stats — totals, top categories, top skills.\n\nNo auth required. Powers the /stats portal page and the recipes_stats MCP tool.\nDesigned to beat LarryBrain's opacity: full counts, fresh data, clear scope.","operationId":"marketplace_stats_api_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/wisechef/demo-cta":{"get":{"tags":["wisechef"],"summary":"Demo Cta","description":"WiseChef cross-sell CTA for the Recipes marketplace.\n\nReturns dynamic marketing content for the landing page and carousel.","operationId":"demo_cta_api_wisechef_demo_cta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoCTAOut"}}}}}}},"/api/wisechef/demo-request":{"post":{"tags":["wisechef"],"summary":"Submit Demo Request","description":"Submit a demo request from the Recipes marketplace.\n\nStores in wisechef_demo_requests table for follow-up.","operationId":"submit_demo_request_api_wisechef_demo_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoRequestIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/healthz":{"get":{"tags":["meta","meta","meta"],"summary":"Healthz","description":"Database liveness + Stripe webhook lag probe.","operationId":"healthz_api_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/skills/access":{"get":{"tags":["skills","skills","skills"],"summary":"Skill Access","description":"Check whether the calling subscriber can access a skill.\n\nTier semantics (Plan v5.4 §A.8, updated Phase G recipes_2005):\n  - Pro subscribers can access any current skill.\n  - Pro+ subscribers add fork capability — pass ``fork_eligible=true``\n    to gate access on it.\n  - Legacy slugs 'cook'/'operator' are accepted as READ aliases for 30 days\n    (RCP-INCIDENT-2026-05-11, remove after 2026-06-10).","operationId":"skill_access_api_skills_access_get","parameters":[{"name":"skill","in":"query","required":true,"schema":{"type":"string","description":"Skill slug to check access for","title":"Skill"},"description":"Skill slug to check access for"},{"name":"fork_eligible","in":"query","required":false,"schema":{"type":"boolean","description":"If true, require Pro+ tier (fork capability) on top of skill-tier access. Forks API ships in a later batch.","default":false,"title":"Fork Eligible"},"description":"If true, require Pro+ tier (fork capability) on top of skill-tier access. Forks API ships in a later batch."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillAccessOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/recipes/{slug}":{"get":{"tags":["recipes","recipes","recipes"],"summary":"Get Recipe","description":"Return public recipe detail.","operationId":"get_recipe_api_recipes__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-library/{slug}":{"get":{"tags":["recipes","recipes","api-library"],"summary":"Get Api Library Entry","description":"Return API library entry detail.","operationId":"get_api_library_entry_api_api_library__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APILibraryOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/install":{"get":{"tags":["skills","skills","skills"],"summary":"Install Skill","description":"Return a signed URL for downloading the skill tarball.\n\nPublic skills are installable by any valid api-key. Private skills are\ninstallable ONLY by the admin master key OR by the api-key whose user\nowns the skill (creator self-install — required for dogfooding).","operationId":"install_skill_api_skills_install_get","parameters":[{"name":"slug","in":"query","required":true,"schema":{"type":"string","description":"Skill slug; supports 'slug@semver' suffix","title":"Slug"},"description":"Skill slug; supports 'slug@semver' suffix"},{"name":"mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(files|full)$","default":"files","title":"Mode"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pin install to a specific semver. Overrides any '@version' suffix on slug.","title":"Version"},"description":"Pin install to a specific semver. Overrides any '@version' suffix on slug."},{"name":"ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"UTM ref platform code (li, x, yt, ig, fb, agentpact)","title":"Ref"},"description":"UTM ref platform code (li, x, yt, ig, fb, agentpact)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/_download":{"get":{"tags":["skills","skills","skills"],"summary":"Download Tarball","description":"Verify signed token and return tarball info.","operationId":"download_tarball_api_skills__download_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"Signed download token","title":"Token"},"description":"Signed download token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/reconcile":{"post":{"tags":["reconcile","reconcile"],"summary":"Reconcile Cookbook","description":"Conditional reconcile poll (see module docstring).","operationId":"reconcile_cookbook_api_cookbooks__cookbook_id__reconcile_post","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReconcileIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Reconcile Cookbook Api Cookbooks  Cookbook Id  Reconcile Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/reconcile-report":{"post":{"tags":["promotion","promotion"],"summary":"Reconcile Report","description":"Record a canary reconcile outcome and opportunistically promote.\n\nThe agent calls this AFTER applying a version, reporting whether it executed\ncleanly. A clean record feeds the promotion gate; once the gate passes, the\nversion is promoted to ``stable`` here (fast path) without waiting for the\nscheduled sweep.\n\nAuth: owner of the cookbook, or master. Non-owner → 404 (no existence leak,\nparity with reconcile_routes §7).","operationId":"reconcile_report_api_cookbooks__cookbook_id__reconcile_report_post","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReconcileReportIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Reconcile Report Api Cookbooks  Cookbook Id  Reconcile Report Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/promotion-sweep":{"post":{"tags":["promotion","promotion"],"summary":"Promotion Sweep","description":"Master-only batch promotion sweep across all canary-reported versions.\n\nThe scheduler/cron calls this periodically so a version whose final\nqualifying canary success arrived between request-path promotions still\nadvances to ``stable``. Idempotent.","operationId":"promotion_sweep_api_admin_promotion_sweep_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Promotion Sweep Api Admin Promotion Sweep Post"}}}}}}},"/api/skills/search":{"get":{"tags":["skills","skills","skills"],"summary":"Search Skills","description":"Full-text skill search with hybrid recall fallback.","operationId":"search_skills_api_skills_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Full-text search on title + description","title":"Q"},"description":"Full-text search on title + description"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"vertical","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(marketing|code|web-scraping|ops|sales|sim-robotics)$"},{"type":"null"}],"description":"Filter by Plan v5.4 vertical","title":"Vertical"},"description":"Filter by Plan v5.4 vertical"},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(free|pro|pro_plus|cook|operator|studio)$"},{"type":"null"}],"description":"Filter by access tier (canonical: free|pro|pro_plus — legacy aliases cook|operator|studio accepted until 2026-06-10 via Phase A map)","title":"Tier"},"description":"Filter by access tier (canonical: free|pro|pro_plus — legacy aliases cook|operator|studio accepted until 2026-06-10 via Phase A map)"},{"name":"subset","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(pantry|menu|cookbook)$"},{"type":"null"}],"description":"v6: filter by catalog subset (pantry=original 3rd-party, menu=public custom, cookbook=private)","title":"Subset"},"description":"v6: filter by catalog subset (pantry=original 3rd-party, menu=public custom, cookbook=private)"},{"name":"variant","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(original|custom)$"},{"type":"null"}],"description":"v6: filter by skill_variant","title":"Variant"},"description":"v6: filter by skill_variant"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(updated_at|created_at|title|quality_score)$","default":"updated_at","title":"Sort"}},{"name":"min_quality","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10,"minimum":0},{"type":"null"}],"description":"quality_1705 Phase C — filter skills with quality_score >= N. Skills without a computed quality_score are excluded when this is set.","title":"Min Quality"},"description":"quality_1705 Phase C — filter skills with quality_score >= N. Skills without a computed quality_score are excluded when this is set."},{"name":"hybrid","in":"query","required":false,"schema":{"type":"boolean","description":"issue #111: when the literal keyword pass returns fewer than ``hybrid_min_keyword_hits`` results, augment with hybrid recall (BM25 + vector) results. Set hybrid=false to force pure keyword.","default":true,"title":"Hybrid"},"description":"issue #111: when the literal keyword pass returns fewer than ``hybrid_min_keyword_hits`` results, augment with hybrid recall (BM25 + vector) results. Set hybrid=false to force pure keyword."},{"name":"hybrid_min_keyword_hits","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":0,"description":"Threshold below which hybrid fallback activates. Default 3.","default":3,"title":"Hybrid Min Keyword Hits"},"description":"Threshold below which hybrid fallback activates. Default 3."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Page Size"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"description":"Alias for page_size — callers may use either name. When both are supplied, `limit` wins. Cap is 100 regardless.","title":"Limit"},"description":"Alias for page_size — callers may use either name. When both are supplied, `limit` wins. Cap is 100 regardless."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillSearchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/trending":{"get":{"tags":["skills","skills","skills"],"summary":"Trending Skills","description":"Trending = most telemetry install events in the given period.\n\nRCP-11: when the requested window has no install events, transparently\nwiden the lookback (day → week → month → all-time) so a quiet stretch\nnever returns empty trending while real install history exists. The\nresponse is the same shape; widening is silent on the wire and logged\nserver-side so we can spot a chronically dead telemetry stream.","operationId":"trending_skills_api_skills_trending_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(day|week|month)$","default":"week","title":"Period"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillSearchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/graph":{"get":{"tags":["skills","skills","skills"],"summary":"Get Full Skill Graph","description":"Full marketplace skill graph dump for portal-side visualisation (Stage 3, G17).\n\nReturns ALL public skills as nodes plus all derived edges between them as\nundirected unique pairs. Single round-trip — designed for `/graph` page\nforce-directed rendering.\n\nNo auth required. Cheap query (≤200 nodes, ≤500 dedup edges in practice).","operationId":"get_full_skill_graph_api_skills_graph_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/skills/external":{"get":{"tags":["skills","skills","skills","federation"],"summary":"Get External Skills","description":"evergreen_0206 Phase F2/F3 + superset_0606 Phase B — the live external\n(federated) catalog seam, now cache-backed.\n\nSurfaces external skills as a SEPARATE, second-class namespace\n(\"External · community · as-is\"), behind a per-source toggle that is OFF by\ndefault. Counts are reported INDEXED-vs-INSTALLABLE per source and never\nconflated (decision #5). Internal/private skills are NEVER surfaced here.\n\nsuperset_0606 Phase B — cache-backed counts:\n  - A NON-enabled source reads its ``{indexed, installable, walked_at,\n    stale}`` block from the PERSISTENT ``federation_index_cache`` table — a\n    cold load NEVER triggers an inline cursor/sitemap walk (decision #7).\n    Falls back to the cheap in-memory ``INDEXED_COUNT`` only when the source\n    has no cache row yet (first boot before the reindex cron has run).\n  - An ENABLED source still does a live, limited adapter search (the toggle\n    is an explicit user action), and its fresh counts are written back to\n    the cache so the next cold load is served from storage.\n  - ``?refresh=1`` (admin only) forces a live re-walk + cache write.\n\nToggle semantics:\n  - ``sources`` empty/omitted  → every source disabled; ``external`` is [].\n    Honest cached indexed counts are still reported per source.\n  - ``sources=hermes-hub``     → only Hermes Hub queried + returned.\n  - ``sources=hermes-hub,github-oss`` → both queried, merged, second-class.","operationId":"get_external_skills_api_skills_external_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Free-text query forwarded to each enabled source","title":"Q"},"description":"Free-text query forwarded to each enabled source"},{"name":"sources","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated source ids to ENABLE (the free-source toggle). OFF BY DEFAULT: with no value, no external source is queried and the curated catalog stays clean. Live sources: hermes-hub, github-oss.","title":"Sources"},"description":"Comma-separated source ids to ENABLE (the free-source toggle). OFF BY DEFAULT: with no value, no external source is queried and the curated catalog stays clean. Live sources: hermes-hub, github-oss."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"refresh","in":"query","required":false,"schema":{"type":"integer","maximum":1,"minimum":0,"description":"ADMIN ONLY: 1 forces a live re-walk + cache write for the queried sources.","default":0,"title":"Refresh"},"description":"ADMIN ONLY: 1 forces a live re-walk + cache write for the queried sources."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/external/{source}/{slug}/install":{"get":{"tags":["skills","skills","skills","federation"],"summary":"Install External Skill","description":"evergreen_0206 Phase F2 — REAL fetch-origin install for an external skill.\n\nCloses the cold-path: makes the external install CTA actually work instead of\nbeing aspirational. The install ROUTER decides the path; this endpoint\nEXECUTES the redistributable one (fetch-origin) by streaming the real,\nMIT-licensed SKILL.md from origin, with license + attribution preserved.\n\nReturns, per the router's decision:\n  - fetch_origin → {install_path, raw_url, content, license, install_command}\n    (the agent writes ``content`` to its skills dir; the command is the\n    copy-paste curl form for a human).\n  - deep_link / non-redistributable → 409 with the origin link (never\n    rehosted — license/ToS wall).\n  - unknown source / unresolvable slug → 404 (honest, never fabricated).","operationId":"install_external_skill_api_skills_external__source___slug__install_get","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"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/skills/external/{source}/{slug}/source-link":{"get":{"tags":["skills","skills","skills","federation"],"summary":"External Source Link","description":"portal_0610 J4 / §6.5 DEFECT-1+2+3 — a VALIDATED, reachable source link\nplus the honest federation class, resolved lazily (per-skill, on click).\n\nThe dogfood found that ``origin_url`` 404s by DEFAULT for the highest-quality\nsource (hermes-hub): the human docs page is gone while the raw SKILL.md is\n200. So a portal \"view source\" that points at bare ``origin_url`` is a broken\nlink by default, not an edge case.\n\nThis endpoint returns the link the portal should actually surface:\n  - HEAD-check ``origin_url``. If 200 → that's the link (``url_kind=origin``).\n  - Else derive the raw SKILL.md URL via the source's origin fetcher and\n    return it (``url_kind=raw``) — the install path already proves it's 200.\n  - If neither resolves → ``reachable=false`` and the portal renders\n    \"source unavailable\" instead of a dead link (PM5).\n\nAlso returns ``fed_class`` (procedural | persona), ``license`` (honest —\n``null`` stays ``null``, never fabricated), and real ``installable``.\n\nCheap by design: at most ONE HEAD on origin_url + (only on 404) the fetcher's\nURL derivation, which for most sources is pure string-building. No full body\ndownload in the happy path.","operationId":"external_source_link_api_skills_external__source___slug__source_link_get","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"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/skills/{slug}":{"get":{"tags":["skills","skills","skills"],"summary":"Get Skill Detail","description":"Full skill detail with versions and resolved related skills.\n\nquality_1705 Phase B — body paywall:\n  - Anonymous / free callers receive metadata-only (readme=null, external_resources=null)\n  - Pro / Pro+ callers receive the full SKILL.md body + scripts/templates manifest\n  - The master/admin api key is treated as Pro+ for self-test parity.","operationId":"get_skill_detail_api_skills__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{slug}/external":{"get":{"tags":["skills","skills","skills"],"summary":"Get Skill External","description":"v6 Phase A: Return external_resources JSON for a skill.\n\nPublic, no auth — surfaces the \"you might also want\" upstream links the\nskill author declared in frontmatter. Empty list if none, 404 if skill\nmissing, private, or archived (no oracle for private/archived slugs).\n\nIssue #16: added is_public + is_archived guard matching get_skill_detail.","operationId":"get_skill_external_api_skills__slug__external_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/skills/{slug}/related":{"get":{"tags":["skills","skills","skills"],"summary":"Get Skill Related","description":"Return up to 10 public skills the author declared as related.\n\nPublic — no auth required. Used by the portal \"Works well with\" rail\nand by the meta-skill v1.1+ install response.","operationId":"get_skill_related_api_skills__slug__related_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SkillOut"},"title":"Response Get Skill Related Api Skills  Slug  Related Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{slug}/graph":{"get":{"tags":["skills","skills","skills"],"summary":"Get Skill Graph","description":"Return the Stage-1 declared edges + Stage-2 derived edges for a skill.\n\nResponse shape:\n    {\n      \"slug\": str,\n      \"declared\":  [SkillOut...],   # author-declared (Stage 1)\n      \"derived\":   [SkillOut...],   # algorithm-derived (Stage 2), top-K\n      \"all\":       [SkillOut...],   # union, declared first, capped at 10\n      \"edges\":     [{slug, weight, signals}, ...]  # debug/derived metadata\n    }","operationId":"get_skill_graph_api_skills__slug__graph_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/skills/{slug}/files":{"get":{"tags":["skills","skills","skills"],"summary":"Get Skill Files","description":"Return the tarball file manifest for a skill.\n\nResponse: {version, files: [{path, size, type}], total_files, total_bytes}\n\nCached at version level (immutable per checksum_sha256).\nNo auth required — only the listing, not the content.","operationId":"get_skill_files_api_skills__slug__files_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/skills/{slug}/file":{"get":{"tags":["skills","skills","skills"],"summary":"Get Skill File","description":"Return the content of a single file from the skill tarball.\n\nSECURITY CRITICAL:\n  - Path traversal, absolute paths, null bytes, symlinks → 400\n  - Path length > 256 chars → 400\n  - File > 1 MiB → 413\n  - Free tier: SKILL.md only; pro/master: all files → 403 if gated\n  - Auth via authz.can_read_skill; relies on RateLimitMiddleware for rate limits","operationId":"get_skill_file_api_skills__slug__file_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","description":"Relative file path within the skill tarball","title":"Path"},"description":"Relative file path within the skill tarball"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{slug}/install-events":{"get":{"tags":["skills","skills","skills"],"summary":"Get Skill Install Events","description":"Return install event counts bucketed by day for a sparkline chart.\n\nResponse: {window_days, buckets: [{date, count}], total_in_window, total_all_time}\n\nPublic — no auth required.  Cached 1h in-process.","operationId":"get_skill_install_events_api_skills__slug__install_events_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","description":"Time window: '7d' or '30d'","default":"7d","title":"Window"},"description":"Time window: '7d' or '30d'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{slug}/runtime":{"get":{"tags":["skills","skills","skills"],"summary":"Get Skill Runtime","description":"Return runtime/toolchain detection info for a skill.\n\nParses SKILL.md frontmatter for runtime/compatible/tools/requires keys.\nFalls back to category-based inference when frontmatter has no runtime keys.\n\nResponse: {runtimes, tools_required, frontmatter_present, inferred}\n\nPublic — no auth required.","operationId":"get_skill_runtime_api_skills__slug__runtime_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/admin/reindex-all":{"post":{"tags":["admin","admin"],"summary":"Admin Reindex All","description":"Reindex BM25 search_vector for every non-archived skill.\n\nMaster-key only (api_key_user_id must be None).  For catastrophic\nrecovery only — normal publishes auto-reindex.","operationId":"admin_reindex_all_api_admin_reindex_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReindexAllResponse"}}}}}}},"/api/admin/skill-publish-requests/{request_id}/tarball":{"get":{"tags":["admin","admin"],"summary":"Admin Get Publish Request Tarball","description":"Return the raw tarball bytes for a SkillPublishRequest.\n\nMaster-key only — used by the reviewer to inspect skill content locally\nand by the skill-publish-approver workflow to fetch the tarball for\nfinal publishing.","operationId":"admin_get_publish_request_tarball_api_admin_skill_publish_requests__request_id__tarball_get","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/skill-publish-requests/{request_id}/status":{"patch":{"tags":["admin","admin"],"summary":"Admin Update Publish Request Status","description":"Approve or reject a pending skill-publish request.\n\nMaster-key only.  On approval:\n  - Sets status = 'approved' and records reviewed_at / reviewed_by.\n  - Calls grant_contributor_credit() for the requester if they are\n    a pro/pro_plus subscriber with no existing unused credit.\n\nOn rejection:\n  - Sets status = 'rejected' and persists the reject_reason.\n  - No credit is granted.","operationId":"admin_update_publish_request_status_api_admin_skill_publish_requests__request_id__status_patch","parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePublishRequestStatusIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePublishRequestStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/pulse":{"get":{"tags":["admin","admin"],"summary":"Admin Pulse","description":"Return the north-star demand scoreboard. Master-key only.\n\nHeadline = REAL CASH MRR from Stripe (net of promo discounts), because our\nDB stores only tier+status, not what a customer pays — a 100%-off promo\nsub looks identical to a full-price one locally. We resolve the truth from\nStripe per active subscriber. If Stripe is unreachable the cash figures are\nreturned as None with mrr_source=\"stripe_unavailable\" — we NEVER fall back\nto list-price as if it were revenue (that was the original bug).","operationId":"admin_pulse_api_admin_pulse_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PulseOut"}}}}}}},"/api/admin/demand-brief":{"get":{"tags":["admin","admin"],"summary":"Demand Brief","description":"Master-key-gated content-marketing direction feed for Chef's content factory.\n\nMaster-key only (``api_key_user_id is None``) — the brief exposes strategic\ndemand gaps that must never hit a public surface. Chef fetches server-side.","operationId":"demand_brief_api_admin_demand_brief_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Look-back window for search + funnel signals","default":14,"title":"Days"},"description":"Look-back window for search + funnel signals"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":25,"minimum":1,"description":"Max themes per signal block","default":8,"title":"Limit"},"description":"Max themes per signal block"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Demand Brief Api Admin Demand Brief Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/github/login":{"get":{"tags":["auth","auth"],"summary":"Github Login","description":"Initiate GitHub OAuth flow. Preserves optional `next` query param via cookie.\n\nOptional `ref=CODE` query param is stamped as a 30-day cookie so the\nreferral attribution survives the OAuth round-trip (WIS-660).","operationId":"github_login_api_auth_github_login_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},{"name":"ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/github/callback":{"get":{"tags":["auth","auth"],"summary":"Github Callback","description":"Handle GitHub OAuth callback. Exchanges code, creates user, sets JWT cookie.","operationId":"github_callback_api_auth_github_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/login":{"get":{"tags":["auth","auth"],"summary":"Google Login","description":"Initiate Google OAuth flow. Preserves optional `next` query param via cookie.\n\nOptional `ref=CODE` query param is stamped as a 30-day cookie (WIS-660).","operationId":"google_login_api_auth_google_login_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},{"name":"ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/callback":{"get":{"tags":["auth","auth"],"summary":"Google Callback","description":"Handle Google OAuth callback. Exchanges code, creates user, sets JWT cookie.","operationId":"google_callback_api_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["creator","creator"],"summary":"Get Me","description":"Get current user profile from JWT.","operationId":"get_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorProfile"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth","auth"],"summary":"Logout","description":"Clear the JWT cookie and any auth-related cookies. Idempotent.","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/carousel/today":{"get":{"tags":["carousel","carousel"],"summary":"Get Carousel Today","description":"Return today's carousel (UTC date).","operationId":"get_carousel_today_api_carousel_today_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CarouselResponse"}}}}}}},"/api/carousel/{date_str}":{"get":{"tags":["carousel","carousel"],"summary":"Get Carousel By Date","description":"Return carousel for a specific date.\n\n*date_str* must match ``YYYY-MM-DD`` exactly; anything else yields 422.","operationId":"get_carousel_by_date_api_carousel__date_str__get","parameters":[{"name":"date_str","in":"path","required":true,"schema":{"type":"string","title":"Date Str"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CarouselResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bootcamp":{"get":{"tags":["bootcamp","bootcamp"],"summary":"List Bootcamp Tracks","description":"List all bootcamp tracks as summary cards (counts computed from LIVE tiers).","operationId":"list_bootcamp_tracks_api_bootcamp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BootcampListResponse"}}}}}}},"/api/bootcamp/{track_id}":{"get":{"tags":["bootcamp","bootcamp"],"summary":"Get Bootcamp Track","description":"Return one track with steps enriched from the live catalog.","operationId":"get_bootcamp_track_api_bootcamp__track_id__get","parameters":[{"name":"track_id","in":"path","required":true,"schema":{"type":"string","title":"Track Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BootcampTrack"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{slug}/sandbox/status":{"get":{"tags":["sandbox","sandbox"],"summary":"Sandbox Status","description":"Check if a skill supports sandbox execution and return its profile.","operationId":"sandbox_status_api_skills__slug__sandbox_status_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{slug}/sandbox/run":{"post":{"tags":["sandbox","sandbox"],"summary":"Sandbox Run","description":"Execute a skill's entrypoint inside a bubblewrap sandbox.\n\nThe skill must have a [sandbox] block in its skill.toml manifest.\nExecution result is recorded as a telemetry event.\nRequires master scope or is_sandbox_operator=True on the API key.","operationId":"sandbox_run_api_skills__slug__sandbox_run_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxRunRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/github":{"get":{"tags":["creator","creator"],"summary":"Github Auth Redirect","description":"Redirect to GitHub OAuth authorization page.","operationId":"github_auth_redirect_api_auth_github_get","parameters":[{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","description":"Frontend callback URL","title":"Redirect Uri"},"description":"Frontend callback URL"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/callback":{"get":{"tags":["creator","creator"],"summary":"Github Callback","description":"Handle GitHub OAuth callback. Exchange code for profile + JWT.","operationId":"github_callback_api_auth_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorProfile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/token":{"post":{"tags":["creator","creator"],"summary":"Exchange Token","description":"Exchange GitHub OAuth code for a JWT + user profile (API-friendly).","operationId":"exchange_token_api_auth_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenExchangeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorProfile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stripe/onboard":{"post":{"tags":["creator","creator"],"summary":"Stripe Onboard","description":"KILLED — Stripe Connect creator onboarding removed in top1pct_1105 Phase C.\n\nEarning mechanism is now 50% referral rev-share only.\nSee /referrals for details.","operationId":"stripe_onboard_api_stripe_onboard_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stripe/status":{"get":{"tags":["creator","creator"],"summary":"Stripe Status","description":"KILLED — Stripe Connect status removed in top1pct_1105 Phase C.","operationId":"stripe_status_api_stripe_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stripe/dashboard":{"get":{"tags":["creator","creator"],"summary":"Stripe Dashboard Link","description":"KILLED — Stripe Express dashboard removed in top1pct_1105 Phase C.","operationId":"stripe_dashboard_link_api_stripe_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/creator/earnings":{"get":{"tags":["creator","creator"],"summary":"Creator Earnings","description":"Get earnings summary for the authenticated creator.","operationId":"creator_earnings_api_creator_earnings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EarningsResponse"}}}}}}},"/api/creator/payouts":{"get":{"tags":["creator","creator"],"summary":"Creator Payouts","description":"Get payout history for the authenticated creator.","operationId":"creator_payouts_api_creator_payouts_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PayoutHistoryItem"},"title":"Response Creator Payouts Api Creator Payouts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vat/calculate":{"post":{"tags":["creator","creator"],"summary":"Vat Calculate","description":"Calculate VAT MOSS for a given amount and buyer location.","operationId":"vat_calculate_api_vat_calculate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VATCalculateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VATCalculateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vat/moss-report":{"post":{"tags":["creator","creator"],"summary":"Vat Moss Report","description":"Generate a VAT MOSS report for the current period (admin endpoint).","operationId":"vat_moss_report_api_vat_moss_report_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VATMOSSReportResponse"}}}}}}},"/api/admin/payouts/run":{"post":{"tags":["creator","creator"],"summary":"Run Payouts","description":"Trigger monthly payout calculation. Requires admin API key.","operationId":"run_payouts_api_admin_payouts_run_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","description":"If true, compute but don't execute","default":true,"title":"Dry Run"},"description":"If true, compute but don't execute"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stripe/webhook":{"post":{"tags":["creator","creator"],"summary":"Stripe Webhook","description":"Handle Stripe webhook events.\n\nRoutes events to the right service:\n- checkout.session.completed, customer.subscription.* → subscription_service\n- account.updated, transfer.* → Connect (creator payouts)\n\nIdempotent: every event_id is recorded in stripe_event_ids; replays\nreturn 200 with already_processed=True (no side effects).","operationId":"stripe_webhook_api_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/skills/_publish":{"post":{"tags":["publisher","publisher","publisher"],"summary":"Publish Skill","description":"Publish a new skill version (private by default).\n\nAuth: x-api-key must belong to the skill's creator (or be the admin master key).\nSignature: ed25519 signature must verify against sha256(tarball bytes).\nStorage: tarball saved to RECIPES_SKILLS_DIR/{slug}/{semver}.tar.gz\nDB: creates skill_versions row; returns 409 if (skill_id, semver) already exists.","operationId":"publish_skill_api_skills__publish_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_publish_skill_api_skills__publish_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{slug}/_archive":{"post":{"tags":["publisher","publisher","publisher"],"summary":"Archive Skill","description":"Soft-archive a skill — sets is_archived=True and NULLs search_vector.\n\nAuth: master key only (admin). Archived skills are hidden from /api/recall\nbut remain in the DB for audit/recovery.","operationId":"archive_skill_api_skills__slug___archive_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArchiveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/checkout/{tier}":{"post":{"tags":["billing","checkout"],"summary":"Create Subscription Checkout","description":"Create a Stripe Checkout Session for the given subscription tier.\n\nRequires the user to be authenticated (JWT cookie set by /api/auth/{provider}/callback).\nAnonymous users get 401 with a hint to log in.","operationId":"create_subscription_checkout_api_checkout__tier__post","parameters":[{"name":"tier","in":"path","required":true,"schema":{"type":"string","title":"Tier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/me":{"get":{"tags":["billing","checkout"],"summary":"Billing Me","description":"Current authenticated user's subscription state.\n\nPhase 2: if the user has a Stripe customer ID but no active tier in the DB\n(race condition window after checkout, before webhook delivery), perform an\ninline Stripe lookup and apply the subscription synchronously.  This makes\nthe success-page poll converge in one RTT rather than waiting up to 30 s for\nthe webhook to arrive.\n\nGuards:\n- Entire Stripe call is wrapped in try/except; any exception falls back to\n  the stale DB state so the endpoint never 5xx.\n- Per-user cooldown (``_RECONCILE_COOLDOWN_S``) prevents a hammering\n  frontend from exhausting Stripe quota.\n- ``BILLING_ME_RECONCILE_BUDGET_S`` is passed as Stripe call timeout.\n- Never creates customers, subscriptions, or invoices — read + sync only.","operationId":"billing_me_api_billing_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/subscriptions/downgrade":{"post":{"tags":["billing","checkout"],"summary":"Downgrade Subscription","description":"Switch a Pro+ subscriber to Pro with proration.\n\nRequires authentication. Returns 400 if the caller isn't currently on pro_plus.","operationId":"downgrade_subscription_api_subscriptions_downgrade_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/portal-session":{"post":{"tags":["billing","checkout"],"summary":"Create Billing Portal Session","description":"Create a Stripe Customer Portal session for self-serve billing.","operationId":"create_billing_portal_session_api_billing_portal_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/api-keys":{"get":{"tags":["api-keys","api-keys"],"summary":"List Api Keys","description":"List the authenticated user's API keys (no plaintext).\n\nPhase C additions: each key item now includes:\n  - cookbook_id (UUID or null)\n  - label (human label)\n  - install_count_total (all-time installs via this key)\n  - install_count_7d   (installs in the last 7 days)","operationId":"list_api_keys_api_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-keys","api-keys"],"summary":"Create Api Key","description":"Create a new API key for the authenticated user.\n\nPhase C policy:\n- Free / Pro (legacy cook)  : max 1 active key\n- Pro+ (legacy operator)    : max 20 active keys\n- Optional cookbook_id: must belong to the calling user\n- Optional label: human-readable name ≤100 chars\n\nThe plaintext key is returned ONCE — store it.","operationId":"create_api_key_api_api_keys_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/api-keys/{key_id}":{"delete":{"tags":["api-keys","api-keys"],"summary":"Revoke Api Key","description":"Revoke an API key. Idempotent — already-revoked or missing keys return 204.","operationId":"revoke_api_key_api_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feedback/incident":{"post":{"tags":["feedback","feedback"],"summary":"Post Incident","description":"Submit an incident report for a skill execution failure.","operationId":"post_incident_api_feedback_incident_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats/patches":{"get":{"tags":["canary","stats"],"summary":"Get Patch Stats","description":"Return patch success/failure stats for the requested time period.","operationId":"get_patch_stats_api_stats_patches_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(24h|7d|30d)$","default":"7d","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Patch Stats Api Stats Patches Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/forks/create":{"post":{"tags":["forks","forks"],"summary":"Create Fork","description":"Create a new private fork of an existing skill.","operationId":"create_fork_api_forks_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForkCreateIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/forks/list":{"get":{"tags":["forks","forks"],"summary":"List Forks","description":"List all forks owned by the authenticated pro_plus user.","operationId":"list_forks_api_forks_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/forks/{fork_id}/version":{"post":{"tags":["forks","forks"],"summary":"Upload Fork Version","description":"Upload a new version tarball to an existing fork.","operationId":"upload_fork_version_api_forks__fork_id__version_post","parameters":[{"name":"fork_id","in":"path","required":true,"schema":{"type":"string","title":"Fork Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_fork_version_api_forks__fork_id__version_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/forks/{fork_id}/install":{"get":{"tags":["forks","forks"],"summary":"Install Fork","description":"Issue an HMAC-signed download URL with 5-min TTL for the latest version.","operationId":"install_fork_api_forks__fork_id__install_get","parameters":[{"name":"fork_id","in":"path","required":true,"schema":{"type":"string","title":"Fork Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/forks/_download":{"get":{"tags":["forks","forks"],"summary":"Download Fork","description":"Verify the HMAC token and stream the tarball. Public — auth lives in\nthe token itself (5-minute TTL, signed with SIGNING_SECRET + fork salt).","operationId":"download_fork_api_forks__download_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/forks/{fork_id}":{"delete":{"tags":["forks","forks"],"summary":"Delete Fork","description":"Soft-delete: visibility is set to NULL and readme is cleared. The row\nremains so version history (and audit) survives, but list_forks will\nskip it and the unique (user_id, slug) constraint still blocks revival\nvia fresh fork until the slug is re-used.","operationId":"delete_fork_api_forks__fork_id__delete","parameters":[{"name":"fork_id","in":"path","required":true,"schema":{"type":"string","title":"Fork Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/discover":{"get":{"tags":["cookbooks","cookbooks"],"summary":"Discover Cookbooks","description":"Public, ranked feed of public cookbooks. No auth required.\n\nsort: 'installs' (default, by real 7d installs then total — test/CI excluded\nper §4.2) | 'newest' (created_at desc). Pagination via limit/offset.","operationId":"discover_cookbooks_api_cookbooks_discover_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"installs","title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/public/{slug}":{"get":{"tags":["cookbooks","cookbooks"],"summary":"Public Cookbook Page","description":"Public cookbook page by slug. No auth. 404 unless visibility='public'.\n\nReturns the cookbook card + its ordered skill list + a ONE-LINE clone hint\nso an agent can compose it via MCP from the public page (GTM gate, Ph F will\nrender this). Carries ?ref attribution.","operationId":"public_cookbook_page_api_cookbooks_public__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/cookbooks/leaderboard":{"get":{"tags":["cookbooks","cookbooks"],"summary":"Cookbook Leaderboard","description":"Public reputation leaderboards. No auth.\n\nReturns two ranked lists over PUBLIC cookbooks:\n  - ``top_weekly`` : ranked by REAL 7d installs (then total) — test/CI\n    excluded via _install_counts_for (Ph B §4.2). The \"top weekly cookbook\"\n    status surface that gives Day-1 sharers a reason to post again.\n  - ``latest``     : most-recently-created public cookbooks (\"latest public\n    cookbook\").\nEach entry is the standard public card (carries is_verified + ?ref).","operationId":"cookbook_leaderboard_api_cookbooks_leaderboard_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/verify":{"post":{"tags":["cookbooks","cookbooks"],"summary":"Verify Cookbook","description":"Assign / revoke the verified-maintainer badge on a cookbook (admin only).\n\nMaster/admin key only — verification is a trust signal we control, not a\nself-serve toggle. Pass ?verified=false to revoke. Returns the new state.","operationId":"verify_cookbook_api_cookbooks__cookbook_id__verify_post","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks":{"get":{"tags":["cookbooks","cookbooks"],"summary":"List Cookbooks","description":"List all cookbooks for the authenticated user.","operationId":"list_cookbooks_api_cookbooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["cookbooks","cookbooks"],"summary":"Create Cookbook","description":"Create a new cookbook for the authenticated user.","operationId":"create_cookbook_api_cookbooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CookbookCreateIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}":{"get":{"tags":["cookbooks","cookbooks"],"summary":"Get Cookbook","description":"Return a single cookbook by ID, including its skill list.","operationId":"get_cookbook_api_cookbooks__cookbook_id__get","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/skills":{"post":{"tags":["cookbooks","cookbooks"],"summary":"Add Skill To Cookbook","description":"Add a skill to the specified cookbook.","operationId":"add_skill_to_cookbook_api_cookbooks__cookbook_id__skills_post","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillAddIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/skills/{slug}":{"delete":{"tags":["cookbooks","cookbooks"],"summary":"Remove Skill From Cookbook","description":"Remove a skill from the specified cookbook.","operationId":"remove_skill_from_cookbook_api_cookbooks__cookbook_id__skills__slug__delete","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}},{"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/cookbooks/{cookbook_id}/visibility":{"patch":{"tags":["cookbooks","cookbooks"],"summary":"Set Cookbook Visibility","description":"portal_0610 J2 — flip a cookbook public/private from the Composer.\n\nThe Composer surfaces visibility inline (L3). Only the owner (or master) may\nchange it; cbt_ share-tokens are scope-gated out by the route guard.","operationId":"set_cookbook_visibility_api_cookbooks__cookbook_id__visibility_patch","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/skills/{slug}/pin":{"patch":{"tags":["cookbooks","cookbooks"],"summary":"Set Skill Pin","description":"portal_0610 J2 / L5 — pin a curated skill to a specific version, or clear\nthe pin (null → always-latest, the default).\n\nCURATED-ONLY: federation/external skills have no version contract, so pinning\none is rejected (422). Passing a semver that doesn't exist for the skill 404s\nwith the available list (mirrors the install route's pin validation).","operationId":"set_skill_pin_api_cookbooks__cookbook_id__skills__slug__pin_patch","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillPinIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/reorder":{"patch":{"tags":["cookbooks","cookbooks"],"summary":"Reorder Cookbook Skills","description":"portal_0610 J2 / L3 — persist the Composer's skill order.\n\nAccepts the full ordered list of slugs; assigns install_order = index*10\n(gaps leave room for future single-item moves without a full rewrite). Slugs\nnot in the cookbook are ignored; cookbook skills omitted from the list keep\ntheir existing order after the listed ones (appended by their old order).","operationId":"reorder_cookbook_skills_api_cookbooks__cookbook_id__reorder_patch","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/install":{"post":{"tags":["cookbooks","cookbooks"],"summary":"Install Cookbook","description":"Idempotent: re-running returns the same payload. Disabled skills are skipped.","operationId":"install_cookbook_api_cookbooks__cookbook_id__install_post","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/manifest":{"get":{"tags":["cookbooks","cookbooks"],"summary":"Cookbook Manifest","description":"Return the install manifest for all skills in a cookbook.","operationId":"cookbook_manifest_api_cookbooks__cookbook_id__manifest_get","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/sync":{"get":{"tags":["cookbooks","cookbooks"],"summary":"Cookbook Sync","description":"Return skills updated since the given timestamp for sync.","operationId":"cookbook_sync_api_cookbooks__cookbook_id__sync_get","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/skills/{slug}/install":{"get":{"tags":["cookbooks","cookbooks"],"summary":"Install Single Skill From Cookbook","description":"Install ONE skill from a cookbook by slug.\n\nMirror of ``GET /api/skills/install`` but scoped under a cookbook so cbt_\nshare tokens (which can ONLY access /api/cookbooks/* paths — see\nmiddleware.py:389) have a documented single-skill install path.\n\nBehaviour:\n- 200 with {slug, version, tarball_url, checksum_sha256} on success\n- 404 if the skill is not in this cookbook (or doesn't exist)\n- 403 if the cbt_ token's scope is 'read' (install IS a write-flavoured\n  action even though it's GET — gated identically to POST /install)\n\nToken scope rules (enforced in _enforce_cbt_scope_for_cookbook_route):\n  read    → 403 SCOPE_INSUFFICIENT\n  install → ok\n  edit    → ok (superset of install)\n  master/user (owner) → ok","operationId":"install_single_skill_from_cookbook_api_cookbooks__cookbook_id__skills__slug__install_get","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}},{"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/cookbooks/{cookbook_id}/handoff":{"post":{"tags":["cookbooks","cookbooks"],"summary":"Handoff Cookbook","description":"Transfer or fork a cookbook to a new owner.\n\nOnly the current cookbook owner (or master) may call this endpoint.\nDelegates to the MCP tool implementation for a single source of truth.","operationId":"handoff_cookbook_api_cookbooks__cookbook_id__handoff_post","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandoffIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/feedback-config":{"get":{"tags":["cookbooks","cookbooks"],"summary":"Get Feedback Config","description":"J8 — read where this cookbook's feedback routes (for the inbox panel).\n\nNever returns the PAT — only repo + mode + whether a credential is bound.","operationId":"get_feedback_config_api_cookbooks__cookbook_id__feedback_config_get","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["cookbooks","cookbooks"],"summary":"Set Feedback Config","description":"J8 — bind (or clear) per-cookbook feedback routing from the cockpit.\n\nDelegates to the MCP tool for a single source of truth (tier gate, ownership,\nrepo validation, PAT verification + encryption all live there). Pro/Pro+ only.","operationId":"set_feedback_config_api_cookbooks__cookbook_id__feedback_config_patch","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackConfigIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/public/{slug}/.well-known/skills/index.json":{"get":{"tags":["cookbooks","well-known","cookbooks","well-known"],"summary":"Cookbook Wellknown Index","description":"agentskills.io discovery index for a public cookbook.\n\nPublic (no auth). 404 unless the cookbook is visibility='public'.","operationId":"cookbook_wellknown_index_api_cookbooks_public__slug___well_known_skills_index_json_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/cookbooks/public/{slug}/.well-known/skills/{skill_name}/SKILL.md":{"get":{"tags":["cookbooks","well-known","cookbooks","well-known"],"summary":"Cookbook Wellknown Skill Md","description":"Serve one skill's SKILL.md from a public cookbook bundle.\n\nPublic (no auth). FREE skill → real readme body. PAID skill → stub pointer\n(no paid IP crosses this surface). 404 if the skill is not in this cookbook.","operationId":"cookbook_wellknown_skill_md_api_cookbooks_public__slug___well_known_skills__skill_name__SKILL_md_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/graph/related":{"get":{"tags":["graph","graph"],"summary":"Graph Related","description":"Return edges of one type rooted at one skill.\n\nPublic — no API key required (the prefix is in PUBLIC_PREFIXES). Accepts\nany of the seven edge types in `EDGE_TYPES`. Defensive about missing\nupstream data: returns [] (200) rather than 500 when a derivation\ntable/column hasn't been provisioned yet.","operationId":"graph_related_api_graph_related_get","parameters":[{"name":"skill","in":"query","required":true,"schema":{"type":"string","description":"Source skill slug","title":"Skill"},"description":"Source skill slug"},{"name":"edge","in":"query","required":true,"schema":{"type":"string","description":"Edge type — one of ['arch_compatible_with', 'category_sibling', 'co_install', 'failed_after', 'related_skills', 'replaced_by', 'tag_overlap']","title":"Edge"},"description":"Edge type — one of ['arch_compatible_with', 'category_sibling', 'co_install', 'failed_after', 'related_skills', 'replaced_by', 'tag_overlap']"},{"name":"min_weight","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.0,"title":"Min Weight"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GraphEdge"},"title":"Response Graph Related Api Graph Related Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/graph/replacements":{"get":{"tags":["graph","graph"],"summary":"List Replacements","description":"Public list of curator-confirmed replacements (audit transparency).","operationId":"list_replacements_api_graph_replacements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ReplacementOut"},"type":"array","title":"Response List Replacements Api Graph Replacements Get"}}}}}},"post":{"tags":["graph","graph"],"summary":"Create Replacement","description":"Create a skill replacement record (master-only).","operationId":"create_replacement_api_graph_replacements_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplacementIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplacementOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbook-deploy/create":{"post":{"tags":["cookbook-deploy","cookbook-deploy"],"summary":"Create Deploy Cookbook","description":"Create a new white-label deployment cookbook for the authenticated Pro user.","operationId":"create_deploy_cookbook_api_cookbook_deploy_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployCookbookCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbook-deploy/list":{"get":{"tags":["cookbook-deploy","cookbook-deploy"],"summary":"List Deploy Cookbooks","description":"List all deployment cookbooks owned by the authenticated Pro user.","operationId":"list_deploy_cookbooks_api_cookbook_deploy_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/cookbook-deploy/{cookbook_id}/skills/add":{"post":{"tags":["cookbook-deploy","cookbook-deploy"],"summary":"Add Deployment","description":"Add a skill or fork as an ordered deployment in the specified cookbook.","operationId":"add_deployment_api_cookbook_deploy__cookbook_id__skills_add_post","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentAddRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbook-deploy/{cookbook_id}/skills/{skill_id}":{"delete":{"tags":["cookbook-deploy","cookbook-deploy"],"summary":"Remove Deployment","description":"Remove a skill/fork deployment from the specified cookbook.","operationId":"remove_deployment_api_cookbook_deploy__cookbook_id__skills__skill_id__delete","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}},{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbook-deploy/{cookbook_id}/apply":{"post":{"tags":["cookbook-deploy","cookbook-deploy"],"summary":"Apply Cookbook","description":"Kick off an atomic install across all cookbook deployments (ordered).\n\nReturns a synthesized job_id; an InstallEvent is written for each skill in\nthe cookbook with the cookbook annotation carried in `client_ip` (legacy\ncolumn) so dashboards can join apply-events back to the originating\ncookbook. The actual install work runs agent-side via the meta-skill\n`recipes apply` command; this endpoint records intent + returns the manifest.","operationId":"apply_cookbook_api_cookbook_deploy__cookbook_id__apply_post","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbook-deploy/{cookbook_id}/jobs/{job_id}":{"get":{"tags":["cookbook-deploy","cookbook-deploy"],"summary":"Cookbook Job Status","description":"Poll status for a cookbook-apply job.\n\nThin wrapper that always returns 'applying' — a real terminal state lands\nwhen the health-check-before-ready work ships. Returning a stable shape now\nmeans the dashboard apply-panel can be wired without a follow-up rev.","operationId":"cookbook_job_status_api_cookbook_deploy__cookbook_id__jobs__job_id__get","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}},{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbook-deploy/{slug}/preflight":{"post":{"tags":["cookbook-deploy","cookbook-deploy"],"summary":"Cookbook Preflight","description":"Pre-flight green-light check for `recipes apply cookbook://<slug>`.\n\nPublic so the meta-skill can call it without an OAuth round-trip; the body\ncarries the host fingerprint that drives compat checks. The endpoint only\nreads — no side effects — so making it unauthenticated is safe.","operationId":"cookbook_preflight_api_cookbook_deploy__slug__preflight_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbook-deploy/{slug}/manifest":{"get":{"tags":["cookbook-deploy","cookbook-deploy"],"summary":"Cookbook Deploy Manifest","description":"Public manifest — no auth, no secrets.\n\nReturns the cookbook plus the ordered list of deployments. Forks are\nemitted by id only since the source tarballs require an authenticated\ninstall against `/api/forks/{id}/install`.","operationId":"cookbook_deploy_manifest_api_cookbook_deploy__slug__manifest_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/heartbeat":{"post":{"tags":["heartbeat","fleet"],"summary":"Post Heartbeat","description":"Record a heartbeat ping from an installed agent.","operationId":"post_heartbeat_api_v1_heartbeat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeartbeatPayload"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fleet/weekly":{"get":{"tags":["heartbeat","fleet"],"summary":"Fleet Weekly","description":"Aggregate distinct devices per ISO week. NO drill-down — by design.\n\nSchema-level guarantee: this is the only public read path; no per-salt\nor per-customer query is exposed (and none can be added without modifying\nthe table itself, which would also need to add a PII column).","operationId":"fleet_weekly_api_v1_fleet_weekly_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/intent-survey":{"post":{"tags":["surveys","intent-survey"],"summary":"Submit Intent Survey","description":"Persist one anonymous survey response. Returns {ok, id}.","operationId":"submit_intent_survey_api_intent_survey_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntentSurveyIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/intent-survey/results":{"get":{"tags":["surveys","intent-survey"],"summary":"Intent Survey Results","description":"Aggregate counts grouped by q1 and q4. Email/free-text never returned.","operationId":"intent_survey_results_api_intent_survey_results_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/skill-error":{"post":{"tags":["skill-errors","skill-errors"],"summary":"Post Skill Error","description":"Submit a skill execution error report with optional PII redaction.","operationId":"post_skill_error_api_v1_skill_error_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillErrorIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/skill-error/health":{"get":{"tags":["skill-errors","skill-errors"],"summary":"Skill Error Health","description":"Health check for the error reporting subsystem.","operationId":"skill_error_health_api_v1_skill_error_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health/transparency":{"get":{"tags":["transparency","transparency"],"summary":"Transparency","description":"Public scorecard. Cached 60s, no auth.","operationId":"transparency_api_health_transparency_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Transparency Api Health Transparency Get"}}}}}}},"/api/v1/recipify-request":{"post":{"tags":["feedback","feedback-v1"],"summary":"Post Recipify Request","description":"Submit a recipify (skill creation) request.","operationId":"post_recipify_request_api_v1_recipify_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipifyRequestIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipifyRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback":{"post":{"tags":["feedback","feedback-v1"],"summary":"Post Feedback","description":"Submit a feedback entry for a skill or recipe.","operationId":"post_feedback_api_v1_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/skill-patch":{"post":{"tags":["skill-patches","skill-patch"],"summary":"Post Skill Patch","description":"Submit a working skill patch and open a draft PR on wisechef-ai/recipes-api.","operationId":"post_skill_patch_api_v1_skill_patch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillPatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Post Skill Patch Api V1 Skill Patch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/recall":{"post":{"tags":["recall","recall"],"summary":"Post Recall","description":"Perform a hybrid BM25 + vector skill recall and return ranked results.","operationId":"post_recall_api_recall_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecallIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecallOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/recipify":{"post":{"tags":["recipify","recipify"],"summary":"Recipify","description":"Validate and store a new SKILL.md draft as a CookbookSkill.","operationId":"recipify_api_recipify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipifyIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipifyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fleets":{"get":{"tags":["fleets","fleets"],"summary":"List Fleets","description":"GET /api/fleets — list the caller's fleets + subscriptions.\n\nMirrors recipes_fleet_list. The AppShell rail + /home + /fleets page all\nconsume this. An anonymous caller gets 401 (the page bounces to /signin).","operationId":"list_fleets_api_fleets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["fleets","fleets"],"summary":"Create Fleet","description":"POST /api/fleets — create a named fleet. Returns the plaintext fleet_key ONCE.","operationId":"create_fleet_api_fleets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetCreateIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fleets/{fleet_id}/subscribe":{"post":{"tags":["fleets","fleets"],"summary":"Subscribe Fleet","description":"POST /api/fleets/{id}/subscribe — subscribe a cookbook on a channel (idempotent).","operationId":"subscribe_fleet_api_fleets__fleet_id__subscribe_post","parameters":[{"name":"fleet_id","in":"path","required":true,"schema":{"type":"string","title":"Fleet Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fleets/{fleet_id}/sync":{"post":{"tags":["fleets","fleets"],"summary":"Sync Fleet Route","description":"POST /api/fleets/{id}/sync — sync every subscribed cookbook. dry_run previews.","operationId":"sync_fleet_route_api_fleets__fleet_id__sync_post","parameters":[{"name":"fleet_id","in":"path","required":true,"schema":{"type":"string","title":"Fleet Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/referral-code":{"get":{"tags":["referral","referrals"],"summary":"Get Referral Code","description":"Return the authenticated user's referral code.\n\nAuto-generates one on first access.","operationId":"get_referral_code_api_me_referral_code_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/me/referrals":{"get":{"tags":["referral","referrals"],"summary":"List Referrals","description":"List referred users and referral earnings for the authenticated user.","operationId":"list_referrals_api_me_referrals_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/marketing/counts":{"get":{"tags":["marketing","marketing"],"summary":"Marketing Counts","description":"Live catalog counts — drift-proof source for every public surface.\n\nReturns:\n    total: every non-archived public skill\n    free: tier='free'\n    pro: tier='pro' (display label \"Pro\")\n    pro_plus: tier='pro_plus' (display label \"Pro+\")\n    pro_plus_exclusive: skills only available on Pro+ (== pro_plus today\n        because the Pro tier still gates Pro+ as a strict superset; future\n        tier semantics may diverge)\n    last_added_at: ISO timestamp of the newest skill","operationId":"marketing_counts_api_marketing_counts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Marketing Counts Api Marketing Counts Get"}}}}}}},"/api/marketing/snapshot":{"get":{"tags":["marketing","marketing"],"summary":"Marketing Snapshot","description":"Full marketing SSOT — counts merged with config/recipes-marketing.yaml.\n\nPhase F of top1pct_1105: every public surface should read from this\nendpoint OR from the yaml at build time. The yaml is the static base;\ncounts are live-overlaid. Drift watchdog (recipes-publish-watchdog cron,\nevery 4h) verifies the yaml matches DB and surfaces.","operationId":"marketing_snapshot_api_marketing_snapshot_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Marketing Snapshot Api Marketing Snapshot Get"}}}}}}},"/api/cookbooks/{cookbook_id}/sync/sse":{"get":{"tags":["sse","live-sync"],"summary":"Cookbook Sync Sse","description":"Stream Server-Sent Events for real-time cookbook sync updates.","operationId":"cookbook_sync_sse_api_cookbooks__cookbook_id__sync_sse_get","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}},{"name":"Last-Event-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last-Event-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/share-tokens":{"post":{"tags":["share","share-tokens"],"summary":"Create Share Token","description":"Create a new share token. Plaintext token returned exactly once.","operationId":"create_share_token_api_cookbooks__cookbook_id__share_tokens_post","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareTokenCreateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["share","share-tokens"],"summary":"List Share Tokens","description":"List all share tokens for a cookbook (metadata only, no plaintext).","operationId":"list_share_tokens_api_cookbooks__cookbook_id__share_tokens_get","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/share-tokens/{token_id}/rotate":{"post":{"tags":["share","share-tokens"],"summary":"Rotate Share Token","description":"Deactivate old token and create a new one with the same name/scope.","operationId":"rotate_share_token_api_cookbooks__cookbook_id__share_tokens__token_id__rotate_post","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}},{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookbooks/{cookbook_id}/share-tokens/{token_id}":{"delete":{"tags":["share","share-tokens"],"summary":"Revoke Share Token","description":"Soft-delete a share token (sets is_active=False).","operationId":"revoke_share_token_api_cookbooks__cookbook_id__share_tokens__token_id__delete","parameters":[{"name":"cookbook_id","in":"path","required":true,"schema":{"type":"string","title":"Cookbook Id"}},{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp/healthz":{"get":{"tags":["mcp","mcp"],"summary":"Mcp Healthz","description":"Return MCP server health info including registered tool names.","operationId":"mcp_healthz_api_mcp_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mcp Healthz Api Mcp Healthz Get"}}}}}}},"/api/mcp/sse":{"get":{"tags":["mcp","mcp"],"summary":"Mcp Sse","description":"SSE transport endpoint. Long-lived connection — client posts to\n``/api/mcp/messages/`` for actual JSON-RPC traffic.","operationId":"mcp_sse_api_mcp_sse_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mcp/messages/":{"post":{"tags":["mcp","mcp"],"summary":"Mcp Messages","description":"POST endpoint paired with the SSE channel. Auth re-checked here so\na stale session-id from another caller can't piggyback.","operationId":"mcp_messages_api_mcp_messages__post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/internal/feedback/{row_id}/issue-url":{"patch":{"tags":["internal"],"summary":"Patch Issue Url","description":"Update issue_url and set feedback_status='filed' on the matching row.\n\nCalled by the GitHub Actions workflow after it creates the GitHub issue\nand knows the real issue URL. Gated by X-Internal-Token header.","operationId":"patch_issue_url_api_internal_feedback__row_id__issue_url_patch","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Row Id"}},{"name":"x-internal-token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Internal-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueUrlPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patch Issue Url Api Internal Feedback  Row Id  Issue Url Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feedback/{row_id}":{"get":{"tags":["feedback-status"],"summary":"Get Feedback Status","description":"Return the current status and issue_url for a feedback or recipify-request row.\n\nLooks up the row_id in both feedback_submissions and recipify_requests tables.\nReturns 404 if the row is not found in either table.","operationId":"get_feedback_status_api_feedback__row_id__get","parameters":[{"name":"row_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Row Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackStatusOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/credits":{"get":{"tags":["credits","credits"],"summary":"List My Credits","description":"Return the authenticated user's subscriber credits, newest first.\n\nAuthentication: JWT cookie or Authorization: Bearer <token>.\nReturns 401 if the caller is not authenticated.","operationId":"list_my_credits_api_me_credits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CreditOut"},"type":"array","title":"Response List My Credits Api Me Credits Get"}}}}}}},"/":{"get":{"tags":["meta"],"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"APILibraryOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","slug","title","created_at","updated_at"],"title":"APILibraryOut"},"ArchiveResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"archived":{"type":"boolean","title":"Archived"}},"type":"object","required":["slug","archived"],"title":"ArchiveResponse"},"Body_publish_skill_api_skills__publish_post":{"properties":{"skill_toml":{"type":"string","contentMediaType":"application/octet-stream","title":"Skill Toml","description":"skill.toml manifest file"},"tarball":{"type":"string","contentMediaType":"application/octet-stream","title":"Tarball","description":"Skill tarball (.tar.gz)"},"signature":{"type":"string","contentMediaType":"application/octet-stream","title":"Signature","description":"ed25519 signature over sha256(tarball)"},"signing_pubkey":{"type":"string","contentMediaType":"application/octet-stream","title":"Signing Pubkey","description":"ed25519 public key (raw 32 bytes or DER)"},"is_public":{"type":"boolean","title":"Is Public","description":"Publish as public skill (default: private)","default":false},"changelog":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changelog","description":"Optional changelog for this version"}},"type":"object","required":["skill_toml","tarball","signature","signing_pubkey"],"title":"Body_publish_skill_api_skills__publish_post"},"Body_upload_fork_version_api_forks__fork_id__version_post":{"properties":{"tarball":{"type":"string","contentMediaType":"application/octet-stream","title":"Tarball"},"semver":{"type":"string","title":"Semver"},"changelog":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changelog"}},"type":"object","required":["tarball","semver"],"title":"Body_upload_fork_version_api_forks__fork_id__version_post"},"BootcampListResponse":{"properties":{"version":{"type":"integer","title":"Version"},"tracks":{"items":{"$ref":"#/components/schemas/BootcampTrackSummary"},"type":"array","title":"Tracks"}},"type":"object","required":["version","tracks"],"title":"BootcampListResponse"},"BootcampStep":{"properties":{"position":{"type":"integer","title":"Position"},"slug":{"type":"string","title":"Slug"},"why":{"type":"string","title":"Why"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"is_free":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Free"},"available":{"type":"boolean","title":"Available","default":true},"install_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Install Link"}},"type":"object","required":["position","slug","why"],"title":"BootcampStep"},"BootcampTrack":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"subtitle":{"type":"string","title":"Subtitle"},"audience":{"type":"string","title":"Audience"},"outcome":{"type":"string","title":"Outcome"},"steps":{"items":{"$ref":"#/components/schemas/BootcampStep"},"type":"array","title":"Steps"}},"type":"object","required":["id","title","subtitle","audience","outcome","steps"],"title":"BootcampTrack"},"BootcampTrackSummary":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"subtitle":{"type":"string","title":"Subtitle"},"audience":{"type":"string","title":"Audience"},"outcome":{"type":"string","title":"Outcome"},"step_count":{"type":"integer","title":"Step Count"},"free_steps":{"type":"integer","title":"Free Steps"},"paid_steps":{"type":"integer","title":"Paid Steps"}},"type":"object","required":["id","title","subtitle","audience","outcome","step_count","free_steps","paid_steps"],"title":"BootcampTrackSummary"},"CarouselEntryItem":{"properties":{"slot":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Slot"},"skill":{"$ref":"#/components/schemas/SkillBrief"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"}},"type":"object","required":["skill"],"title":"CarouselEntryItem"},"CarouselResponse":{"properties":{"date":{"type":"string","title":"Date"},"entries":{"items":{"$ref":"#/components/schemas/CarouselEntryItem"},"type":"array","title":"Entries"}},"type":"object","required":["date","entries"],"title":"CarouselResponse"},"CookbookCreateIn":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name"],"title":"CookbookCreateIn"},"CreatorProfile":{"properties":{"id":{"type":"string","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"stripe_connected":{"type":"boolean","title":"Stripe Connected","default":false},"is_creator":{"type":"boolean","title":"Is Creator","default":false},"is_founder":{"type":"boolean","title":"Is Founder","default":false},"creator_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Slug"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},"type":"object","required":["id","display_name"],"title":"CreatorProfile"},"CreditOut":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"amount_pct":{"type":"integer","title":"Amount Pct"},"granted_at":{"type":"string","title":"Granted At"},"expires_at":{"type":"string","title":"Expires At"},"used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Used At"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","type","amount_pct","granted_at","expires_at","used_at","status"],"title":"CreditOut"},"DemoCTAOut":{"properties":{"headline":{"type":"string","title":"Headline"},"subheadline":{"type":"string","title":"Subheadline"},"cta_text":{"type":"string","title":"Cta Text"},"cta_url":{"type":"string","title":"Cta Url"},"social_proof":{"items":{"type":"string"},"type":"array","title":"Social Proof"},"tier_from":{"type":"string","title":"Tier From"}},"type":"object","required":["headline","subheadline","cta_text","cta_url","social_proof","tier_from"],"title":"DemoCTAOut","description":"Response for GET /api/wisechef/demo-cta."},"DemoRequestIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"company_size":{"anyOf":[{"type":"string","pattern":"^\\d+-\\d+$|^\\d+\\+$"},{"type":"null"}],"title":"Company Size"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["email"],"title":"DemoRequestIn","description":"POST body for demo request."},"DemoRequestOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"company_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Size"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","status","created_at"],"title":"DemoRequestOut"},"DeployCookbookCreateRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"visibility":{"type":"string","title":"Visibility","default":"private"},"pin_mode":{"type":"string","title":"Pin Mode","default":"latest-stable"}},"type":"object","required":["name"],"title":"DeployCookbookCreateRequest"},"DeploymentAddRequest":{"properties":{"skill_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Id"},"fork_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fork Id"},"version_pin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Pin"},"install_order":{"type":"integer","title":"Install Order","default":100}},"type":"object","title":"DeploymentAddRequest"},"EarningsResponse":{"properties":{"total_installs":{"type":"integer","title":"Total Installs"},"total_gross_cents":{"type":"integer","title":"Total Gross Cents"},"total_earned_cents":{"type":"integer","title":"Total Earned Cents"},"total_payouts":{"type":"integer","title":"Total Payouts"},"pending_cents":{"type":"integer","title":"Pending Cents"},"paid_cents":{"type":"integer","title":"Paid Cents"},"this_month_installs":{"type":"integer","title":"This Month Installs"}},"type":"object","required":["total_installs","total_gross_cents","total_earned_cents","total_payouts","pending_cents","paid_cents","this_month_installs"],"title":"EarningsResponse"},"FeedbackConfigIn":{"properties":{"repo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repo"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode","default":"pat"},"pat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pat"}},"type":"object","title":"FeedbackConfigIn","description":"PATCH body for cookbook feedback routing (J8 cockpit binding UI)."},"FeedbackIn":{"properties":{"category":{"type":"string","enum":["ux","search","billing","docs","install","other"],"title":"Category"},"message":{"type":"string","maxLength":4096,"minLength":1,"title":"Message"},"context":{"additionalProperties":true,"type":"object","title":"Context"},"agent_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Agent Id"},"force":{"type":"boolean","title":"Force","default":false},"confirmation":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Confirmation"}},"type":"object","required":["category","message"],"title":"FeedbackIn"},"FeedbackOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"id":{"type":"string","title":"Id"},"issue_url":{"type":"string","title":"Issue Url"},"deduped":{"type":"boolean","title":"Deduped","default":false},"last_submissions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Last Submissions"},"retry_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Retry At"},"force_available":{"type":"boolean","title":"Force Available","default":false}},"type":"object","required":["ok","id","issue_url"],"title":"FeedbackOut"},"FeedbackStatusOut":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"issue_url":{"type":"string","title":"Issue Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","status","issue_url","created_at"],"title":"FeedbackStatusOut"},"FileEntry":{"properties":{"path":{"type":"string","title":"Path"},"content":{"type":"string","title":"Content"}},"type":"object","required":["path","content"],"title":"FileEntry"},"FleetCreateIn":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"FleetCreateIn"},"ForkCreateIn":{"properties":{"source_slug":{"type":"string","title":"Source Slug"},"name":{"type":"string","title":"Name"},"readme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readme"}},"type":"object","required":["source_slug","name"],"title":"ForkCreateIn"},"GraphEdge":{"properties":{"skill_slug":{"type":"string","title":"Skill Slug"},"edge_type":{"type":"string","title":"Edge Type"},"weight":{"type":"number","title":"Weight"},"evidence_count":{"type":"integer","title":"Evidence Count"}},"type":"object","required":["skill_slug","edge_type","weight","evidence_count"],"title":"GraphEdge"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HandoffIn":{"properties":{"new_owner_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Owner User Id"},"new_owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Owner Email"},"mode":{"type":"string","title":"Mode","default":"transfer"}},"type":"object","title":"HandoffIn","description":"Request body for POST /api/cookbooks/{id}/handoff."},"HeartbeatPayload":{"properties":{"salt":{"type":"string","maxLength":64,"minLength":16,"pattern":"^[a-f0-9]+$","title":"Salt"},"last_seen_day":{"type":"string","format":"date","title":"Last Seen Day"}},"additionalProperties":false,"type":"object","required":["salt","last_seen_day"],"title":"HeartbeatPayload","description":"Strict 2-field schema — extra fields are rejected (HTTP 422)."},"IncidentIn":{"properties":{"skill_id":{"type":"string","format":"uuid","title":"Skill Id"},"error_signature":{"type":"string","maxLength":128,"minLength":8,"title":"Error Signature"},"env_fingerprint":{"additionalProperties":true,"type":"object","title":"Env Fingerprint"},"agent_fp_anon":{"type":"string","maxLength":128,"minLength":8,"title":"Agent Fp Anon"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"command":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Command"},"exit_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exit Code"},"stack_trace_top":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Stack Trace Top"}},"type":"object","required":["skill_id","error_signature","env_fingerprint","agent_fp_anon","occurred_at"],"title":"IncidentIn"},"IncidentOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"accepted":{"type":"boolean","title":"Accepted","default":true}},"type":"object","required":["id"],"title":"IncidentOut"},"InstallResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"version":{"type":"string","title":"Version"},"tarball_url":{"type":"string","title":"Tarball Url"},"checksum_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum Sha256"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"manifest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Manifest"},"provenance_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance Id"}},"type":"object","required":["slug","version","tarball_url"],"title":"InstallResponse"},"IntentSurveyIn":{"properties":{"q1":{"type":"string","enum":["yes","maybe","no"],"title":"Q1","description":"Would you pay €100/mo for Pro+?"},"q2":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Q2"},"q3":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Q3"},"q4":{"type":"string","enum":["agency","solo","dev","curious"],"title":"Q4","description":"Which best describes you?"},"q5":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Q5"}},"type":"object","required":["q1","q4"],"title":"IntentSurveyIn"},"IssueUrlPatch":{"properties":{"issue_url":{"type":"string","title":"Issue Url"},"table":{"type":"string","enum":["feedback","recipify"],"title":"Table"}},"type":"object","required":["issue_url","table"],"title":"IssueUrlPatch"},"LocalSkillIn":{"properties":{"slug":{"type":"string","title":"Slug"},"pinned_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinned Version"},"sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sha256"}},"type":"object","required":["slug"],"title":"LocalSkillIn"},"PayoutHistoryItem":{"properties":{"id":{"type":"string","title":"Id"},"period_start":{"type":"string","format":"date-time","title":"Period Start"},"period_end":{"type":"string","format":"date-time","title":"Period End"},"installs_count":{"type":"integer","title":"Installs Count"},"gross_revenue_cents":{"type":"integer","title":"Gross Revenue Cents"},"creator_share_cents":{"type":"integer","title":"Creator Share Cents"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","title":"Status"},"stripe_transfer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Transfer Id"},"paid_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paid At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","period_start","period_end","installs_count","gross_revenue_cents","creator_share_cents","currency","status","created_at"],"title":"PayoutHistoryItem"},"PayoutRunResponse":{"properties":{"payouts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Payouts"},"total_count":{"type":"integer","title":"Total Count"},"total_cents":{"type":"integer","title":"Total Cents"}},"type":"object","required":["payouts","total_count","total_cents"],"title":"PayoutRunResponse"},"PublishResponse":{"properties":{"skill_id":{"type":"string","title":"Skill Id"},"version":{"type":"string","title":"Version"},"tarball_path":{"type":"string","title":"Tarball Path"},"sha256":{"type":"string","title":"Sha256"},"warnings":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Warnings","default":[]}},"type":"object","required":["skill_id","version","tarball_path","sha256"],"title":"PublishResponse"},"PulseOut":{"properties":{"paying_operators":{"type":"integer","title":"Paying Operators"},"real_cash_mrr_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Real Cash Mrr Usd"},"comped_subscriptions":{"type":"integer","title":"Comped Subscriptions"},"mrr_source":{"type":"string","title":"Mrr Source"},"active_subscriptions":{"type":"integer","title":"Active Subscriptions"},"by_tier":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Tier"},"list_mrr_ceiling_usd":{"type":"integer","title":"List Mrr Ceiling Usd"},"free_sync_used_total":{"type":"integer","title":"Free Sync Used Total"},"free_sync_used_7d":{"type":"integer","title":"Free Sync Used 7D"},"fleets_total":{"type":"integer","title":"Fleets Total"},"fleet_subscriptions_total":{"type":"integer","title":"Fleet Subscriptions Total"},"fleet_subscriptions_7d":{"type":"integer","title":"Fleet Subscriptions 7D"},"generated_at":{"type":"string","title":"Generated At"}},"type":"object","required":["paying_operators","real_cash_mrr_usd","comped_subscriptions","mrr_source","active_subscriptions","by_tier","list_mrr_ceiling_usd","free_sync_used_total","free_sync_used_7d","fleets_total","fleet_subscriptions_total","fleet_subscriptions_7d","generated_at"],"title":"PulseOut","description":"The 'one number' demand scoreboard for the khaserto GTM loop.\n\nDistinct from GET /api/stats (supply-side vanity: skill + install counts).\nThis is DEMAND-side truth. The headline number is REAL CASH MRR — what\nStripe actually bills, net of promo-code discounts — not list-price ×\nsubscriber count. A 100%-off-coupon \"customer\" pays $0 and counts as $0.\nMaster-key only."},"RecallHit":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"score":{"type":"number","title":"Score"},"why_matched":{"type":"string","title":"Why Matched"},"install_status":{"type":"string","enum":["already_in_cookbook","available","tier_locked"],"title":"Install Status"}},"type":"object","required":["slug","title","score","why_matched","install_status"],"title":"RecallHit"},"RecallIn":{"properties":{"query":{"type":"string","title":"Query"},"local_context_summary":{"type":"string","title":"Local Context Summary","default":""},"tier_filter":{"items":{"type":"string","enum":["free","pro","pro_plus","cook","operator"]},"type":"array","title":"Tier Filter"},"limit":{"type":"integer","title":"Limit","default":10}},"type":"object","required":["query"],"title":"RecallIn"},"RecallOut":{"properties":{"hits":{"items":{"$ref":"#/components/schemas/RecallHit"},"type":"array","title":"Hits"},"used_fallback":{"type":"boolean","title":"Used Fallback"},"backend":{"type":"string","title":"Backend"}},"type":"object","required":["hits","used_fallback","backend"],"title":"RecallOut"},"RecipeOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"creator_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","slug","title","created_at","updated_at"],"title":"RecipeOut"},"RecipifyIn":{"properties":{"slug":{"type":"string","title":"Slug"},"content":{"type":"string","title":"Content"},"target_cookbook_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Target Cookbook Id"},"visibility":{"type":"string","enum":["private","public_pending_review"],"title":"Visibility","default":"private"},"target_subrecipe_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Target Subrecipe Id"}},"type":"object","required":["slug","content"],"title":"RecipifyIn"},"RecipifyOut":{"properties":{"slug":{"type":"string","title":"Slug"},"cookbook_id":{"type":"string","format":"uuid","title":"Cookbook Id"},"category":{"type":"string","title":"Category"},"related_skills":{"items":{"type":"string"},"type":"array","title":"Related Skills"},"status":{"type":"string","enum":["created","updated"],"title":"Status"}},"type":"object","required":["slug","cookbook_id","category","related_skills","status"],"title":"RecipifyOut"},"RecipifyRequestIn":{"properties":{"target_name":{"type":"string","maxLength":128,"minLength":1,"title":"Target Name"},"why_useful":{"type":"string","maxLength":2048,"minLength":1,"title":"Why Useful"},"suggested_sources":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Suggested Sources"},"agent_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Agent Id"}},"type":"object","required":["target_name","why_useful"],"title":"RecipifyRequestIn"},"RecipifyRequestOut":{"properties":{"ok":{"type":"boolean","title":"Ok"},"id":{"type":"string","title":"Id"},"issue_url":{"type":"string","title":"Issue Url"},"deduped":{"type":"boolean","title":"Deduped","default":false},"retry_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Retry At"}},"type":"object","required":["ok","id","issue_url"],"title":"RecipifyRequestOut"},"ReconcileIn":{"properties":{"local":{"items":{"$ref":"#/components/schemas/LocalSkillIn"},"type":"array","title":"Local","default":[]},"prune":{"type":"boolean","title":"Prune","default":false},"dry_run":{"type":"boolean","title":"Dry Run","default":true}},"type":"object","title":"ReconcileIn"},"ReconcileReportIn":{"properties":{"slug":{"type":"string","title":"Slug"},"semver":{"type":"string","title":"Semver"},"outcome":{"type":"string","title":"Outcome"},"channel":{"type":"string","title":"Channel","default":"canary"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason"}},"type":"object","required":["slug","semver","outcome"],"title":"ReconcileReportIn","description":"One canary apply-outcome report for a single skill version."},"ReindexAllResponse":{"properties":{"reindexed":{"type":"integer","title":"Reindexed"}},"type":"object","required":["reindexed"],"title":"ReindexAllResponse"},"ReorderIn":{"properties":{"order":{"items":{"type":"string"},"type":"array","title":"Order"}},"type":"object","required":["order"],"title":"ReorderIn","description":"PATCH body for Composer reorder — ordered list of skill slugs."},"ReplacementIn":{"properties":{"source_slug":{"type":"string","title":"Source Slug","description":"Slug being replaced"},"target_slug":{"type":"string","title":"Target Slug","description":"Slug doing the replacing"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Curator note for audit log"}},"type":"object","required":["source_slug","target_slug"],"title":"ReplacementIn"},"ReplacementOut":{"properties":{"source_slug":{"type":"string","title":"Source Slug"},"target_slug":{"type":"string","title":"Target Slug"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["source_slug","target_slug","reason","created_by","created_at"],"title":"ReplacementOut"},"SandboxRunRequest":{"properties":{"entrypoint":{"type":"string","title":"Entrypoint","description":"Script to execute inside sandbox","default":"setup.sh"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","description":"Specific version (default: latest)"},"env":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Env","description":"Extra env vars for sandbox"}},"type":"object","title":"SandboxRunRequest","description":"Request body for POST /api/skills/{slug}/sandbox/run."},"SandboxRunResponse":{"properties":{"sandbox_id":{"type":"string","title":"Sandbox Id"},"exit_code":{"type":"integer","title":"Exit Code"},"stdout":{"type":"string","title":"Stdout"},"stderr":{"type":"string","title":"Stderr"},"timed_out":{"type":"boolean","title":"Timed Out"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"success":{"type":"boolean","title":"Success"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["sandbox_id","exit_code","stdout","stderr","timed_out","duration_seconds","success"],"title":"SandboxRunResponse","description":"Response for sandbox execution."},"SandboxStatusResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"sandbox_supported":{"type":"boolean","title":"Sandbox Supported"},"profile":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Profile"},"validation_warnings":{"items":{"type":"string"},"type":"array","title":"Validation Warnings"}},"type":"object","required":["slug","sandbox_supported"],"title":"SandboxStatusResponse","description":"Response for sandbox status check."},"ShareTokenCreateIn":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope","default":"install"}},"type":"object","title":"ShareTokenCreateIn"},"SkillAccessOut":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"has_access":{"type":"boolean","title":"Has Access"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"user_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"},"fork_eligible":{"type":"boolean","title":"Fork Eligible","default":false},"cookbook_deploy_eligible":{"type":"boolean","title":"Cookbook Deploy Eligible","default":false},"bucket_eligible":{"type":"boolean","title":"Bucket Eligible","default":false},"latest_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Version"},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License"}},"type":"object","required":["slug","title","has_access"],"title":"SkillAccessOut","description":"Response for GET /api/skills/access — shows if caller can use a skill.\n\nTier semantics (canonical slugs as of Phase 5):\n  Pro       — access to all skills currently in the marketplace\n  Pro+      — Pro + fork capability (fork_eligible=True) + bucket capability\n\nSkills carry a `tier` (pro | pro_plus | None=free). A caller\nhas access when their subscription tier rank ≥ the skill's tier rank.\nThe optional `fork_eligible` request param requires Pro+ on top of\nskill-tier access."},"SkillAddIn":{"properties":{"slug":{"type":"string","title":"Slug"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","default":"custom-added"},"external_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Source"}},"type":"object","required":["slug"],"title":"SkillAddIn"},"SkillBrief":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"is_free":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Free"},"vertical":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vertical"}},"type":"object","required":["slug","title"],"title":"SkillBrief"},"SkillDetailOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"is_public":{"type":"boolean","title":"Is Public","default":true},"creator_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Name"},"creator_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Handle"},"creator_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Url"},"latest_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Version"},"install_count_total":{"type":"integer","title":"Install Count Total","default":0},"install_count_7d":{"type":"integer","title":"Install Count 7D","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_verified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Verified"},"quality_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quality Score"},"readme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Readme"},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License"},"versions":{"items":{"$ref":"#/components/schemas/VersionOut"},"type":"array","title":"Versions","default":[]},"related":{"items":{"$ref":"#/components/schemas/SkillOut"},"type":"array","title":"Related","default":[]},"skill_variant":{"type":"string","title":"Skill Variant","default":"custom"},"original_source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Source Url"},"parent_skill_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Skill Slug"},"pinned_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinned Sha"},"upstream_status":{"type":"string","title":"Upstream Status","default":"active"},"external_resources":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"External Resources"},"unhappy_paths_count":{"type":"integer","title":"Unhappy Paths Count","default":0}},"type":"object","required":["id","slug","title","created_at","updated_at"],"title":"SkillDetailOut"},"SkillErrorIn":{"properties":{"skill_slug":{"type":"string","maxLength":128,"minLength":1,"title":"Skill Slug"},"error_signature":{"type":"string","maxLength":128,"minLength":8,"title":"Error Signature"},"env_fingerprint":{"additionalProperties":true,"type":"object","title":"Env Fingerprint","default":{}},"agent_fp_anon":{"type":"string","maxLength":128,"minLength":8,"title":"Agent Fp Anon"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"command":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Command"},"exit_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exit Code"},"stack_trace_top":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Stack Trace Top"}},"type":"object","required":["skill_slug","error_signature","agent_fp_anon"],"title":"SkillErrorIn","description":"Payload for skill error reports. Uses skill_slug for CLI convenience."},"SkillErrorOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"accepted":{"type":"boolean","title":"Accepted","default":true},"anonymized":{"type":"boolean","title":"Anonymized","default":true}},"type":"object","required":["id"],"title":"SkillErrorOut"},"SkillOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"is_public":{"type":"boolean","title":"Is Public","default":true},"creator_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Name"},"creator_handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Handle"},"creator_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Url"},"latest_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Version"},"install_count_total":{"type":"integer","title":"Install Count Total","default":0},"install_count_7d":{"type":"integer","title":"Install Count 7D","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_verified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Verified"},"quality_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quality Score"}},"type":"object","required":["id","slug","title","created_at","updated_at"],"title":"SkillOut"},"SkillPatchRequest":{"properties":{"slug":{"type":"string","maxLength":128,"minLength":1,"title":"Slug"},"base_version":{"type":"string","maxLength":64,"minLength":1,"title":"Base Version"},"files":{"items":{"$ref":"#/components/schemas/FileEntry"},"type":"array","title":"Files"},"rationale":{"type":"string","maxLength":2000,"minLength":1,"title":"Rationale"},"evidence_install_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Evidence Install Id"},"agent_id_anon":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Agent Id Anon"}},"type":"object","required":["slug","base_version","files","rationale"],"title":"SkillPatchRequest"},"SkillPinIn":{"properties":{"pinned_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinned Version"}},"type":"object","title":"SkillPinIn","description":"PATCH body for a cookbook skill's version pin (L5, curated-only)."},"SkillSearchResult":{"properties":{"results":{"items":{"$ref":"#/components/schemas/SkillOut"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"backend":{"type":"string","title":"Backend","default":"keyword"},"hybrid_augmented":{"type":"boolean","title":"Hybrid Augmented","default":false},"window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window"}},"type":"object","required":["results","total","page","page_size"],"title":"SkillSearchResult"},"SubscribeIn":{"properties":{"cookbook_id":{"type":"string","title":"Cookbook Id"},"channel":{"type":"string","title":"Channel","default":"stable"}},"type":"object","required":["cookbook_id"],"title":"SubscribeIn"},"SyncIn":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"type":"object","title":"SyncIn"},"TelemetryEventOut":{"properties":{"status":{"type":"string","title":"Status"},"event_id":{"type":"string","title":"Event Id"}},"type":"object","required":["status","event_id"],"title":"TelemetryEventOut","description":"Response for POST /api/telemetry."},"TelemetryIn":{"properties":{"event_type":{"type":"string","maxLength":128,"title":"Event Type"},"skill_slug":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Skill Slug"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"},"goal_class":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Goal Class"},"duration_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Seconds"},"retry_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry Count"},"user_intervention":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"User Intervention"},"agent_class_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Class Hash"}},"type":"object","required":["event_type"],"title":"TelemetryIn","description":"Accepts both legacy (payload text) and typed telemetry payloads.\n\nTyped fields (all optional):\n  goal_class        — open enum, stored as-is\n  duration_seconds  — 0..86400\n  retry_count       — non-negative integer\n  user_intervention — boolean\n  agent_class_hash  — ^[a-f0-9]{8,64}$\n\nLegacy field (optional):\n  payload           — free-form dict; stored as JSON text in payload column"},"TokenExchangeRequest":{"properties":{"code":{"type":"string","title":"Code"},"state":{"type":"string","title":"State"}},"type":"object","required":["code","state"],"title":"TokenExchangeRequest"},"UpdatePublishRequestStatusIn":{"properties":{"status":{"type":"string","enum":["approved","rejected"],"title":"Status"},"reviewed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewed By"},"reject_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reject Reason"}},"type":"object","required":["status"],"title":"UpdatePublishRequestStatusIn"},"UpdatePublishRequestStatusOut":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"reviewed_at":{"type":"string","title":"Reviewed At"},"credit_granted":{"type":"boolean","title":"Credit Granted"}},"type":"object","required":["id","status","reviewed_at","credit_granted"],"title":"UpdatePublishRequestStatusOut"},"VATCalculateRequest":{"properties":{"amount_cents":{"type":"integer","title":"Amount Cents"},"country_code":{"type":"string","title":"Country Code"},"is_b2b":{"type":"boolean","title":"Is B2B","default":false},"vat_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Number"}},"type":"object","required":["amount_cents","country_code"],"title":"VATCalculateRequest"},"VATCalculateResponse":{"properties":{"country_code":{"type":"string","title":"Country Code"},"is_eu":{"type":"boolean","title":"Is Eu"},"is_b2b":{"type":"boolean","title":"Is B2B"},"vat_rate":{"type":"number","title":"Vat Rate"},"vat_cents":{"type":"integer","title":"Vat Cents"},"gross_cents":{"type":"integer","title":"Gross Cents"},"net_cents":{"type":"integer","title":"Net Cents"},"reverse_charge":{"type":"boolean","title":"Reverse Charge"},"vat_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Number"}},"type":"object","required":["country_code","is_eu","is_b2b","vat_rate","vat_cents","gross_cents","net_cents","reverse_charge"],"title":"VATCalculateResponse"},"VATMOSSReportResponse":{"properties":{"report":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Report"},"total_vat_cents":{"type":"integer","title":"Total Vat Cents"}},"type":"object","required":["report","total_vat_cents"],"title":"VATMOSSReportResponse"},"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"},"VersionOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"semver":{"type":"string","title":"Semver"},"changelog":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changelog"},"tarball_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tarball Size Bytes"},"checksum_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum Sha256"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","semver","created_at"],"title":"VersionOut"},"VisibilityIn":{"properties":{"visibility":{"type":"string","title":"Visibility"}},"type":"object","required":["visibility"],"title":"VisibilityIn","description":"PATCH body for cookbook visibility (Composer inline toggle, L3)."}}}}