{"openapi":"3.1.0","info":{"title":"Scholar Feed API","description":"Public developer API for Scholar Feed — academic paper search, citation graph, and LLM analysis over 600,000+ CS/AI/ML papers.","version":"1.0.0"},"paths":{"/health/freshness":{"get":{"tags":["Health"],"summary":"Freshness Check","description":"Comprehensive pipeline freshness watchdog (checks defined in api/freshness_slos.py).\n\nOutput-level SLOs across ingest, nightly enrichment, and serving caches, plus\nliveness (each lane logged a recent success in pipeline_runs). Returns 200 when\nall green, 503 when any check is breached.\n\nHeavier than /health/cache (some checks scan papers) — intended for the daily\npipeline_health.py job and ad-hoc inspection, not high-frequency uptime pings.\nPoint UptimeRobot at /health/cache; this is the full board. Cached 60s in-process.","operationId":"freshness_check_health_freshness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/health":{"get":{"tags":["v1"],"summary":"V1 Public Health","description":"Connection check endpoint — verify API key and return plan/usage info.\n\nReturns status, subscription plan, key name, and quota usage.\n\nTHE HEADLINE NUMBERS ARE MONTHLY (monthly_limit / usage_this_month) — that is the\nmeter (mig 173) and the number the pricing page sells. daily_limit / usage_today\nare still reported but are only the in-memory burst guardrail; they are per-dyno\nand approximate, so never present them as the quota. An agent reading this to\ndecide whether it can afford a batch must read the monthly pair.\n\nAnonymous requests return plan \"anonymous\" with the anonymous monthly allowance.\nRate limit: 60/minute.","operationId":"v1_public_health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Public Health V1 Health Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/papers/search":{"get":{"tags":["v1"],"summary":"V1 Search Papers","description":"Search papers by keyword or semantic similarity with optional filters.\n\nv3 extended params (TOOL-03):\n- anchor_paper_id: similar-papers mode (absorbs find_similar). Results ordered by\n  similarity_score DESC using precomputed related_papers neighbors. q is ignored.\n- scope_to_citations_of: citation-scoped search (absorbs find_citations_about).\n  Takes the citation neighborhood of the given paper, embeds q, ranks by cosine\n  similarity. Results carry similarity_score.\n- sort: relevance↔impact dial + ordering knob. 'relevance' (default), 'balanced'\n  (relevant + well-cited), 'impactful' (proven citations among the relevant) rerank\n  the semantic pool by pool-relative log-citations; 'trending' = impact_pct DESC\n  (rising/forecast, ~90d), 'recent' = published_date DESC. In keyword mode the dial\n  degrades: 'impactful' = citation_count DESC, 'balanced' = rank_score (default).\n\nParam precedence: anchor_paper_id > scope_to_citations_of > sort.\nsort= is silently ignored when anchor_paper_id or scope_to_citations_of is set.\n\nQuery-less browse: sort=trending/recent/impactful may be called with NO q (the\ntopic-free \"what's rising right now\" feed). Those three order by an indexed\ncolumn, so the planner early-stops at LIMIT. Capped to the first 200 results and\nreturns total=null (an unfiltered COUNT(*) scans the whole corpus). sort=community\nis excluded on purpose: its NULLS LAST ordering has no usable index and degrades\nto a full seq scan. Every other q-less request still 422s.\n\nModes (keyword/semantic):\n- keyword (default): PostgreSQL full-text search. Fast, exact matches.\n- semantic: Gemini embedding similarity. Finds conceptually related papers\n  even without exact keyword matches. Slower (requires Gemini API call).\n\nAll structured filters (category, novelty_min, days) work with both keyword\nand semantic modes. Filters are not applied in anchor mode.\n\nRate limit: 30/minute per API key (or IP for JWT users).","operationId":"v1_search_papers_v1_papers_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"Search query. Optional when anchor_paper_id is set (ignored in anchor mode), and when sort is one of trending/recent/impactful (query-less 'browse the frontier' feed, capped to the first 200 results and served on the keyword path). Required otherwise.","title":"Q"},"description":"Search query. Optional when anchor_paper_id is set (ignored in anchor mode), and when sort is one of trending/recent/impactful (query-less 'browse the frontier' feed, capped to the first 200 results and served on the keyword path). Required otherwise."},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category code e.g. 'cs.AI'","title":"Category"},"description":"Filter by category code e.g. 'cs.AI'"},{"name":"novelty_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"description":"Minimum llm_novelty_score","title":"Novelty Min"},"description":"Minimum llm_novelty_score"},{"name":"impact_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":0},{"type":"null"}],"description":"Minimum impact_pct (0-100): the ML forecaster's per-category percentile of predicted 12-month impact. e.g. 80 = top 20%. Unscored papers (NULL impact_pct) are excluded.","title":"Impact Min"},"description":"Minimum impact_pct (0-100): the ML forecaster's per-category percentile of predicted 12-month impact. e.g. 80 = top 20%. Unscored papers (NULL impact_pct) are excluded."},{"name":"has_code","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Factual filter: when true, restrict to papers with a known code release (has_code = TRUE).","title":"Has Code"},"description":"Factual filter: when true, restrict to papers with a known code release (has_code = TRUE)."},{"name":"min_citations","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Factual filter: minimum citation_count (NULLs treated as 0, so unscored papers are excluded by any positive threshold).","title":"Min Citations"},"description":"Factual filter: minimum citation_count (NULLs treated as 0, so unscored papers are excluded by any positive threshold)."},{"name":"github_url_exists","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Factual filter: when true, restrict to papers that carry a GitHub repo URL (github_url IS NOT NULL).","title":"Github Url Exists"},"description":"Factual filter: when true, restrict to papers that carry a GitHub repo URL (github_url IS NOT NULL)."},{"name":"min_stars","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Factual filter: papers KNOWN to have at least this many github_stars. Requires a measured star count, so papers whose repo was never fetched are excluded rather than counted as 0-star — honest but incomplete: a genuinely popular paper can be absent because nobody measured it. Star coverage skews toward recently-published papers and is being backfilled.","title":"Min Stars"},"description":"Factual filter: papers KNOWN to have at least this many github_stars. Requires a measured star count, so papers whose repo was never fetched are excluded rather than counted as 0-star — honest but incomplete: a genuinely popular paper can be absent because nobody measured it. Star coverage skews toward recently-published papers and is being backfilled."},{"name":"published_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Factual filter: only papers published on/after this date (YYYY-MM-DD), inclusive — published_date >= :published_after. Malformed/invalid dates are rejected with 422.","title":"Published After"},"description":"Factual filter: only papers published on/after this date (YYYY-MM-DD), inclusive — published_date >= :published_after. Malformed/invalid dates are rejected with 422."},{"name":"published_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Factual filter: only papers published on/before this date (YYYY-MM-DD), inclusive — published_date <= :published_before. Malformed/invalid dates are rejected with 422.","title":"Published Before"},"description":"Factual filter: only papers published on/before this date (YYYY-MM-DD), inclusive — published_date <= :published_before. Malformed/invalid dates are rejected with 422."},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":3650,"minimum":1},{"type":"null"}],"description":"Limit to papers published within N days","title":"Days"},"description":"Limit to papers published within N days"},{"name":"mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search mode: 'keyword' (default, full-text search) or 'semantic' (embedding similarity). Semantic mode finds conceptually related papers even without exact keyword matches.","title":"Mode"},"description":"Search mode: 'keyword' (default, full-text search) or 'semantic' (embedding similarity). Semantic mode finds conceptually related papers even without exact keyword matches."},{"name":"rerank","in":"query","required":false,"schema":{"type":"boolean","description":"Semantic-mode only: apply summary-aware intent reranking on the top-100 candidate pool. Default true. Pass false to get raw cosine ordering (matches the pre-2026-05-24 baseline).","default":true,"title":"Rerank"},"description":"Semantic-mode only: apply summary-aware intent reranking on the top-100 candidate pool. Default true. Pass false to get raw cosine ordering (matches the pre-2026-05-24 baseline)."},{"name":"hyde","in":"query","required":false,"schema":{"type":"boolean","description":"Semantic-mode only: generate a hypothetical paper abstract (DeepSeek) and blend its embedding with the query embedding for retrieval. Lifts recall on descriptive queries (Q4 in eval: 20%→60%). Adds ~5-10s on cache miss; cached 24h. Off by default while we validate prod latency.","default":false,"title":"Hyde"},"description":"Semantic-mode only: generate a hypothetical paper abstract (DeepSeek) and blend its embedding with the query embedding for retrieval. Lifts recall on descriptive queries (Q4 in eval: 20%→60%). Adds ~5-10s on cache miss; cached 24h. Off by default while we validate prod latency."},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort/rank order. The relevance↔impact dial (semantic mode): 'relevance' (default, best match), 'balanced' (relevant AND well-cited), 'impactful' (most-cited among the relevant — proven influence; in keyword mode = citation_count DESC). Plus 'trending' (rising/forecast: impact_pct DESC, last ~90d), 'recent' (published_date DESC), and 'community' (traction: github_stars DESC, then citation_velocity DESC; applied in BOTH keyword and semantic mode, where it reorders the cosine candidate pool. Papers with no measured star count sink below genuine zeros instead of tying with them — a 0 means 'unknown', so this is a measured-adoption order, not a corpus-wide one). 'balanced'/'impactful' rerank the cosine candidate pool by pool-relative log-citations. Ignored when anchor_paper_id or scope_to_citations_of is set.","title":"Sort"},"description":"Sort/rank order. The relevance↔impact dial (semantic mode): 'relevance' (default, best match), 'balanced' (relevant AND well-cited), 'impactful' (most-cited among the relevant — proven influence; in keyword mode = citation_count DESC). Plus 'trending' (rising/forecast: impact_pct DESC, last ~90d), 'recent' (published_date DESC), and 'community' (traction: github_stars DESC, then citation_velocity DESC; applied in BOTH keyword and semantic mode, where it reorders the cosine candidate pool. Papers with no measured star count sink below genuine zeros instead of tying with them — a 0 means 'unknown', so this is a measured-adoption order, not a corpus-wide one). 'balanced'/'impactful' rerank the cosine candidate pool by pool-relative log-citations. Ignored when anchor_paper_id or scope_to_citations_of is set."},{"name":"anchor_paper_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Return papers similar to this arXiv paper (precomputed related_papers neighbors). When set, results carry similarity_score and are ordered by similarity DESC. q is ignored in this mode. Absorbs find_similar(arxiv_id) from v1.8.0.","title":"Anchor Paper Id"},"description":"Return papers similar to this arXiv paper (precomputed related_papers neighbors). When set, results carry similarity_score and are ordered by similarity DESC. q is ignored in this mode. Absorbs find_similar(arxiv_id) from v1.8.0."},{"name":"scope_to_citations_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict search to papers in this arXiv paper's citation graph, then rank by relevance to q. Results carry similarity_score. sort= is ignored; ordering is cosine DESC. Absorbs find_citations_about(arxiv_id, query) from v1.8.0.","title":"Scope To Citations Of"},"description":"Restrict search to papers in this arXiv paper's citation graph, then rank by relevance to q. Results carry similarity_score. sort= is ignored; ordering is cosine DESC. Absorbs find_citations_about(arxiv_id, query) from v1.8.0."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for keyset pagination (from next_cursor in previous response)","title":"Cursor"},"description":"Cursor for keyset pagination (from next_cursor in previous response)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of fields to return (e.g. 'arxiv_id,title,llm_summary'). If omitted, returns the lean 12-field default unless verbose=true.","title":"Fields"},"description":"Comma-separated list of fields to return (e.g. 'arxiv_id,title,llm_summary'). If omitted, returns the lean 12-field default unless verbose=true."},{"name":"verbose","in":"query","required":false,"schema":{"type":"boolean","description":"If true, returns the full 28-field paper shape. Default false returns the lean set. Ignored when `fields` is provided.","default":false,"title":"Verbose"},"description":"If true, returns the full 28-field paper shape. Default false returns the lean set. Ignored when `fields` is provided."},{"name":"exclude_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated arXiv IDs to exclude from results (max 100)","title":"Exclude Ids"},"description":"Comma-separated arXiv IDs to exclude from results (max 100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Search Papers V1 Papers Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/papers/{arxiv_id}/similar":{"get":{"tags":["v1"],"summary":"V1 Get Similar Papers","description":"Get papers similar to the given arXiv paper using precomputed neighbors.\n\nUses the related_papers table (bibliographic coupling + embedding similarity).\nReturns up to `limit` results ordered by composite relevance rank.\n\nRate limit: 20/minute per API key.","operationId":"v1_get_similar_papers_v1_papers__arxiv_id__similar_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"arxiv_id","in":"path","required":true,"schema":{"type":"string","title":"Arxiv Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":10,"title":"Limit"}},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":3650,"minimum":1},{"type":"null"}],"description":"Filter similar papers published within N days","title":"Days"},"description":"Filter similar papers published within N days"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of fields to return. If omitted, returns the lean 12-field default unless verbose=true.","title":"Fields"},"description":"Comma-separated list of fields to return. If omitted, returns the lean 12-field default unless verbose=true."},{"name":"verbose","in":"query","required":false,"schema":{"type":"boolean","description":"If true, returns the full 28-field paper shape. Default false returns the lean set.","default":false,"title":"Verbose"},"description":"If true, returns the full 28-field paper shape. Default false returns the lean set."},{"name":"exclude_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated arXiv IDs to exclude from results (max 100)","title":"Exclude Ids"},"description":"Comma-separated arXiv IDs to exclude from results (max 100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Get Similar Papers V1 Papers  Arxiv Id  Similar Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/papers/{arxiv_id}/citations":{"get":{"tags":["v1"],"summary":"V1 Get Paper Citations","description":"Get the citation graph for a paper.\n\ndirection='citing'  — papers that this paper cites (outgoing references)\ndirection='cited_by' — papers that cite this paper (incoming citations)\n\nRate limit: 30/minute per API key.","operationId":"v1_get_paper_citations_v1_papers__arxiv_id__citations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"arxiv_id","in":"path","required":true,"schema":{"type":"string","title":"Arxiv Id"}},{"name":"direction","in":"query","required":false,"schema":{"type":"string","description":"'citing' = papers this paper cites; 'cited_by' = papers that cite this paper","default":"cited_by","title":"Direction"},"description":"'citing' = papers this paper cites; 'cited_by' = papers that cite this paper"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of fields to return. If omitted, returns the lean 12-field default unless verbose=true.","title":"Fields"},"description":"Comma-separated list of fields to return. If omitted, returns the lean 12-field default unless verbose=true."},{"name":"verbose","in":"query","required":false,"schema":{"type":"boolean","description":"If true, returns the full 28-field paper shape. Default false returns the lean set.","default":false,"title":"Verbose"},"description":"If true, returns the full 28-field paper shape. Default false returns the lean set."},{"name":"exclude_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated arXiv IDs to exclude from results (max 100)","title":"Exclude Ids"},"description":"Comma-separated arXiv IDs to exclude from results (max 100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Get Paper Citations V1 Papers  Arxiv Id  Citations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/papers/{arxiv_id}/citations/about":{"get":{"tags":["v1"],"summary":"V1 Find Citations About","description":"Find papers in the citation graph of `arxiv_id` whose content matches `query`.\n\nCombines the citation graph (paper_citations) with semantic search (Gemini\nRETRIEVAL_QUERY embedding vs. paper RETRIEVAL_DOCUMENT embeddings) to answer\nquestions like \"find papers citing X that talk about Y\".\n\nAlgorithm:\n  1. Resolve source paper UUID from arxiv_id.\n  2. Embed `query` via Gemini (cached, 15-min TTL).\n  3. Take the top 2000 citation neighbours by rank_score (impact-weighted).\n  4. Re-rank that pool by cosine similarity to the query embedding.\n  5. Return the top `limit` with `similarity_score` per paper.\n\nSimilarity is doc-doc cosine between RETRIEVAL_QUERY and RETRIEVAL_DOCUMENT\nspaces — relevant matches typically score ~0.55–0.75 (not 0.85+ like\ndoc-doc). Results are returned ranked, with no hard threshold; callers can\nfilter on `similarity_score` if they want a floor.\n\nRate limit: 20/minute per API key.","operationId":"v1_find_citations_about_v1_papers__arxiv_id__citations_about_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"arxiv_id","in":"path","required":true,"schema":{"type":"string","title":"Arxiv Id"}},{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":300,"description":"Natural-language topic query — finds citations whose content matches this query","title":"Query"},"description":"Natural-language topic query — finds citations whose content matches this query"},{"name":"direction","in":"query","required":false,"schema":{"type":"string","description":"'citing' = papers this paper cites; 'cited_by' = papers that cite this paper","default":"cited_by","title":"Direction"},"description":"'citing' = papers this paper cites; 'cited_by' = papers that cite this paper"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of fields to return. If omitted, returns the lean 12-field default unless verbose=true.","title":"Fields"},"description":"Comma-separated list of fields to return. If omitted, returns the lean 12-field default unless verbose=true."},{"name":"verbose","in":"query","required":false,"schema":{"type":"boolean","description":"If true, returns the full 28-field paper shape. Default false returns the lean set.","default":false,"title":"Verbose"},"description":"If true, returns the full 28-field paper shape. Default false returns the lean set."},{"name":"exclude_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated arXiv IDs to exclude from results (max 100)","title":"Exclude Ids"},"description":"Comma-separated arXiv IDs to exclude from results (max 100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Find Citations About V1 Papers  Arxiv Id  Citations About Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/papers/{arxiv_id}/fulltext":{"get":{"tags":["v1"],"summary":"V1 Get Paper Fulltext","description":"Extract section-typed full text for an arXiv paper (PAPI-06).\n\n`sections` selects the projection:\n- omitted or \"all\" (default): every canonical section — abstract, introduction,\n  related_work, method, results, conclusion — at up to 3000 chars each,\n  plus up to 5 captions.\n- one section name: just that section.\n- several names, comma-separated or as repeated params: just those, in\n  canonical order. `sections=method,results` is roughly a third of the `all`\n  payload, which matters when the caller is an LLM paying for every token of\n  it.\n\nEvery response carries `available_sections`, so a caller always knows which\nsections this paper actually has. Requesting a section the paper does not\ncontain returns 200 with `requested_section_available: false`, a `note`, and\nthe sections that do exist — never an empty body.\n\n`section_provenance` records how each section was typed, and\n`low_confidence_sections` names the ones that were inferred rather than read.\nToday that means only a `method` recovered by position: when no heading\nidentified the method, the section between the introduction and the results is\nused, which a 50-paper hand audit put at ~50% accurate. Treat those as a hint\nand check the text before citing them.\n\nSources, tried in order: arXiv LaTeXML HTML (section-tagged, ~89% of the\ncorpus), the LaTeX e-print tarball, then PDF text segmented by heading.\n\nRate limit: 10/minute per API key.","operationId":"v1_get_paper_fulltext_v1_papers__arxiv_id__fulltext_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"arxiv_id","in":"path","required":true,"schema":{"type":"string","title":"Arxiv Id"}},{"name":"sections","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Sections to return: 'all' (default), or any of abstract, introduction, related_work, method, results, conclusion. Comma-separate or repeat the param to ask for several, e.g. sections=method,results.","title":"Sections"},"description":"Sections to return: 'all' (default), or any of abstract, introduction, related_work, method, results, conclusion. Comma-separate or repeat the param to ask for several, e.g. sections=method,results."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Get Paper Fulltext V1 Papers  Arxiv Id  Fulltext Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/papers/fulltext":{"post":{"tags":["v1"],"summary":"V1 Get Papers Fulltext Batch","description":"Extract section-typed full text for up to 8 papers in one call.\n\nReading several papers is the normal shape of a research task, and doing it\none request at a time against a per-minute limit is what pushed agents toward\nfetching one paper and guessing about the rest.\n\n`sections` is REQUIRED when more than one paper is requested. Eight papers of\n`all` is ~108KB, which is the exact outcome this endpoint exists to prevent;\na 422 teaches that in one round trip instead of silently burning the caller's\ncontext window.\n\nPer-paper failures are ENTRIES, never a non-200 — one unextractable paper\nmust not cost the caller the seven that worked. Each entry carries `ok`, and\nfailures carry `error` in: invalid_id, not_extractable, extraction_failed,\ntimeout.\n\nCosts ONE quota unit regardless of batch size, so batching is cheaper than\nlooping and callers have a reason to actually use it.\n\nRate limit: 6/minute per API key.","operationId":"v1_get_papers_fulltext_batch_v1_papers_fulltext_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FulltextBatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Get Papers Fulltext Batch V1 Papers Fulltext Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/papers/bibtex":{"post":{"tags":["v1"],"summary":"V1 Export Bibtex","description":"Export BibTeX entries for the given arXiv IDs.\n\nAccepts the same request body as batch lookup (up to 50 arXiv IDs).\nReturns a single BibTeX string with all found entries.\n\nRate limit: 20/minute per API key.","operationId":"v1_export_bibtex_v1_papers_bibtex_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchLookupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Export Bibtex V1 Papers Bibtex Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/papers":{"get":{"tags":["v1"],"summary":"V1 Get Papers Batch","description":"Batch lookup multiple papers via repeated query params (TOOL-04, v3 batch surface).\n\nAccepts up to 50 arXiv IDs as repeated ?arxiv_ids[]=... query parameters.\nReturns the same {papers, total, not_found} shape as the now-retired\nPOST /papers/batch endpoint. Version suffixes are stripped before lookup.\nIDs not found in the corpus are listed in not_found.\n\nRate limit: 30/minute per API key.\n\nResponse shape:\n    papers: list[PublicPaperResponse]\n    total: int\n    not_found: list[str]  -- IDs from the request not present in corpus","operationId":"v1_get_papers_batch_v1_papers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"arxiv_ids[]","in":"query","required":true,"schema":{"type":"array","items":{"type":"string"},"description":"Repeated arXiv IDs to batch-fetch, e.g. ?arxiv_ids[]=2401.1&arxiv_ids[]=2402.2 (max 50).","title":"Arxiv Ids[]"},"description":"Repeated arXiv IDs to batch-fetch, e.g. ?arxiv_ids[]=2401.1&arxiv_ids[]=2402.2 (max 50)."},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of fields to return. If omitted, returns the lean default unless verbose=true.","title":"Fields"},"description":"Comma-separated list of fields to return. If omitted, returns the lean default unless verbose=true."},{"name":"verbose","in":"query","required":false,"schema":{"type":"boolean","description":"If true, returns the full paper shape. Default false returns the lean set.","default":false,"title":"Verbose"},"description":"If true, returns the full paper shape. Default false returns the lean set."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Get Papers Batch V1 Papers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/papers/{arxiv_id}":{"get":{"tags":["v1"],"summary":"V1 Get Paper","description":"Retrieve a single paper by arXiv ID.\n\nHandles versioned IDs (e.g. 2401.12345v2 — strips version suffix for lookup).\nReturns lean PublicPaperResponse without frontend-specific state fields.\n\nWhen format=bibtex, returns {bibtex: \"<entry>\", count: 1, not_found: []} using\n_paper_to_bibtex — same shape as POST /papers/bibtex for uniformity with the\nv3 get_paper(format='bibtex') MCP wrapper (plan 05).\n\nRate limit: 60/minute per API key.","operationId":"v1_get_paper_v1_papers__arxiv_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"arxiv_id","in":"path","required":true,"schema":{"type":"string","title":"Arxiv Id"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of fields to return. If omitted, returns the lean 12-field default unless verbose=true.","title":"Fields"},"description":"Comma-separated list of fields to return. If omitted, returns the lean 12-field default unless verbose=true."},{"name":"verbose","in":"query","required":false,"schema":{"type":"boolean","description":"If true, returns the full paper shape. Default false returns the lean set.","default":false,"title":"Verbose"},"description":"If true, returns the full paper shape. Default false returns the lean set."},{"name":"format","in":"query","required":false,"schema":{"type":"string","description":"Response format: 'json' (default) or 'bibtex' (returns a single BibTeX entry as {bibtex: string}).","default":"json","title":"Format"},"description":"Response format: 'json' (default) or 'bibtex' (returns a single BibTeX entry as {bibtex: string})."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Get Paper V1 Papers  Arxiv Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/trending":{"get":{"tags":["v1"],"summary":"V1 Get Trending","description":"Get trending papers: recent + high-quality papers in core ML/AI categories.\n\nRuns a single inline DB query — no daily_cache dependency. Recency is\nderived from arxiv_id (original_publish_date column), so v2/v3 reuploads\nof older papers don't poison the feed. Default scope is ML/AI-core; pass\n?category= to override to any single category.\n\nRate limit: 30/minute per API key.","operationId":"v1_get_trending_v1_trending_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category code e.g. 'cs.AI'","title":"Category"},"description":"Filter by category code e.g. 'cs.AI'"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated list of fields to return. If omitted, returns the lean 12-field default unless verbose=true.","title":"Fields"},"description":"Comma-separated list of fields to return. If omitted, returns the lean 12-field default unless verbose=true."},{"name":"verbose","in":"query","required":false,"schema":{"type":"boolean","description":"If true, returns the full 28-field paper shape. Default false returns the lean set.","default":false,"title":"Verbose"},"description":"If true, returns the full 28-field paper shape. Default false returns the lean set."},{"name":"exclude_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated arXiv IDs to exclude from results (max 100)","title":"Exclude Ids"},"description":"Comma-separated arXiv IDs to exclude from results (max 100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Get Trending V1 Trending Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/papers/{arxiv_id}/repo":{"get":{"tags":["v1"],"summary":"V1 Get Paper Repo","description":"Fetch code/repo summary (README + file tree) for a paper (PAPI-08).\n\nLooks up the paper's github_url in the DB, then queries the GitHub API for:\n- README content (base64-decoded, truncated to 3000 chars)\n- File tree (up to 100 blob paths, with truncation flag)\n\nBoth GitHub API calls are made in parallel via asyncio.gather.\n\nGITHUB_TOKEN env var is optional. Without it, the GitHub API allows 60 req/hr\n(unauthenticated); with it, 5000 req/hr.\n\nRate limit: 10/minute per API key (conservative — each call makes 2 GitHub API requests).\n\nResponse shape (success):\n    owner: str\n    repo: str\n    readme: str | null   -- README content truncated to 3000 chars\n    file_tree: list[str] -- up to 100 file paths from the repo root\n    tree_truncated: bool -- True if the repo has >100 blobs (GitHub tree API limit)\n\nResponse shape (error):\n    error: str   -- error code (repo_not_found, private_repo, github_rate_limited, invalid_github_url)\n    detail: str  -- human-readable description","operationId":"v1_get_paper_repo_v1_papers__arxiv_id__repo_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"arxiv_id","in":"path","required":true,"schema":{"type":"string","title":"Arxiv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Get Paper Repo V1 Papers  Arxiv Id  Repo Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/authors/discover":{"get":{"tags":["v1"],"summary":"V1 Public Discover Authors","description":"Discover researchers by topic (semantic search) or name.\n\nShort queries (<=3 words) without research terms use name-based ILIKE search.\nLonger or research-themed queries use semantic embedding search against\nauthor research topic embeddings.\n\nRate limit: 20/minute per API key.","operationId":"v1_public_discover_authors_v1_authors_discover_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":500,"description":"Topic or researcher name to search","title":"Q"},"description":"Topic or researcher name to search"},{"name":"field","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by primary field e.g. 'cs.LG'","title":"Field"},"description":"Filter by primary field e.g. 'cs.LG'"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Public Discover Authors V1 Authors Discover Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/authors/co-author-graph":{"get":{"tags":["v1"],"summary":"V1 Public Co Author Graph","description":"Co-authorship edge graph for a set of authors (TOOL-01).\n\nFor each input author, returns outgoing edges to every co-author on papers\npublished within the time window. Edges are deterministic and derived from\nthe paper_authors join table — not from any cached graph snapshot.\n\nReturns asymmetric (from, to) edges, sorted by papers_count DESC; capped at\n500 edges per request. Useful for downstream reviewer-triage and\ncollaboration-neighborhood workflows.\n\nNote: this surfaces the FULL co-author neighborhood per input author. If a\nsymmetric subgraph restricted to {input_authors} is needed, filter the\nreturned edges client-side (YAGNI — not implemented server-side).\n\nRate limit: 20/minute per API key.","operationId":"v1_public_co_author_graph_v1_authors_co_author_graph_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"author_ids","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated author IDs (max 25). Example: '12345,67890'.","title":"Author Ids"},"description":"Comma-separated author IDs (max 25). Example: '12345,67890'."},{"name":"window_years","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Only count co-authorships from the last N years (max 30).","default":10,"title":"Window Years"},"description":"Only count co-authorships from the last N years (max 30)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Public Co Author Graph V1 Authors Co Author Graph Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/authors/{author_id}":{"get":{"tags":["v1"],"summary":"V1 Public Get Author","description":"Get author details by stable OpenAlex id (``A123…``) or legacy integer PK.\n\nReturns author profile with h-index, rank, top papers, and research topics.\n\nRate limit: 30/minute per API key.","operationId":"v1_public_get_author_v1_authors__author_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"author_id","in":"path","required":true,"schema":{"type":"string","title":"Author Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Public Get Author V1 Authors  Author Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/authors/{author_id}/papers":{"get":{"tags":["v1"],"summary":"V1 Public Get Author Papers","description":"Get all papers by an author (stable OpenAlex id or legacy integer PK).\n\nReturns paginated list of papers with standard PublicPaperResponse fields.\nUse discover_authors or get_author to find the author id first.\n\nRate limit: 20/minute per API key.","operationId":"v1_public_get_author_papers_v1_authors__author_id__papers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"author_id","in":"path","required":true,"schema":{"type":"string","title":"Author Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Public Get Author Papers V1 Authors  Author Id  Papers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/research/landscape":{"get":{"tags":["v1"],"summary":"V1 Get Research Landscape","description":"Aggregated research landscape statistics for a topic.\n\nUses semantic (embedding) search to find relevant papers, then returns\ncount-based aggregates: authors, publication velocity by month, and\nnovelty score distribution. All counts are factual — no rankings, labels,\nor editorial interpretation.\n\nRate limit: 10/minute per API key.","operationId":"v1_get_research_landscape_v1_research_landscape_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":500,"description":"Research topic (semantic search)","title":"Q"},"description":"Research topic (semantic search)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":10,"description":"Number of papers to analyze","default":50,"title":"Limit"},"description":"Number of papers to analyze"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Get Research Landscape V1 Research Landscape Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/embeddings":{"post":{"tags":["v1"],"summary":"V1 Public Embed Text","description":"Embed text using Gemini Flash embeddings (768-dim).\n\nReturns {embedding, model, dimensionality, task_type}. Enables agent-side\nHyDE composition — an agent can build a hypothetical-document embedding\nthen pass it back through `search_papers(anchor_embedding=...)` (v3\nsurface) for hybrid retrieval.\n\nPOST is used (not GET) to accommodate long text payloads (HyDE\nhypothetical-document strings can be hundreds of chars).\n\n`task_type` defaults to RETRIEVAL_DOCUMENT (matches paper-side embeddings,\nthe correct space for HyDE flows). Use RETRIEVAL_QUERY for query-side\nsemantic search.\n\nThin wrapper over the existing Gemini helpers in routers/papers.py — no\nduplicate Gemini client setup, no new embedding logic.\n\nRequires a free account (any tier) — see _require_account. Each call is charged\nagainst the account's monthly quota; anonymous callers get 403 account_required.\n\nRate limit: 30/minute per account. Returns 502 if the upstream Gemini\nservice fails (timeout / API error).","operationId":"v1_public_embed_text_v1_embeddings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbedTextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Public Embed Text V1 Embeddings Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/field-orientation":{"get":{"tags":["v1"],"summary":"V1 Get Field Orientation","description":"Cheap retrieval-only field orientation (TOOL-06, v3 get_field_orientation tool backend).\n\nEmbeds the topic via Gemini Flash (get_query_embedding), runs a cosine search\nover the papers vector index to fetch candidate papers, then re-ranks those\ncandidates by a foundational-ness blend (0.6 * normalised citation_count +\n0.4 * cosine_similarity). Returns the top `limit` papers as a thin list with\nsimilarity score and citation count.\n\nTHIS IS NOT THE FIELD GUIDE AGENT. No DeepSeek synthesis, no quota, no Pro\nrequirement, no background jobs. The expensive LLM synthesis half stays in the\n/field-guide skill (docs/architecture/tool-vs-skill.md §field_guide row) which\ncomposes this retrieval endpoint + in-context reasoning client-side.\n\nRate limit: 20/minute per API key.\n\nResponse shape:\n    topic: str\n    papers: list[{arxiv_id, title, authors, published_date, citation_count,\n                   rank_score, llm_summary, llm_novelty_score, similarity}]\n    total: int\n    note: str — reminder that this is retrieval-only, no LLM synthesis","operationId":"v1_get_field_orientation_v1_field_orientation_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"topic","in":"query","required":true,"schema":{"type":"string","minLength":5,"maxLength":300,"description":"Research area to orient on, e.g. 'diffusion models for protein structure'.","title":"Topic"},"description":"Research area to orient on, e.g. 'diffusion models for protein structure'."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":5,"description":"Number of foundational candidate papers to return (5–30).","default":15,"title":"Limit"},"description":"Number of foundational candidate papers to return (5–30)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Get Field Orientation V1 Field Orientation Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/drift/check":{"get":{"tags":["v1"],"summary":"V1 Check Drift","description":"DriftKB supersession check (TOOL-12, check_drift backend).\n\nAnswers \"for my problem, is the method I use superseded — and by what?\" over a\ngrounded, entity-resolved knowledge base of textual critique receipts + benchmark\ndominance edges (mig 150). No LLM call; reads the denormalized drift_* serving tables.\n\nRate limit: 30/minute per API key.","operationId":"v1_check_drift_v1_drift_check_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"family","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":60,"description":"Builder-problem family, e.g. 'kvcache'. Omit method to list families/overview.","title":"Family"},"description":"Builder-problem family, e.g. 'kvcache'. Omit method to list families/overview."},{"name":"method","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"description":"Method to check, e.g. 'SnapKV' (case/spacing-insensitive). Omit for the whole-family map.","title":"Method"},"description":"Method to check, e.g. 'SnapKV' (case/spacing-insensitive). Omit for the whole-family map."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":3,"description":"Max items per list (3–50).","default":12,"title":"Limit"},"description":"Max items per list (3–50)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Check Drift V1 Drift Check Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/foundational-lineage":{"get":{"tags":["v1"],"summary":"V1 Get Foundational Lineage","description":"Foundational lineage for a paper's NICHE (TOOL-07, paper-anchored).\n\nPipeline (consensus-then-lift; no LLM, no PageRank):\n  1. Resolve the anchor's stored embedding (no Gemini call — cheaper than field-orientation).\n  2. Niche = pgvector k-NN neighbourhood (the `scope` knob) = \"the field\".\n  3. One GROUP BY over the niche's out-edges → within-niche in-degree per ancestor.\n  4. Demote universal landmarks by the R1 specificity ratio; split the niche-specific\n     foundations into roots (above a relative consensus floor) vs field_level.\n  5. Rank niche_roots by LIFT (enrichment) so the niche gems lead — not raw\n     consensus, which surfaces broad pillars and buries the gems.\n\nReturns the foundational work SPECIFIC to this paper's niche — surfacing canonical\nanchors that embedding similarity misses, while universally-cited landmark papers\n(e.g. Attention Is All You Need) collapse into `discipline`.\n\nRate limit: 20/minute per API key.","operationId":"v1_get_foundational_lineage_v1_foundational_lineage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"anchor_paper_id","in":"query","required":true,"schema":{"type":"string","minLength":4,"maxLength":40,"description":"arXiv ID to anchor on, e.g. '2504.04704'.","title":"Anchor Paper Id"},"description":"arXiv ID to anchor on, e.g. '2504.04704'."},{"name":"scope","in":"query","required":false,"schema":{"enum":["narrow","field","broad"],"type":"string","description":"Niche breadth: narrow≈100 nearest papers, field≈200, broad≈400.","default":"field","title":"Scope"},"description":"Niche breadth: narrow≈100 nearest papers, field≈200, broad≈400."},{"name":"generality_ceiling","in":"query","required":false,"schema":{"type":"boolean","description":"Demote universally-cited landmark papers (low niche-enrichment) into a collapsed 'discipline' tier.","default":true,"title":"Generality Ceiling"},"description":"Demote universally-cited landmark papers (low niche-enrichment) into a collapsed 'discipline' tier."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":40,"minimum":5,"description":"Max papers in each of the niche_roots and field_level tiers.","default":15,"title":"Limit"},"description":"Max papers in each of the niche_roots and field_level tiers."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Get Foundational Lineage V1 Foundational Lineage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/batches":{"post":{"tags":["Batches"],"summary":"Submit an async batch job","description":"Submit an async batch job for processing.\n\nRequires the `Idempotency-Key` header — a client-supplied string that scopes\ndeduplication per account. Retrying with the same key returns the same job id\n(no duplicate row), backed by the `UNIQUE(account_id, idempotency_key)` constraint\non the `batch_jobs` table (migration 122).\n\nReturns **202 Accepted** with `{id, status:\"queued\"}`. The job id can be\nused with `GET /v1/batches/{id}` to poll for status and results.\n\n**Batch submission is accepted but not processed until the worker ships\n(BATCH2-01, discovery-gated).** Submitted batches persist as 'queued' rows\nin `batch_jobs` until the processing worker is activated. This is intentional —\nthe scaffold lets developers integrate the contract end-to-end while the\nasync execution infrastructure is under active development.\n\n**Idempotency:** A retried POST with the same `Idempotency-Key` (for the same\naccount) returns the existing job id with 202 — no duplicate row is created.\nTwo different accounts may reuse the same key string without conflict\n(uniqueness is scoped per account).\n\nRate limit: 10/minute per account (provisional).\n\nReturns 400 if the Idempotency-Key header is empty or whitespace.\nReturns 401 if not authenticated.\nReturns 413 if any single operation exceeds 8 KB or the whole payload exceeds 1 MB.\nReturns 422 if the Idempotency-Key header is absent.","operationId":"submit_batch_v1_batches_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSubmitRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchSubmitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/batches/{batch_id}":{"get":{"tags":["Batches"],"summary":"Poll batch job status","description":"Poll the status, request_counts, and results of a batch job.\n\nReturns the current job state for the authenticated account's job.\nAccount-scoped: a `batch_id` belonging to a different account returns 404\n(no cross-account information leakage).\n\nFor the foreseeable future, `status` will remain `\"queued\"` because the\nprocessing worker (BATCH2-01) is not yet active — submitted batches are\nnot processed until the worker ships.\n\n`results` is populated only when `status=\"completed\"`, directly from the\n`results` JSONB column on `batch_jobs`. Until the worker ships, `results`\nwill always be null.\n\nReturns 404 for unknown batch ids, invalid UUIDs, or jobs belonging to\nother accounts (account-scoped, no 403/422 distinction to avoid leaking\nexistence information).\nReturns 401 if not authenticated.","operationId":"get_batch_v1_batches__batch_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/api__routers__batches__BatchStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccessRequestBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"message":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Message"}},"type":"object","required":["email"],"title":"AccessRequestBody","description":"Body for submitting an access request."},"AccessRequestResponse":{"properties":{"received":{"type":"boolean","title":"Received"},"id":{"type":"integer","title":"Id"}},"type":"object","required":["received","id"],"title":"AccessRequestResponse","description":"Response after successful submission."},"AlertCreateRequest":{"properties":{"topic_text":{"type":"string","maxLength":500,"minLength":5,"title":"Topic Text"}},"type":"object","required":["topic_text"],"title":"AlertCreateRequest"},"AlertListResponse":{"properties":{"alerts":{"items":{"$ref":"#/components/schemas/AlertResponse"},"type":"array","title":"Alerts"},"active_count":{"type":"integer","title":"Active Count"},"limit":{"type":"integer","title":"Limit"},"is_pro":{"type":"boolean","title":"Is Pro"},"grandfathered":{"type":"boolean","title":"Grandfathered","default":false}},"type":"object","required":["alerts","active_count","limit","is_pro"],"title":"AlertListResponse"},"AlertPreviewRequest":{"properties":{"topic_text":{"type":"string","minLength":5,"title":"Topic Text"}},"type":"object","required":["topic_text"],"title":"AlertPreviewRequest"},"AlertPreviewResponse":{"properties":{"papers":{"items":{"$ref":"#/components/schemas/PreviewPaper"},"type":"array","title":"Papers"}},"type":"object","required":["papers"],"title":"AlertPreviewResponse"},"AlertResponse":{"properties":{"id":{"type":"string","title":"Id"},"topic_text":{"type":"string","title":"Topic Text"},"active":{"type":"boolean","title":"Active"},"created_at":{"type":"string","title":"Created At"},"last_matched_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Matched At"},"match_count":{"type":"integer","title":"Match Count"}},"type":"object","required":["id","topic_text","active","created_at","match_count"],"title":"AlertResponse"},"ApiKeyListItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","name","prefix","created_at"],"title":"ApiKeyListItem","description":"Returned in list — no full key, only prefix for identification."},"ApiKeyResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"key":{"type":"string","title":"Key"},"prefix":{"type":"string","title":"Prefix"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","name","key","prefix","created_at"],"title":"ApiKeyResponse","description":"Returned after create — includes full plaintext key. Never returned again."},"AttributionRequest":{"properties":{"ref":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Ref"},"mcp_session":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Mcp Session"},"referrer":{"anyOf":[{"type":"string","maxLength":253},{"type":"null"}],"title":"Referrer"},"landing_path":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Landing Path"},"first_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Seen At"}},"type":"object","title":"AttributionRequest","description":"First-touch attribution, collected client-side and posted once after sign-in.\n\nEvery field is optional and every field is UNTRUSTED — it comes from the\nbrowser. The caps below are the whole validation story: these values are only\never aggregated, never used to authorize anything, so length limits plus the\nhost-only rule for `referrer` are sufficient. Nothing here may be echoed back\ninto a page without escaping."},"AuthorFieldsResponse":{"properties":{"fields":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Fields"}},"type":"object","required":["fields"],"title":"AuthorFieldsResponse","description":"List of fields with author counts."},"AuthorRankEntry":{"properties":{"id":{"type":"integer","title":"Id"},"openalex_author_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Openalex Author Id"},"name":{"type":"string","title":"Name"},"h_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"H Index"},"total_papers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Papers"},"total_citations":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Citations"},"avg_novelty_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Novelty Score"},"peak_novelty_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Peak Novelty Score"},"author_rank_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Author Rank Score"},"author_alltime_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Author Alltime Score"},"primary_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Field"},"recent_paper_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recent Paper Count"},"venue_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Venue Score"},"code_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Code Score"},"years_active":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Years Active"},"semantic_scholar_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Semantic Scholar Id"},"is_followed":{"type":"boolean","title":"Is Followed","default":false}},"type":"object","required":["id","name"],"title":"AuthorRankEntry","description":"An author in the ranking list with all ranking fields."},"AuthorRankingResponse":{"properties":{"authors":{"items":{"$ref":"#/components/schemas/AuthorRankEntry"},"type":"array","title":"Authors"},"mode":{"type":"string","title":"Mode"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["authors","mode","total","page","limit","has_more"],"title":"AuthorRankingResponse","description":"Paginated author ranking list."},"BatchLookupRequest":{"properties":{"arxiv_ids":{"items":{"type":"string"},"type":"array","maxItems":50,"minItems":1,"title":"Arxiv Ids","description":"List of arXiv IDs to look up (max 50)"},"fields":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fields","description":"Comma-separated list of fields to return (e.g. 'arxiv_id,title,llm_summary'). If omitted, returns the lean default (~12 fields) unless verbose=true."},"verbose":{"type":"boolean","title":"Verbose","description":"If true, return the full 28-field paper shape. Default false returns the lean 12-field set. Ignored if `fields` is provided.","default":false}},"type":"object","required":["arxiv_ids"],"title":"BatchLookupRequest","description":"Request body for batch paper lookup (PAPI-07)."},"BatchPapersRequest":{"properties":{"paper_ids":{"items":{"type":"string"},"type":"array","maxItems":200,"minItems":1,"title":"Paper Ids"}},"type":"object","required":["paper_ids"],"title":"BatchPapersRequest","description":"Bulk membership mutation — accepts UUIDs (website) or arXiv IDs (MCP)."},"BatchStatusRequest":{"properties":{"paper_ids":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Paper Ids"}},"type":"object","required":["paper_ids"],"title":"BatchStatusRequest"},"BatchSubmitRequest":{"properties":{"requests":{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":10000,"title":"Requests","description":"List of operations to run in batch. Shape is provisional and finalised when the worker ships (BATCH2-01). Maximum 10,000 operations per batch — larger batches should be split across multiple jobs."}},"type":"object","required":["requests"],"title":"BatchSubmitRequest","description":"Body for submitting an async batch job."},"BatchSubmitResponse":{"properties":{"id":{"type":"string","title":"Id","description":"UUID of the created batch job. Use this with GET /v1/batches/{id} to poll status."},"status":{"type":"string","title":"Status","description":"Initial job status. Always 'queued' — the batch has been accepted and persisted, but the processing worker (BATCH2-01) is not yet active. The status will remain 'queued' until the worker ships."}},"type":"object","required":["id","status"],"title":"BatchSubmitResponse","description":"Response returned on successful batch submission (202 Accepted)."},"BriefingPaperResponse":{"properties":{"arxiv_id":{"type":"string","title":"Arxiv Id"},"title":{"type":"string","title":"Title"},"abstract":{"type":"string","title":"Abstract"},"authors":{"items":{"type":"string"},"type":"array","title":"Authors"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"primary_category":{"type":"string","title":"Primary Category"},"published_date":{"type":"string","format":"date-time","title":"Published Date"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"arxiv_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arxiv Url"},"id":{"type":"string","format":"uuid","title":"Id"},"has_code":{"type":"boolean","title":"Has Code","default":false},"github_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github Url"},"github_stars":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Stars"},"github_forks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Forks"},"last_commit_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Commit Date"},"github_stars_velocity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Github Stars Velocity"},"citation_count":{"type":"integer","title":"Citation Count","default":0},"code_links":{"items":{"$ref":"#/components/schemas/CodeLink"},"type":"array","title":"Code Links","default":[]},"code_links_total":{"type":"integer","title":"Code Links Total","default":0},"max_author_h_index":{"type":"integer","title":"Max Author H Index","default":0},"institution_tags":{"items":{"type":"string"},"type":"array","title":"Institution Tags","default":[]},"rank_score":{"type":"number","title":"Rank Score","default":0.0},"paper_quality":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Paper Quality"},"internal_citation_count":{"type":"integer","title":"Internal Citation Count","default":0},"impact_derivation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Impact Derivation"},"author_ids":{"items":{"type":"integer"},"type":"array","title":"Author Ids","default":[]},"author_openalex_ids":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Author Openalex Ids","default":[]},"is_liked":{"type":"boolean","title":"Is Liked","default":false},"is_saved":{"type":"boolean","title":"Is Saved","default":false},"is_read":{"type":"boolean","title":"Is Read","default":false},"note_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Text"},"citation_liked_count":{"type":"integer","title":"Citation Liked Count","default":0},"embedding":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Embedding"},"llm_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Summary"},"llm_significance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Significance"},"llm_novelty_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Novelty Score"},"llm_novelty_percentile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Novelty Percentile"},"unified_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unified Score"},"unified_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unified Pct"},"impact_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Pct"},"impact_badge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Badge"},"realized_weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Realized Weight"},"s2_tldr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S2 Tldr"},"rising_week":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rising Week"},"venue_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Name"},"venue_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Type"},"scoring_factors":{"anyOf":[{"$ref":"#/components/schemas/ScoringFactors"},{"type":"null"}]},"match":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Match"}},"type":"object","required":["arxiv_id","title","abstract","authors","categories","primary_category","published_date","id"],"title":"BriefingPaperResponse","description":"Paper response with LLM analysis context for daily briefing."},"BriefingResponse":{"properties":{"papers":{"items":{"$ref":"#/components/schemas/BriefingPaperResponse"},"type":"array","title":"Papers"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["papers","count"],"title":"BriefingResponse","description":"Daily briefing response."},"CategoriesRequest":{"properties":{"categories":{"items":{"type":"string"},"type":"array","maxItems":20,"minItems":1,"title":"Categories"}},"type":"object","required":["categories"],"title":"CategoriesRequest"},"CategoryCount":{"properties":{"category":{"type":"string","title":"Category"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["category","count"],"title":"CategoryCount"},"CheckoutRequest":{"properties":{"interval":{"type":"string","enum":["monthly","yearly"],"title":"Interval","default":"monthly"}},"type":"object","title":"CheckoutRequest","description":"Request body for /billing/checkout — selects the price tier."},"CitationEdge":{"properties":{"source_arxiv_id":{"type":"string","title":"Source Arxiv Id"},"target_arxiv_id":{"type":"string","title":"Target Arxiv Id"}},"type":"object","required":["source_arxiv_id","target_arxiv_id"],"title":"CitationEdge","description":"A directed citation edge: source_arxiv_id cites target_arxiv_id."},"CodeLink":{"properties":{"repo_url":{"type":"string","title":"Repo Url"},"is_official":{"type":"boolean","title":"Is Official","default":false},"framework":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework"}},"type":"object","required":["repo_url"],"title":"CodeLink","description":"A paper→code repository link (from Papers with Code archive, CC-BY-SA-4.0)."},"CollectionListResponse":{"properties":{"collections":{"items":{"$ref":"#/components/schemas/CollectionResponse"},"type":"array","title":"Collections"}},"type":"object","required":["collections"],"title":"CollectionListResponse","description":"List of user collections."},"CollectionRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"CollectionRequest","description":"Request to create or rename a collection."},"CollectionResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"paper_count":{"type":"integer","title":"Paper Count","default":0},"contains_paper":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Contains Paper"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","name","created_at","updated_at"],"title":"CollectionResponse","description":"A single collection with paper count."},"CompleteRequest":{"properties":{"liked_paper_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Liked Paper Ids"}},"type":"object","title":"CompleteRequest"},"CompleteResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"stats":{"additionalProperties":true,"type":"object","title":"Stats","default":{}}},"type":"object","required":["success"],"title":"CompleteResponse"},"ComputePreferencesResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"stats":{"$ref":"#/components/schemas/UserPreferencesResponse"}},"type":"object","required":["success","message","stats"],"title":"ComputePreferencesResponse","description":"Response after computing preferences."},"CouplingEdge":{"properties":{"source_arxiv_id":{"type":"string","title":"Source Arxiv Id"},"target_arxiv_id":{"type":"string","title":"Target Arxiv Id"},"coupling_score":{"type":"number","title":"Coupling Score"},"shared_ref_count":{"type":"integer","title":"Shared Ref Count"}},"type":"object","required":["source_arxiv_id","target_arxiv_id","coupling_score","shared_ref_count"],"title":"CouplingEdge","description":"A bibliographic coupling edge between two papers."},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"CreateApiKeyRequest"},"DigestStatusResponse":{"properties":{"subscribed":{"type":"boolean","title":"Subscribed"},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frequency"},"send_hour":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Send Hour"},"active":{"type":"boolean","title":"Active","default":false}},"type":"object","required":["subscribed"],"title":"DigestStatusResponse","description":"Current digest subscription status for the authenticated user."},"DigestSubscribeRequest":{"properties":{"frequency":{"type":"string","title":"Frequency","default":"weekly"},"send_hour":{"type":"integer","title":"Send Hour","default":8}},"type":"object","title":"DigestSubscribeRequest","description":"Request to subscribe to or update email digest settings."},"DiscoverResponse":{"properties":{"authors":{"items":{"$ref":"#/components/schemas/DiscoveredAuthor"},"type":"array","title":"Authors"},"query":{"type":"string","title":"Query"},"search_type":{"type":"string","title":"Search Type"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["authors","query","search_type","total"],"title":"DiscoverResponse","description":"Response from the author discovery endpoint."},"DiscoveredAuthor":{"properties":{"id":{"type":"integer","title":"Id"},"openalex_author_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Openalex Author Id"},"name":{"type":"string","title":"Name"},"h_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"H Index"},"total_papers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Papers"},"primary_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Field"},"recent_paper_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recent Paper Count"},"author_rank_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Author Rank Score"},"research_topics":{"items":{"type":"string"},"type":"array","title":"Research Topics","default":[]},"semantic_scholar_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Semantic Scholar Id"},"years_active":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Years Active"},"relevance_score":{"type":"number","title":"Relevance Score","default":0.0},"is_followed":{"type":"boolean","title":"Is Followed","default":false}},"type":"object","required":["id","name"],"title":"DiscoveredAuthor","description":"An author returned by semantic topic search."},"EmbedTextRequest":{"properties":{"text":{"type":"string","maxLength":8000,"minLength":1,"title":"Text","description":"Text to embed (1-8000 chars)."},"task_type":{"type":"string","enum":["RETRIEVAL_DOCUMENT","RETRIEVAL_QUERY"],"title":"Task Type","description":"Embedding task type. RETRIEVAL_DOCUMENT (default) matches paper-side embeddings for HyDE flows; RETRIEVAL_QUERY matches query-side semantic search.","default":"RETRIEVAL_DOCUMENT"}},"type":"object","required":["text"],"title":"EmbedTextRequest","description":"Request body for the embed_text endpoint (TOOL-02).\n\n`task_type` defaults to RETRIEVAL_DOCUMENT to match the paper-side embedding\nspace — this is the correct default for HyDE composition (an agent builds a\nhypothetical-document embedding then passes it back through other tools for\nhybrid retrieval). Use RETRIEVAL_QUERY for query-side semantic search."},"EmbeddingsBatchRequest":{"properties":{"arxiv_ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Arxiv Ids"}},"type":"object","required":["arxiv_ids"],"title":"EmbeddingsBatchRequest","description":"Request body for POST /papers/embeddings-batch.\n\nFetch raw 768-d embeddings for an arbitrary set of papers in one round-trip\n(used to compute pairwise cosine for the atlas focus-mode ego-graph layout).\nThe list is capped at MAX_EMBEDDINGS_BATCH (see papers router) to bound cost."},"EmbeddingsBatchResponse":{"properties":{"embeddings":{"items":{"$ref":"#/components/schemas/PaperEmbedding"},"type":"array","title":"Embeddings"}},"type":"object","required":["embeddings"],"title":"EmbeddingsBatchResponse","description":"Response for POST /papers/embeddings-batch.\n\nOne entry per requested arxiv_id that HAS a non-null embedding; arxiv_ids that\nare not found or have a NULL embedding are silently skipped. No order guarantee."},"FollowResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"action":{"type":"string","title":"Action"},"author_id":{"type":"integer","title":"Author Id"},"author_name":{"type":"string","title":"Author Name"}},"type":"object","required":["success","action","author_id","author_name"],"title":"FollowResponse"},"FollowedAuthor":{"properties":{"id":{"type":"integer","title":"Id"},"openalex_author_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Openalex Author Id"},"name":{"type":"string","title":"Name"},"h_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"H Index"},"total_papers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Papers"},"semantic_scholar_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Semantic Scholar Id"},"followed_at":{"type":"string","format":"date-time","title":"Followed At"}},"type":"object","required":["id","name","followed_at"],"title":"FollowedAuthor"},"FollowedAuthorsResponse":{"properties":{"followed_authors":{"items":{"$ref":"#/components/schemas/FollowedAuthor"},"type":"array","title":"Followed Authors"},"count":{"type":"integer","title":"Count"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"},"is_pro":{"type":"boolean","title":"Is Pro"},"grandfathered":{"type":"boolean","title":"Grandfathered","default":false}},"type":"object","required":["followed_authors","count","limit","is_pro"],"title":"FollowedAuthorsResponse"},"FoundationalPaperListResponse":{"properties":{"papers":{"items":{"$ref":"#/components/schemas/FoundationalPaperResponse"},"type":"array","title":"Papers"},"total":{"type":"integer","title":"Total"},"category_code":{"type":"string","title":"Category Code"},"category_name":{"type":"string","title":"Category Name"}},"type":"object","required":["papers","total","category_code","category_name"],"title":"FoundationalPaperListResponse","description":"Response envelope for GET /cache/foundational."},"FoundationalPaperResponse":{"properties":{"arxiv_id":{"type":"string","title":"Arxiv Id"},"title":{"type":"string","title":"Title"},"abstract":{"type":"string","title":"Abstract"},"authors":{"items":{"type":"string"},"type":"array","title":"Authors"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"primary_category":{"type":"string","title":"Primary Category"},"published_date":{"type":"string","format":"date-time","title":"Published Date"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"arxiv_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arxiv Url"},"id":{"type":"string","format":"uuid","title":"Id"},"has_code":{"type":"boolean","title":"Has Code","default":false},"github_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github Url"},"github_stars":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Stars"},"github_forks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Forks"},"last_commit_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Commit Date"},"github_stars_velocity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Github Stars Velocity"},"citation_count":{"type":"integer","title":"Citation Count","default":0},"code_links":{"items":{"$ref":"#/components/schemas/CodeLink"},"type":"array","title":"Code Links","default":[]},"code_links_total":{"type":"integer","title":"Code Links Total","default":0},"max_author_h_index":{"type":"integer","title":"Max Author H Index","default":0},"institution_tags":{"items":{"type":"string"},"type":"array","title":"Institution Tags","default":[]},"rank_score":{"type":"number","title":"Rank Score","default":0.0},"paper_quality":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Paper Quality"},"internal_citation_count":{"type":"integer","title":"Internal Citation Count","default":0},"impact_derivation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Impact Derivation"},"author_ids":{"items":{"type":"integer"},"type":"array","title":"Author Ids","default":[]},"author_openalex_ids":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Author Openalex Ids","default":[]},"is_liked":{"type":"boolean","title":"Is Liked","default":false},"is_saved":{"type":"boolean","title":"Is Saved","default":false},"is_read":{"type":"boolean","title":"Is Read","default":false},"note_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Text"},"citation_liked_count":{"type":"integer","title":"Citation Liked Count","default":0},"embedding":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Embedding"},"llm_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Summary"},"llm_significance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Significance"},"llm_novelty_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Novelty Score"},"llm_novelty_percentile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Novelty Percentile"},"unified_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unified Score"},"unified_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unified Pct"},"impact_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Pct"},"impact_badge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Badge"},"realized_weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Realized Weight"},"s2_tldr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S2 Tldr"},"rising_week":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rising Week"},"venue_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Name"},"venue_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Type"},"scoring_factors":{"anyOf":[{"$ref":"#/components/schemas/ScoringFactors"},{"type":"null"}]},"match":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Match"},"internal_citation_score":{"type":"number","title":"Internal Citation Score","default":0.0}},"type":"object","required":["arxiv_id","title","abstract","authors","categories","primary_category","published_date","id"],"title":"FoundationalPaperResponse","description":"Paper response for the foundational papers endpoint.\n\nExtends PaperResponse with corpus-internal citation signals."},"FulltextBatchRequest":{"properties":{"arxiv_ids":{"items":{"type":"string"},"type":"array","maxItems":8,"minItems":1,"title":"Arxiv Ids","description":"arXiv IDs to extract (max 8)."},"sections":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sections","description":"Sections to return for every paper: any of abstract, introduction, related_work, method, results, conclusion, or 'all'. Comma-separated or a list. REQUIRED when requesting more than one paper."}},"type":"object","required":["arxiv_ids"],"title":"FulltextBatchRequest","description":"Request body for batch full-text extraction."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"database":{"type":"string","title":"Database"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"db_query_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Db Query Ms"},"pool_active":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pool Active"},"pool_idle":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pool Idle"},"pool_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pool Max"},"pool_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pool Min"}},"type":"object","required":["status","database","timestamp"],"title":"HealthResponse","description":"Health check response."},"HeatmapDay":{"properties":{"date":{"type":"string","title":"Date"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["date","count"],"title":"HeatmapDay"},"InteractionRequest":{"properties":{"paper_id":{"type":"string","title":"Paper Id"}},"type":"object","required":["paper_id"],"title":"InteractionRequest","description":"Request to create/toggle an interaction.\n\npaper_id accepts EITHER the internal UUID (website) OR an arXiv ID\n(MCP / programmatic clients). Handlers resolve it via resolve_paper_uuid()."},"InteractionResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"action":{"type":"string","title":"Action"},"paper_id":{"type":"string","format":"uuid","title":"Paper Id"}},"type":"object","required":["success","action","paper_id"],"title":"InteractionResponse","description":"Response after interaction."},"InteractionStats":{"properties":{"reads":{"type":"integer","title":"Reads","default":0},"likes":{"type":"integer","title":"Likes","default":0},"saves":{"type":"integer","title":"Saves","default":0},"streak_days":{"type":"integer","title":"Streak Days","default":0},"collections_count":{"type":"integer","title":"Collections Count","default":0}},"type":"object","title":"InteractionStats"},"KeyExchangeRequest":{"properties":{"api_key":{"type":"string","maxLength":200,"minLength":8,"title":"Api Key"}},"type":"object","required":["api_key"],"title":"KeyExchangeRequest"},"KeyExchangeResponse":{"properties":{"action_link":{"type":"string","title":"Action Link"}},"type":"object","required":["action_link"],"title":"KeyExchangeResponse"},"MintTrialKeyRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Name","description":"API key label. Defaults to 'trial:<email>'."},"trial_days":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Trial Days","description":"Trial length in days (1-60, default 14).","default":14}},"type":"object","required":["email"],"title":"MintTrialKeyRequest"},"MintTrialKeyResponse":{"properties":{"email":{"type":"string","title":"Email"},"user_id":{"type":"string","title":"User Id"},"account":{"type":"string","title":"Account"},"api_key":{"type":"string","title":"Api Key"},"key_prefix":{"type":"string","title":"Key Prefix"},"tier":{"type":"string","title":"Tier"},"monthly_call_limit":{"type":"integer","title":"Monthly Call Limit"},"trial_days":{"type":"integer","title":"Trial Days"},"trial_expires_at":{"type":"string","title":"Trial Expires At"},"after_trial":{"type":"string","title":"After Trial"},"revoked_prior_keys":{"type":"integer","title":"Revoked Prior Keys"}},"type":"object","required":["email","user_id","account","api_key","key_prefix","tier","monthly_call_limit","trial_days","trial_expires_at","after_trial","revoked_prior_keys"],"title":"MintTrialKeyResponse"},"MissingPaperListResponse":{"properties":{"papers":{"items":{"$ref":"#/components/schemas/MissingPaperResponse"},"type":"array","title":"Papers"},"collection_size":{"type":"integer","title":"Collection Size"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["papers","collection_size","total"],"title":"MissingPaperListResponse","description":"Response for the 'What Am I Missing?' endpoint."},"MissingPaperResponse":{"properties":{"arxiv_id":{"type":"string","title":"Arxiv Id"},"title":{"type":"string","title":"Title"},"abstract":{"type":"string","title":"Abstract"},"authors":{"items":{"type":"string"},"type":"array","title":"Authors"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"primary_category":{"type":"string","title":"Primary Category"},"published_date":{"type":"string","format":"date-time","title":"Published Date"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"arxiv_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arxiv Url"},"id":{"type":"string","format":"uuid","title":"Id"},"has_code":{"type":"boolean","title":"Has Code","default":false},"github_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github Url"},"github_stars":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Stars"},"github_forks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Forks"},"last_commit_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Commit Date"},"github_stars_velocity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Github Stars Velocity"},"citation_count":{"type":"integer","title":"Citation Count","default":0},"code_links":{"items":{"$ref":"#/components/schemas/CodeLink"},"type":"array","title":"Code Links","default":[]},"code_links_total":{"type":"integer","title":"Code Links Total","default":0},"max_author_h_index":{"type":"integer","title":"Max Author H Index","default":0},"institution_tags":{"items":{"type":"string"},"type":"array","title":"Institution Tags","default":[]},"rank_score":{"type":"number","title":"Rank Score","default":0.0},"paper_quality":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Paper Quality"},"internal_citation_count":{"type":"integer","title":"Internal Citation Count","default":0},"impact_derivation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Impact Derivation"},"author_ids":{"items":{"type":"integer"},"type":"array","title":"Author Ids","default":[]},"author_openalex_ids":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Author Openalex Ids","default":[]},"is_liked":{"type":"boolean","title":"Is Liked","default":false},"is_saved":{"type":"boolean","title":"Is Saved","default":false},"is_read":{"type":"boolean","title":"Is Read","default":false},"note_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Text"},"citation_liked_count":{"type":"integer","title":"Citation Liked Count","default":0},"embedding":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Embedding"},"llm_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Summary"},"llm_significance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Significance"},"llm_novelty_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Novelty Score"},"llm_novelty_percentile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Novelty Percentile"},"unified_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unified Score"},"unified_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unified Pct"},"impact_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Pct"},"impact_badge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Badge"},"realized_weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Realized Weight"},"s2_tldr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S2 Tldr"},"rising_week":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rising Week"},"venue_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Name"},"venue_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Type"},"scoring_factors":{"anyOf":[{"$ref":"#/components/schemas/ScoringFactors"},{"type":"null"}]},"match":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Match"},"missing_score":{"type":"number","title":"Missing Score"},"shared_ref_count":{"type":"integer","title":"Shared Ref Count","default":0},"cited_by_collection":{"type":"integer","title":"Cited By Collection","default":0},"cites_collection":{"type":"integer","title":"Cites Collection","default":0}},"type":"object","required":["arxiv_id","title","abstract","authors","categories","primary_category","published_date","id","missing_score"],"title":"MissingPaperResponse","description":"Paper that a collection is missing, with explanation."},"MovePapersRequest":{"properties":{"paper_ids":{"items":{"type":"string"},"type":"array","maxItems":200,"minItems":1,"title":"Paper Ids"},"to_collection_id":{"type":"string","title":"To Collection Id"}},"type":"object","required":["paper_ids","to_collection_id"],"title":"MovePapersRequest","description":"Move a set of papers from this collection into another."},"MultiSeedRequest":{"properties":{"paper_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":50,"minItems":2,"title":"Paper Ids"},"days_limit":{"type":"integer","minimum":0.0,"title":"Days Limit","default":0},"limit":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Limit","default":20}},"type":"object","required":["paper_ids"],"title":"MultiSeedRequest","description":"Request body for multi-seed explore."},"MultiSeedResponse":{"properties":{"papers":{"items":{"$ref":"#/components/schemas/SimilarPaperResponse"},"type":"array","title":"Papers"},"edges":{"items":{"$ref":"#/components/schemas/UniverseEdge"},"type":"array","title":"Edges"},"citation_edges":{"items":{"$ref":"#/components/schemas/CitationEdge"},"type":"array","title":"Citation Edges","default":[]},"seeds":{"items":{"$ref":"#/components/schemas/SeedInfo"},"type":"array","title":"Seeds"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["papers","edges","seeds","total"],"title":"MultiSeedResponse","description":"Multi-seed explore results: merged similar papers from N seeds."},"NoteRequest":{"properties":{"note_text":{"type":"string","maxLength":5000,"minLength":1,"title":"Note Text"}},"type":"object","required":["note_text"],"title":"NoteRequest","description":"Request to create or update a note."},"NoteResponse":{"properties":{"id":{"type":"string","title":"Id"},"paper_id":{"type":"string","title":"Paper Id"},"note_text":{"type":"string","title":"Note Text"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","paper_id","note_text","created_at","updated_at"],"title":"NoteResponse","description":"A note on a paper."},"OnboardingResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message","default":""}},"type":"object","required":["success"],"title":"OnboardingResponse"},"PaperCollectionRequest":{"properties":{"paper_id":{"type":"string","title":"Paper Id"}},"type":"object","required":["paper_id"],"title":"PaperCollectionRequest","description":"Request to add a paper to a collection.\n\npaper_id accepts EITHER the internal UUID (website) OR an arXiv ID\n(MCP / programmatic clients). Handlers resolve it via resolve_paper_uuid()."},"PaperEmbedding":{"properties":{"arxiv_id":{"type":"string","title":"Arxiv Id"},"embedding":{"items":{"type":"number"},"type":"array","title":"Embedding"}},"type":"object","required":["arxiv_id","embedding"],"title":"PaperEmbedding","description":"One paper's raw embedding (parallel to PaperResponse.embedding, a List[float])."},"PaperListResponse":{"properties":{"papers":{"items":{"$ref":"#/components/schemas/PaperResponse"},"type":"array","title":"Papers"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["papers","total","page","limit","has_more"],"title":"PaperListResponse","description":"Paginated list of papers."},"PaperResponse":{"properties":{"arxiv_id":{"type":"string","title":"Arxiv Id"},"title":{"type":"string","title":"Title"},"abstract":{"type":"string","title":"Abstract"},"authors":{"items":{"type":"string"},"type":"array","title":"Authors"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"primary_category":{"type":"string","title":"Primary Category"},"published_date":{"type":"string","format":"date-time","title":"Published Date"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"arxiv_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arxiv Url"},"id":{"type":"string","format":"uuid","title":"Id"},"has_code":{"type":"boolean","title":"Has Code","default":false},"github_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github Url"},"github_stars":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Stars"},"github_forks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Forks"},"last_commit_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Commit Date"},"github_stars_velocity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Github Stars Velocity"},"citation_count":{"type":"integer","title":"Citation Count","default":0},"code_links":{"items":{"$ref":"#/components/schemas/CodeLink"},"type":"array","title":"Code Links","default":[]},"code_links_total":{"type":"integer","title":"Code Links Total","default":0},"max_author_h_index":{"type":"integer","title":"Max Author H Index","default":0},"institution_tags":{"items":{"type":"string"},"type":"array","title":"Institution Tags","default":[]},"rank_score":{"type":"number","title":"Rank Score","default":0.0},"paper_quality":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Paper Quality"},"internal_citation_count":{"type":"integer","title":"Internal Citation Count","default":0},"impact_derivation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Impact Derivation"},"author_ids":{"items":{"type":"integer"},"type":"array","title":"Author Ids","default":[]},"author_openalex_ids":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Author Openalex Ids","default":[]},"is_liked":{"type":"boolean","title":"Is Liked","default":false},"is_saved":{"type":"boolean","title":"Is Saved","default":false},"is_read":{"type":"boolean","title":"Is Read","default":false},"note_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Text"},"citation_liked_count":{"type":"integer","title":"Citation Liked Count","default":0},"embedding":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Embedding"},"llm_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Summary"},"llm_significance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Significance"},"llm_novelty_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Novelty Score"},"llm_novelty_percentile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Novelty Percentile"},"unified_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unified Score"},"unified_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unified Pct"},"impact_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Pct"},"impact_badge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Badge"},"realized_weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Realized Weight"},"s2_tldr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S2 Tldr"},"rising_week":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rising Week"},"venue_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Name"},"venue_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Type"},"scoring_factors":{"anyOf":[{"$ref":"#/components/schemas/ScoringFactors"},{"type":"null"}]},"match":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Match"}},"type":"object","required":["arxiv_id","title","abstract","authors","categories","primary_category","published_date","id"],"title":"PaperResponse","description":"Paper response with computed fields."},"PreviewPaper":{"properties":{"id":{"type":"string","title":"Id"},"arxiv_id":{"type":"string","title":"Arxiv Id"},"title":{"type":"string","title":"Title"},"authors":{"items":{},"type":"array","title":"Authors"},"primary_category":{"type":"string","title":"Primary Category"},"published_date":{"type":"string","title":"Published Date"},"llm_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Summary"},"similarity":{"type":"number","title":"Similarity"}},"type":"object","required":["id","arxiv_id","title","authors","primary_category","published_date","similarity"],"title":"PreviewPaper"},"ProfileAnalyticsResponse":{"properties":{"user":{"$ref":"#/components/schemas/UserInfo"},"stats":{"$ref":"#/components/schemas/InteractionStats"},"heatmap":{"items":{"$ref":"#/components/schemas/HeatmapDay"},"type":"array","title":"Heatmap"},"categories":{"items":{"$ref":"#/components/schemas/CategoryCount"},"type":"array","title":"Categories"},"scores":{"$ref":"#/components/schemas/ResearchScores"},"recent_activity":{"items":{"$ref":"#/components/schemas/RecentActivityItem"},"type":"array","title":"Recent Activity"}},"type":"object","required":["user","stats","heatmap","categories","scores","recent_activity"],"title":"ProfileAnalyticsResponse"},"RecentActivityItem":{"properties":{"type":{"type":"string","title":"Type"},"created_at":{"type":"string","title":"Created At"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"arxiv_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arxiv Id"},"primary_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Category"}},"type":"object","required":["type","created_at"],"title":"RecentActivityItem"},"RepoTrendingItem":{"properties":{"github_url":{"type":"string","title":"Github Url"},"github_stars":{"type":"integer","title":"Github Stars"},"github_stars_7d":{"type":"integer","title":"Github Stars 7D"},"github_stars_30d":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Stars 30D"},"accel":{"type":"integer","title":"Accel"},"spiking":{"type":"boolean","title":"Spiking"},"last_commit_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Commit Date"},"backlink_verified":{"type":"boolean","title":"Backlink Verified","default":true},"paper_count":{"type":"integer","title":"Paper Count","default":0},"papers":{"items":{"$ref":"#/components/schemas/RepoTrendingPaper"},"type":"array","title":"Papers","default":[]}},"type":"object","required":["github_url","github_stars","github_stars_7d","accel","spiking"],"title":"RepoTrendingItem","description":"One repo-grouped row for GET /home/trending-repos — the mid-tier-wedge surface.\n\nRanked by github_stars_7d DESC after a min_stars credibility floor + a star CEILING that drops\nframework giants + a hard backlink_verified gate (only official repos whose README back-links\nthe paper). accel = stars_7d - prior_7d (>= 50 => spiking). github_url is normalized (trailing\n\".git\" stripped) so the gaussian-splatting.git artifact groups correctly."},"RepoTrendingPaper":{"properties":{"arxiv_id":{"type":"string","title":"Arxiv Id"},"title":{"type":"string","title":"Title"},"published_date":{"type":"string","format":"date-time","title":"Published Date"},"unified_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unified Pct"},"impact_badge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Badge"},"realized_weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Realized Weight"}},"type":"object","required":["arxiv_id","title","published_date"],"title":"RepoTrendingPaper","description":"One paper attached to a trending repo (the nested array element).\n\nA deliberately thin projection — the trending-repos surface is about the REPO, so we carry\nonly enough paper identity to link out + show the magnitude badge. unified_pct is the SAME\ndisplayed magnitude badge PaperResponse surfaces (mig 142); this surface does NOT use\nimpact_pct (the per-CATEGORY percentile, paper-detail only)."},"RepoTrendingResponse":{"properties":{"repos":{"items":{"$ref":"#/components/schemas/RepoTrendingItem"},"type":"array","title":"Repos"},"generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated At"},"stale":{"type":"boolean","title":"Stale","default":false}},"type":"object","required":["repos"],"title":"RepoTrendingResponse","description":"Envelope for GET /home/trending-repos. `stale`/`generated_at` mirror the other home\nsurfaces (rising, trending-clusters) so the component can render nothing rather than error.\nServed live (no daily_cache row); generated_at reports the freshest velocity refresh."},"ResearchScores":{"properties":{"novelty_appetite":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Novelty Appetite"},"breadth_explored":{"type":"integer","title":"Breadth Explored","default":0},"breadth_total":{"type":"integer","title":"Breadth Total","default":0}},"type":"object","title":"ResearchScores"},"ResolveKeyRequest":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Verified `sub` from the OAuth access token (auth.users id)."},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Verified `email` claim, used to seed user_profiles + the JIT trial. Optional."}},"type":"object","required":["user_id"],"title":"ResolveKeyRequest"},"ResolveKeyResponse":{"properties":{"api_key":{"type":"string","title":"Api Key"},"key_prefix":{"type":"string","title":"Key Prefix"},"tier":{"type":"string","title":"Tier"},"minted":{"type":"boolean","title":"Minted"}},"type":"object","required":["api_key","key_prefix","tier","minted"],"title":"ResolveKeyResponse"},"ScoringFactors":{"properties":{"embedding_similarity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Embedding Similarity"},"recency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Recency"},"quality":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Quality"},"category_boost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Category Boost"},"author_boost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Author Boost"},"citation_boost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Citation Boost"}},"type":"object","title":"ScoringFactors","description":"Breakdown of personalized feed scoring components.\n\nEach field holds the weighted score contribution (weight * raw_signal),\nso they sum (excluding trend) to approximately the final_score.\nOnly populated for personalized feed results (TRST-02)."},"SeedImportRequest":{"properties":{"identifiers":{"items":{"type":"string"},"type":"array","title":"Identifiers"}},"type":"object","required":["identifiers"],"title":"SeedImportRequest"},"SeedImportResult":{"properties":{"imported":{"items":{"$ref":"#/components/schemas/SeedPaper"},"type":"array","title":"Imported"},"errors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Errors"}},"type":"object","required":["imported","errors"],"title":"SeedImportResult"},"SeedInfo":{"properties":{"id":{"type":"string","title":"Id"},"arxiv_id":{"type":"string","title":"Arxiv Id"},"title":{"type":"string","title":"Title"}},"type":"object","required":["id","arxiv_id","title"],"title":"SeedInfo","description":"Metadata about a seed paper for graph labeling."},"SeedListResponse":{"properties":{"seeds":{"items":{"$ref":"#/components/schemas/SeedPaper"},"type":"array","title":"Seeds"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["seeds","count"],"title":"SeedListResponse"},"SeedPaper":{"properties":{"id":{"type":"string","title":"Id"},"arxiv_id":{"type":"string","title":"Arxiv Id"},"title":{"type":"string","title":"Title"},"authors":{"items":{"type":"string"},"type":"array","title":"Authors"},"published_date":{"type":"string","title":"Published Date"},"embedding_status":{"type":"string","title":"Embedding Status"}},"type":"object","required":["id","arxiv_id","title","authors","published_date","embedding_status"],"title":"SeedPaper"},"SimilarPaperListResponse":{"properties":{"papers":{"items":{"$ref":"#/components/schemas/SimilarPaperResponse"},"type":"array","title":"Papers"},"edges":{"anyOf":[{"items":{"$ref":"#/components/schemas/UniverseEdge"},"type":"array"},{"type":"null"}],"title":"Edges"},"coupling_edges":{"items":{"$ref":"#/components/schemas/CouplingEdge"},"type":"array","title":"Coupling Edges","default":[]},"citation_edges":{"items":{"$ref":"#/components/schemas/CitationEdge"},"type":"array","title":"Citation Edges","default":[]},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["papers","total","page","limit","has_more"],"title":"SimilarPaperListResponse","description":"Paginated envelope for the /similar endpoint."},"SimilarPaperResponse":{"properties":{"arxiv_id":{"type":"string","title":"Arxiv Id"},"title":{"type":"string","title":"Title"},"abstract":{"type":"string","title":"Abstract"},"authors":{"items":{"type":"string"},"type":"array","title":"Authors"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"primary_category":{"type":"string","title":"Primary Category"},"published_date":{"type":"string","format":"date-time","title":"Published Date"},"pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Url"},"arxiv_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arxiv Url"},"id":{"type":"string","format":"uuid","title":"Id"},"has_code":{"type":"boolean","title":"Has Code","default":false},"github_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github Url"},"github_stars":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Stars"},"github_forks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Forks"},"last_commit_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Commit Date"},"github_stars_velocity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Github Stars Velocity"},"citation_count":{"type":"integer","title":"Citation Count","default":0},"code_links":{"items":{"$ref":"#/components/schemas/CodeLink"},"type":"array","title":"Code Links","default":[]},"code_links_total":{"type":"integer","title":"Code Links Total","default":0},"max_author_h_index":{"type":"integer","title":"Max Author H Index","default":0},"institution_tags":{"items":{"type":"string"},"type":"array","title":"Institution Tags","default":[]},"rank_score":{"type":"number","title":"Rank Score","default":0.0},"paper_quality":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Paper Quality"},"internal_citation_count":{"type":"integer","title":"Internal Citation Count","default":0},"impact_derivation":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Impact Derivation"},"author_ids":{"items":{"type":"integer"},"type":"array","title":"Author Ids","default":[]},"author_openalex_ids":{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array","title":"Author Openalex Ids","default":[]},"is_liked":{"type":"boolean","title":"Is Liked","default":false},"is_saved":{"type":"boolean","title":"Is Saved","default":false},"is_read":{"type":"boolean","title":"Is Read","default":false},"note_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Text"},"citation_liked_count":{"type":"integer","title":"Citation Liked Count","default":0},"embedding":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Embedding"},"llm_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Summary"},"llm_significance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Significance"},"llm_novelty_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Novelty Score"},"llm_novelty_percentile":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Novelty Percentile"},"unified_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unified Score"},"unified_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unified Pct"},"impact_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Pct"},"impact_badge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Badge"},"realized_weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Realized Weight"},"s2_tldr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S2 Tldr"},"rising_week":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rising Week"},"venue_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Name"},"venue_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Type"},"scoring_factors":{"anyOf":[{"$ref":"#/components/schemas/ScoringFactors"},{"type":"null"}]},"match":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Match"},"similarity_score":{"type":"number","title":"Similarity Score"},"coupling_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Coupling Score"},"shared_ref_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shared Ref Count"},"is_direct_citation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Direct Citation"}},"type":"object","required":["arxiv_id","title","abstract","authors","categories","primary_category","published_date","id","similarity_score"],"title":"SimilarPaperResponse","description":"Paper response with cosine similarity score for /similar endpoint results."},"UniverseEdge":{"properties":{"source_arxiv_id":{"type":"string","title":"Source Arxiv Id"},"target_arxiv_id":{"type":"string","title":"Target Arxiv Id"},"similarity_score":{"type":"number","title":"Similarity Score"}},"type":"object","required":["source_arxiv_id","target_arxiv_id","similarity_score"],"title":"UniverseEdge","description":"An edge between two papers in the research universe graph."},"UniverseResponse":{"properties":{"papers":{"items":{"$ref":"#/components/schemas/SimilarPaperResponse"},"type":"array","title":"Papers"},"edges":{"items":{"$ref":"#/components/schemas/UniverseEdge"},"type":"array","title":"Edges"},"citation_edges":{"items":{"$ref":"#/components/schemas/CitationEdge"},"type":"array","title":"Citation Edges","default":[]},"total":{"type":"integer","title":"Total"}},"type":"object","required":["papers","edges","total"],"title":"UniverseResponse","description":"Personal research universe: papers near user's preference embedding + inter-paper edges."},"UserInfo":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","title":"UserInfo"},"UserPreferencesResponse":{"properties":{"preferred_categories":{"items":{"type":"string"},"type":"array","title":"Preferred Categories","default":[]},"total_likes":{"type":"integer","title":"Total Likes","default":0},"total_saves":{"type":"integer","title":"Total Saves","default":0},"total_skips":{"type":"integer","title":"Total Skips","default":0},"has_preference_embedding":{"type":"boolean","title":"Has Preference Embedding","default":false}},"type":"object","title":"UserPreferencesResponse","description":"User preference summary."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WatchCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"novelty_min":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Novelty Min","default":0.5},"seed":{"$ref":"#/components/schemas/WatchSeed"}},"type":"object","required":["name","seed"],"title":"WatchCreateRequest"},"WatchListResponse":{"properties":{"watches":{"items":{"$ref":"#/components/schemas/WatchResponse"},"type":"array","title":"Watches"},"limit":{"type":"integer","title":"Limit"},"is_pro":{"type":"boolean","title":"Is Pro"}},"type":"object","required":["watches","limit","is_pro"],"title":"WatchListResponse"},"WatchPreviewRequest":{"properties":{"criteria":{"additionalProperties":true,"type":"object","title":"Criteria"},"match":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match"},"recency_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recency Days"}},"type":"object","required":["criteria"],"title":"WatchPreviewRequest","description":"Dry-run a v2 filter spec over the recent window — no watch is created."},"WatchResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"summary":{"type":"string","title":"Summary"},"novelty_min":{"type":"number","title":"Novelty Min"},"seed":{"additionalProperties":true,"type":"object","title":"Seed"},"last_evaluated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Evaluated At"},"pending_hits":{"type":"integer","title":"Pending Hits","default":0}},"type":"object","required":["id","name","summary","novelty_min","seed"],"title":"WatchResponse"},"WatchSeed":{"properties":{"kind":{"type":"string","title":"Kind"},"q":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"},"collection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection Id"},"collection_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection Name"},"anchor_paper_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anchor Paper Id"},"scope_to_citations_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope To Citations Of"},"author_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Id"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"criteria":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Criteria"},"match":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match"},"recency_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recency Days"}},"type":"object","required":["kind"],"title":"WatchSeed","description":"The stored search_papers query. Exactly one selector, keyed by kind."},"WatchUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"novelty_min":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Novelty Min"},"seed":{"anyOf":[{"$ref":"#/components/schemas/WatchSeed"},{"type":"null"}]}},"type":"object","title":"WatchUpdateRequest","description":"Partial update: any omitted field is left unchanged. A new `seed` replaces the\nwatch definition (re-validated/re-resolved) and clears its pending hits."},"api__routers__batches__BatchStatusResponse":{"properties":{"id":{"type":"string","title":"Id","description":"UUID of the batch job."},"status":{"type":"string","title":"Status","description":"Current job lifecycle status: queued | running | completed | failed | cancelled | expired. For the foreseeable future status will remain 'queued' because the processing worker (BATCH2-01) is not yet active — submitted batches are not processed until the worker ships."},"request_counts":{"additionalProperties":true,"type":"object","title":"Request Counts","description":"Running operation counts: {total, completed, failed}. Reflects the submitted operation count; completed/failed update as the worker progresses (worker not yet active)."},"results":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Results","description":"Per-operation results array populated by the worker on completion. Null until status='completed'. Stored in the results JSONB column on batch_jobs — no external object storage."},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At","description":"ISO8601 timestamp when the job was created."},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At","description":"ISO8601 timestamp when a worker claimed the job (queued → running). Null until claimed."},"finished_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Finished At","description":"ISO8601 timestamp when the job reached a terminal status. Null until terminal."},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"ISO8601 timestamp when results may be evicted by a sweep job. Null = no expiry set."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Terminal failure detail. Set when status='failed' or 'expired'. Null otherwise."}},"type":"object","required":["id","status","request_counts"],"title":"BatchStatusResponse","description":"Response from GET /v1/batches/{batch_id} — current job state."},"api__routers__interactions__BatchStatusResponse":{"properties":{"liked":{"items":{"type":"string"},"type":"array","title":"Liked"},"saved":{"items":{"type":"string"},"type":"array","title":"Saved"},"viewed":{"items":{"type":"string"},"type":"array","title":"Viewed","default":[]}},"type":"object","required":["liked","saved"],"title":"BatchStatusResponse"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}