{"openapi":"3.1.0","info":{"title":"SEO Knowledge Graph","description":"Knowledge bank optimized for search, combining entity data with SEO metrics","version":"0.1.0"},"paths":{"/api/minted/stats":{"get":{"tags":["living-edge"],"summary":"Minted Stats","description":"Mint-rate aggregates for ENTITIES. `per_hour` is 24 buckets, oldest -> newest, with\nempty hours present as 0 so the client can plot without gap-filling.\n\nA list endpoint cannot answer this: /api/minted caps at 200 rows, so at the observed\nrate that window is well under 24h.","operationId":"minted_stats_api_minted_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Minted Stats Api Minted Stats Get"}}}}}}},"/api/minted/facts":{"get":{"tags":["living-edge"],"summary":"Minted Facts","description":"Same shape as /api/minted/stats, counting CLAIMS instead of entities.\n\nExists because entities alone under-report liveness: measured 2026-09-02, 362 entities\nagainst 4,592 claims in the same 24h — 12x. A tile reading 362 with a 1/hour daytime\ntrough looks dead while the lane is busy.","operationId":"minted_facts_api_minted_facts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Minted Facts Api Minted Facts Get"}}}}}}},"/api/v1/entities/recent-edits":{"get":{"tags":["v1"],"summary":"Recent Edits","description":"Newest Wikidata edits to entities we hold, newest first.\n\nNSFW passes through `is_adult_entity` — the single chokepoint (see\n`app/services/content_safety.py`). This is a public list surface, so it filters\nlike every other one; we over-fetch and trim so filtering cannot short the page.","operationId":"recent_edits_api_v1_entities_recent_edits_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO timestamp; only edits after it","title":"Since"},"description":"ISO timestamp; only edits after it"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Recent Edits Api V1 Entities Recent Edits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/launches/upcoming":{"get":{"tags":["v1-launches"],"summary":"Upcoming rocket launches (Launch Library 2 via the 4ort lake)","description":"Future orbital launches ordered by NET (UTC), with provider, rocket, pad, country, status,\nmission type and orbit. `as_of` / `stale` state the capture's freshness; `attribution` is the\nApache-2.0 credit line to show with the data.","operationId":"launches_upcoming_api_v1_launches_upcoming_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetUpcomingLaunchesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/galaxy/brain":{"get":{"tags":["v1-galaxy"],"summary":"Galaxy brain: live signals across 4ort, one object per region","description":"Crawler (eyes), news (ears), Wikipedia attention, knowledge-graph growth (memory), fact\nverification (reasoning), the data lake (deep_memory), the next launch (mission_control),\nthe trust-and-safety patrol (immune) and 4ort.live (voice). Counts and public-safe labels\nonly. Rebuilt every minute; each region carries `ok` and `updated_at`, and a failed region\nis `ok: false`, never an error response.","operationId":"galaxy_brain_api_v1_galaxy_brain_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetGalaxyBrainOut"}}}}}}},"/api/v1/galaxy/brain/stream":{"get":{"tags":["v1-galaxy"],"summary":"Galaxy brain as Server-Sent Events","description":"`event: brain` carries the same JSON as GET /api/v1/galaxy/brain, sent on connect and\nwhenever a new snapshot is built (about once a minute). Comment pings every 15 s.","operationId":"galaxy_brain_stream_api_v1_galaxy_brain_stream_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/entities/{key}":{"get":{"tags":["v1"],"summary":"Get Entity","description":"Return a single entity by slug, UUID, or Wikidata Q-id.\n\nThe response carries two parallel views of the same underlying data:\n\n* **Legacy curated views** (`facts`, `relationships`, `recent_edits`,\n  `popularity`) — controlled by `?detail=tiny|small|medium|full`. These\n  flatten claims_rich into 5-field facts and lose qualifier/reference\n  fidelity. Kept for backwards compatibility with MCP and existing\n  clients.\n\n* **Envelope blocks** (`claims_raw`, `product_meta`, `music_meta`,\n  `relationships_directed`, `pageviews_series`, `changelog`, `citations`,\n  `licenses`, `meta`) — controlled by `?include=...`. Raw Wikidata-shape\n  passthrough with full fidelity. Resolve P-codes via `/api/v1/properties`\n  and Q-IDs via `/api/v1/items`.\n\nResponses carry an `ETag` and `Cache-Control: max-age=300`. Clients that\necho the validator via `If-None-Match` get a 304 short-circuit when the\nserved facts and rights haven't changed since their last fetch. Delivery\ntimestamps and attention/history blocks do not invalidate this weak validator;\nfetch without If-None-Match when those metrics must be refreshed.\n\nA new client should rely on the envelope blocks and ignore the legacy\nfacts/relationships — they'll be deprecated together in v2.","operationId":"get_entity_api_v1_entities__key__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"detail","in":"query","required":false,"schema":{"enum":["tiny","small","medium","full"],"type":"string","description":"Legacy response-size tier (controls the curated facts/relationships/recent_edits/popularity views). For envelope blocks use `include`.","default":"medium","title":"Detail"},"description":"Legacy response-size tier (controls the curated facts/relationships/recent_edits/popularity views). For envelope blocks use `include`."},{"name":"include","in":"query","required":false,"schema":{"type":"string","description":"Comma-separated envelope blocks to include. Defaults to `raw,product,music,licenses,meta` (cheap blocks already in DB). Pass `all` for everything (adds pageviews_series, changelog, citations, relationships_directed — each costs an extra query). Pass `none` to skip the envelope entirely (legacy-only response, smallest payload). Known tokens: changelog, citations, licenses, meta, mint_statements, music, pageviews_series, product, raw, relationships_directed","title":"Include"},"description":"Comma-separated envelope blocks to include. Defaults to `raw,product,music,licenses,meta` (cheap blocks already in DB). Pass `all` for everything (adds pageviews_series, changelog, citations, relationships_directed — each costs an extra query). Pass `none` to skip the envelope entirely (legacy-only response, smallest payload). Known tokens: changelog, citations, licenses, meta, mint_statements, music, pageviews_series, product, raw, relationships_directed"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/entities/bulk":{"post":{"tags":["v1"],"summary":"Get Entities Bulk","description":"Fetch up to 100 entities in one round-trip.\n\nSame shape as `GET /entities/{key}` but takes a list of keys (slug, UUID,\nor Q-id — mixable). `detail` and `include` apply uniformly across every\nentity in the batch. Missing keys land in `not_found`; resolved keys land\nin `entities` keyed by the EXACT input string the caller sent.\n\nWhy POST: a 100-key GET URL is ~3 KB which trips picky CDNs and proxies.\nPOST also lets us version the request schema cleanly.\n\nNot cached — bulk responses are too cross-cutting to ETag reliably.\nFor single-entity caching prefer `GET /entities/{key}`.","operationId":"get_entities_bulk_api_v1_entities_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1EntityBulkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1EntityBulkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/match":{"get":{"tags":["v1"],"summary":"Match Get","description":"Resolve a string to its canonical knowledge-graph entity (GET form).\n\nSymmetric with `/search` — pass `?text=Apple&entity_types=company`. The\nPOST form is preserved for backwards compatibility but the GET form is\ncanonical going forward (cacheable, idempotent, friendlier to CDN).","operationId":"match_get_api_v1_match_get","parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":500,"description":"Natural-language string to resolve to an entity, e.g. 'Apple'","title":"Text"},"description":"Natural-language string to resolve to an entity, e.g. 'Apple'"},{"name":"entity_types","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated entity types to filter to (e.g. 'company,person')","title":"Entity Types"},"description":"Comma-separated entity types to filter to (e.g. 'company,person')"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":25,"minimum":1,"default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1MatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["v1"],"summary":"Match Post","description":"Resolve a string to its canonical knowledge-graph entity (POST form,\nlegacy). Prefer GET — see `match_get` above.","operationId":"match_post_api_v1_match_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1MatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1MatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/popularity/{key}":{"get":{"tags":["v1"],"summary":"Entity Popularity","description":"Wikipedia-pageview-derived 'real-world search volume' for an entity.\n\n**DEPRECATED** — this data is now part of the entity envelope. Prefer\n`GET /api/v1/entities/{key}?include=pageviews_series` which returns the\nsame time series alongside the rest of the entity record. This endpoint\nwill be removed in v2.\n\nDrop-in alternative to Google Keyword Planner / Ahrefs / SEMrush monthly\nvolume — measured (not modeled), CC0-licensed, free to query. Returns\ncurrent monthly volume, 12-month trend, 30-day daily trend, direction +\nYoY change, country breakdown, and rank within domain.","operationId":"entity_popularity_api_v1_popularity__key__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Popularity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/entities/{key}/article-context":{"get":{"tags":["v1"],"summary":"Entity Article Context","description":"Fat bundle for SEO writers — replaces 5-7 separate calls.\n\nCombines a medium-detail entity card, ranked facts, every external\ncitation URL, recent Wikidata edits, top connections, trending\nsignals (velocity / direction / yoy / edit count / domain rank),\nand 3-5 LLM-synthesized writing hooks. Cached 5 min in Redis.\n\nCitations preserve their original external URLs — never rewritten.","operationId":"entity_article_context_api_v1_entities__key__article_context_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1ArticleContext"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/entities/{key}/agent-context":{"get":{"tags":["v1"],"summary":"Entity Agent Context","description":"Memory-bank bundle for autonomous agents.\n\nDifferent shape than article-context: facts grouped by predicate,\nkey_actors (people connected via P169/P112/P50/P175 etc.),\nworld_context (country, domain rank, monthly views), short + long\nsummaries. `music_meta` and `book_meta` are stubs reserved for\nTrack B (MusicBrainz / Open Library). Cached 5 min in Redis.\n\nPrivacy boundary: this endpoint exposes biographical FACTS about\nreal people connected to the entity (e.g. CEO/founder/author) but\ndoes NOT package real people as agent personas or behavioral\nprofiles.","operationId":"entity_agent_context_api_v1_entities__key__agent_context_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1AgentContext"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trending":{"get":{"tags":["v1"],"summary":"Trending","description":"Top entities by raw Wikipedia pageviews in the window.\n\nRanking is by **observed view count** in the time window — same number\na customer would calculate manually from the pageviews data. No opaque\n\"trending score\" reorders the list.\n\nSlicing: combine `country` + `category` to drill in\n(e.g. `?period=hour&country=DE&category=public_company`).\n\nThe response includes a side `velocity_score` field per entity (views\nvs that entity's hourly average from monthly_pageviews) for\n\"is this surprising?\" context — but it never reorders the leaderboard.\n\nSub-millisecond reads — backed by Redis sorted sets maintained live\nfrom the pageview NOTIFY stream (see `seokg-trending-aggregator.service`).","operationId":"trending_api_v1_trending_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(hour|day)$","description":"Time window: 'hour' (last completed hour) or 'day' (rolling 24h). Both are sub-ms reads from a live Redis aggregator that's fed by the same NOTIFY firehose the /pageviews/stream uses.","default":"hour","title":"Period"},"description":"Time window: 'hour' (last completed hour) or 'day' (rolling 24h). Both are sub-ms reads from a live Redis aggregator that's fed by the same NOTIFY firehose the /pageviews/stream uses."},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-2 country code (US, DE, JP, ...) — slices to entities tagged with that country in Wikidata (P17). Pass empty / omit for global.","title":"Country"},"description":"ISO-2 country code (US, DE, JP, ...) — slices to entities tagged with that country in Wikidata (P17). Pass empty / omit for global."},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"harvest_domain to slice by (e.g. 'human', 'public_company', 'software'). Pass empty / omit for cross-category.","title":"Category"},"description":"harvest_domain to slice by (e.g. 'human', 'public_company', 'software'). Pass empty / omit for cross-category."},{"name":"rank_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(views|velocity|novelty)$","description":"How to rank the leaderboard. `views` (default): raw view count in window — what's literally most-read. `velocity`: views ÷ entity baseline — what's *surprisingly* high. `novelty`: filters out chronically-popular entries, then ranks by velocity. The 'truth source we do not hide' principle: chronic-popular entries stay visible by default with an `is_chronically_popular` flag + explanation.","default":"views","title":"Rank By"},"description":"How to rank the leaderboard. `views` (default): raw view count in window — what's literally most-read. `velocity`: views ÷ entity baseline — what's *surprisingly* high. `novelty`: filters out chronically-popular entries, then ranks by velocity. The 'truth source we do not hide' principle: chronic-popular entries stay visible by default with an `is_chronically_popular` flag + explanation."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"hours","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":168,"minimum":1},{"type":"null"}],"description":"DEPRECATED. Map 1 → period='hour', anything else → period='day'. Use `period` going forward.","title":"Hours"},"description":"DEPRECATED. Map 1 → period='hour', anything else → period='day'. Use `period` going forward."},{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"DEPRECATED alias for `category`.","title":"Domain"},"description":"DEPRECATED alias for `category`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1TrendingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/tools":{"get":{"tags":["v1-knowledge"],"summary":"Knowledge-tool contract (MCP + REST)","description":"The contract every knowledge surface is generated from: name, description, input and\noutput JSON Schema, MCP annotations and REST path per tool, plus the contract's sha256 (the\nMCP server embeds the same hash, so a client can prove both doors speak one contract).","operationId":"knowledge_tools_api_v1_knowledge_tools_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/knowledge/get_entity_packet":{"get":{"tags":["v1-knowledge"],"summary":"Get evidence packets","description":"Facts about one or more known things (people, companies, places, works, products) with per-fact citation: source dataset, source record URL, edition, licence and required credit line, qualifiers (start/end dates, roles), a reference-support band, and explicit unknowns. Use it for any factual question about a named entity ('when was X born', 'who is the CEO of Y', 'population of Z'), including several entities at once to compare them. Accepts names, so you do not need resolve_entity first. Pass `fields` to get only the properties you need.","operationId":"knowledge_get_entity_packet_api_v1_knowledge_get_entity_packet_get","parameters":[{"name":"entities","in":"query","required":true,"schema":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":10,"description":"1 to 10 entities: an entity_id (slug), a Wikidata Q-id, a 4ort UUID, or a plain name (resolved to the best match; the resolution is reported)","title":"Entities"},"description":"1 to 10 entities: an entity_id (slug), a Wikidata Q-id, a 4ort UUID, or a plain name (resolved to the best match; the resolution is reported)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"},"maxItems":30},{"type":"null"}],"description":"Only these properties: P-codes ('P569') or English property labels ('date of birth', 'population'). Omit for the entity's main facts. A field we do not hold comes back in unknowns with its reason","title":"Fields"},"description":"Only these properties: P-codes ('P569') or English property labels ('date of birth', 'population'). Omit for the entity's main facts. A field we do not hold comes back in unknowns with its reason"},{"name":"max_facts","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":1,"description":"Upper bound on facts per entity (size bound)","default":30,"title":"Max Facts"},"description":"Upper bound on facts per entity (size bound)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEntityPacketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/search_knowledge":{"get":{"tags":["v1-knowledge"],"summary":"Search the knowledge graph and index","description":"Open-ended question or topic search. Returns the evidence packet of the entity the query is about (when there is one), web pages from the 4ort index, and the top destinations to fetch next. Use it when the question is not about one named entity you can pass to get_entity_packet, or when you also want pages. status 'no_coverage' means use another provider.","operationId":"knowledge_search_knowledge_api_v1_knowledge_search_knowledge_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"A question or topic in natural language, e.g. 'who founded Anthropic'","title":"Query"},"description":"A question or topic in natural language, e.g. 'who founded Anthropic'"},{"name":"limit_pages","in":"query","required":false,"schema":{"type":"integer","maximum":15,"minimum":0,"description":"Web pages from the 4ort index to include","default":5,"title":"Limit Pages"},"description":"Web pages from the 4ort index to include"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchKnowledgeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/resolve_entity":{"get":{"tags":["v1-knowledge"],"summary":"Resolve a name to entities","description":"List the entities a name could mean, with ids, descriptions and a confidence. Use it only to disambiguate ('which Mercury?', 'list entities called Paris') or to get an entity_id; for facts call get_entity_packet directly.","operationId":"knowledge_resolve_entity_api_v1_knowledge_resolve_entity_get","parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"A name or phrase to resolve, e.g. 'Mercury' or 'Apple Inc'","title":"Name"},"description":"A name or phrase to resolve, e.g. 'Mercury' or 'Apple Inc'"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"description":"Candidates to return","default":5,"title":"Limit"},"description":"Candidates to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveEntityOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/find_routes":{"get":{"tags":["v1-knowledge"],"summary":"Find where to look something up","description":"Destinations for a task: official sites, registries, APIs and site search URLs, ranked, each with its kind and licence. Use it to answer 'where can I look up / which API / which official site'. A route is where to fetch next, not evidence of the answer.","operationId":"knowledge_find_routes_api_v1_knowledge_find_routes_get","parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"What you want to look up or do, e.g. 'company registry Estonia' or 'weather API'","title":"Query"},"description":"What you want to look up or do, e.g. 'company registry Estonia' or 'weather API'"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":8,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindRoutesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/get_entity_changes":{"get":{"tags":["v1-knowledge"],"summary":"Recent changes to an entity","description":"Edits to one entity's source record (Wikidata), newest first, with the properties each edit touched, plus a cursor to poll for newer ones. Use it for 'what changed about X', 'was X updated since <date>', or to know when cached facts went stale.","operationId":"knowledge_get_entity_changes_api_v1_knowledge_get_entity_changes_get","parameters":[{"name":"entity","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"entity_id, Q-id, UUID or name of ONE entity","title":"Entity"},"description":"entity_id, Q-id, UUID or name of ONE entity"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only changes at or after this UTC date/time, e.g. '2026-10-01'","title":"Since"},"description":"Only changes at or after this UTC date/time, e.g. '2026-10-01'"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetEntityChangesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/why_trending":{"get":{"tags":["v1-knowledge"],"summary":"What is trending and why","description":"Entities trending right now on Wikipedia by language edition, each with its pageview spike against baseline and 3 to 5 knowledge-graph-resolved news items that explain it (status news or organic). Use it for 'what is trending', 'why is X in the news today'. Needs your 4ort.xyz API key (free tier works).","operationId":"knowledge_why_trending_api_v1_knowledge_why_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["person","org","place","work","event"],"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Wikipedia edition: en, de, fr, es, it, ja, ru, pt, or all","default":"en","title":"Lang"},"description":"Wikipedia edition: en, de, fr, es, it, ja, ru, pt, or all"},{"name":"include_unexplained","in":"query","required":false,"schema":{"type":"boolean","description":"Also list trending entities without at least 3 verified news items","default":false,"title":"Include Unexplained"},"description":"Also list trending entities without at least 3 verified news items"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhyTrendingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/get_attention":{"get":{"tags":["v1-knowledge"],"summary":"Attention over time for an entity","description":"Wikipedia pageviews for one entity as a time series (48 h hourly, 30 d daily or 12 months monthly), its change across the period, and views per language. Use it for 'how popular is X', 'is interest in X rising', 'monthly views of X'.","operationId":"knowledge_get_attention_api_v1_knowledge_get_attention_get","parameters":[{"name":"entity","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"entity_id, Q-id, UUID or name of ONE entity","title":"Entity"},"description":"entity_id, Q-id, UUID or name of ONE entity"},{"name":"period","in":"query","required":false,"schema":{"enum":["48h","30d","12m"],"type":"string","description":"48h: hourly points; 30d: daily points; 12m: monthly points","default":"30d","title":"Period"},"description":"48h: hourly points; 30d: daily points; 12m: monthly points"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetAttentionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/get_source_info":{"get":{"tags":["v1-knowledge"],"summary":"Licence and terms of a data source","description":"The licence, required credit line, redistribution and resale status of a dataset 4ort serves (Wikidata, GeoNames, GLEIF, SEC EDGAR, ...). Use it for 'can I reuse / redistribute facts from X', 'what licence is source Y', 'how must I credit Z'. Packets already carry the licence per fact; this explains a source.","operationId":"knowledge_get_source_info_api_v1_knowledge_get_source_info_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"type":"string","maxLength":100,"description":"Source key or name, e.g. 'wikidata', 'geonames', 'GLEIF'. Empty lists every source","default":"","title":"Source"},"description":"Source key or name, e.g. 'wikidata', 'geonames', 'GLEIF'. Empty lists every source"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSourceInfoOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/get_upcoming_launches":{"get":{"tags":["v1-knowledge"],"summary":"Upcoming rocket launches","description":"The next scheduled orbital launches worldwide, soonest first: rocket, provider, pad and country, NET (no-earlier-than, UTC) with its precision, status, mission type and orbit. Use it for 'when is the next launch', 'upcoming SpaceX launches', 'what launches this week'. From Launch Library 2 (Apache-2.0) via the 4ort lake; `as_of` and `stale` say how fresh the capture is.","operationId":"knowledge_get_upcoming_launches_api_v1_knowledge_get_upcoming_launches_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"How many launches, soonest first","default":10,"title":"Limit"},"description":"How many launches, soonest first"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetUpcomingLaunchesOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/get_galaxy_brain":{"get":{"tags":["v1-knowledge"],"summary":"Galaxy brain: live signals","description":"One live snapshot of the whole 4ort galaxy, one object per brain region: crawler pages fetched (eyes), news ingested and latest headlines (ears), top Wikipedia attention with why (attention), knowledge-graph size and growth today plus the Wikidata edit rate (memory), facts verified into the served tier (reasoning), the data lake's size and newest landing (deep_memory), the next rocket launch (mission_control), the trust-and-safety patrol state (immune) and what 4ort.live is playing (voice). Use it for 'what is happening across 4ort right now'. Rebuilt every minute; each region has ok and updated_at.","operationId":"knowledge_get_galaxy_brain_api_v1_knowledge_get_galaxy_brain_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetGalaxyBrainOut"}}}}}}},"/api/v1/entities/{key}/packet":{"get":{"tags":["v1-knowledge"],"summary":"Evidence packet for one entity","description":"One entity's facts with per-field source, edition, licence, credit line, qualifiers,\nreference-support band and explicit unknowns. Same builder as the `get_entity_packet` tool.\nWeak ETag over the body; the body holds no delivery time, so unchanged facts revalidate\nto a free 304 with If-None-Match.","operationId":"entity_packet_api_v1_entities__key__packet_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"P-codes or property labels; repeat or comma-separate","title":"Fields"},"description":"P-codes or property labels; repeat or comma-separate"},{"name":"max_facts","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":1,"default":30,"title":"Max Facts"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvidencePacket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pulse":{"get":{"tags":["pulse"],"summary":"Pulse","operationId":"pulse_v1_pulse_get","parameters":[{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workspace id; default: the key's first workspace","title":"Workspace"},"description":"Workspace id; default: the key's first workspace"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pulse":{"get":{"tags":["pulse"],"summary":"Pulse","operationId":"pulse_api_v1_pulse_get","parameters":[{"name":"workspace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Workspace id; default: the key's first workspace","title":"Workspace"},"description":"Workspace id; default: the key's first workspace"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/why-trending":{"get":{"tags":["why-trending"],"summary":"Why Trending","operationId":"why_trending_v1_why_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Limit"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["person","org","place","work","event"],"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"include_unexplained","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Unexplained"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhyTrendingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/why-trending":{"get":{"tags":["why-trending"],"summary":"Why Trending","operationId":"why_trending_api_v1_why_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":10,"title":"Limit"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["person","org","place","work","event"],"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"include_unexplained","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Unexplained"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhyTrendingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/trend/share-of-voice":{"get":{"tags":["trend-intel"],"summary":"Share of voice in GDELT news for a set of entities","operationId":"share_of_voice_v1_trend_share_of_voice_get","parameters":[{"name":"entities","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entities"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries.","default":"all","title":"Lang"},"description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/trend/share-of-attention":{"get":{"tags":["trend-intel"],"summary":"Share of Wikipedia attention for a set of entities","operationId":"share_of_attention_v1_trend_share_of_attention_get","parameters":[{"name":"entities","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entities"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries.","default":"all","title":"Lang"},"description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/trend/tone":{"get":{"tags":["trend-intel"],"summary":"GDELT news tone for a set of entities","operationId":"tone_v1_trend_tone_get","parameters":[{"name":"entities","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entities"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries.","default":"all","title":"Lang"},"description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/trend/history":{"get":{"tags":["trend-intel"],"summary":"Per-entity attention, news volume and tone series","operationId":"history_v1_trend_history_get","parameters":[{"name":"entity","in":"query","required":true,"schema":{"type":"string","title":"Entity"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries.","default":"all","title":"Lang"},"description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries."},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":192,"minimum":1,"default":168,"title":"Hours"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":180,"minimum":1,"default":90,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/trend/categories":{"get":{"tags":["trend-intel"],"summary":"Category registry for category trending","operationId":"categories_v1_trend_categories_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/trend/categories/{slug}":{"get":{"tags":["trend-intel"],"summary":"What is trending in one category, with SoV and attention share","operationId":"category_v1_trend_categories__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"rank_by","in":"query","required":false,"schema":{"enum":["views","rising"],"type":"string","default":"views","title":"Rank By"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":25,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trend/share-of-voice":{"get":{"tags":["trend-intel"],"summary":"Share of voice in GDELT news for a set of entities","operationId":"share_of_voice_api_v1_trend_share_of_voice_get","parameters":[{"name":"entities","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entities"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries.","default":"all","title":"Lang"},"description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trend/share-of-attention":{"get":{"tags":["trend-intel"],"summary":"Share of Wikipedia attention for a set of entities","operationId":"share_of_attention_api_v1_trend_share_of_attention_get","parameters":[{"name":"entities","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entities"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries.","default":"all","title":"Lang"},"description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trend/tone":{"get":{"tags":["trend-intel"],"summary":"GDELT news tone for a set of entities","operationId":"tone_api_v1_trend_tone_get","parameters":[{"name":"entities","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entities"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries.","default":"all","title":"Lang"},"description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries."},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trend/history":{"get":{"tags":["trend-intel"],"summary":"Per-entity attention, news volume and tone series","operationId":"history_api_v1_trend_history_get","parameters":[{"name":"entity","in":"query","required":true,"schema":{"type":"string","title":"Entity"}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries.","default":"all","title":"Lang"},"description":"'all' or one Wikipedia language edition (en, de, fr, es, ja, ru, pt, it). Editions are what that edition's readers read, never reader countries."},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":192,"minimum":1,"default":168,"title":"Hours"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":180,"minimum":1,"default":90,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trend/categories":{"get":{"tags":["trend-intel"],"summary":"Category registry for category trending","operationId":"categories_api_v1_trend_categories_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trend/categories/{slug}":{"get":{"tags":["trend-intel"],"summary":"What is trending in one category, with SoV and attention share","operationId":"category_api_v1_trend_categories__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"rank_by","in":"query","required":false,"schema":{"enum":["views","rising"],"type":"string","default":"views","title":"Rank By"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":25,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces":{"get":{"tags":["workspaces"],"summary":"My Workspaces","operationId":"my_workspaces_v1_workspaces_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["workspaces"],"summary":"Create","operationId":"create_v1_workspaces_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/join":{"post":{"tags":["workspaces"],"summary":"Join","operationId":"join_v1_workspaces_join_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/entity-search":{"get":{"tags":["workspaces"],"summary":"Entity Search","description":"The watchlist picker: KG candidates for a typed name. Returns KG ids, never strings\nto save; blocked (adult / non-article) entities are not offered.","operationId":"entity_search_v1_workspaces_entity_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":120,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":8,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}":{"get":{"tags":["workspaces"],"summary":"Get One","operationId":"get_one_v1_workspaces__workspace_id__get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["workspaces"],"summary":"Patch","operationId":"patch_v1_workspaces__workspace_id__patch","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspacePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/invites":{"post":{"tags":["workspaces"],"summary":"Invite","operationId":"invite_v1_workspaces__workspace_id__invites_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/members/{member_key_id}":{"delete":{"tags":["workspaces"],"summary":"Remove Member","operationId":"remove_member_v1_workspaces__workspace_id__members__member_key_id__delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"member_key_id","in":"path","required":true,"schema":{"type":"string","title":"Member Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/recipients":{"post":{"tags":["workspaces"],"summary":"Add Recipient","operationId":"add_recipient_v1_workspaces__workspace_id__recipients_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipientIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/recipients/{recipient_id}":{"delete":{"tags":["workspaces"],"summary":"Remove Recipient","operationId":"remove_recipient_v1_workspaces__workspace_id__recipients__recipient_id__delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"recipient_id","in":"path","required":true,"schema":{"type":"integer","title":"Recipient Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/slack":{"put":{"tags":["workspaces"],"summary":"Set Slack","description":"Connect a Slack incoming webhook. A test message is posted first; the URL is stored\nonly if Slack accepts it, and it is never returned in full afterwards.","operationId":"set_slack_v1_workspaces__workspace_id__slack_put","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["workspaces"],"summary":"Remove Slack","operationId":"remove_slack_v1_workspaces__workspace_id__slack_delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/test-alert":{"post":{"tags":["workspaces"],"summary":"Test Alert","operationId":"test_alert_v1_workspaces__workspace_id__test_alert_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TestAlertIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/watchlists":{"post":{"tags":["workspaces"],"summary":"Create Watchlist","operationId":"create_watchlist_v1_workspaces__workspace_id__watchlists_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/watchlists/{watchlist_id}":{"patch":{"tags":["workspaces"],"summary":"Patch Watchlist","operationId":"patch_watchlist_v1_workspaces__workspace_id__watchlists__watchlist_id__patch","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"string","title":"Watchlist Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["workspaces"],"summary":"Delete Watchlist","operationId":"delete_watchlist_v1_workspaces__workspace_id__watchlists__watchlist_id__delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"string","title":"Watchlist Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/watchlists/{watchlist_id}/metrics":{"get":{"tags":["workspaces"],"summary":"Watchlist Metrics","operationId":"watchlist_metrics_v1_workspaces__workspace_id__watchlists__watchlist_id__metrics_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"string","title":"Watchlist Id"}},{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/watchlists/{watchlist_id}/series":{"get":{"tags":["workspaces"],"summary":"Watchlist Series","description":"Daily share-of-attention and share-of-voice series for the dashboard charts.","operationId":"watchlist_series_v1_workspaces__workspace_id__watchlists__watchlist_id__series_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"string","title":"Watchlist Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":2,"default":14,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/watchlists/{watchlist_id}/metrics.csv":{"get":{"tags":["workspaces"],"summary":"Watchlist Metrics Csv","operationId":"watchlist_metrics_csv_v1_workspaces__workspace_id__watchlists__watchlist_id__metrics_csv_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"string","title":"Watchlist Id"}},{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/alerts":{"get":{"tags":["workspaces"],"summary":"Alerts","operationId":"alerts_v1_workspaces__workspace_id__alerts_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Before"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/workspaces/{workspace_id}/alerts.csv":{"get":{"tags":["workspaces"],"summary":"Alerts Csv","operationId":"alerts_csv_v1_workspaces__workspace_id__alerts_csv_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces":{"get":{"tags":["workspaces"],"summary":"My Workspaces","operationId":"my_workspaces_api_v1_workspaces_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["workspaces"],"summary":"Create","operationId":"create_api_v1_workspaces_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/join":{"post":{"tags":["workspaces"],"summary":"Join","operationId":"join_api_v1_workspaces_join_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JoinIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/entity-search":{"get":{"tags":["workspaces"],"summary":"Entity Search","description":"The watchlist picker: KG candidates for a typed name. Returns KG ids, never strings\nto save; blocked (adult / non-article) entities are not offered.","operationId":"entity_search_api_v1_workspaces_entity_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":120,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":8,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}":{"get":{"tags":["workspaces"],"summary":"Get One","operationId":"get_one_api_v1_workspaces__workspace_id__get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["workspaces"],"summary":"Patch","operationId":"patch_api_v1_workspaces__workspace_id__patch","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspacePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/invites":{"post":{"tags":["workspaces"],"summary":"Invite","operationId":"invite_api_v1_workspaces__workspace_id__invites_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/members/{member_key_id}":{"delete":{"tags":["workspaces"],"summary":"Remove Member","operationId":"remove_member_api_v1_workspaces__workspace_id__members__member_key_id__delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"member_key_id","in":"path","required":true,"schema":{"type":"string","title":"Member Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/recipients":{"post":{"tags":["workspaces"],"summary":"Add Recipient","operationId":"add_recipient_api_v1_workspaces__workspace_id__recipients_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipientIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/recipients/{recipient_id}":{"delete":{"tags":["workspaces"],"summary":"Remove Recipient","operationId":"remove_recipient_api_v1_workspaces__workspace_id__recipients__recipient_id__delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"recipient_id","in":"path","required":true,"schema":{"type":"integer","title":"Recipient Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/slack":{"put":{"tags":["workspaces"],"summary":"Set Slack","description":"Connect a Slack incoming webhook. A test message is posted first; the URL is stored\nonly if Slack accepts it, and it is never returned in full afterwards.","operationId":"set_slack_api_v1_workspaces__workspace_id__slack_put","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["workspaces"],"summary":"Remove Slack","operationId":"remove_slack_api_v1_workspaces__workspace_id__slack_delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/test-alert":{"post":{"tags":["workspaces"],"summary":"Test Alert","operationId":"test_alert_api_v1_workspaces__workspace_id__test_alert_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TestAlertIn"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/watchlists":{"post":{"tags":["workspaces"],"summary":"Create Watchlist","operationId":"create_watchlist_api_v1_workspaces__workspace_id__watchlists_post","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/watchlists/{watchlist_id}":{"patch":{"tags":["workspaces"],"summary":"Patch Watchlist","operationId":"patch_watchlist_api_v1_workspaces__workspace_id__watchlists__watchlist_id__patch","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"string","title":"Watchlist Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["workspaces"],"summary":"Delete Watchlist","operationId":"delete_watchlist_api_v1_workspaces__workspace_id__watchlists__watchlist_id__delete","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"string","title":"Watchlist Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/watchlists/{watchlist_id}/metrics":{"get":{"tags":["workspaces"],"summary":"Watchlist Metrics","operationId":"watchlist_metrics_api_v1_workspaces__workspace_id__watchlists__watchlist_id__metrics_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"string","title":"Watchlist Id"}},{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/watchlists/{watchlist_id}/series":{"get":{"tags":["workspaces"],"summary":"Watchlist Series","description":"Daily share-of-attention and share-of-voice series for the dashboard charts.","operationId":"watchlist_series_api_v1_workspaces__workspace_id__watchlists__watchlist_id__series_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"string","title":"Watchlist Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":2,"default":14,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/watchlists/{watchlist_id}/metrics.csv":{"get":{"tags":["workspaces"],"summary":"Watchlist Metrics Csv","operationId":"watchlist_metrics_csv_api_v1_workspaces__workspace_id__watchlists__watchlist_id__metrics_csv_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"string","title":"Watchlist Id"}},{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Window Hours"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/alerts":{"get":{"tags":["workspaces"],"summary":"Alerts","operationId":"alerts_api_v1_workspaces__workspace_id__alerts_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Before"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/workspaces/{workspace_id}/alerts.csv":{"get":{"tags":["workspaces"],"summary":"Alerts Csv","operationId":"alerts_csv_api_v1_workspaces__workspace_id__alerts_csv_get","parameters":[{"name":"workspace_id","in":"path","required":true,"schema":{"type":"string","title":"Workspace Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/route":{"get":{"tags":["v1-search","search"],"summary":"Route","description":"Smart-router search.\n\nReturns a 4-layer result: primary intent (category), canonical entity match,\nauthoritative-source routing, and page-level fallback hits.","operationId":"route_api_v1_route_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"limit_pages","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":0,"default":10,"title":"Limit Pages"}},{"name":"limit_sources","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":0,"default":8,"title":"Limit Sources"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","description":"Caller capability: plain | browser | residential","default":"plain","title":"Agent"},"description":"Caller capability: plain | browser | residential"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Route Api V1 Route Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/searxng/search":{"get":{"tags":["searxng"],"summary":"Search Get","description":"SearXNG-compatible search.\n\nResults are 4ort routing targets (authoritative sources to search) followed\nby our own page hits; `infoboxes` carries the knowledge-graph entity.","operationId":"search_get_searxng_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Search query","default":"","title":"Q"},"description":"Search query"},{"name":"format","in":"query","required":false,"schema":{"type":"string","description":"Only 'json' is served","default":"json","title":"Format"},"description":"Only 'json' is served"},{"name":"categories","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Categories"}},{"name":"engines","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engines"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"}},{"name":"pageno","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Pageno"}},{"name":"time_range","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Range"}},{"name":"safesearch","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Safesearch"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Get Searxng Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["searxng"],"summary":"Search Post","description":"Form-encoded POST — what SearXNG's own UI and several clients send.","operationId":"search_post_searxng_search_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Post Searxng Search Post"}}}}}}},"/searxng/config":{"get":{"tags":["searxng"],"summary":"Config","description":"Minimal SearXNG `/config`. Several clients probe this to decide whether an\ninstance is reachable and whether JSON is enabled before sending a query.","operationId":"config_searxng_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Config Searxng Config Get"}}}}}}},"/searxng/healthz":{"get":{"tags":["searxng"],"summary":"Healthz","operationId":"healthz_searxng_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Healthz Searxng Healthz Get"}}}}}}},"/api/v1/research":{"post":{"tags":["v1-research"],"summary":"Create Research","description":"Enqueue a deep-research job. Returns instantly with a job_id to poll.","operationId":"create_research_api_v1_research_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/research/{job_id}":{"get":{"tags":["v1-research"],"summary":"Get Research","description":"Poll a job. While running, returns status + progress; when done, the\nclean markdown report + citations; on failure, the error.","operationId":"get_research_api_v1_research__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{32}$","title":"Job Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/living-edge":{"get":{"tags":["living-edge"],"summary":"Living Edge Api","description":"JSON: the current Living-Edge frontier.","operationId":"living_edge_api_api_living_edge_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"min_windows","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"only entities seen in ≥N windows (recurrence filter)","default":1,"title":"Min Windows"},"description":"only entities seen in ≥N windows (recurrence filter)"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(recurrence|novelty)$","description":"recurrence = most-persistent first; novelty = most-likely-genuinely-new first","default":"recurrence","title":"Sort"},"description":"recurrence = most-persistent first; novelty = most-likely-genuinely-new first"},{"name":"articles","in":"query","required":false,"schema":{"type":"boolean","description":"include the actual source news-article URLs for each entity (transparency)","default":false,"title":"Articles"},"description":"include the actual source news-article URLs for each entity (transparency)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/living-edge":{"get":{"tags":["living-edge"],"summary":"Living Edge Page","description":"New Entity Radar — branded SSR page surfacing the frontier (novelty + display-quality\nfiltered: REAL emerging entities, not resolution-misses of famous ones we already have).","operationId":"living_edge_page_living_edge_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/minted":{"get":{"tags":["living-edge"],"summary":"Minted Api","description":"JSON: entities MINTED into 4ort's inferred layer (L3) from world news.","operationId":"minted_api_api_minted_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(latest|random)$","description":"latest = newest-minted first (offset-paginated); random = a fresh random sample every call","default":"latest","title":"Sort"},"description":"latest = newest-minted first (offset-paginated); random = a fresh random sample every call"},{"name":"lane","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|archive|live|products|registry)$","description":"all | archive (discovered_from='geg-archive', the 2016-2026 news-archive sweep) | live (the still-running gkg/geg lanes) | products (entity_type='Product' — discovered in press releases; facts are vendor-claimed — stated in a press release — until independently corroborated)","default":"all","title":"Lane"},"description":"all | archive (discovered_from='geg-archive', the 2016-2026 news-archive sweep) | live (the still-running gkg/geg lanes) | products (entity_type='Product' — discovered in press releases; facts are vendor-claimed — stated in a press release — until independently corroborated)"},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"optional entity_type filter (PERSON/ORGANIZATION/LOCATION/EVENT/WORK_OF_ART/CONSUMER_GOOD); anything else — including empty, which the filter-bar's 'all' option submits — is treated as no filter","title":"Type"},"description":"optional entity_type filter (PERSON/ORGANIZATION/LOCATION/EVENT/WORK_OF_ART/CONSUMER_GOOD); anything else — including empty, which the filter-bar's 'all' option submits — is treated as no filter"},{"name":"min_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"description":"Return only entities whose score is >= this. UNSCORED rows are excluded by any explicit floor — a row with no trust signal is not an answer to a trust question. ⚠️ SCALE: entity scores span 0.50-0.79 (avg 0.612, measured 2026-09-05) and are NOT on the same scale as fact scores (0.70-0.97), so a 0.9 floor here returns nothing by construction. Entities are deliberately NOT banded: ADR-0022's high/emerging/low cutoffs are fact-scoped. Neither number is yet a calibrated probability — see `score_basis`, which flips to 'calibrated' when mint ships the real column.","title":"Min Score"},"description":"Return only entities whose score is >= this. UNSCORED rows are excluded by any explicit floor — a row with no trust signal is not an answer to a trust question. ⚠️ SCALE: entity scores span 0.50-0.79 (avg 0.612, measured 2026-09-05) and are NOT on the same scale as fact scores (0.70-0.97), so a 0.9 floor here returns nothing by construction. Entities are deliberately NOT banded: ADR-0022's high/emerging/low cutoffs are fact-scoped. Neither number is yet a calibrated probability — see `score_basis`, which flips to 'calibrated' when mint ships the real column."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"offset page for sort=latest; ignored for sort=random","default":1,"title":"Page"},"description":"offset page for sort=latest; ignored for sort=random"},{"name":"slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"resolve ONE minted entity by slug. Returns a single-item list (or an empty one). Added 2026-08-27: agents had no single-minted lookup at all — minted entities render at /minted/{slug} but are not in the queryable entity store, so /api/v1/entities/{slug} 404s for them. Previously an unknown ?slug= was silently DROPPED by FastAPI and the caller got all 100 rows back, which reads as 'the filter is broken' but was really 'the filter never existed'.","title":"Slug"},"description":"resolve ONE minted entity by slug. Returns a single-item list (or an empty one). Added 2026-08-27: agents had no single-minted lookup at all — minted entities render at /minted/{slug} but are not in the queryable entity store, so /api/v1/entities/{slug} 404s for them. Previously an unknown ?slug= was silently DROPPED by FastAPI and the caller got all 100 rows back, which reads as 'the filter is broken' but was really 'the filter never existed'."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/minted/recent":{"get":{"tags":["living-edge"],"summary":"Living Edge — newest minted entities and their claims","description":"Public, no key. The Living Edge rail behind 4ort.ai's homepage.\n\nCached 30s in Redis: this is a homepage rail, so it is the one surface where\na cache miss storm is a real risk (see _mint_hero_counts' pool-exhaustion\nnote — the same page did exactly that once already).","operationId":"minted_recent_api_minted_recent_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Minted Recent Api Minted Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/minted/recent/stream":{"get":{"tags":["living-edge"],"summary":"Living Edge — SSE of newest minted entities and claims","description":"Same payload as /api/minted/recent, pushed instead of polled.\n\nThe rail moves without polling; a 30s poll of /recent is the documented\nfallback and returns the identical shape, so a client that cannot hold a\nstream open is not on a second-class surface.\n\nEmits only when the newest claim actually changes, so an idle lane costs the\nclient nothing and a reconnect does not replay a burst. Heartbeats keep\nintermediaries from closing an idle connection.","operationId":"minted_recent_stream_api_minted_recent_stream_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/minted":{"get":{"tags":["living-edge"],"summary":"Minted Page","description":"The Mint — branded SSR page of entities 4ort discovered in news before the encyclopedias.\nQA browsing kit: sort=latest|random, lane=all|archive|live|products, type=, page= (latest only).","operationId":"minted_page_minted_get","parameters":[{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(latest|random)$","default":"latest","title":"Sort"}},{"name":"lane","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|archive|live|products)$","default":"all","title":"Lane"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"see _clean_etype — '' (the filter-bar's 'all' option, always present when the <select> submits) is treated as no filter, not rejected","title":"Type"},"description":"see _clean_etype — '' (the filter-bar's 'all' option, always present when the <select> submits) is treated as no filter, not rejected"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/minted/{slug}":{"get":{"tags":["living-edge"],"summary":"Minted Entity Page","description":"Individual minted-entity page — the entity + its facts (each with its verification\ntier: vendor_claimed | first_party | corroborated | promoted) + source articles.","operationId":"minted_entity_page_minted__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pulse/countries":{"get":{"tags":["pulse"],"summary":"Pulse Countries Api","description":"JSON: the current Country Pulse stability board.","operationId":"pulse_countries_api_api_pulse_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/pulse":{"get":{"tags":["pulse"],"summary":"Pulse Page","description":"Country Pulse — branded SSR stability board, ranked by biggest destabilization\n(vs. each country's own 30-day norm) first.","operationId":"pulse_page_pulse_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/pulse/builders":{"get":{"tags":["builders"],"summary":"Api Pulse Builders","operationId":"api_pulse_builders_api_pulse_builders_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pulse/markets":{"get":{"tags":["markets"],"summary":"Api Pulse Markets","operationId":"api_pulse_markets_api_pulse_markets_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":180,"minimum":7,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/articles":{"get":{"tags":["articles"],"summary":"Articles Json","operationId":"articles_json_api_articles_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"topic query — terms, OR/AND, \"phrase\", parens","title":"Q"},"description":"topic query — terms, OR/AND, \"phrase\", parens"},{"name":"since","in":"query","required":false,"schema":{"type":"integer","maximum":72,"minimum":1,"description":"rolling window in hours (cap 72)","default":24,"title":"Since"},"description":"rolling window in hours (cap 72)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"max articles (cap 250)","default":75,"title":"Limit"},"description":"max articles (cap 250)"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"optional language filter (e.g. English)","title":"Lang"},"description":"optional language filter (e.g. English)"},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"optional source-country filter (e.g. New Zealand)","title":"Country"},"description":"optional source-country filter (e.g. New Zealand)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/articles.rss":{"get":{"tags":["articles"],"summary":"Articles Rss","operationId":"articles_rss_api_articles_rss_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}},{"name":"since","in":"query","required":false,"schema":{"type":"integer","maximum":72,"minimum":1,"default":24,"title":"Since"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":75,"title":"Limit"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/filings":{"get":{"tags":["filings"],"summary":"Api Filings","description":"JSON twin of `/filings`. Public and unauthenticated, like `/api/v1/trending`.\n\nPublic domain end-to-end: SEC EDGAR is a US federal work, and every row\ncarries the accession number + sec.gov URL that backs it.","operationId":"api_filings_api_v1_filings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1FilingsResponse"}}}}}}},"/filings":{"get":{"tags":["filings"],"summary":"Filings Page","description":"SSR pulse page. One cached read, no live computation, no LLM.","operationId":"filings_page_filings_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/v1/products":{"get":{"tags":["v1-products"],"summary":"Product prices across merchants","operationId":"products_api_v1_products_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"product query","title":"Q"},"description":"product query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":5,"title":"Limit"}},{"name":"currency","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":3},{"type":"null"}],"description":"ISO 4217, e.g. USD","title":"Currency"},"description":"ISO 4217, e.g. USD"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/entity-card-facts":{"get":{"tags":["v1-entity-seam","v1-entity-seam"],"summary":"Answer-bearing facts for one entity","operationId":"entity_card_facts_api_v1_entity_card_facts_get","parameters":[{"name":"slug","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":300,"description":"entity slug, as stored in entities.slug","title":"Slug"},"description":"entity slug, as stored in entities.slug"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pipelines":{"get":{"tags":["pipelines-health"],"summary":"Pipelines Api","operationId":"pipelines_api_api_pipelines_get","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines":{"get":{"tags":["pipelines-health"],"summary":"Pipelines Page","operationId":"pipelines_page_pipelines_get","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/agent-ready":{"get":{"tags":["agent-ready"],"summary":"Agent Ready Api","operationId":"agent_ready_api_api_v1_public_agent_ready_get","parameters":[{"name":"n","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"N"}},{"name":"host","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"check a single domain's score","title":"Host"},"description":"check a single domain's score"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agent-ready":{"get":{"tags":["agent-ready"],"summary":"Agent Ready Page","operationId":"agent_ready_page_agent_ready_get","parameters":[{"name":"host","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/register":{"post":{"tags":["v1-register"],"summary":"Register","description":"Issue a fresh 4ort.xyz API key + one-time recovery code.\n\nNo human verification required (TOFU model, mirrors 4ort.net). Defenses:\n- REGISTRATION_DISABLED env kill switch\n- Per-IP hourly registration rate limit (default 3/hr)\n- Hard cap on total native keys (default 10k)","operationId":"register_api_v1_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/properties":{"get":{"tags":["v1-resolvers","v1-resolvers"],"summary":"List Properties","description":"Browse the full Wikidata property catalog with search + filtering.\n\nCache aggressively client-side — the catalog changes a few times per\nyear. A 30-day TTL is reasonable. We don't yet emit Cache-Control\nheaders; that's wired in the productization phase.","operationId":"list_properties_api_v1_properties_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"description":"Case-insensitive substring match against label/description","title":"Search"},"description":"Case-insensitive substring match against label/description"},{"name":"datatype","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one datatype (e.g. 'external-id', 'wikibase-item')","title":"Datatype"},"description":"Filter to one datatype (e.g. 'external-id', 'wikibase-item')"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/properties/{pid}":{"get":{"tags":["v1-resolvers","v1-resolvers"],"summary":"Get Property","description":"Resolve a single property by ID. Cached aggressively (Wikidata\nproperties change a few times per year) — 1-day max-age.","operationId":"get_property_api_v1_properties__pid__get","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/properties/bulk":{"post":{"tags":["v1-resolvers","v1-resolvers"],"summary":"Bulk Properties","description":"Resolve up to 500 properties in one call. Unknown ids surface in\n`missing[]` rather than 404-ing the whole batch.","operationId":"bulk_properties_api_v1_properties_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyBulkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyBulkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/items/{qid}":{"get":{"tags":["v1-resolvers","v1-resolvers"],"summary":"Get Item","description":"Resolve a single Q-ID label. The wikidata_items table is 91.7M rows\nbut it has a pkey on qid so the lookup is O(1). 1-day cache because\nQ-ID labels are stable — Wikidata label edits are rare.","operationId":"get_item_api_v1_items__qid__get","parameters":[{"name":"qid","in":"path","required":true,"schema":{"type":"string","title":"Qid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/items/bulk":{"post":{"tags":["v1-resolvers","v1-resolvers"],"summary":"Bulk Items","description":"Resolve up to 1000 Q-IDs in one call. Designed for clients that just\nwalked a claims_rich blob and collected unresolved value Q-IDs — they\nsubmit the whole batch and get back a label dictionary in one round-trip.","operationId":"bulk_items_api_v1_items_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemBulkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemBulkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/entities/{key}/stream":{"get":{"tags":["v1-streaming","v1-streaming"],"summary":"Stream Entity Edits","description":"SSE stream of Wikidata edits hitting this entity. Each `entity_edit`\nevent carries the changed P-codes + the editor handle.\n\nReplay-on-reconnect: send `Last-Event-ID: <edit_id>` in the request\nheaders and we'll replay every edit since that id (capped at 100)\nbefore switching to the live tail.","operationId":"stream_entity_edits_api_v1_entities__key__stream_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"last_event_id_header","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Event Id Header"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/changelog/stream":{"get":{"tags":["v1-streaming","v1-streaming"],"summary":"Stream Changelog","description":"The firehose. Wikidata edits live-streamed across the whole graph,\nwith optional `domain`, `country`, and `predicate` filters.\n\nThis is the headline streaming product: country-segmented, predicate-\nfiltered KG deltas in real time. Combine filters for sliced firehoses:\n  - `?country=US` — US-relevant edits\n  - `?domain=public_company&country=US` — US public-co edits\n  - `?predicate=P31,P106` — type/occupation changes globally\n  - `?domain=human&country=DE` — German people only\n\n`country` accepts ISO-3166 alpha-2 codes (US, DE, JP, GB) AND Wikidata\nQ-IDs (Q30, Q183) — both resolve to the same canonical Q-ID via the\nin-memory ISO map.\n\nNo backfill on this endpoint (use the REST /changelog GET for history).\nLive tail only.","operationId":"stream_changelog_api_v1_changelog_stream_get","parameters":[{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one harvest_domain, e.g. 'musical_group', 'human', 'pharmaceutical_product'","title":"Domain"},"description":"Filter to one harvest_domain, e.g. 'musical_group', 'human', 'pharmaceutical_product'"},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":3},{"type":"null"}],"description":"ISO-3166 2-letter country filter (US, DE, JP, GB...). Matches the entity's country tag.","title":"Country"},"description":"ISO-3166 2-letter country filter (US, DE, JP, GB...). Matches the entity's country tag."},{"name":"predicate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated P-codes — only fire when ≥1 of these props changed.","title":"Predicate"},"description":"Comma-separated P-codes — only fire when ≥1 of these props changed."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/entities/{key}/pageviews/stream":{"get":{"tags":["v1-streaming","v1-streaming"],"summary":"Stream Entity Pageviews","description":"SSE stream of hourly Wikipedia pageview events for one entity.\n\nCadence: Wikipedia publishes pageview dumps hourly; we ingest them on\na systemd timer; the trigger NOTIFY fires as each row lands. So this\nis \"real-time within the hourly batch\" — typically ≤1 hour after the\npageview window closes.\n\nEach event carries `views` (the hour total), `lang` (per-language\nbreakdown — en, de, ja, etc.), and `velocity` (multiple of 7-day\nbaseline — `1.0` is \"normal,\" `5.0` means 5× normal traffic).\n\nUse this to monitor engagement on a specific entity in real time.\nCombine with `?velocity_gt=2.0` filter for \"wake me on traffic spikes.\"","operationId":"stream_entity_pageviews_api_v1_entities__key__pageviews_stream_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pageviews/stream":{"get":{"tags":["v1-streaming","v1-streaming"],"summary":"Stream Pageview Firehose","description":"The attention firehose. Every hourly Wikipedia pageview record for\nentities we track, filterable across multiple dimensions.\n\nThe headline streaming product alongside the changelog firehose. Where\nthe changelog fires when *facts* change, this fires when *attention*\nchanges — the upstream signal that often precedes the fact updates by\nminutes to hours (your \"Wikidata-confirmation\" framing in reverse).\n\nVolume management: the underlying trigger pre-filters to views > 10 so\nthe ~4.7M low-traffic entities don't drown the firehose. Combine\n`velocity_gt=2.0` with `min_views=100` for a clean \"trending\" stream.\n\nCountry segmentation: pass `lang=en` for English-Wikipedia traffic\n(correlates with US/UK/AU/CA audiences), `lang=de` for German\n(DE/AT/CH), `lang=ja` (JP), etc. Multilingual: `lang=en,de,fr`.","operationId":"stream_pageview_firehose_api_v1_pageviews_stream_get","parameters":[{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one harvest_domain (e.g. 'human', 'public_company')","title":"Domain"},"description":"Filter to one harvest_domain (e.g. 'human', 'public_company')"},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated language codes (en, de, ja, ...). Each lang correlates with country — en→US/UK/AU, de→DE/AT/CH, ja→JP. The country dimension for pageviews is lang.","title":"Lang"},"description":"Comma-separated language codes (en, de, ja, ...). Each lang correlates with country — en→US/UK/AU, de→DE/AT/CH, ja→JP. The country dimension for pageviews is lang."},{"name":"min_views","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Only fire when views ≥ this threshold. The trigger pre-filters at >10 but you can raise the bar higher to focus on bigger spikes.","default":0,"title":"Min Views"},"description":"Only fire when views ≥ this threshold. The trigger pre-filters at >10 but you can raise the bar higher to focus on bigger spikes."},{"name":"velocity_gt","in":"query","required":false,"schema":{"type":"number","minimum":0.0,"description":"Only fire when velocity (multiple of 7-day baseline) exceeds this. 1.0 = normal traffic; 2.0 = doubled; 5.0 = trending. Default 0 emits all.","default":0.0,"title":"Velocity Gt"},"description":"Only fire when velocity (multiple of 7-day baseline) exceeds this. 1.0 = normal traffic; 2.0 = doubled; 5.0 = trending. Default 0 emits all."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trending/stream":{"get":{"tags":["v1-streaming","v1-streaming"],"summary":"Stream Trending","description":"Live trending leaderboard. Emits three event types:\n\n* `entered`     — entity just appeared in the top-N\n* `exited`      — entity dropped out of the top-N\n* `rank_change` — entity moved by ≥ `min_rank_delta` positions\n\nPolling cadence: re-ranks every 60 seconds. Cheap server-side because\nthe trending query is materialised and indexed.\n\nWire shape per event:\n```\n{ \"type\": \"entered\", \"entity_id\": \"...\", \"slug\": \"...\", \"name\": \"...\",\n  \"rank\": 3, \"velocity_score\": 4.2, \"views_in_window\": 12450,\n  \"domain\": \"public_company\", \"why_trending\": \"...\" }\n```","operationId":"stream_trending_api_v1_trending_stream_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(hour|day)$","description":"'hour' = last completed hour, 'day' = rolling 24h.","default":"hour","title":"Period"},"description":"'hour' = last completed hour, 'day' = rolling 24h."},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-2 country code (US, DE, JP, ...) to slice by. Empty = global.","title":"Country"},"description":"ISO-2 country code (US, DE, JP, ...) to slice by. Empty = global."},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"harvest_domain to slice by ('human', 'public_company', ...). Empty = cross-category.","title":"Category"},"description":"harvest_domain to slice by ('human', 'public_company', ...). Empty = cross-category."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":5,"description":"Leaderboard size. Larger = more entries you'll see churn in/out","default":50,"title":"Limit"},"description":"Leaderboard size. Larger = more entries you'll see churn in/out"},{"name":"min_rank_delta","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Only fire `rank_change` events when |Δposition| ≥ this. `entered` and `exited` events always fire regardless.","default":5,"title":"Min Rank Delta"},"description":"Only fire `rank_change` events when |Δposition| ≥ this. `entered` and `exited` events always fire regardless."},{"name":"hours","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":168,"minimum":1},{"type":"null"}],"description":"DEPRECATED — use `period`. 1 → hour, anything else → day.","title":"Hours"},"description":"DEPRECATED — use `period`. 1 → hour, anything else → day."},{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"DEPRECATED alias for `category`.","title":"Domain"},"description":"DEPRECATED alias for `category`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sources":{"get":{"tags":["v1-sources","v1-sources"],"summary":"Data-source and licence manifest","description":"Every dataset that contributed to the served graph, with its licence, attribution requirement, and redistribution status. Generated from the canonical source registry — the same one that renders the public /sources page and the /coverage dashboard.","operationId":"v1_sources_api_v1_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Sources Api V1 Sources Get"}}}}}}},"/api/v1/ontology":{"get":{"tags":["v1-ontology","v1-ontology"],"summary":"The object-type registry","description":"Every schema.org type in the graph with its entity count, how many distinct properties and link types it carries, and how many constraint violations it has. All counts are precomputed nightly; `edition` and `computed_at` say from when.","operationId":"v1_ontology_api_v1_ontology_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Ontology Api V1 Ontology Get"}}}}}}},"/api/v1/ontology/{type_name}":{"get":{"tags":["v1-ontology","v1-ontology"],"summary":"One object type: properties, links, sources, samples","description":"The full profile of one type. `properties` are ordered by count with a coverage percentage; `links` give each predicate with the target types it points at; `samples` are five objects ranked by visibility (degree x pageviews).","operationId":"v1_ontology_type_api_v1_ontology__type_name__get","parameters":[{"name":"type_name","in":"path","required":true,"schema":{"type":"string","title":"Type Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Ontology Type Api V1 Ontology  Type Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/datasets":{"get":{"tags":["v1-ontology","v1-ontology"],"summary":"The dataset catalog: every source the lake holds","description":"Per source: its editions, row counts, bytes, verify status, licence tier and the publisher's terms verbatim. Generated by 4ort-lake after every landing and read here as a file. Metadata only — no row value is ever in this catalog.","operationId":"v1_datasets_api_v1_datasets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response V1 Datasets Api V1 Datasets Get"}}}}}}},"/api/v1/datasets/{source}":{"get":{"tags":["v1-ontology","v1-ontology"],"summary":"One dataset source, with its editions","operationId":"v1_dataset_api_v1_datasets__source__get","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response V1 Dataset Api V1 Datasets  Source  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/4ort/login":{"get":{"tags":["empire-sso"],"summary":"Empire Login","operationId":"empire_login_auth_4ort_login_get","parameters":[{"name":"returnTo","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Returnto"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/4ort/callback":{"get":{"tags":["empire-sso"],"summary":"Empire Callback","operationId":"empire_callback_auth_4ort_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/4ort/logout":{"get":{"tags":["empire-sso"],"summary":"Empire Logout","operationId":"empire_logout_auth_4ort_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/4ort/whoami":{"get":{"tags":["empire-sso"],"summary":"Empire Whoami","description":"Tiny inspection endpoint for the UI to know if a session is active.","operationId":"empire_whoami_auth_4ort_whoami_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Empire Whoami Auth 4Ort Whoami Get"}}}}}}},"/api/v1/public/entities/sample":{"get":{"tags":["v1-public","v1-public-collision"],"summary":"Sample","description":"N real, recognizable entities — one per canonical *field* (default),\nor recognizable companies (`type=company`). The bisociation bootstrap.\n\nConcept mode samples N of the ~28 curated fields (`field_anchors`) and\nreturns the top concept in each — a balanced cross-field spread, not a\nrow-count-weighted one. Varied per call (random field / company sample).\nShort cache window so a polling client still sees rotation but bursts get\namortized.","operationId":"sample_api_v1_public_entities_sample_get","parameters":[{"name":"n","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"how many entities","default":24,"title":"N"},"description":"how many entities"},{"name":"min_pageviews","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"popularity floor","default":2000,"title":"Min Pageviews"},"description":"popularity floor"},{"name":"type","in":"query","required":false,"schema":{"type":"string","pattern":"^(concept|company)$","default":"concept","title":"Type"}},{"name":"weighted","in":"query","required":false,"schema":{"type":"boolean","description":"bias field sampling by collision_weight (up-weights thin concept fields, down-weights instance-giants)","default":false,"title":"Weighted"},"description":"bias field sampling by collision_weight (up-weights thin concept fields, down-weights instance-giants)"},{"name":"safe","in":"query","required":false,"schema":{"type":"boolean","description":"exclude NSFW / violent / extremist / sensitive concepts — for client-facing premium surfaces (the public chaos-orb keeps them raw)","default":false,"title":"Safe"},"description":"exclude NSFW / violent / extremist / sensitive concepts — for client-facing premium surfaces (the public chaos-orb keeps them raw)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/entities/{key}/distant":{"get":{"tags":["v1-public","v1-public-collision"],"summary":"Distant","description":"Partners that are multi-hop FAR on the relationship graph but still\nPATH-CONNECTED to the seed — structurally distant + bridgeable.\n\nBounded BFS:\n  * bidirectional edges (entity_relationships is directed; we follow both\n    source→target and target→source),\n  * per-step LATERAL fan-out cap (:fanout) so hub nodes can't explode the\n    walk (worst case ≈ fanout^hops),\n  * no-cycle guard (NOT id = ANY(path)),\n  * hard 5s statement_timeout → on timeout we roll back and return whatever\n    we have (here: empty list), never a 504.\n\nReturns the seed + partners, each with the bridging `path` (entity names —\nthe latent pivot the collision prompt reasons through).","operationId":"distant_api_v1_public_entities__key__distant_get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"hops","in":"query","required":false,"schema":{"type":"integer","maximum":4,"minimum":2,"description":"target graph distance","default":3,"title":"Hops"},"description":"target graph distance"},{"name":"n","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"description":"how many partners","default":8,"title":"N"},"description":"how many partners"},{"name":"cross_domain","in":"query","required":false,"schema":{"type":"boolean","description":"partner in a different harvest_domain","default":true,"title":"Cross Domain"},"description":"partner in a different harvest_domain"},{"name":"min_pageviews","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"quality floor on partners","default":5000,"title":"Min Pageviews"},"description":"quality floor on partners"},{"name":"far_field","in":"query","required":false,"schema":{"type":"boolean","description":"rank partners in the seed's most structurally-distant canonical FIELDS first (field_distance) — surfaces the biggest cross-field collisions, not just any other domain","default":false,"title":"Far Field"},"description":"rank partners in the seed's most structurally-distant canonical FIELDS first (field_distance) — surfaces the biggest cross-field collisions, not just any other domain"},{"name":"safe","in":"query","required":false,"schema":{"type":"boolean","description":"ALSO exclude violent/sensitive partners (premium surfaces); adult/porn partners are ALWAYS excluded","default":false,"title":"Safe"},"description":"ALSO exclude violent/sensitive partners (premium surfaces); adult/porn partners are ALWAYS excluded"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/fields":{"get":{"tags":["v1-public","v1-public-fields"],"summary":"List Fields","description":"The canonical field vocabulary (+ surfaceable entity_count per field).\n\nAn LLM classifies a brief into one of THESE labels (it must pick from the\nreal vocabulary, not invent one), then calls `/{field}/distant`.","operationId":"list_fields_api_v1_public_fields_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/fields/{field}/distant":{"get":{"tags":["v1-public","v1-public-fields"],"summary":"Field Distant","description":"Recognizable entities from fields FAR from `{field}`, each tagged with its\nown field (the bridge). The universal, disambiguation-proof floor: classify\nthe brief into a field, get back genuinely-distant, safe, recognizable\nentities — no entity resolution, never the `general` dead-end.\n\nBalanced across `k_fields` distinct far fields (round-robin, not all from\none). Sampled per call for run-to-run variety. `400` on an unknown field.","operationId":"field_distant_api_v1_public_fields__field__distant_get","parameters":[{"name":"field","in":"path","required":true,"schema":{"type":"string","title":"Field"}},{"name":"n","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"how many entities to return","default":14,"title":"N"},"description":"how many entities to return"},{"name":"safe","in":"query","required":false,"schema":{"type":"boolean","description":"apply the NSFW/sensitive filter (premium surfaces)","default":false,"title":"Safe"},"description":"apply the NSFW/sensitive filter (premium surfaces)"},{"name":"k_fields","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"spread results across this many distinct far fields","default":6,"title":"K Fields"},"description":"spread results across this many distinct far fields"},{"name":"min_popularity","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"description":"optional 0–1 floor so twists stay recognizable (maps to a pageviews floor)","title":"Min Popularity"},"description":"optional 0–1 floor so twists stay recognizable (maps to a pageviews floor)"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/fetch":{"get":{"tags":["v1-public"],"summary":"Agent Fetch","description":"Fetch a URL and return agent-readable main-content via the lean ladder,\nplus the agent-friendliness verdict for the host. Pairs the index's verdict\nwith the capability to act on it.","operationId":"agent_fetch_api_v1_public_fetch_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"absolute http(s) URL to read","title":"Url"},"description":"absolute http(s) URL to read"},{"name":"max_chars","in":"query","required":false,"schema":{"type":"integer","maximum":200000,"minimum":200,"default":50000,"title":"Max Chars"}},{"name":"use_mirror","in":"query","required":false,"schema":{"type":"boolean","description":"auto-route via a clean lite-mirror when one exists","default":true,"title":"Use Mirror"},"description":"auto-route via a clean lite-mirror when one exists"},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/entities/stats":{"get":{"tags":["v1-public"],"summary":"Get Stats","description":"Quick stats for dashboards.","operationId":"get_stats_api_v1_public_entities_stats_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/entities/recent":{"get":{"tags":["v1-public"],"summary":"Get Recent","description":"Recently updated entities for live ticker.","operationId":"get_recent_api_v1_public_entities_recent_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/entities/graph":{"get":{"tags":["v1-public"],"summary":"Get Graph","description":"Get graph data (nodes + edges) for 3D visualization.","operationId":"get_graph_api_v1_public_entities_graph_get","parameters":[{"name":"domains","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Domains"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50000,"minimum":100,"default":2000,"title":"Limit"}},{"name":"min_connections","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":2,"title":"Min Connections"}},{"name":"rel_types","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Rel Types"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/entities":{"get":{"tags":["v1-public"],"summary":"List Entities","description":"List all entities with optional type filter and sort order.\n\nSort options:\n  best   — enriched first, then by connection count (default)\n  recent — newest first\n  name   — alphabetical","operationId":"list_entities_api_v1_public_entities_get","parameters":[{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(best|recent|name)$","default":"best","title":"Sort"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/entities/{entity_id}":{"get":{"tags":["v1-public"],"summary":"Get Entity","description":"Get full entity detail with all SEO data.","operationId":"get_entity_api_v1_public_entities__entity_id__get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/entities/{entity_id}/related":{"get":{"tags":["v1-public"],"summary":"Get Related Entities","description":"Get entities related to this one — direct relationships AND type-based peers.","operationId":"get_related_entities_api_v1_public_entities__entity_id__related_get","parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Entity Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/entities/search/":{"get":{"tags":["v1-public"],"summary":"Search Entities","description":"Quick text search on entity names.","operationId":"search_entities_api_v1_public_entities_search__get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/rag/query":{"post":{"tags":["v1-public"],"summary":"Rag Query","description":"Semantic search across the knowledge base with SEO metrics.","operationId":"rag_query_api_v1_public_rag_query_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RagQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/rag/search-all":{"post":{"tags":["v1-public"],"summary":"Rag Search All","description":"Unified search across entities AND keywords in the same vector space.","operationId":"rag_search_all_api_v1_public_rag_search_all_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RagQuery"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/keys":{"post":{"tags":["v1-admin"],"summary":"Create Key","operationId":"create_key_api_v1_admin_keys_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["v1-admin"],"summary":"List Keys","operationId":"list_keys_api_v1_admin_keys_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/KeyOut"},"title":"Response List Keys Api V1 Admin Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/keys/{key_id}/revoke":{"post":{"tags":["v1-admin"],"summary":"Revoke Key","operationId":"revoke_key_api_v1_admin_keys__key_id__revoke_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Revoke Key Api V1 Admin Keys  Key Id  Revoke Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/keys/{key_id}":{"delete":{"tags":["v1-admin"],"summary":"Delete Key","operationId":"delete_key_api_v1_admin_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/run":{"post":{"tags":["v1-admin"],"summary":"Run Pipeline","description":"Trigger the entity pipeline for a keyword (free — no DataForSEO calls).","operationId":"run_pipeline_api_v1_admin_pipeline_run_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/crawl":{"post":{"tags":["v1-admin"],"summary":"Start Crawl","description":"Start a BFS crawl from a Wikidata entity. Runs in the background.\n\nSet skeleton_only=True for Stage 1: fast graph mapping with Wikidata identity only.","operationId":"start_crawl_api_v1_admin_pipeline_crawl_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrawlRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrawlStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/crawl/{crawl_id}":{"get":{"tags":["v1-admin"],"summary":"Crawl Status","description":"Check the status of a running crawl.","operationId":"crawl_status_api_v1_admin_pipeline_crawl__crawl_id__get","parameters":[{"name":"crawl_id","in":"path","required":true,"schema":{"type":"string","title":"Crawl Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrawlStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/crawl-sparql":{"post":{"tags":["v1-admin"],"summary":"Start Sparql Crawl","description":"Discover entities via targeted SPARQL queries against Wikidata.\n\nMuch more precise than BFS — directly queries for specific entity types.\n\nAvailable topics:\n- ai-orgs: Companies/orgs in the AI industry (~250 entities)\n- ai-research: AI research institutions and labs\n- ai-software: AI software, ML frameworks, tools\n- ai-people: Notable AI researchers and leaders\n- ai-conferences: AI/ML academic conferences\n\nPass topics=[\"ai-orgs\"] to run one, or omit for all topics.\nSet skeleton_only=false for full Stage 2 enrichment (slower, adds AI content + embeddings).","operationId":"start_sparql_crawl_api_v1_admin_pipeline_crawl_sparql_post","parameters":[{"name":"skeleton_only","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Skeleton Only"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Topics"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/crawl-sparql/{crawl_id}":{"get":{"tags":["v1-admin"],"summary":"Sparql Crawl Status","description":"Check SPARQL crawl progress.","operationId":"sparql_crawl_status_api_v1_admin_pipeline_crawl_sparql__crawl_id__get","parameters":[{"name":"crawl_id","in":"path","required":true,"schema":{"type":"string","title":"Crawl Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/enrich-free":{"post":{"tags":["v1-admin"],"summary":"Start Free Enrichment","description":"Batch Stage 2 enrichment for all skeleton entities. FREE — no paid APIs.\n\nRuns: Wikidata structured properties → academic cross-links → AI rewrite → embeddings\nOnly processes entities that are still at Stage 1 (no enhanced_content).","operationId":"start_free_enrichment_api_v1_admin_pipeline_enrich_free_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/enrich-free/{enrichment_id}":{"get":{"tags":["v1-admin"],"summary":"Free Enrichment Status","description":"Check the status of a free enrichment job.","operationId":"free_enrichment_status_api_v1_admin_pipeline_enrich_free__enrichment_id__get","parameters":[{"name":"enrichment_id","in":"path","required":true,"schema":{"type":"string","title":"Enrichment Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/enrich-seo":{"post":{"tags":["v1-admin"],"summary":"Start Seo Enrichment","description":"Batch-enrich ALL entities with SEO data. ~$0.04 total for all entities.\n\nSet rewrite_content=True to also re-run AI rewriter with SEO data woven in.","operationId":"start_seo_enrichment_api_v1_admin_pipeline_enrich_seo_post","parameters":[{"name":"rewrite_content","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Rewrite Content"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/enrich-seo/{enrichment_id}":{"get":{"tags":["v1-admin"],"summary":"Enrichment Status","description":"Check the status of a batch SEO enrichment job.","operationId":"enrichment_status_api_v1_admin_pipeline_enrich_seo__enrichment_id__get","parameters":[{"name":"enrichment_id","in":"path","required":true,"schema":{"type":"string","title":"Enrichment Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/backfill-structured":{"post":{"tags":["v1-admin"],"summary":"Start Backfill Structured","description":"Backfill structured Wikidata properties for all entities. Free API.\n\nDefault concurrency=5 balances speed vs Wikidata rate limits.\n~106K entities at concurrency=5 ≈ 3-4 hours.\nSet force=true to re-fetch ALL entities (even those with existing structured_data).","operationId":"start_backfill_structured_api_v1_admin_pipeline_backfill_structured_post","parameters":[{"name":"concurrency","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Concurrency"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/backfill-structured/{backfill_id}":{"get":{"tags":["v1-admin"],"summary":"Backfill Status","description":"Check backfill progress.","operationId":"backfill_status_api_v1_admin_pipeline_backfill_structured__backfill_id__get","parameters":[{"name":"backfill_id","in":"path","required":true,"schema":{"type":"string","title":"Backfill Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/backfill-academic":{"post":{"tags":["v1-admin"],"summary":"Start Backfill Academic","description":"Backfill academic data for entities with cross-link IDs (ORCID, DOI, OpenAlex).\n\nReads cross-link IDs from structured_data and fetches from academic providers.\nFree — all providers are free through 4ort.io.","operationId":"start_backfill_academic_api_v1_admin_pipeline_backfill_academic_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/discover-keywords":{"post":{"tags":["v1-admin"],"summary":"Start Keyword Discovery","description":"Discover AI-related keywords via DataForSEO Labs.\n\nRuns keyword_suggestions + related_keywords for each seed,\nthen keywords_for_site for target domains. Deduplicates and stores.\nCost: ~$0.05-0.15 depending on settings.","operationId":"start_keyword_discovery_api_v1_admin_pipeline_discover_keywords_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeywordDiscoveryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/discover-keywords/{research_id}":{"get":{"tags":["v1-admin"],"summary":"Keyword Discovery Status","description":"Check keyword discovery progress.","operationId":"keyword_discovery_status_api_v1_admin_pipeline_discover_keywords__research_id__get","parameters":[{"name":"research_id","in":"path","required":true,"schema":{"type":"string","title":"Research Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/harvest":{"post":{"tags":["v1-admin"],"summary":"Start Harvest","description":"Bulk harvest entities from Wikidata SPARQL. FREE. ~100K entities in ~10 min.\n\nAvailable domains: ai, software, web, os, companies, people, languages, education\n\nPass domains=[\"languages\"] for a quick test (~2K entities).\nOmit domains for all domains (~100K entities).","operationId":"start_harvest_api_v1_admin_pipeline_harvest_post","parameters":[{"name":"domains","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Domains"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/harvest/{harvest_id}":{"get":{"tags":["v1-admin"],"summary":"Harvest Status","description":"Check harvest progress.","operationId":"harvest_status_api_v1_admin_pipeline_harvest__harvest_id__get","parameters":[{"name":"harvest_id","in":"path","required":true,"schema":{"type":"string","title":"Harvest Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/harvest/cross-domain":{"post":{"tags":["v1-admin"],"summary":"Start Cross Domain Harvest","description":"Harvest cross-domain relationships (educated at, employer, developer, etc.).\nConnects the 8 domain clusters into one unified graph. FREE. ~30 min.","operationId":"start_cross_domain_harvest_api_v1_admin_pipeline_harvest_cross_domain_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/harvest/seeds":{"post":{"tags":["v1-admin"],"summary":"Start Seed Harvest","description":"Harvest important entities missing from type-based harvests.\n\nIncludes major platforms (YouTube, Twitter, Reddit), ML frameworks\n(PyTorch, TensorFlow), databases, dev tools, and more.\nFetches entities + structured_data from Wikidata. FREE.","operationId":"start_seed_harvest_api_v1_admin_pipeline_harvest_seeds_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/growth/start":{"post":{"tags":["v1-admin"],"summary":"Start Growth Cycle","description":"Start an autonomous growth cycle.\n\nDirections: ai-core, ai-products, ai-business, ai-research\n\nCost: ~$0.50-1.20 per cycle (DataForSEO discovery + SEO metrics).\nAI filtering, categorization, entity creation, and enrichment are FREE.","operationId":"start_growth_cycle_api_v1_admin_pipeline_growth_start_post","parameters":[{"name":"direction","in":"query","required":false,"schema":{"type":"string","default":"ai-core","title":"Direction"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/growth/budget":{"get":{"tags":["v1-admin"],"summary":"Growth Budget","description":"Current month's DataForSEO budget status.","operationId":"growth_budget_api_v1_admin_pipeline_growth_budget_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/growth/directions":{"get":{"tags":["v1-admin"],"summary":"List Growth Directions","description":"List available growth directions.","operationId":"list_growth_directions_api_v1_admin_pipeline_growth_directions_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/growth/{cycle_id}":{"get":{"tags":["v1-admin"],"summary":"Growth Cycle Status","description":"Check growth cycle progress.","operationId":"growth_cycle_status_api_v1_admin_pipeline_growth__cycle_id__get","parameters":[{"name":"cycle_id","in":"path","required":true,"schema":{"type":"string","title":"Cycle Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/contribute/summary":{"get":{"tags":["v1-admin"],"summary":"Contribute Summary","description":"Summary of missing entities to be created on Wikidata, grouped by company.","operationId":"contribute_summary_api_v1_admin_pipeline_contribute_summary_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/contribute/quickstatements":{"get":{"tags":["v1-admin"],"summary":"Contribute Quickstatements","description":"Generate QuickStatements for bulk Wikidata entity creation.\n\nPaste output into https://quickstatements.toolforge.org/\nFormats: v1 (tab-separated), csv","operationId":"contribute_quickstatements_api_v1_admin_pipeline_contribute_quickstatements_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"v1","title":"Format"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/contribute/verify":{"post":{"tags":["v1-admin"],"summary":"Contribute Verify","description":"Pre-flight check: verify none of the 184 entities already exist on Wikidata.\n\nSearches each entity name and returns matches. Run this before submitting\nQuickStatements to avoid duplicates.","operationId":"contribute_verify_api_v1_admin_pipeline_contribute_verify_post","parameters":[{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Batch Size"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/backfill-content":{"post":{"tags":["v1-admin"],"summary":"Start Backfill Content","description":"Batch Stage 2 enrichment: AI rewrite + embedding for skeleton entities.\n\nProcesses entities that have structured_data but no enhanced_content.\nUses lightweight enrich_skeleton() — skips entity search.\nFree (Gemini via 4ort.io). ~24-30hrs for 89K entities at concurrency=10.","operationId":"start_backfill_content_api_v1_admin_pipeline_backfill_content_post","parameters":[{"name":"concurrency","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Concurrency"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/infer-relationships":{"post":{"tags":["v1-admin"],"summary":"Start Relationship Inference","description":"Use AI to infer relationships not in Wikidata (GPU↔model compat, etc).\n\nAvailable rules: gpu_runs_llm, competing_gpu, competing_llm, model_uses_framework\n\nlimit = max entities per side (0 = no limit).\nmin_confidence = threshold for creating relationships (0.0-1.0).\nmin_sitelinks = minimum Wikipedia editions for entity inclusion (default 10).\nmodel = LLM model to use (default \"auto\" for round-robin).\nbase_url = custom OpenAI-compatible endpoint (e.g. http://localhost:1234/v1 for LM Studio).","operationId":"start_relationship_inference_api_v1_admin_pipeline_infer_relationships_post","parameters":[{"name":"rules","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Rules"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Limit"}},{"name":"min_confidence","in":"query","required":false,"schema":{"type":"number","default":0.7,"title":"Min Confidence"}},{"name":"min_sitelinks","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Min Sitelinks"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"auto","title":"Model"}},{"name":"base_url","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/infer-relationships/{inference_id}":{"get":{"tags":["v1-admin"],"summary":"Inference Status","description":"Check AI relationship inference progress.","operationId":"inference_status_api_v1_admin_pipeline_infer_relationships__inference_id__get","parameters":[{"name":"inference_id","in":"path","required":true,"schema":{"type":"string","title":"Inference Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/connect-all":{"post":{"tags":["v1-admin"],"summary":"Connect All","description":"Run Phase 2 (SPARQL cross-domain harvest) then Phase 3 (AI inference) sequentially.\n\nCross-domain harvest runs first to create free Wikidata-based edges.\nAI inference runs after, skipping pairs already connected by SPARQL.\nBoth are resumable — safe to restart if interrupted.","operationId":"connect_all_api_v1_admin_pipeline_connect_all_post","parameters":[{"name":"min_confidence","in":"query","required":false,"schema":{"type":"number","default":0.7,"title":"Min Confidence"}},{"name":"min_sitelinks","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Min Sitelinks"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"auto","title":"Model"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/backfill-keyword-embeddings":{"post":{"tags":["v1-admin"],"summary":"Start Backfill Keyword Embeddings","description":"Re-embed all keywords at 2000-dim for unified RAG search. Free.","operationId":"start_backfill_keyword_embeddings_api_v1_admin_pipeline_backfill_keyword_embeddings_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/build-relationships":{"post":{"tags":["v1-admin"],"summary":"Start Build Relationships","description":"Build relationships from structured_data by matching entity names + aliases.\n\nZero API calls — scans local data only. ~15 minutes for 106K entities.\nResumable: re-running is always safe (deduplicates on insert).\n\nproperties: Limit to specific keys (e.g. [\"developer\", \"platform\"]).\ndry_run: Scan and report matches without creating relationships.","operationId":"start_build_relationships_api_v1_admin_pipeline_build_relationships_post","parameters":[{"name":"properties","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Properties"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/pipeline/build-relationships/{builder_id}":{"get":{"tags":["v1-admin"],"summary":"Build Relationships Status","description":"Check relationship builder progress.","operationId":"build_relationships_status_api_v1_admin_pipeline_build_relationships__builder_id__get","parameters":[{"name":"builder_id","in":"path","required":true,"schema":{"type":"string","title":"Builder Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["seo"],"summary":"Homepage","description":"SSR homepage: the hero (job line, one search box, Try it in 4ort.ai), trending, and a\nshort what's-inside strip. Same family as 4ort.ai's first run (2026-10-25).","operationId":"homepage__head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"head":{"tags":["seo"],"summary":"Homepage","description":"SSR homepage: the hero (job line, one search box, Try it in 4ort.ai), trending, and a\nshort what's-inside strip. Same family as 4ort.ai's first run (2026-10-25).","operationId":"homepage__head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/browse":{"get":{"tags":["seo"],"summary":"Browse Page","description":"SSR browse page — all domains with top entities, cached.","operationId":"browse_page_browse_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"head":{"tags":["seo"],"summary":"Browse Page","description":"SSR browse page — all domains with top entities, cached.","operationId":"browse_page_browse_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/browse/{domain}":{"head":{"tags":["seo"],"summary":"Browse Domain Page","description":"SSR domain page — all entities in a domain, paginated, with type filter.","operationId":"browse_domain_page_browse__domain__head","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"subtype","in":"query","required":false,"schema":{"type":"string","title":"Subtype"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Browse Domain Page","description":"SSR domain page — all entities in a domain, paginated, with type filter.","operationId":"browse_domain_page_browse__domain__head","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"subtype","in":"query","required":false,"schema":{"type":"string","title":"Subtype"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/browse/{domain}/{subtype}":{"head":{"tags":["seo"],"summary":"Browse Domain Page","description":"SSR domain page — all entities in a domain, paginated, with type filter.","operationId":"browse_domain_page_browse__domain___subtype__head","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"subtype","in":"path","required":true,"schema":{"type":"string","title":"Subtype"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Browse Domain Page","description":"SSR domain page — all entities in a domain, paginated, with type filter.","operationId":"browse_domain_page_browse__domain___subtype__head","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"subtype","in":"path","required":true,"schema":{"type":"string","title":"Subtype"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/entity/{slug}.md":{"head":{"tags":["seo"],"summary":"Entity Markdown","description":"LLM-friendly markdown alternative to the HTML entity page.\n\nConvention: many sites now expose `<page>.md` for LLM crawlers. Plain markdown\n= no HTML cruft, low-token retrieval target, same factual content as the HTML\npage but easier to parse + cite.","operationId":"entity_markdown_entity__slug__md_head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Entity Markdown","description":"LLM-friendly markdown alternative to the HTML entity page.\n\nConvention: many sites now expose `<page>.md` for LLM crawlers. Plain markdown\n= no HTML cruft, low-token retrieval target, same factual content as the HTML\npage but easier to parse + cite.","operationId":"entity_markdown_entity__slug__md_head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/entity/{slug}/facts.json":{"head":{"tags":["seo"],"summary":"Entity Facts Json","description":"Pure structured-data endpoint — JSON-LD shaped output for LLM crawlers + agents.\n\nTier system (use ?level=...):\n  - level=summary  ~3-5KB    name, description, _confidence, top-tier Schema fields\n  - level=standard ~15-25KB  + per-claim source counts, top 30 citations  (DEFAULT)\n  - level=full     ~75-150KB + raw _claims_rich (qualifiers + all references)\n\nAgents fitting in tight context windows should request summary or standard.","operationId":"entity_facts_json_entity__slug__facts_json_head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Entity Facts Json","description":"Pure structured-data endpoint — JSON-LD shaped output for LLM crawlers + agents.\n\nTier system (use ?level=...):\n  - level=summary  ~3-5KB    name, description, _confidence, top-tier Schema fields\n  - level=standard ~15-25KB  + per-claim source counts, top 30 citations  (DEFAULT)\n  - level=full     ~75-150KB + raw _claims_rich (qualifiers + all references)\n\nAgents fitting in tight context windows should request summary or standard.","operationId":"entity_facts_json_entity__slug__facts_json_head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/entity/{slug}/programmatic":{"get":{"tags":["seo"],"summary":"Entity Page Programmatic Redirect","description":"Legacy URL — the programmatic article now renders inside the canonical\nentity template via the ``?body=programmatic`` query parameter. 302 to\nkeep old links working.","operationId":"entity_page_programmatic_redirect_entity__slug__programmatic_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/entity/{slug}":{"head":{"tags":["seo"],"summary":"Entity Page Cached","description":"Anonymous-GET cache in front of entity_page (app/services/page_cache.py). Key = slug + the row's updated_at,\nso any write to the row (flag, suppression, scrub, refresh) is a miss; mint-lane rows and requests with a\nsession cookie or a non-default query are never cached.","operationId":"entity_page_cached_entity__slug__head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"body","in":"query","required":false,"schema":{"type":"string","default":"programmatic","title":"Body"}},{"name":"expansion","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Expansion"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Entity Page Cached","description":"Anonymous-GET cache in front of entity_page (app/services/page_cache.py). Key = slug + the row's updated_at,\nso any write to the row (flag, suppression, scrub, refresh) is a miss; mint-lane rows and requests with a\nsession cookie or a non-default query are never cached.","operationId":"entity_page_cached_entity__slug__head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"body","in":"query","required":false,"schema":{"type":"string","default":"programmatic","title":"Body"}},{"name":"expansion","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Expansion"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topic/{slug}":{"head":{"tags":["seo"],"summary":"Topic Page","description":"Render a category or list entity as a topic landing page with related entities.","operationId":"topic_page_topic__slug__head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Topic Page","description":"Render a category or list entity as a topic landing page with related entities.","operationId":"topic_page_topic__slug__head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/disambig/{slug}":{"head":{"tags":["seo"],"summary":"Disambig Page","description":"Render a disambiguation page showing entities with similar names.","operationId":"disambig_page_disambig__slug__head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Disambig Page","description":"Render a disambiguation page showing entities with similar names.","operationId":"disambig_page_disambig__slug__head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources":{"get":{"tags":["seo"],"summary":"Sources Page","description":"Comprehensive data-source / attribution page. Required by BLS, BEA,\nCensus, etc. for their data; also a trust signal for paid customers\nwho want auditable provenance of every fact in our graph.\n\nLives at /sources (canonical, user-friendly). The legacy /attribution\nURL 301-redirects here so older backlinks keep working and Google sees\none canonical page (no duplicate-content penalty).","operationId":"sources_page_sources_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"head":{"tags":["seo"],"summary":"Sources Page","description":"Comprehensive data-source / attribution page. Required by BLS, BEA,\nCensus, etc. for their data; also a trust signal for paid customers\nwho want auditable provenance of every fact in our graph.\n\nLives at /sources (canonical, user-friendly). The legacy /attribution\nURL 301-redirects here so older backlinks keep working and Google sees\none canonical page (no duplicate-content penalty).","operationId":"sources_page_sources_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/attribution":{"get":{"tags":["seo"],"summary":"Attribution Redirect","description":"301 → /sources. Renamed for clarity; kept for stable old backlinks.","operationId":"attribution_redirect_attribution_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["seo"],"summary":"Attribution Redirect","description":"301 → /sources. Renamed for clarity; kept for stable old backlinks.","operationId":"attribution_redirect_attribution_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/about":{"get":{"tags":["seo"],"summary":"About Page","description":"About page — mission, principles, founder, stack. Trust signal for\nAI evaluators (ChatGPT/Claude) and humans alike. Schema.org Organization\nmarkup declares us as a real entity with a name + founder + sameAs chain.","operationId":"about_page_about_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/privacy":{"get":{"tags":["seo"],"summary":"Privacy Page","description":"Privacy notice for visitors, API users and graph subjects.","operationId":"privacy_page_privacy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/refunds":{"get":{"tags":["seo"],"summary":"Refunds Page","description":"Public refund and cancellation policy.","operationId":"refunds_page_refunds_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/terms":{"get":{"tags":["seo"],"summary":"Terms Page","description":"Terms of service. Plain-language. Important for the API tier\nwhere we'll need to enforce rate limits + acceptable use.","operationId":"terms_page_terms_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/coverage":{"get":{"tags":["seo"],"summary":"Coverage Dashboard","description":"Data coverage audit dashboard. Shows what fraction of entities have\neach field populated — useful for debugging gaps and prioritizing\nbackfills. Cached 5 min in Redis.","operationId":"coverage_dashboard_coverage_get","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search":{"get":{"tags":["seo"],"summary":"Search Page","description":"Smart-router search UI — Stage 1 of SEARCH_ENGINE_PLAN.md.\n\nServer-renders the same 4-layer result the /api/v1/route JSON endpoint\nreturns: classified intent, canonical 4ort.xyz entity, authoritative\nsource routing, and page-level fallback hits from the Common Crawl corpus.","operationId":"search_page_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/coverage":{"get":{"tags":["seo"],"summary":"Coverage Json","description":"JSON version of /coverage — agent-friendly for monitoring tools.","operationId":"coverage_json_api_coverage_get","parameters":[{"name":"refresh","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/robots.txt":{"get":{"tags":["seo"],"summary":"Robots Txt","description":"Welcome LLM crawlers + standard search bots; block /search?q=… result\npages site-wide.\n\nMany sites block GPTBot/ClaudeBot/PerplexityBot out of caution. We're\ndeliberately the OPPOSITE — citations are our value prop, so being indexed\nby every retrieval-capable LLM is critical. But we DO block crawlers from\nfetching /search?q=… result pages — those are user-typed queries we don't\nwant indexed under our domain authority (SEO-poisoning defense).","operationId":"robots_txt_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms.txt":{"get":{"tags":["seo"],"summary":"Llms Txt","description":"Site-level LLM signal (proposed convention; cf. llmstxt.org).\n\nProvides a markdown-formatted overview that LLM crawlers can ingest as a\nsingle high-density description of what 4ort.xyz is and how to consume it.","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/sitemap.xml":{"get":{"tags":["seo"],"summary":"Sitemap Index","operationId":"sitemap_index_sitemap_xml_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["seo"],"summary":"Sitemap Index","operationId":"sitemap_index_sitemap_xml_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap/trending.xml":{"get":{"tags":["seo"],"summary":"Sitemap Trending","description":"Sitemap of the programmatic /trending/{country}/{slug}/{period} pages.\n\nReads the DISTINCT slices present in trending_slice — that table is the\nquality gate (the builder only writes slices with ≥10 entities), so any\ncombo appearing here is guaranteed to be a real, non-thin page.","operationId":"sitemap_trending_sitemap_trending_xml_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["seo"],"summary":"Sitemap Trending","description":"Sitemap of the programmatic /trending/{country}/{slug}/{period} pages.\n\nReads the DISTINCT slices present in trending_slice — that table is the\nquality gate (the builder only writes slices with ≥10 entities), so any\ncombo appearing here is guaranteed to be a real, non-thin page.","operationId":"sitemap_trending_sitemap_trending_xml_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap/recrawl-{page}.xml":{"head":{"tags":["seo"],"summary":"Sitemap Recrawl","description":"The pages the bad adult Q-IDs wrongly noindexed — see generate_sitemaps.py.","operationId":"sitemap_recrawl_sitemap_recrawl__page__xml_head","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"integer","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Sitemap Recrawl","description":"The pages the bad adult Q-IDs wrongly noindexed — see generate_sitemaps.py.","operationId":"sitemap_recrawl_sitemap_recrawl__page__xml_head","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"integer","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap/lane-trial-{page}.xml":{"head":{"tags":["seo"],"summary":"Sitemap Lane Trial","description":"The 10k register-lane trial pages (boss ruling 2026-10-10) — see generate_sitemaps.py.","operationId":"sitemap_lane_trial_sitemap_lane_trial__page__xml_head","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"integer","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Sitemap Lane Trial","description":"The 10k register-lane trial pages (boss ruling 2026-10-10) — see generate_sitemaps.py.","operationId":"sitemap_lane_trial_sitemap_lane_trial__page__xml_head","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"integer","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap/entities-{page}.xml":{"head":{"tags":["seo"],"summary":"Sitemap Entities","operationId":"sitemap_entities_sitemap_entities__page__xml_head","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"integer","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Sitemap Entities","operationId":"sitemap_entities_sitemap_entities__page__xml_head","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"integer","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/{page}":{"head":{"tags":["seo"],"summary":"Topics Hub","description":"Index of the topic pages, so they are not sitemap-only orphans.\n\nBefore this, 45,924 topic pages were DECLARED in the sitemap and had eight\ninternal links between them — the fifteen in the footer, of which seven\n404'd until this morning. A page a crawler can only reach by reading an XML\nfile gets no internal signal and no human path; \"in the sitemap\" and\n\"reachable\" are different claims and only the first was true.\n\nPaginated rather than truncated: the top 500 would have left 45,424 pages\nexactly as orphaned as before, which is the kind of fix that measures well\nand changes nothing.","operationId":"topics_hub_topics__page__head","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"integer","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Topics Hub","description":"Index of the topic pages, so they are not sitemap-only orphans.\n\nBefore this, 45,924 topic pages were DECLARED in the sitemap and had eight\ninternal links between them — the fifteen in the footer, of which seven\n404'd until this morning. A page a crawler can only reach by reading an XML\nfile gets no internal signal and no human path; \"in the sitemap\" and\n\"reachable\" are different claims and only the first was true.\n\nPaginated rather than truncated: the top 500 would have left 45,424 pages\nexactly as orphaned as before, which is the kind of fix that measures well\nand changes nothing.","operationId":"topics_hub_topics__page__head","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"integer","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics":{"head":{"tags":["seo"],"summary":"Topics Hub","description":"Index of the topic pages, so they are not sitemap-only orphans.\n\nBefore this, 45,924 topic pages were DECLARED in the sitemap and had eight\ninternal links between them — the fifteen in the footer, of which seven\n404'd until this morning. A page a crawler can only reach by reading an XML\nfile gets no internal signal and no human path; \"in the sitemap\" and\n\"reachable\" are different claims and only the first was true.\n\nPaginated rather than truncated: the top 500 would have left 45,424 pages\nexactly as orphaned as before, which is the kind of fix that measures well\nand changes nothing.","operationId":"topics_hub_topics_head","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Topics Hub","description":"Index of the topic pages, so they are not sitemap-only orphans.\n\nBefore this, 45,924 topic pages were DECLARED in the sitemap and had eight\ninternal links between them — the fifteen in the footer, of which seven\n404'd until this morning. A page a crawler can only reach by reading an XML\nfile gets no internal signal and no human path; \"in the sitemap\" and\n\"reachable\" are different claims and only the first was true.\n\nPaginated rather than truncated: the top 500 would have left 45,424 pages\nexactly as orphaned as before, which is the kind of fix that measures well\nand changes nothing.","operationId":"topics_hub_topics_head","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap/read.xml":{"get":{"tags":["seo"],"summary":"Sitemap Read","description":"Sitemap of /read and the per-country reading pages.\n\nThese had NO sitemap at all — 29 country pages and the hub, indexable and\ninternally linked but never declared. Listed from the same predicate the\nhub links with, so the sitemap cannot advertise a page that 404s: a country\nis here only if at least _READ_MIN_ROWS of its articles survive the filters.","operationId":"sitemap_read_sitemap_read_xml_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["seo"],"summary":"Sitemap Read","description":"Sitemap of /read and the per-country reading pages.\n\nThese had NO sitemap at all — 29 country pages and the hub, indexable and\ninternally linked but never declared. Listed from the same predicate the\nhub links with, so the sitemap cannot advertise a page that 404s: a country\nis here only if at least _READ_MIN_ROWS of its articles survive the filters.","operationId":"sitemap_read_sitemap_read_xml_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap/rankings.xml":{"get":{"tags":["seo"],"summary":"Sitemap Rankings","description":"Sitemap of the /rankings pages, plus the hub.\n\nThese served fine and were in NO sitemap, with seven of them reachable only\nfrom a footer column — the property's most commercial-intent surface, and\ncrawlers had almost no way in.\n\nOnly RANKINGS_INDEXED is listed, and that tuple is a measured set rather\nthan the route's own vocabulary: /rankings/{domain} accepts any string and\nanswers 200 for most of them, so deriving the sitemap from the route would\npublish thin pages, 70-second pages, and two URLs with identical contents.\n\nlastmod is the last day the pageview rollup landed, because that is what\nactually re-ranks these lists.","operationId":"sitemap_rankings_sitemap_rankings_xml_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["seo"],"summary":"Sitemap Rankings","description":"Sitemap of the /rankings pages, plus the hub.\n\nThese served fine and were in NO sitemap, with seven of them reachable only\nfrom a footer column — the property's most commercial-intent surface, and\ncrawlers had almost no way in.\n\nOnly RANKINGS_INDEXED is listed, and that tuple is a measured set rather\nthan the route's own vocabulary: /rankings/{domain} accepts any string and\nanswers 200 for most of them, so deriving the sitemap from the route would\npublish thin pages, 70-second pages, and two URLs with identical contents.\n\nlastmod is the last day the pageview rollup landed, because that is what\nactually re-ranks these lists.","operationId":"sitemap_rankings_sitemap_rankings_xml_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap/topics-{page}.xml":{"head":{"tags":["seo"],"summary":"Sitemap Topics","operationId":"sitemap_topics_sitemap_topics__page__xml_head","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"integer","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Sitemap Topics","operationId":"sitemap_topics_sitemap_topics__page__xml_head","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"integer","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rankings":{"get":{"tags":["seo"],"summary":"Rankings Hub","description":"Hub listing every published rankings page.\n\nREGISTERED BEFORE /rankings/{domain} ON PURPOSE. FastAPI matches in\ndeclaration order and the catch-all would otherwise swallow /rankings and\nrender \"Most Popular Rankings\" (main.py says the same about /sample).\n\nA sitemap alone would leave these reachable only by a crawler that reads\nit. This is the page a reader can actually get to, and the footer links it.","operationId":"rankings_hub_rankings_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"head":{"tags":["seo"],"summary":"Rankings Hub","description":"Hub listing every published rankings page.\n\nREGISTERED BEFORE /rankings/{domain} ON PURPOSE. FastAPI matches in\ndeclaration order and the catch-all would otherwise swallow /rankings and\nrender \"Most Popular Rankings\" (main.py says the same about /sample).\n\nA sitemap alone would leave these reachable only by a crawler that reads\nit. This is the page a reader can actually get to, and the footer links it.","operationId":"rankings_hub_rankings_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/rankings/{domain}":{"head":{"tags":["seo"],"summary":"Rankings Page","operationId":"rankings_page_rankings__domain__head","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["seo"],"summary":"Rankings Page","operationId":"rankings_page_rankings__domain__head","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trending/entities":{"get":{"tags":["seo"],"summary":"Api Trending Entities","description":"JSON feed of top entities by Wikipedia pageviews in the last N hours.\n\nQuery params:\n  hours   — window size (default 1, max 24)\n  limit   — max entities returned (default 50, max 200)\n  country — ISO alpha-2 (e.g. TR). Restricts the feed to entities that appear\n            in that country's news. UNKNOWN CODES 400 — this param was\n            previously accepted and silently ignored, which returned the\n            global feed under a country label: wrong data wearing the shape\n            of right data. See app/services/trending_country.py.\n\nEach entry includes a stable URL and the inputs to compute a velocity score\non the client side. The Explainable Trending Engine will extend each entry\nwith `trending_because` once the edit log is wired in.","operationId":"api_trending_entities_api_trending_entities_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Hours"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/rundown/entities":{"get":{"tags":["seo"],"summary":"Api Rundown Entities","description":"Trending entities annotated with GDELT news presence, rundown-shaped.\n\nQuery params mirror /api/trending/entities: hours (1-24), limit (1-100),\ncountry (ISO alpha-2; unknown codes 400 rather than silently going global).","operationId":"api_rundown_entities_api_v1_rundown_entities_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Hours"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trending/slice":{"get":{"tags":["seo"],"summary":"Api Trending Slice","description":"JSON feed of the top entities in one (category, country, period) slice.\n\nThin wrapper over `_fetch_trending_slice` (same logic that powers the HTML\n`/trending/{country}/{slug}/{period}` page). Mirrors `/api/trending/entities`\nresponse shape so consumers (4ort-stream's KgTopicSource, agents, etc.) share\none parser.\n\nUNLIKE the HTML route, this NEVER 404s on a thin (<10 row) slice — it returns\nthe list as-is plus the count in `_meta`. The consumer decides what to do with\na sparse category. The HTML anti-doorway 404 is for SEO; the API is for code.","operationId":"api_trending_slice_api_trending_slice_get","parameters":[{"name":"slug","in":"query","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"global","title":"Country"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trending/slugs":{"get":{"tags":["seo"],"summary":"Api Trending Slugs","description":"Discovery endpoint — list every registered category, country, and period\nslug so consumers can enumerate instead of hardcoding.","operationId":"api_trending_slugs_api_trending_slugs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/keyword/search":{"get":{"tags":["seo"],"summary":"Api Keyword Search","description":"Entity-aware keyword volume lookup.\n\nReturns ranked entity matches with monthly pageviews, velocity,\nclassification, and disambiguation siblings. Confidence-rated.\n\nCoverage layers (highest confidence first):\n  - exact name match\n  - alias match (entity_aliases — multilingual)\n  - sitelink title match (entity_sitelinks — multilingual)\n  - name prefix or substring match\n\nEach result includes:\n  monthly_pageviews, popularity_score, hourly_velocity_pct,\n  domain, entity_type, slug, related entities cluster.","operationId":"api_keyword_search_api_v1_keyword_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/world-cup":{"get":{"tags":["seo"],"summary":"World Cup Report Page","description":"Live World Cup brand & attention report — sponsors (+ sub-brands) + bubbling teams/\nplayers + brand news, off the daily pageview pipeline + GKG news index. Stale-while-\nrevalidate: always serves the last render instantly; refreshes in the background.","operationId":"world_cup_report_page_world_cup_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/report/world-cup":{"get":{"tags":["seo"],"summary":"World Cup Report Page","description":"Live World Cup brand & attention report — sponsors (+ sub-brands) + bubbling teams/\nplayers + brand news, off the daily pageview pipeline + GKG news index. Stale-while-\nrevalidate: always serves the last render instantly; refreshes in the background.","operationId":"world_cup_report_page_report_world_cup_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/trending":{"get":{"tags":["seo"],"summary":"Trending Page","description":"SSR trending leaderboard, sliceable by country/category/period/rank_by.\n\nURLs:\n  /trending                                         → global, last hour, by views\n  /trending?period=day                              → global, last 24h, by views\n  /trending?rank_by=velocity                        → surprises only (high velocity)\n  /trending?rank_by=novelty                         → surprises minus chronics\n  /trending?country=US&rank_by=velocity             → US surprises\n  /trending?country=DE&category=public_company&period=day\n\nReads from the Redis-backed engine (sub-ms) — same data as the\n/api/v1/trending endpoint, just rendered server-side for SEO + sharing.\nCached for 60 seconds at the CDN.","operationId":"trending_page_trending_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"hour","title":"Period"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"rank_by","in":"query","required":false,"schema":{"type":"string","default":"views","title":"Rank By"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/trending/weird":{"get":{"tags":["seo"],"summary":"Trending Weird Page","description":"The /trending/weird page — chronic-popularity transparency.\n\nSurfaces entities that are *always* in trending leaderboards but for\nstructural / non-newsworthy reasons (TLD articles, country names,\ncommon English words, etc.). Each section explains WHY that class of\nentity carries chronic baseline traffic.\n\nThis is the \"truth source we do not hide\" feature — other trending\nservices filter these out for being \"boring noise\"; we celebrate them\nas a fascinating window into how internet traffic actually flows.","operationId":"trending_weird_page_trending_weird_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/read":{"get":{"tags":["seo"],"summary":"Country Read Index","description":"Hub for the per-country reading pages, and an honest map of the gaps.\n\nThe uncovered countries are listed too, with the reason. \"Wikimedia does not\npublish this\" is a fact worth stating on a reference site rather than an\nabsence to hide.","operationId":"country_read_index_read_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/read/{country}":{"get":{"tags":["seo"],"summary":"Country Read Page","description":"What one country actually read on Wikipedia, on the most recent stored day.","operationId":"country_read_page_read__country__get","parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/trending/{country}/{slug}":{"get":{"tags":["seo"],"summary":"Trending Slice Default Period","operationId":"trending_slice_default_period_trending__country___slug__get","parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","title":"Country"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/trending/{country}/{slug}/{period}":{"get":{"tags":["seo"],"summary":"Trending Slice With Period","operationId":"trending_slice_with_period_trending__country___slug___period__get","parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","title":"Country"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"period","in":"path","required":true,"schema":{"type":"string","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/live-pulse":{"get":{"tags":["seo"],"summary":"Live Pulse","description":"Real-time activity feed for the homepage.","operationId":"live_pulse_api_live_pulse_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/q/{slug}":{"head":{"tags":["qa-pages"],"summary":"Shared Answer Page","description":"SSR page for a permanent shared Q&A answer.","operationId":"shared_answer_page_q__slug__head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["qa-pages"],"summary":"Shared Answer Page","description":"SSR page for a permanent shared Q&A answer.","operationId":"shared_answer_page_q__slug__head","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap-answers.xml":{"get":{"tags":["qa-pages"],"summary":"Sitemap Answers","description":"Search-engine-discoverable list of all indexable /q/{slug} pages.","operationId":"sitemap_answers_sitemap_answers_xml_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["qa-pages"],"summary":"Sitemap Answers","description":"Search-engine-discoverable list of all indexable /q/{slug} pages.","operationId":"sitemap_answers_sitemap_answers_xml_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/questions":{"get":{"tags":["qa-pages"],"summary":"Questions Index","description":"Browse-all page for shared answers — also serves as discovery for\ncrawlers (every Q&A page is reachable in 2 clicks from /).","operationId":"questions_index_questions_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"head":{"tags":["qa-pages"],"summary":"Questions Index","description":"Browse-all page for shared answers — also serves as discovery for\ncrawlers (every Q&A page is reachable in 2 clicks from /).","operationId":"questions_index_questions_head","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/img/wm/{path}":{"get":{"tags":["images"],"summary":"Lazy Wikimedia Image","description":"Serve `upload.wikimedia.org/wikipedia/<path>` lazily.\n\nFirst request: fetches upstream (compliant UA + 429 handling), saves to\ndisk, returns. Every later request: serves from disk in ~5ms with a\nlong Cache-Control so client browsers cache aggressively too.\n\nSingle-flight de-dup: if N concurrent requests hit the same cold path,\nonly one fetches upstream; the rest wait for the event.","operationId":"lazy_wikimedia_image_img_wm__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}},{"name":"s","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Health","operationId":"health_health_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/graph":{"get":{"summary":"Graph View","operationId":"graph_view_graph_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Graph View","operationId":"graph_view_graph_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/browse.html":{"get":{"summary":"Browse Html Redirect","operationId":"browse_html_redirect_browse_html_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Browse Html Redirect","operationId":"browse_html_redirect_browse_html_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/graph.html":{"get":{"summary":"Graph Html View","operationId":"graph_html_view_graph_html_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Graph Html View","operationId":"graph_html_view_graph_html_head","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AiCitationOut":{"properties":{"keyword":{"type":"string","title":"Keyword"},"cited_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cited Url"},"cited_brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cited Brand"},"citation_context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Citation Context"},"ai_provider":{"type":"string","title":"Ai Provider"},"snapshot_date":{"type":"string","format":"date","title":"Snapshot Date"}},"type":"object","required":["keyword","cited_url","cited_brand","citation_context","ai_provider","snapshot_date"],"title":"AiCitationOut"},"AlertFloors":{"properties":{"min_views_per_hour":{"type":"integer","maximum":10000000.0,"minimum":5.0,"title":"Min Views Per Hour","description":"Attention alerts need at least this many views in the latest hour","default":500},"min_mentions_24h":{"type":"integer","maximum":1000000.0,"minimum":1.0,"title":"Min Mentions 24H","description":"News alerts (surge, share of voice, tone) need this many mentions of the entity in 24 h (either 24 h window, so a falling share still alerts)","default":10}},"type":"object","title":"AlertFloors","description":"Workspace-wide absolute volume floors, applied on top of every watchlist's own thresholds\n(the stricter one wins). Defaults measured 2026-10-24 over the 1,094 entities in the\ntrend-intel category snapshot, last 48 h, same definition as the evaluator (latest hour vs\nthe 7-day hourly mean): entity-hour views p50 86 / p75 245 / p90 578 / p95 963; a 25-entity\nwatchlist gets ~16.5 attention alerts/day at a 50 views/hr floor, 6.6 at 300, 4.8 at 500,\n2.5 at 1,000; one-hour blips (back under +50% the next hour) are 24% of +100% hours under\n50 views/hr and 4-5% from 200 up. Mentions over 24 h per entity: p50 0 / p75 9 / p90 125.\n500 views/hr keeps alerts to roughly the top tenth of hourly attention (the Final Fantasy:\nBrave Exvius alert of 2026-10-24 fired at +121% on 209 views/hr); 10 mentions/24 h keeps\nnews rules to the top quarter of covered entities. Owners lower them for niche watchlists."},"AsOf":{"properties":{"copy_written_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Copy Written At","description":"When our stored row was last written for ANY reason (UTC ISO). Not a statement refresh: use claims_refreshed_at for that"},"last_source_edit_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Source Edit Seen","description":"Latest Wikidata edit to this item our edit stream recorded (UTC ISO)"},"stale_possible":{"type":"boolean","title":"Stale Possible","description":"Wikidata items: true unless our statements were checked against Wikidata (claims_refreshed_at) after the latest edit we saw. Other sources: true when the source recorded an edit after our copy was written","default":false},"claims_refreshed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claims Refreshed At","description":"When we last checked this item's statements against Wikidata and matched its revision (UTC ISO); null = not checked since 2026-10-25, when tracking began"},"source_revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Revision","description":"The Wikidata revision id our statements matched at claims_refreshed_at"}},"type":"object","title":"AsOf"},"Attention":{"properties":{"views":{"type":"integer","title":"Views"},"share_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share Pct","description":"Share of the compared set's pageviews; null when the set has none"},"previous_views":{"type":"integer","title":"Previous Views"},"previous_share_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Previous Share Pct"},"share_shift_pp":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share Shift Pp","description":"Percentage-point change vs the previous equal window"}},"type":"object","required":["views","share_pct","previous_views","previous_share_pct","share_shift_pp"],"title":"Attention"},"BrainAttention":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"False when this region's source could not be read this cycle"},"updated_at":{"type":"string","title":"Updated At","description":"When this region was last collected, UTC ISO 8601"},"source":{"type":"string","title":"Source","description":"Where the numbers come from"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Why ok is false: 'timeout' or 'unavailable'"},"trending":{"items":{"$ref":"#/components/schemas/BrainTrend"},"type":"array","title":"Trending","description":"Top English Wikipedia attention, rank order"},"window_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window End","description":"End of the pageview hour ranked"}},"type":"object","required":["ok","updated_at","source"],"title":"BrainAttention"},"BrainDeepMemory":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"False when this region's source could not be read this cycle"},"updated_at":{"type":"string","title":"Updated At","description":"When this region was last collected, UTC ISO 8601"},"source":{"type":"string","title":"Source","description":"Where the numbers come from"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Why ok is false: 'timeout' or 'unavailable'"},"sources":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sources","description":"Datasets in the 4ort lake catalog"},"rows_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rows Total","description":"Rows across every source's latest edition"},"newest_landing":{"anyOf":[{"$ref":"#/components/schemas/BrainLanding"},{"type":"null"}]},"catalog_generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalog Generated At"}},"type":"object","required":["ok","updated_at","source"],"title":"BrainDeepMemory"},"BrainEars":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"False when this region's source could not be read this cycle"},"updated_at":{"type":"string","title":"Updated At","description":"When this region was last collected, UTC ISO 8601"},"source":{"type":"string","title":"Source","description":"Where the numbers come from"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Why ok is false: 'timeout' or 'unavailable'"},"articles_1h":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Articles 1H","description":"News articles GDELT tagged in the last hour"},"latest_headlines":{"items":{"$ref":"#/components/schemas/BrainHeadline"},"type":"array","title":"Latest Headlines","description":"Newest headlines from allowlisted publishers, safety-screened"}},"type":"object","required":["ok","updated_at","source"],"title":"BrainEars"},"BrainEyes":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"False when this region's source could not be read this cycle"},"updated_at":{"type":"string","title":"Updated At","description":"When this region was last collected, UTC ISO 8601"},"source":{"type":"string","title":"Source","description":"Where the numbers come from"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Why ok is false: 'timeout' or 'unavailable'"},"pages_fetched_1m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pages Fetched 1M","description":"Pages the 4ort.nexus crawler fetched in the last minute"},"pages_fetched_1h":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pages Fetched 1H"},"pages_in_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pages In Index","description":"Pages in the nexus index (planner estimate)"},"last_fetch_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Fetch At"}},"type":"object","required":["ok","updated_at","source"],"title":"BrainEyes"},"BrainHeadline":{"properties":{"title":{"type":"string","title":"Title"},"publisher":{"type":"string","title":"Publisher","description":"Publisher domain"},"seen_at":{"type":"string","title":"Seen At"}},"type":"object","required":["title","publisher","seen_at"],"title":"BrainHeadline"},"BrainImmune":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"False when this region's source could not be read this cycle"},"updated_at":{"type":"string","title":"Updated At","description":"When this region was last collected, UTC ISO 8601"},"source":{"type":"string","title":"Source","description":"Where the numbers come from"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Why ok is false: 'timeout' or 'unavailable'"},"state":{"anyOf":[{"type":"string","enum":["clean","attention"]},{"type":"null"}],"title":"State","description":"'attention' while a critical trust-and-safety finding is open"},"last_patrol_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Patrol At"},"patrols_24h":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Patrols 24H"}},"type":"object","required":["ok","updated_at","source"],"title":"BrainImmune"},"BrainLanding":{"properties":{"source":{"type":"string","title":"Source"},"date":{"type":"string","title":"Date"}},"type":"object","required":["source","date"],"title":"BrainLanding"},"BrainLaunch":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"net":{"type":"string","title":"Net","description":"No Earlier Than, UTC ISO 8601"},"net_precision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Net Precision"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"webcast_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webcast Url"}},"type":"object","required":["net"],"title":"BrainLaunch"},"BrainMemory":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"False when this region's source could not be read this cycle"},"updated_at":{"type":"string","title":"Updated At","description":"When this region was last collected, UTC ISO 8601"},"source":{"type":"string","title":"Source","description":"Where the numbers come from"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Why ok is false: 'timeout' or 'unavailable'"},"entities_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Entities Total","description":"Entities in the knowledge graph (planner estimate)"},"entities_added_today":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Entities Added Today","description":"Entities created since 00:00 UTC"},"entities_added_today_as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entities Added Today As Of","description":"This count refreshes every 10 min"},"facts_added_today":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Facts Added Today","description":"Facts entering the served tier since 00:00 UTC"},"wikidata_edits_per_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wikidata Edits Per Min","description":"Wikidata edits to entities we hold, 5-min average"}},"type":"object","required":["ok","updated_at","source"],"title":"BrainMemory"},"BrainMissionControl":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"False when this region's source could not be read this cycle"},"updated_at":{"type":"string","title":"Updated At","description":"When this region was last collected, UTC ISO 8601"},"source":{"type":"string","title":"Source","description":"Where the numbers come from"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Why ok is false: 'timeout' or 'unavailable'"},"next_launch":{"anyOf":[{"$ref":"#/components/schemas/BrainLaunch"},{"type":"null"}]},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of"},"stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stale"},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution"}},"type":"object","required":["ok","updated_at","source"],"title":"BrainMissionControl"},"BrainReasoning":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"False when this region's source could not be read this cycle"},"updated_at":{"type":"string","title":"Updated At","description":"When this region was last collected, UTC ISO 8601"},"source":{"type":"string","title":"Source","description":"Where the numbers come from"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Why ok is false: 'timeout' or 'unavailable'"},"facts_verified_1h":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Facts Verified 1H","description":"Facts promoted into the served tier in the last hour"},"served_tier_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Served Tier Total","description":"Facts currently in the served tier"}},"type":"object","required":["ok","updated_at","source"],"title":"BrainReasoning"},"BrainRegions":{"properties":{"eyes":{"$ref":"#/components/schemas/BrainEyes"},"ears":{"$ref":"#/components/schemas/BrainEars"},"attention":{"$ref":"#/components/schemas/BrainAttention"},"memory":{"$ref":"#/components/schemas/BrainMemory"},"reasoning":{"$ref":"#/components/schemas/BrainReasoning"},"deep_memory":{"$ref":"#/components/schemas/BrainDeepMemory"},"mission_control":{"$ref":"#/components/schemas/BrainMissionControl"},"immune":{"$ref":"#/components/schemas/BrainImmune"},"voice":{"$ref":"#/components/schemas/BrainVoice"}},"type":"object","required":["eyes","ears","attention","memory","reasoning","deep_memory","mission_control","immune","voice"],"title":"BrainRegions"},"BrainTrend":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"why":{"type":"string","title":"Why","description":"Matched headline, or the organic-attention label when no headline matched"},"why_icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Icon","description":"news | organic_surge | organic_interest | followup"},"delta_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Pct","description":"Pageviews vs the 7-day baseline, percent"}},"type":"object","required":["name","why"],"title":"BrainTrend"},"BrainVoice":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"False when this region's source could not be read this cycle"},"updated_at":{"type":"string","title":"Updated At","description":"When this region was last collected, UTC ISO 8601"},"source":{"type":"string","title":"Source","description":"Where the numbers come from"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Why ok is false: 'timeout' or 'unavailable'"},"playing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Playing"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"artist":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Artist","description":"Null: 4ort.live tracks are generated, not credited"},"station":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Station"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"duration_s":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration S"}},"type":"object","required":["ok","updated_at","source"],"title":"BrainVoice"},"Candidate":{"properties":{"entity_id":{"type":"string","title":"Entity Id","description":"Pass this to get_entity_packet / get_entity_changes / get_attention"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"wikidata_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"monthly_pageviews":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Pageviews"}},"type":"object","required":["entity_id","name","confidence"],"title":"Candidate"},"CategoryEntity":{"properties":{"rank":{"type":"integer","title":"Rank"},"id":{"type":"string","title":"Id"},"wikidata_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"label":{"type":"string","title":"Label"},"type":{"type":"string","title":"Type"},"kg_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kg Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"views_last_hour":{"type":"integer","title":"Views Last Hour"},"baseline_per_hour":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Baseline Per Hour"},"delta_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Pct"},"views_24h":{"type":"integer","title":"Views 24H"},"views_prev_24h":{"type":"integer","title":"Views Prev 24H"},"attention_share_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Attention Share Pct"},"attention_share_last_hour_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Attention Share Last Hour Pct"},"news_mentions_24h":{"type":"integer","title":"News Mentions 24H"},"news_mentions_prev_24h":{"type":"integer","title":"News Mentions Prev 24H"},"share_of_voice_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share Of Voice Pct"},"tone_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tone 24H"},"tone_prev_24h":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tone Prev 24H"},"news_tracking":{"type":"string","enum":["tracked","queued"],"title":"News Tracking"},"ambiguous_name":{"type":"boolean","title":"Ambiguous Name","description":"Another KG entity with ≥500 monthly views shares this name"},"why":{"anyOf":[{"$ref":"#/components/schemas/WhyBlock"},{"type":"null"}]}},"type":"object","required":["rank","id","wikidata_id","slug","label","type","kg_type","description","url","views_last_hour","baseline_per_hour","delta_pct","views_24h","views_prev_24h","attention_share_pct","attention_share_last_hour_pct","news_mentions_24h","news_mentions_prev_24h","share_of_voice_pct","tone_24h","tone_prev_24h","news_tracking","ambiguous_name","why"],"title":"CategoryEntity"},"CategoryListResponse":{"properties":{"categories":{"items":{"$ref":"#/components/schemas/CategorySummary"},"type":"array","title":"Categories"},"computed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Computed At"},"window":{"anyOf":[{"$ref":"#/components/schemas/Window"},{"type":"null"}]},"lang_note":{"type":"string","title":"Lang Note"},"methodology":{"type":"string","title":"Methodology"}},"type":"object","required":["categories","computed_at","window","lang_note","methodology"],"title":"CategoryListResponse"},"CategoryResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"label":{"type":"string","title":"Label"},"group":{"type":"string","title":"Group"},"description":{"type":"string","title":"Description"},"membership":{"additionalProperties":true,"type":"object","title":"Membership"},"compared_set":{"type":"string","title":"Compared Set"},"members_in_pool":{"type":"integer","title":"Members In Pool"},"rising_rule":{"type":"string","title":"Rising Rule"},"totals":{"additionalProperties":true,"type":"object","title":"Totals"},"rank_by":{"type":"string","enum":["views","rising"],"title":"Rank By"},"entities":{"items":{"$ref":"#/components/schemas/CategoryEntity"},"type":"array","title":"Entities"},"count":{"type":"integer","title":"Count"},"window":{"additionalProperties":true,"type":"object","title":"Window"},"computed_at":{"type":"string","title":"Computed At"},"lang":{"type":"string","title":"Lang"},"lang_note":{"type":"string","title":"Lang Note"},"receipts":{"items":{"$ref":"#/components/schemas/Receipt"},"type":"array","title":"Receipts"},"methodology":{"type":"string","title":"Methodology"},"freshness":{"additionalProperties":true,"type":"object","title":"Freshness"}},"type":"object","required":["slug","label","group","description","membership","compared_set","members_in_pool","rising_rule","totals","rank_by","entities","count","window","computed_at","lang","lang_note","receipts","methodology","freshness"],"title":"CategoryResponse"},"CategorySummary":{"properties":{"slug":{"type":"string","title":"Slug"},"label":{"type":"string","title":"Label"},"group":{"type":"string","title":"Group"},"description":{"type":"string","title":"Description"},"membership":{"additionalProperties":true,"type":"object","title":"Membership"}},"type":"object","required":["slug","label","group","description","membership"],"title":"CategorySummary"},"Change":{"properties":{"changed_at":{"type":"string","title":"Changed At"},"fields":{"items":{"type":"string"},"type":"array","title":"Fields","description":"Properties the edit touched (P-codes)"},"field_labels":{"items":{"type":"string"},"type":"array","title":"Field Labels"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"actor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor"},"is_bot":{"type":"boolean","title":"Is Bot","default":false},"source":{"type":"string","title":"Source","default":"wikidata"}},"type":"object","required":["changed_at","fields","field_labels"],"title":"Change"},"Citation":{"properties":{"source":{"type":"string","title":"Source","description":"Source-registry key, e.g. 'wikidata', 'geonames' (see get_source_info)"},"source_name":{"type":"string","title":"Source Name","description":"Human name of the source dataset"},"source_record":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Record","description":"URL of the record inside the source that states this fact"},"source_edition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Edition","description":"Edition of that record we serve (ISO time or the dataset's edition label)"},"edition_basis":{"type":"string","enum":["claims_refreshed_at","copy_written_at","lake_edition","derived_at","unknown"],"title":"Edition Basis","description":"claims_refreshed_at: when we last checked this item's statements against the source and matched its revision (the value was current then); lake_edition: the dataset release we loaded; derived_at: when 4ort derived the claim; copy_written_at: when our row was last written, which is NOT a statement refresh (kept for older clients); unknown: not recorded"},"licence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Licence","description":"Licence of the source dataset; null = unknown, never assumed"},"licence_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Licence Url"},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution","description":"Credit line the licence requires when you reuse the fact; null = none required"},"references":{"items":{"$ref":"#/components/schemas/Reference"},"type":"array","title":"References","description":"The source's own references for this statement (at most 2)"}},"type":"object","required":["source","source_name","edition_basis"],"title":"Citation","description":"Where one fact comes from and what you may do with it."},"CompareResponse":{"properties":{"lang":{"type":"string","title":"Lang"},"lang_note":{"type":"string","title":"Lang Note"},"window_hours":{"type":"integer","title":"Window Hours"},"attention_window":{"$ref":"#/components/schemas/Window"},"news_window":{"$ref":"#/components/schemas/Window"},"entities":{"items":{"$ref":"#/components/schemas/ComparedEntity"},"type":"array","title":"Entities"},"totals":{"additionalProperties":true,"type":"object","title":"Totals"},"definitions":{"additionalProperties":true,"type":"object","title":"Definitions"},"queued_for_news":{"items":{"type":"string"},"type":"array","title":"Queued For News"},"receipts":{"items":{"$ref":"#/components/schemas/Receipt"},"type":"array","title":"Receipts"},"methodology":{"type":"string","title":"Methodology"},"freshness":{"additionalProperties":true,"type":"object","title":"Freshness"}},"type":"object","required":["lang","lang_note","window_hours","attention_window","news_window","entities","totals","definitions","queued_for_news","receipts","methodology","freshness"],"title":"CompareResponse"},"ComparedEntity":{"properties":{"id":{"type":"string","title":"Id","description":"4ort KG id (stable)"},"wikidata_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"label":{"type":"string","title":"Label"},"type":{"type":"string","title":"Type","description":"person | org | place | work | event | other KG class"},"kg_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kg Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"attention":{"$ref":"#/components/schemas/Attention"},"voice":{"$ref":"#/components/schemas/Voice"},"tone":{"$ref":"#/components/schemas/Tone"}},"type":"object","required":["id","wikidata_id","slug","label","type","kg_type","description","url","attention","voice","tone"],"title":"ComparedEntity"},"CrawlRequest":{"properties":{"seed_qid":{"type":"string","title":"Seed Qid"},"depth":{"type":"integer","title":"Depth","default":2},"max_entities":{"type":"integer","title":"Max Entities","default":100},"skeleton_only":{"type":"boolean","title":"Skeleton Only","default":false}},"type":"object","required":["seed_qid"],"title":"CrawlRequest"},"CrawlStatusResponse":{"properties":{"crawl_id":{"type":"string","title":"Crawl Id"},"status":{"type":"string","title":"Status"},"processed":{"type":"integer","title":"Processed"},"discovered":{"type":"integer","title":"Discovered"},"errors":{"type":"integer","title":"Errors"},"current_entity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Entity"}},"type":"object","required":["crawl_id","status","processed","discovered","errors","current_entity"],"title":"CrawlStatusResponse"},"CreateKeyIn":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"tier":{"type":"string","maxLength":32,"title":"Tier","default":"free"},"rate_limit_per_min":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Rate Limit Per Min","default":60},"allowed_origins":{"items":{"type":"string"},"type":"array","title":"Allowed Origins"}},"type":"object","required":["name"],"title":"CreateKeyIn"},"CreateKeyOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"tier":{"type":"string","title":"Tier"},"rate_limit_per_min":{"type":"integer","title":"Rate Limit Per Min"},"allowed_origins":{"items":{"type":"string"},"type":"array","title":"Allowed Origins"},"key_prefix":{"type":"string","title":"Key Prefix"},"raw_key":{"type":"string","title":"Raw Key"}},"type":"object","required":["id","name","tier","rate_limit_per_min","allowed_origins","key_prefix","raw_key"],"title":"CreateKeyOut"},"DayPoint":{"properties":{"day":{"type":"string","title":"Day"},"views":{"type":"integer","title":"Views"}},"type":"object","required":["day","views"],"title":"DayPoint"},"EntityBrief":{"properties":{"id":{"type":"string","title":"Id","description":"4ort KG id (stable)"},"wikidata_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"label":{"type":"string","title":"Label"},"type":{"type":"string","title":"Type","description":"person | org | place | work | event | other KG class"},"kg_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kg Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","required":["id","wikidata_id","slug","label","type","kg_type","description","url"],"title":"EntityBrief"},"EntityChangelogEntry":{"properties":{"changed_at":{"type":"string","title":"Changed At","description":"ISO 8601 timestamp"},"predicate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predicate"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"actor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor","description":"Editor handle from Wikidata, when known"}},"type":"object","required":["changed_at"],"title":"EntityChangelogEntry","description":"One change record from entity_edits — the per-entity Wikidata edit log."},"EntityCitation":{"properties":{"fact_predicate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fact Predicate","description":"Which predicate this citation backs, when known"},"url":{"type":"string","title":"Url"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher"},"retrieved_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retrieved At"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["url"],"title":"EntityCitation","description":"One citation row — sourced from ai_citations. Per-claim provenance\nthat lets a downstream consumer trace any fact to a verifiable URL."},"EntityDetailOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"enhanced_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enhanced Content"},"wikidata_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Id"},"google_kg_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Kg Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"raw_knowledge":{"anyOf":[{},{"type":"null"}],"title":"Raw Knowledge"},"structured_data":{"anyOf":[{},{"type":"null"}],"title":"Structured Data"},"domain_metrics":{"anyOf":[{},{"type":"null"}],"title":"Domain Metrics"},"serp_rankings":{"items":{"$ref":"#/components/schemas/SerpRankingOut"},"type":"array","title":"Serp Rankings"},"ai_citations":{"items":{"$ref":"#/components/schemas/AiCitationOut"},"type":"array","title":"Ai Citations"}},"type":"object","required":["id","name","slug","entity_type","description","enhanced_content","wikidata_id","google_kg_id","created_at","updated_at","raw_knowledge","structured_data","domain_metrics","serp_rankings","ai_citations"],"title":"EntityDetailOut"},"EntityFact":{"properties":{"predicate":{"type":"string","title":"Predicate","description":"Wikidata P-code, e.g. 'P31'"},"predicate_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predicate Label","description":"Human-readable predicate name, e.g. 'instance of'"},"value":{"type":"string","title":"Value","description":"Human-readable value (Q-IDs resolved to labels)"},"raw_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Value","description":"Raw Wikidata value (Q-id, date, etc.) for downstream parsing"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url","description":"The fact's source: the statement's reference URL when it has one, else its source record (the lane's record, the Wikidata statement, or the dataset edition). Never a 4ort.xyz page."},"verified":{"type":"boolean","title":"Verified","description":"True iff at least one external source URL is registered","default":false},"preferred":{"type":"boolean","title":"Preferred","description":"True for the preferred-rank claim on a multi-value property","default":false},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Source-registry key of the dataset this came from"},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"Licence name, e.g. 'CC0 1.0 Universal'"},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url","description":"Licence text URL"},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution","description":"Credit line the licence requires when redistributing (null = none)"}},"type":"object","required":["predicate","value"],"title":"EntityFact","description":"One fact about an entity — comes from claims_rich."},"EntityListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EntityOut"},"type":"array","title":"Items"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"total_capped":{"type":"boolean","title":"Total Capped","default":false}},"type":"object","required":["items"],"title":"EntityListOut"},"EntityOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"enhanced_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enhanced Content"},"wikidata_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Id"},"google_kg_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Kg Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","slug","entity_type","description","enhanced_content","wikidata_id","google_kg_id","created_at","updated_at"],"title":"EntityOut"},"EntityPageviewPoint":{"properties":{"period":{"type":"string","title":"Period","description":"ISO date/month/hour bucket boundary"},"views":{"type":"integer","title":"Views"},"lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang","description":"ISO-639-1 language code when point is language-scoped"}},"type":"object","required":["period","views"],"title":"EntityPageviewPoint"},"EntityPageviewSeries":{"properties":{"monthly":{"items":{"$ref":"#/components/schemas/EntityPageviewPoint"},"type":"array","title":"Monthly"},"daily":{"items":{"$ref":"#/components/schemas/EntityPageviewPoint"},"type":"array","title":"Daily"},"hourly":{"items":{"$ref":"#/components/schemas/EntityPageviewPoint"},"type":"array","title":"Hourly"},"by_lang":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Lang","description":"Monthly-aggregated views keyed by ISO-639-1 code"}},"type":"object","title":"EntityPageviewSeries","description":"Pageviews across granularities + by-language breakdown. Each section\nis independently empty-able — clients should not assume all four are\npopulated."},"EntityPopularity":{"properties":{"monthly_pageviews":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Pageviews"},"yearly_pageviews":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Yearly Pageviews"},"popularity_score":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Popularity Score","description":"Log-normalized score 0-1 derived from pageviews"},"rank_within_domain":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Within Domain"}},"type":"object","title":"EntityPopularity","description":"Pageview-derived popularity signals."},"EntityRecentEdit":{"properties":{"changed_at":{"type":"string","title":"Changed At","description":"ISO 8601 timestamp"},"predicate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predicate"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"}},"type":"object","required":["changed_at"],"title":"EntityRecentEdit","description":"A recent change to this entity from Wikidata."},"EntityRelationship":{"properties":{"target_id":{"type":"string","title":"Target Id"},"target_name":{"type":"string","title":"Target Name"},"target_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Slug"},"target_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Type"},"predicate":{"type":"string","title":"Predicate"},"predicate_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predicate Label"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Source-registry key of the dataset this came from"},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"Licence name, e.g. 'CC0 1.0 Universal'"},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url","description":"Licence text URL"},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution","description":"Credit line the licence requires when redistributing (null = none)"}},"type":"object","required":["target_id","target_name","predicate"],"title":"EntityRelationship","description":"One typed edge to another entity."},"EntityRelationshipDirected":{"properties":{"direction":{"type":"string","enum":["out","in"],"title":"Direction","description":"'out' = entity → target; 'in' = source → entity"},"target_id":{"type":"string","title":"Target Id"},"target_name":{"type":"string","title":"Target Name"},"target_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Slug"},"target_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Type"},"predicate":{"type":"string","title":"Predicate","description":"Predicate token, e.g. 'P31', 'mb:performer_of'"},"predicate_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predicate Label"},"qualifiers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Qualifiers","description":"Per-edge qualifier dict (start_time, end_time, role, etc.) when registered on the source graph. Shape mirrors Wikidata qualifiers."},"source_dataset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Dataset","description":"Originating dataset: 'wikidata' | 'musicbrainz' | 'edgar' | 'usda' | etc."},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"Licence name, e.g. 'CC0 1.0 Universal'"},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url","description":"Licence text URL"},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution","description":"Credit line the licence requires when redistributing (null = none)"}},"type":"object","required":["direction","target_id","target_name","predicate"],"title":"EntityRelationshipDirected","description":"One typed edge with explicit direction + qualifier passthrough.\n\nLives alongside the legacy flat `EntityRelationship` shape — this one\nsurfaces what the legacy version hid: which way the edge points, the\nqualifiers on it (start/end dates, role labels), and which dataset\nsourced it (Wikidata vs MusicBrainz vs internal heuristic)."},"EntityRelationshipsDirected":{"properties":{"outgoing":{"items":{"$ref":"#/components/schemas/EntityRelationshipDirected"},"type":"array","title":"Outgoing"},"incoming":{"items":{"$ref":"#/components/schemas/EntityRelationshipDirected"},"type":"array","title":"Incoming"},"out_total":{"type":"integer","title":"Out Total","description":"Total outgoing edges in graph (page may be smaller)","default":0},"in_total":{"type":"integer","title":"In Total","description":"Total incoming edges in graph (page may be smaller)","default":0}},"type":"object","title":"EntityRelationshipsDirected","description":"Directed-edge view of an entity's relationships, split + counted."},"EvidencePacket":{"properties":{"schema_version":{"type":"string","const":"4ort.packet/1","title":"Schema Version","default":"4ort.packet/1"},"entity":{"$ref":"#/components/schemas/PacketEntity"},"status":{"type":"string","enum":["complete","truncated"],"title":"Status","description":"complete: every selected fact is here; truncated: see omitted"},"as_of":{"$ref":"#/components/schemas/AsOf"},"facts":{"items":{"$ref":"#/components/schemas/Fact"},"type":"array","title":"Facts"},"unknowns":{"items":{"$ref":"#/components/schemas/Unknown"},"type":"array","title":"Unknowns"},"omitted":{"$ref":"#/components/schemas/Omitted"},"licences":{"items":{"$ref":"#/components/schemas/PacketLicence"},"type":"array","title":"Licences"},"routes":{"$ref":"#/components/schemas/PacketRoutes"},"trust_rules":{"additionalProperties":{"type":"string"},"type":"object","title":"Trust Rules","description":"Text of every trust rule id used by facts[].trust.basis"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["entity","status","as_of","facts","routes"],"title":"EvidencePacket","description":"One entity's facts with per-field provenance."},"Fact":{"properties":{"field":{"type":"string","title":"Field","description":"Property P-code, e.g. 'P569'"},"label":{"type":"string","title":"Label","description":"Property label, e.g. 'date of birth'"},"value":{"type":"string","title":"Value","description":"Display value (Q-ids resolved to labels, dates to their precision)"},"value_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Id","description":"Wikidata Q-id when the value is an item"},"value_raw":{"title":"Value Raw","description":"The value exactly as the source stores it"},"rank":{"type":"string","enum":["preferred","normal","deprecated"],"title":"Rank","default":"normal"},"current":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Current","description":"False when an end time qualifier (P582) is set; null when the source gives no period"},"qualifiers":{"items":{"$ref":"#/components/schemas/Qualifier"},"type":"array","title":"Qualifiers"},"layer":{"type":"string","enum":["source","derived"],"title":"Layer","description":"source: stated by the cited dataset; derived: a claim 4ort derived from cited evidence","default":"source"},"citation":{"$ref":"#/components/schemas/Citation"},"trust":{"$ref":"#/components/schemas/Trust"}},"type":"object","required":["field","label","value","citation","trust"],"title":"Fact"},"FindRoutesOut":{"properties":{"contract":{"type":"string","title":"Contract","default":"knowledge/1.2.0"},"query":{"type":"string","title":"Query"},"intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent"},"routes":{"items":{"$ref":"#/components/schemas/RouteOut"},"type":"array","title":"Routes"},"note":{"type":"string","title":"Note","default":"A route is a destination to fetch next, not evidence that the answer is there."}},"type":"object","required":["query","routes"],"title":"FindRoutesOut"},"GetAttentionOut":{"properties":{"contract":{"type":"string","title":"Contract","default":"knowledge/1.2.0"},"entity":{"$ref":"#/components/schemas/PacketEntity"},"resolution":{"$ref":"#/components/schemas/Resolution"},"period":{"type":"string","title":"Period"},"series":{"items":{"$ref":"#/components/schemas/SeriesPoint"},"type":"array","title":"Series","description":"Wikipedia pageviews, oldest first"},"total":{"type":"integer","title":"Total"},"change_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change Pct","description":"Second half of the series vs the first half, percent; null when the first half is 0"},"monthly_pageviews":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Pageviews"},"by_lang_30d":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Lang 30D","description":"Views per Wikipedia language, last 30 days"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of","description":"Latest period with data"},"citation":{"$ref":"#/components/schemas/Citation"}},"type":"object","required":["entity","resolution","period","series","total","citation"],"title":"GetAttentionOut"},"GetEntityChangesOut":{"properties":{"contract":{"type":"string","title":"Contract","default":"knowledge/1.2.0"},"entity":{"$ref":"#/components/schemas/PacketEntity"},"resolution":{"$ref":"#/components/schemas/Resolution"},"changes":{"items":{"$ref":"#/components/schemas/Change"},"type":"array","title":"Changes"},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"Pass as `since` to poll for newer changes"},"as_of":{"$ref":"#/components/schemas/AsOf"},"coverage":{"type":"string","title":"Coverage"}},"type":"object","required":["entity","resolution","changes","as_of","coverage"],"title":"GetEntityChangesOut"},"GetEntityPacketOut":{"properties":{"contract":{"type":"string","title":"Contract","default":"knowledge/1.2.0"},"packets":{"items":{"$ref":"#/components/schemas/EvidencePacket"},"type":"array","title":"Packets"},"resolutions":{"items":{"$ref":"#/components/schemas/Resolution"},"type":"array","title":"Resolutions"},"not_found":{"items":{"type":"string"},"type":"array","title":"Not Found","description":"Inputs that matched no served entity"}},"type":"object","required":["packets","resolutions"],"title":"GetEntityPacketOut"},"GetGalaxyBrainOut":{"properties":{"version":{"type":"string","title":"Version","description":"Snapshot format, '4ort.galaxy-brain/1'"},"generated_at":{"type":"string","title":"Generated At"},"refresh_s":{"type":"integer","title":"Refresh S","description":"How often the snapshot is rebuilt, seconds"},"regions":{"$ref":"#/components/schemas/BrainRegions"}},"type":"object","required":["version","generated_at","refresh_s","regions"],"title":"GetGalaxyBrainOut"},"GetSourceInfoOut":{"properties":{"contract":{"type":"string","title":"Contract","default":"knowledge/1.2.0"},"query":{"type":"string","title":"Query"},"sources":{"items":{"$ref":"#/components/schemas/SourceInfo"},"type":"array","title":"Sources"},"total_registered":{"type":"integer","title":"Total Registered"},"by_licence":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Licence","description":"Registered sources per licence"}},"type":"object","required":["query","sources","total_registered"],"title":"GetSourceInfoOut"},"GetUpcomingLaunchesOut":{"properties":{"launches":{"items":{"$ref":"#/components/schemas/UpcomingLaunch"},"type":"array","title":"Launches"},"count":{"type":"integer","title":"Count"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of","description":"When the capture was fetched from Launch Library 2, UTC"},"edition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edition","description":"Lake capture date"},"stale":{"type":"boolean","title":"Stale","description":"True when the capture is over 36 h old: launches announced since may be missing"},"source":{"type":"string","title":"Source"},"licence":{"type":"string","title":"Licence"},"attribution":{"type":"string","title":"Attribution","description":"Credit line required on reuse"}},"type":"object","required":["launches","count","stale","source","licence","attribution"],"title":"GetUpcomingLaunchesOut"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HistoryResponse":{"properties":{"entity":{"$ref":"#/components/schemas/EntityBrief"},"lang":{"type":"string","title":"Lang"},"lang_note":{"type":"string","title":"Lang Note"},"attention_hourly":{"items":{"$ref":"#/components/schemas/HourPoint"},"type":"array","title":"Attention Hourly"},"attention_daily":{"items":{"$ref":"#/components/schemas/DayPoint"},"type":"array","title":"Attention Daily"},"news_hourly":{"items":{"$ref":"#/components/schemas/NewsHour"},"type":"array","title":"News Hourly"},"news_daily":{"items":{"$ref":"#/components/schemas/NewsDay"},"type":"array","title":"News Daily"},"news_tracking":{"additionalProperties":true,"type":"object","title":"News Tracking"},"coverage":{"additionalProperties":true,"type":"object","title":"Coverage"},"definitions":{"additionalProperties":true,"type":"object","title":"Definitions"},"receipts":{"items":{"$ref":"#/components/schemas/Receipt"},"type":"array","title":"Receipts"},"methodology":{"type":"string","title":"Methodology"},"freshness":{"additionalProperties":true,"type":"object","title":"Freshness"}},"type":"object","required":["entity","lang","lang_note","attention_hourly","attention_daily","news_hourly","news_daily","news_tracking","coverage","definitions","receipts","methodology","freshness"],"title":"HistoryResponse"},"HourPoint":{"properties":{"hour":{"type":"string","title":"Hour"},"views":{"type":"integer","title":"Views"}},"type":"object","required":["hour","views"],"title":"HourPoint"},"Item":{"properties":{"$type":{"type":"string","title":"$Type","default":"item"},"qid":{"type":"string","title":"Qid","description":"Item ID, e.g. 'Q215380'"},"label":{"type":"string","title":"Label"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["qid","label"],"title":"Item","description":"One Wikidata item — just a label + optional description, used as the\nvalue-side of a claim (e.g. P31 → Q215380 → 'musical group')."},"ItemBulkRequest":{"properties":{"qids":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Qids","description":"Up to 1000 item IDs in a single call"}},"type":"object","required":["qids"],"title":"ItemBulkRequest"},"ItemBulkResponse":{"properties":{"items":{"additionalProperties":{"$ref":"#/components/schemas/Item"},"type":"object","title":"Items"},"missing":{"items":{"type":"string"},"type":"array","title":"Missing"}},"type":"object","title":"ItemBulkResponse"},"JoinIn":{"properties":{"code":{"type":"string","maxLength":80,"minLength":8,"title":"Code"}},"type":"object","required":["code"],"title":"JoinIn"},"KeyOut":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"tier":{"type":"string","title":"Tier"},"enabled":{"type":"boolean","title":"Enabled"},"rate_limit_per_min":{"type":"integer","title":"Rate Limit Per Min"},"allowed_origins":{"items":{"type":"string"},"type":"array","title":"Allowed Origins"},"key_prefix":{"type":"string","title":"Key Prefix"},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["id","name","tier","enabled","rate_limit_per_min","allowed_origins","key_prefix","created_at","last_used_at"],"title":"KeyOut"},"KeywordDiscoveryRequest":{"properties":{"seed_keywords":{"items":{"type":"string"},"type":"array","title":"Seed Keywords","default":["artificial intelligence"]},"target_sites":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Sites"},"depth":{"type":"integer","title":"Depth","default":2},"suggestions_limit":{"type":"integer","title":"Suggestions Limit","default":700},"site_limit":{"type":"integer","title":"Site Limit","default":500},"min_volume":{"type":"integer","title":"Min Volume","default":10},"location_code":{"type":"integer","title":"Location Code","default":2840},"language_code":{"type":"string","title":"Language Code","default":"en"}},"type":"object","title":"KeywordDiscoveryRequest"},"LicenseEntry":{"properties":{"source":{"type":"string","title":"Source","description":"Dataset key: 'wikidata' | 'usda_fdc' | 'openfda_ndc' | 'nhtsa_vpic' | 'musicbrainz' | 'gleif' | 'edgar'"},"name":{"type":"string","title":"Name","description":"License name, e.g. 'CC0 1.0 Universal'"},"url":{"type":"string","title":"Url","description":"License canonical URL"},"applies_to":{"items":{"type":"string"},"type":"array","title":"Applies To","description":"Which envelope blocks this license covers: 'claims', 'product_meta', 'relationships', 'music_meta', etc."}},"type":"object","required":["source","name","url"],"title":"LicenseEntry","description":"Per-source license. Replaces the monolithic `license: 'CC0 (Wikidata)'`\nthat was wrong for mixed-source entities (Wikidata claims + USDA\nproduct_meta + MusicBrainz relationships)."},"MintStatement":{"properties":{"pid":{"type":"string","title":"Pid","description":"Wikidata property id, e.g. 'P2044'"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Property label, e.g. 'Elevation'"},"value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Value","description":"Numeric value, when the statement is a quantity"},"value_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Text","description":"Textual value — a Q-id (see value_label), date or name"},"value_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Label","description":"Resolved label when value_text is a Q-id (e.g. the timezone item)"},"display":{"type":"string","title":"Display","description":"Human-rendered value, e.g. '936 m' or '2,025'"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit","description":"Unit Q-id for quantities (Q11573 = metre)"},"coordinate":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Coordinate","description":"Globe-coordinate statements (P625): {latitude, longitude, precision} in decimal degrees; `display` renders it as 'lat, lon (± precision)'"},"point_in_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Point In Time","description":"ISO date stamp on the statement"},"point_in_time_display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Point In Time Display","description":"Rendered time — '2013' for year-precision rows"},"point_in_time_precision":{"type":"string","title":"Point In Time Precision","description":"'day' | 'month' | 'year' | 'edition' (the stamp is the dataset edition, not a fact date)","default":"day"},"qualifiers":{"additionalProperties":true,"type":"object","title":"Qualifiers","description":"Row qualifiers (year, bounds, precision, provenance)"},"source":{"type":"string","title":"Source","description":"Lane source key: 'geonames' | 'ucdp-ged' | 'ucdp-acd' | ..."},"registry_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registry Key","description":"Canonical source-registry key for the dataset ('ucdp-ged'/'ucdp-ged-candidate'/'ucdp-acd' all fold to 'ucdp')"},"source_label":{"type":"string","title":"Source Label","description":"e.g. 'GeoNames (CC BY 4.0)', 'UCDP GED (CC BY 4.0)'"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"edition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edition","description":"Dataset edition as mint stamped it (YYYYMMDD)"},"edition_display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edition Display","description":"Edition as a date, '2026-09-26'"},"licence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Licence","description":"Licence name, e.g. 'CC BY 4.0'"},"licence_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Licence Url"},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"Same as `licence` (uniform per-fact spelling)"},"license_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Url","description":"Same as `licence_url`"},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution","description":"Verbatim attribution string the licence requires, when the lake manifest carries one (GeoNames does)"},"lane":{"type":"string","title":"Lane","description":"'lake' (generic lake lane) | 'conflict' (UCDP lane)"},"overrides_wikidata":{"type":"boolean","title":"Overrides Wikidata","description":"True when a registry-authority ruling makes THIS row the display value for its property, displacing Wikidata's (ClinicalTrials.gov on trial facts — the only such lane). Wikidata's displaced value rides wikidata_value_display.","default":false},"conflict_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conflict Class","description":"Override rows only — how the registry disagreed with Wikidata: 'precision_only' | 'planned_vs_actual' | 'genuine'"},"enrollment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enrollment Type","description":"planned_vs_actual enrollment rows: 'ACTUAL' | 'ESTIMATED' — part of the value, also appended to `display`"},"wikidata_value_display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Value Display","description":"Override rows only: the displaced Wikidata value, rendered ('53', '2021-12-31', '2021-01' at month precision)"}},"type":"object","required":["pid","display","source","source_label","lane"],"title":"MintStatement","description":"One statement 4ort-mint served onto this entity from a 4ort-lake\ndataset (GeoNames, UCDP, ClinicalTrials.gov). Separate from `claims_raw`\n(Wikidata's data and nothing else) and from `derived_claims` (news-mined):\nthis is the dataset-grounded layer, each row carrying the dataset's own\nedition and licence. Only SERVED mint rows appear here — held rows are\nnever exposed through any API. A property Wikidata itself states on the\nentity is never duplicated here UNLESS the row is a registry-authority\noverride (`overrides_wikidata`): ClinicalTrials.gov outranks Wikidata's\nimport for trial facts, so its row IS the display value for its property\nand Wikidata's displaced value rides `wikidata_value_display`."},"NewsDay":{"properties":{"day":{"type":"string","title":"Day"},"mentions":{"type":"integer","title":"Mentions"},"tone":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tone"}},"type":"object","required":["day","mentions","tone"],"title":"NewsDay"},"NewsHour":{"properties":{"hour":{"type":"string","title":"Hour"},"mentions":{"type":"integer","title":"Mentions"},"headline_mentions":{"type":"integer","title":"Headline Mentions"},"tone":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tone"},"toned_mentions":{"type":"integer","title":"Toned Mentions"}},"type":"object","required":["hour","mentions","headline_mentions","tone","toned_mentions"],"title":"NewsHour"},"Omitted":{"properties":{"facts":{"type":"integer","title":"Facts","description":"Facts left out by max_facts or the size bound","default":0},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"Omitted"},"PacketEntity":{"properties":{"entity_id":{"type":"string","title":"Entity Id","description":"Stable 4ort id to pass to other tools (slug, else UUID)"},"kg_uuid":{"type":"string","title":"Kg Uuid"},"wikidata_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"4ort entity page"}},"type":"object","required":["entity_id","kg_uuid","name"],"title":"PacketEntity"},"PacketLicence":{"properties":{"source":{"type":"string","title":"Source"},"source_name":{"type":"string","title":"Source Name"},"licence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Licence"},"licence_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Licence Url"},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution","description":"Required credit line; null = none"},"fields":{"items":{"type":"string"},"type":"array","title":"Fields","description":"P-codes in this packet that this licence covers"}},"type":"object","required":["source","source_name","licence","licence_url","fields"],"title":"PacketLicence"},"PacketRoutes":{"properties":{"entity_page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Page"},"packet_api":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Packet Api","description":"This packet over REST (ETag; If-None-Match gives a free 304)"},"facts_jsonld":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facts Jsonld"},"changes_api":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changes Api"},"attention_api":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attention Api"},"wikidata":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata"},"official_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Official Website"}},"type":"object","title":"PacketRoutes","description":"Where to go next. A route is a destination, not evidence."},"Page":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"url":{"type":"string","title":"Url"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of"},"licence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Licence","description":"Page rights; third-party pages are the publisher's, not 4ort's"}},"type":"object","required":["url"],"title":"Page"},"PipelineRequest":{"properties":{"keyword":{"type":"string","title":"Keyword"},"location_code":{"type":"integer","title":"Location Code","default":2840},"language_code":{"type":"string","title":"Language Code","default":"en"}},"type":"object","required":["keyword"],"title":"PipelineRequest"},"PipelineResponse":{"properties":{"entity_id":{"type":"string","format":"uuid","title":"Entity Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"}},"type":"object","required":["entity_id","name","status"],"title":"PipelineResponse"},"Property":{"properties":{"$type":{"type":"string","title":"$Type","default":"property"},"pid":{"type":"string","title":"Pid","description":"Property ID, e.g. 'P31'"},"label":{"type":"string","title":"Label"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"datatype":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Datatype","description":"Wikidata datatype: 'wikibase-item', 'string', 'external-id', 'quantity', 'time', 'globe-coordinate', 'url', etc."},"aliases":{"items":{"type":"string"},"type":"array","title":"Aliases"}},"type":"object","required":["pid","label"],"title":"Property","description":"One Wikidata property definition. The `aliases` are alternate labels\nin English; multilingual labels are deferred until a customer asks."},"PropertyBulkRequest":{"properties":{"pids":{"items":{"type":"string"},"type":"array","maxItems":500,"title":"Pids","description":"Up to 500 property IDs in a single call"}},"type":"object","required":["pids"],"title":"PropertyBulkRequest"},"PropertyBulkResponse":{"properties":{"items":{"additionalProperties":{"$ref":"#/components/schemas/Property"},"type":"object","title":"Items","description":"Keyed by pid. Only present for found properties."},"missing":{"items":{"type":"string"},"type":"array","title":"Missing","description":"Requested pids we have no record for. May be deprecated properties or typos."}},"type":"object","title":"PropertyBulkResponse"},"PropertyListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Property"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"next_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Offset"}},"type":"object","required":["items","total","limit","offset"],"title":"PropertyListResponse"},"Qualifier":{"properties":{"field":{"type":"string","title":"Field","description":"Qualifier property P-code, e.g. P580 (start time)"},"label":{"type":"string","title":"Label"},"value":{"type":"string","title":"Value","description":"Display value"}},"type":"object","required":["field","label","value"],"title":"Qualifier"},"RagQuery":{"properties":{"query":{"type":"string","maxLength":500,"minLength":1,"title":"Query"},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","default":10},"entity_type":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Entity Type"}},"type":"object","required":["query"],"title":"RagQuery","description":"⚠️ BOUNDED. Every /rag call makes a PAID OpenRouter embedding request, and this schema\nhad no limits at all — `{\"query\": \"<megabytes>\", \"limit\": 1000000}` was a free cost\namplifier against an unauthenticated mount, with an unbounded pgvector result eagerly\nloaded via selectinload. The mount is 410 now; the bounds mean the keyed twin cannot be\nused the same way by a single key."},"RagResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/RagResult"},"type":"array","title":"Results"},"query":{"type":"string","title":"Query"}},"type":"object","required":["results","query"],"title":"RagResponse"},"RagResult":{"properties":{"entity":{"$ref":"#/components/schemas/EntityOut"},"score":{"type":"number","title":"Score"}},"type":"object","required":["entity","score"],"title":"RagResult"},"Receipt":{"properties":{"source":{"type":"string","title":"Source"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"licence":{"type":"string","title":"Licence"},"terms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terms"},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution"}},"type":"object","required":["source","licence"],"title":"Receipt"},"RecipientIn":{"properties":{"email":{"type":"string","maxLength":254,"title":"Email"}},"type":"object","required":["email"],"title":"RecipientIn"},"Reference":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Reference URL (P854), when the source gives one"},"stated_in":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stated In","description":"Work the source cites (P248), as a label"},"stated_in_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stated In Id","description":"Wikidata Q-id of that work"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Title of the cited work (P1476)"},"retrieved":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retrieved","description":"When the source retrieved it (P813), YYYY-MM-DD"},"imported_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imported From","description":"Wikimedia project the statement was imported from (P143); not an independent source"}},"type":"object","title":"Reference","description":"One of the source's own references for a statement (Wikidata reference block).\nFields the source does not give are left out of the JSON (all are optional)."},"RegisterIn":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Display label for this key, e.g. 'my-agent' or 'lambda-fn-prod'"},"email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Email","description":"Optional contact email for billing + recovery notices"}},"type":"object","required":["name"],"title":"RegisterIn"},"RegisterOut":{"properties":{"apiKey":{"type":"string","title":"Apikey","description":"Raw API key — store securely, shown ONCE"},"recoveryCode":{"type":"string","title":"Recoverycode","description":"One-time recovery code — store separately from apiKey. It's the only way to rotate a lost key."},"keyPrefix":{"type":"string","title":"Keyprefix","description":"First 12 chars of the key, for display only"},"name":{"type":"string","title":"Name"},"tier":{"type":"string","title":"Tier"},"docsUrl":{"type":"string","title":"Docsurl","default":"https://4ort.xyz/cli"}},"type":"object","required":["apiKey","recoveryCode","keyPrefix","name","tier"],"title":"RegisterOut"},"RegistryOfficerMention":{"properties":{"predicate":{"type":"string","title":"Predicate","default":"registry_officer_mention"},"value_type":{"type":"string","title":"Value Type","default":"structured_literal"},"value":{"$ref":"#/components/schemas/RegistryOfficerMentionValue"},"provenance":{"additionalProperties":true,"type":"object","title":"Provenance","description":"source, source_name, edition, company_record_key, source_row_or_slot, reference_url, company_identity_route, source_projection_sha256, retrieved_at, licence, attribution, lane"}},"type":"object","required":["value","provenance"],"title":"RegistryOfficerMention","description":"One name a company register publishes in a role on this company, in one edition — a\nMENTION, not a person: names are never matched to person profiles or to each other, and no\naddress, birth date, personal identifier or contact is carried. Dates are the source's role\ndates only; the edition is when the register said it."},"RegistryOfficerMentionValue":{"properties":{"published_name":{"type":"string","title":"Published Name","description":"The name exactly as the register publishes it in this role"},"role_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Text","description":"The role exactly as the register reports it"},"start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start","description":"Role start as the source states it, at `date_precision.start`"},"end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End","description":"Role end as the source states it. Absent ≠ still in office"},"date_precision":{"additionalProperties":true,"type":"object","title":"Date Precision","description":"{'start': 'day'|'month'|'year'|null, 'end': …}; null = no date"}},"type":"object","required":["published_name"],"title":"RegistryOfficerMentionValue"},"ResearchAccepted":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"estimated_s":{"type":"integer","title":"Estimated S"}},"type":"object","required":["job_id","status","estimated_s"],"title":"ResearchAccepted"},"ResearchRequest":{"properties":{"query":{"type":"string","maxLength":2000,"minLength":3,"title":"Query"},"depth":{"type":"string","title":"Depth","description":"flash (~1m, single-agent) · quick (~5m) · standard (~15m) · deep (~25m). Unknown values fall back to standard.","default":"standard"}},"type":"object","required":["query"],"title":"ResearchRequest"},"Resolution":{"properties":{"input":{"type":"string","title":"Input","description":"What you passed"},"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id","description":"What it resolved to"},"method":{"type":"string","enum":["id","name"],"title":"Method","description":"id: matched a slug/Q-id/UUID; name: resolved a name"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"alternatives":{"items":{"type":"string"},"type":"array","title":"Alternatives","description":"Other entity_ids the name could mean"}},"type":"object","required":["input","method"],"title":"Resolution"},"ResolveEntityOut":{"properties":{"query":{"type":"string","title":"Query"},"best":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best","description":"entity_id of a confident match (confidence >= 0.7), else null"},"candidates":{"items":{"$ref":"#/components/schemas/Candidate"},"type":"array","title":"Candidates"},"note":{"type":"string","title":"Note"}},"type":"object","required":["query","candidates","note"],"title":"ResolveEntityOut"},"RouteOut":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"url":{"type":"string","title":"Url"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"query (a search URL on that site), page, api or route"},"match":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match","description":"Why this destination was chosen"},"licence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Licence"},"as_of_basis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of Basis"}},"type":"object","required":["url"],"title":"RouteOut"},"SearchKnowledgeOut":{"properties":{"contract":{"type":"string","title":"Contract","default":"knowledge/1.2.0"},"query":{"type":"string","title":"Query"},"status":{"type":"string","enum":["answered_from_kg","pages_only","no_coverage"],"title":"Status","description":"answered_from_kg: an entity packet is included; pages_only: no entity matched, pages did; no_coverage: nothing in the 4ort index - fall back to another provider"},"intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent"},"entity":{"anyOf":[{"$ref":"#/components/schemas/EvidencePacket"},{"type":"null"}],"description":"Evidence packet of the matched entity"},"pages":{"items":{"$ref":"#/components/schemas/Page"},"type":"array","title":"Pages"},"routes":{"items":{"$ref":"#/components/schemas/RouteOut"},"type":"array","title":"Routes","description":"Top 3 destinations; call find_routes for more"},"licence_note":{"type":"string","title":"Licence Note"}},"type":"object","required":["query","status","pages","routes","licence_note"],"title":"SearchKnowledgeOut"},"SeriesPoint":{"properties":{"period":{"type":"string","title":"Period"},"views":{"type":"integer","title":"Views"}},"type":"object","required":["period","views"],"title":"SeriesPoint"},"SerpRankingOut":{"properties":{"keyword":{"type":"string","title":"Keyword"},"position":{"type":"integer","title":"Position"},"url":{"type":"string","title":"Url"},"domain":{"type":"string","title":"Domain"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet"},"snapshot_date":{"type":"string","format":"date","title":"Snapshot Date"}},"type":"object","required":["keyword","position","url","domain","title","snippet","snapshot_date"],"title":"SerpRankingOut"},"SlackIn":{"properties":{"webhook_url":{"type":"string","maxLength":300,"title":"Webhook Url"}},"type":"object","required":["webhook_url"],"title":"SlackIn"},"SourceInfo":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"licence":{"type":"string","title":"Licence"},"licence_url":{"type":"string","title":"Licence Url"},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution","description":"Credit line required on reuse; null = none"},"attribution_required":{"type":"boolean","title":"Attribution Required"},"redistributed":{"type":"boolean","title":"Redistributed","description":"False: 4ort uses it but does not pass its data on"},"sellable":{"type":"boolean","title":"Sellable","description":"May appear on paid surfaces"},"tier":{"type":"string","title":"Tier"},"status":{"type":"string","title":"Status"},"homepage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Homepage"},"applies_to":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Applies To"},"uses":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uses"}},"type":"object","required":["key","name","licence","licence_url","attribution_required","redistributed","sellable","tier","status"],"title":"SourceInfo","description":"One registered source. Listing every source (empty query) leaves out kind, homepage,\napplies_to and uses to keep the list small; ask for a source by name for all of it."},"TestAlertIn":{"properties":{"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id","description":"A KG id on one of the workspace's enabled watchlists"},"rule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule","description":"Render the test as this rule's alert: attention_spike, news_surge, sov_shift or tone_shift (live numbers; nothing is fired)"}},"type":"object","title":"TestAlertIn"},"Thresholds":{"properties":{"rules":{"items":{"type":"string"},"type":"array","title":"Rules"},"attention_spike_pct":{"type":"number","maximum":100000.0,"minimum":10.0,"title":"Attention Spike Pct","description":"Views in the latest hour vs the 7-day hourly baseline, percent above","default":100.0},"min_views_per_hour":{"type":"integer","maximum":10000000.0,"minimum":5.0,"title":"Min Views Per Hour","description":"Volume floor for attention alerts","default":50},"news_surge_mentions":{"type":"integer","maximum":100000.0,"minimum":1.0,"title":"News Surge Mentions","description":"Mentions in the last 6 h (floor)","default":5},"news_surge_ratio":{"type":"number","maximum":1000.0,"minimum":1.2,"title":"News Surge Ratio","description":"Last-6h mentions vs the prior 66 h rate","default":3.0},"sov_shift_pp":{"type":"number","maximum":100.0,"minimum":1.0,"title":"Sov Shift Pp","description":"Share-of-voice change within the watchlist, pp","default":10.0},"sov_min_mentions":{"type":"integer","maximum":100000.0,"minimum":1.0,"title":"Sov Min Mentions","description":"Watchlist mentions needed for SoV alerts","default":20},"tone_shift":{"type":"number","maximum":50.0,"minimum":0.5,"title":"Tone Shift","description":"Absolute change in 24 h mean tone","default":2.0},"tone_min_mentions":{"type":"integer","maximum":100000.0,"minimum":3.0,"title":"Tone Min Mentions","description":"Toned mentions needed in both windows","default":10},"cooldown_hours":{"type":"integer","maximum":168.0,"minimum":1.0,"title":"Cooldown Hours","default":6}},"type":"object","title":"Thresholds","description":"Change triggers. Each rule fires on the transition into its condition, at most once\nper cooldown, and never below the volume floors (so a 3-view entity cannot 'spike')."},"Tone":{"properties":{"mean":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mean","description":"Mean GDELT V1.5Tone (−100…+100); null without toned mentions"},"positive":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Positive"},"negative":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Negative"},"toned_mentions":{"type":"integer","title":"Toned Mentions"},"previous_mean":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Previous Mean"},"shift":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shift"}},"type":"object","required":["mean","positive","negative","toned_mentions","previous_mean","shift"],"title":"Tone"},"Trust":{"properties":{"band":{"type":"string","enum":["high","medium","low","unscored"],"title":"Band","description":"high / medium / low reference support, or unscored"},"basis":{"type":"string","title":"Basis","description":"Id of the rule that produced the band; its text is in the packet's trust_rules"},"calibrated":{"type":"boolean","title":"Calibrated","description":"True only for a measured probability. Always false today","default":false}},"type":"object","required":["band","basis"],"title":"Trust"},"Unknown":{"properties":{"field":{"type":"string","title":"Field","description":"The P-code or the field name you asked for"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"status":{"type":"string","enum":["not_in_our_sources","no_value","unknown_value","only_deprecated","unknown_field"],"title":"Status","description":"not_in_our_sources: we hold no statement (absence is not evidence of no value); no_value: the source states there is none; unknown_value: the source states a value exists but is unknown; only_deprecated: the source holds values but marks every one deprecated; unknown_field: we could not map your field name to a property"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["field","status"],"title":"Unknown"},"UpcomingLaunch":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Launch Library 2 launch UUID"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"'Rocket | Payload', as Launch Library 2 names it"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"Launch service provider"},"rocket":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rocket"},"pad":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pad"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location","description":"Launch site"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"ISO 3166-1 alpha-2 of the pad"},"net":{"type":"string","title":"Net","description":"No Earlier Than, UTC ISO 8601"},"net_precision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Net Precision"},"window_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window Start"},"window_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Window End"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"e.g. 'Go for Launch', 'To Be Determined'"},"status_abbrev":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Abbrev"},"mission":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mission"},"mission_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mission Type"},"orbit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orbit"},"webcast_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webcast Url"},"webcast_live":{"type":"boolean","title":"Webcast Live","default":false},"source":{"type":"string","title":"Source"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url","description":"The launch's Launch Library 2 record"}},"type":"object","required":["net","source"],"title":"UpcomingLaunch","description":"One scheduled orbital launch. `net` is No Earlier Than; `net_precision` says how exact it is\n(SEC, MIN, HR, DAY, MONTH, Q1..Q4, YEAR). Fields Launch Library 2 does not give are null."},"V1AgentContext":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"wikidata_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Id"},"summary_short":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Short","description":"~30-token blurb (uses entity.description if available)"},"summary_long":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary Long","description":"~150-token paragraph synthesized from top facts"},"facts_by_predicate":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Facts By Predicate","description":"Grouped facts: {P-code: [resolved values, ...]}"},"key_actors":{"items":{"$ref":"#/components/schemas/V1KeyActor"},"type":"array","title":"Key Actors","description":"People connected via P169/P112/P50/P175 (CEO/founder/author/performer)"},"world_context":{"$ref":"#/components/schemas/V1WorldContext"},"product_meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Product Meta","description":"USDA/openFDA/NHTSA/GLEIF product attributes when this entity has any. Raw passthrough — sub-keys 'usda_fdc' (food + nutrition), 'openfda_ndc' (drugs + ingredients), 'nhtsa_vpic' (vehicles), 'gleif' (legal entities + LEI + jurisdiction). Agents should treat these as structured catalog facts about the entity (where applicable)."},"music_meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Music Meta","description":"MusicBrainz-derived data for music entities — artist type, country, lifespan, primary type, secondary types, first-release date. Populated only when the entity is in entity_music_meta. Null otherwise."},"book_meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Book Meta","description":"Reserved for Open Library ingest. Null until shipped."},"cached":{"type":"boolean","title":"Cached","default":false},"license":{"type":"string","title":"License","default":"CC0 (Wikidata + MusicBrainz + USDA + openFDA + NHTSA + GLEIF)"}},"type":"object","required":["entity_id","name"],"title":"V1AgentContext","description":"Agent-friendly memory bank for one entity.\n\nDifferent shape than article-context: facts grouped by predicate,\nstructural key_actors, world_context block, summaries at two\nlengths. Designed for an agent to load this once and reason over\na stable structured view."},"V1ArticleContext":{"properties":{"entity":{"$ref":"#/components/schemas/V1Entity","description":"V1Entity at detail=medium"},"key_facts":{"items":{"$ref":"#/components/schemas/EntityFact"},"type":"array","title":"Key Facts","description":"Top facts ranked by predicate priority"},"citations":{"items":{"$ref":"#/components/schemas/V1Citation"},"type":"array","title":"Citations","description":"External source URLs (original Wikidata refs, never rewritten)"},"recent_edits":{"items":{"$ref":"#/components/schemas/EntityRecentEdit"},"type":"array","title":"Recent Edits","description":"Last 7 days of Wikidata edits"},"connections":{"items":{"$ref":"#/components/schemas/EntityRelationship"},"type":"array","title":"Connections","description":"Top related entities by predicate priority + popularity"},"trending_signals":{"$ref":"#/components/schemas/V1TrendingSignals"},"writing_hooks":{"items":{"type":"string"},"type":"array","title":"Writing Hooks","description":"LLM-synthesized angles a writer can lead a piece with"},"product_meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Product Meta","description":"USDA/openFDA/NHTSA/GLEIF product attributes when this entity has any. Raw passthrough — sub-keys 'usda_fdc', 'openfda_ndc', 'nhtsa_vpic', 'gleif' present iff the entity is product-tagged in that catalog. Highest-leverage block for SEO writers covering food/drug/vehicle/corporate-registry pages — surfaces label nutrients, NDC codes, vehicle types, etc."},"music_meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Music Meta","description":"MusicBrainz-derived data for music entities (artist type, country, lifespan, primary type, secondary types, first-release date). Populated only when the entity has an entity_music_meta row."},"cached":{"type":"boolean","title":"Cached","default":false},"license":{"type":"string","title":"License","default":"CC0 (Wikidata + USDA + openFDA + NHTSA + MusicBrainz)"}},"type":"object","required":["entity"],"title":"V1ArticleContext","description":"Fat bundle for SEO writers — one call instead of 5-7.\n\nBundles entity card + ranked facts + every citation URL + recent edits\n+ trending signals + LLM-synthesized writing hooks. Optimized for\ndropping straight into an LLM context window."},"V1Citation":{"properties":{"url":{"type":"string","title":"Url"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"predicate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predicate","description":"Wikidata P-code this citation supports"},"predicate_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predicate Label"}},"type":"object","required":["url"],"title":"V1Citation","description":"One external source URL backing a fact about this entity.\n\nCitations preserve their original external URL — we never rewrite\nthem to internal /entity/X paths. Consumers can follow them straight\nto the underlying Wikidata reference."},"V1CountrySignal":{"properties":{"country_iso":{"type":"string","title":"Country Iso"},"message":{"type":"string","title":"Message","description":"Human-readable spike note, e.g. 'protest/conflict events in Germany running 4× the 30-day norm (GDELT)'."}},"type":"object","required":["country_iso","message"],"title":"V1CountrySignal"},"V1DailyPoint":{"properties":{"day":{"type":"string","title":"Day","description":"YYYY-MM-DD"},"views":{"type":"integer","title":"Views"}},"type":"object","required":["day","views"],"title":"V1DailyPoint"},"V1Entity":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"type":"string","title":"Name"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Citeable page URL, https://4ort.xyz/entity/{slug}. Cite this; store `id`"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","description":"Wikidata-derived entity type"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain","description":"Top-level domain like 'people' or 'business'"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"LLM-generated entity summary, when present"},"wikidata_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Id"},"wikipedia_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikipedia Url"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Hero image URL, proxied through 4ort.xyz/img/wm/ when sourced from Wikimedia"},"facts":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntityFact"},"type":"array"},{"type":"null"}],"title":"Facts"},"relationships":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntityRelationship"},"type":"array"},{"type":"null"}],"title":"Relationships"},"popularity":{"anyOf":[{"$ref":"#/components/schemas/EntityPopularity"},{"type":"null"}]},"recent_edits":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntityRecentEdit"},"type":"array"},{"type":"null"}],"title":"Recent Edits"},"claims_raw":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Claims Raw","description":"Raw claims_rich JSONB passthrough: {'P31': [{'value': ..., 'qualifiers': {...}, 'references': [...]}], ...}. Resolve P-codes via /api/v1/properties, Q-IDs via /api/v1/items."},"derived_claims":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Derived Claims","description":"Claims 4ort DERIVED about this entity, kept strictly separate from `claims_raw` (which is Wikidata's data and nothing else). Each row: pcode, predicate_label, value, value_label, source_lane, verification, evidence_url, evidence_text, retrieved_at, score, score_band. `score`/`score_band` are null for cited-but-unscored claims and MUST be read as null, never as 0 — an unscored claim is not a low-scoring one. Empty list means we hold none; the field is never merged upward, so a consumer can always tell which layer a fact came from."},"product_meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Product Meta","description":"Raw product_meta passthrough: USDA/openFDA/NHTSA/GLEIF blocks. Shape: {'usda_fdc': {...}, 'openfda_ndc': {...}, 'nhtsa_vpic': {...}, 'gleif': {...}}"},"music_meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Music Meta","description":"Raw MusicBrainz-derived metadata for music entities. Shape: {'mbid': ..., 'genres': [...], 'labels': [...], 'members': [...], ...}"},"mint_statements":{"anyOf":[{"items":{"$ref":"#/components/schemas/MintStatement"},"type":"array"},{"type":"null"}],"title":"Mint Statements","description":"Statements 4ort-mint served onto this entity from 4ort-lake datasets (GeoNames population/elevation/timezone, UCDP conflict facts, ClinicalTrials.gov trial facts). Gaps only — a property Wikidata states on this entity never appears here — EXCEPT registry-authority overrides (ClinicalTrials.gov on trial facts): those rows displace Wikidata's display value and carry the displaced value as wikidata_value_display. Held mint rows are never exposed. Each row carries its dataset source, edition and licence; CC BY sources carry the attribution string."},"registry_officer_mentions":{"anyOf":[{"items":{"$ref":"#/components/schemas/RegistryOfficerMention"},"type":"array"},{"type":"null"}],"title":"Registry Officer Mentions","description":"Names company registers publish in a role on this company (Slovak RPO, NZ Charities Register, Florida Sunbiz), each with the role and dates as reported and the source edition. Registry mentions: names are not matched to person profiles, and a count of mentions is not a count of people. Null while the feature is off or none of its lanes is served."},"relationships_directed":{"anyOf":[{"$ref":"#/components/schemas/EntityRelationshipsDirected"},{"type":"null"}]},"pageviews_series":{"anyOf":[{"$ref":"#/components/schemas/EntityPageviewSeries"},{"type":"null"}]},"changelog":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntityChangelogEntry"},"type":"array"},{"type":"null"}],"title":"Changelog"},"citations":{"anyOf":[{"items":{"$ref":"#/components/schemas/EntityCitation"},"type":"array"},{"type":"null"}],"title":"Citations"},"licenses":{"anyOf":[{"items":{"$ref":"#/components/schemas/LicenseEntry"},"type":"array"},{"type":"null"}],"title":"Licenses"},"meta":{"anyOf":[{"$ref":"#/components/schemas/V1EntityMeta"},{"type":"null"}]},"detail_level":{"type":"string","enum":["tiny","small","medium","full"],"title":"Detail Level"},"license":{"type":"string","title":"License","description":"DEPRECATED — use `licenses[]`. Kept for backwards compatibility.","default":"CC0 (Wikidata)"}},"type":"object","required":["id","name","detail_level"],"title":"V1Entity","description":"Versioned, public-API-clean entity shape.\n\nDefault response contains the cheap blocks (`claims_raw`,\n`product_meta`, `music_meta`, `licenses`, `meta`). Expensive blocks\n(`pageviews_series`, `changelog`, `citations`, `relationships_directed`)\nare gated behind `?include=...` query tokens so a default GET doesn't\npay the cost.\n\nLegacy `facts`, `relationships`, `recent_edits` are still computed for\npre-envelope clients (MCP especially) — they're cheap-to-build derived\nviews over the same underlying data."},"V1EntityBulkRequest":{"properties":{"keys":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Keys","description":"List of entity keys (slug / UUID / Q-id). Max 100 per call."},"detail":{"type":"string","enum":["tiny","small","medium","full"],"title":"Detail","description":"Legacy facts/relationships tier. Defaults 'small' to keep bulk payloads tight.","default":"small"},"include":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Include","description":"Comma-separated envelope blocks (same vocabulary as /entities/{key}). Defaults to `raw,product,music,licenses,meta`. Pass `none` for legacy-only."}},"type":"object","required":["keys"],"title":"V1EntityBulkRequest"},"V1EntityBulkResponse":{"properties":{"entities":{"additionalProperties":{"$ref":"#/components/schemas/V1Entity"},"type":"object","title":"Entities","description":"Keyed by the input string the caller passed in."},"not_found":{"items":{"type":"string"},"type":"array","title":"Not Found","description":"Input keys that did not resolve to any entity."},"total_returned":{"type":"integer","title":"Total Returned"},"latency_ms":{"type":"integer","title":"Latency Ms"}},"type":"object","required":["entities","total_returned","latency_ms"],"title":"V1EntityBulkResponse"},"V1EntityMeta":{"properties":{"schema_ref":{"type":"string","title":"Schema Ref","description":"URL of the canonical schema (currently a stub — JSON Schema doc landing later)","default":"https://4ort.xyz/api/v1/schema/entity"},"resolvers":{"additionalProperties":{"type":"string"},"type":"object","title":"Resolvers","description":"Endpoints clients should use to resolve unknown P-codes or Q-IDs"},"includes_active":{"items":{"type":"string"},"type":"array","title":"Includes Active","description":"Which optional blocks are populated in this response"},"generated_at":{"type":"string","title":"Generated At","description":"ISO 8601 timestamp the envelope was assembled at"}},"type":"object","required":["generated_at"],"title":"V1EntityMeta","description":"Self-description: tells the client what schema this is, where to\nresolve P-codes and Q-IDs, what include tokens are active, when this\nsnapshot was assembled."},"V1FilingRow":{"properties":{"item":{"type":"string","title":"Item","description":"SEC 8-K item code, e.g. '5.02'"},"item_label":{"type":"string","title":"Item Label"},"entity_name":{"type":"string","title":"Entity Name"},"entity_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Slug"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date","description":"Filing date, ISO (YYYY-MM-DD)"},"accession":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accession"},"accession_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accession Url","description":"sec.gov Archives folder for the accession"},"document_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Url","description":"The filing's own primary document on sec.gov"}},"type":"object","required":["item","item_label","entity_name"],"title":"V1FilingRow","description":"One 8-K filing under one tracked item code."},"V1FilingSection":{"properties":{"item":{"type":"string","title":"Item"},"heading":{"type":"string","title":"Heading"},"label":{"type":"string","title":"Label"},"today":{"type":"integer","title":"Today","description":"How many of these were filed today"},"total":{"type":"integer","title":"Total","description":"Total in the window BEFORE the per-section display cap; `rows` may be shorter."},"rows":{"items":{"$ref":"#/components/schemas/V1FilingRow"},"type":"array","title":"Rows"}},"type":"object","required":["item","heading","label","today","total"],"title":"V1FilingSection","description":"All filings under one 8-K item code in the window."},"V1FilingSignal":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"entity_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Slug"},"form":{"type":"string","title":"Form","description":"SEC form type, e.g. '8-K' or '4'"},"item":{"type":"string","title":"Item","description":"8-K item code ('5.02') or Form-4 signal ('insider_sale' / 'insider_buy')"},"label":{"type":"string","title":"Label","description":"Human phrasing, e.g. '5.02 officer or director change'"},"n_7d":{"type":"integer","title":"N 7D","description":"Count in the last 7 days"},"n_prev_7d":{"type":"integer","title":"N Prev 7D","description":"Count in the 7 days before that","default":0},"velocity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Velocity","description":"n_7d / n_prev_7d. None when there was no prior-week activity — undefined, not infinite."},"latest_day":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Day"},"latest_accession":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Accession","description":"SEC accession number of the most recent filing behind this signal"},"accession_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accession Url","description":"sec.gov Archives folder for that accession"}},"type":"object","required":["entity_id","entity_name","form","item","label","n_7d"],"title":"V1FilingSignal","description":"One company's SEC filing activity in the last 7 days.\n\nDerived from SEC's OWN `items` field on Form 8-K and from Form-4\ntransaction codes — **not** from a model reading prose. That is why this\ncan be published as-is while the narrative-extraction lane is held back\n(see /filings#methodology)."},"V1FilingsMeta":{"properties":{"api_version":{"type":"string","title":"Api Version","default":"1.0"},"generated_at":{"type":"integer","title":"Generated At","description":"Unix time this response was built"},"built_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Built At","description":"ISO time the underlying cached payload was computed"},"window_days":{"type":"integer","title":"Window Days","default":7},"source":{"type":"string","title":"Source"},"license":{"type":"string","title":"License"},"methodology":{"type":"string","title":"Methodology"},"derivation":{"type":"string","title":"Derivation"},"withheld":{"type":"string","title":"Withheld","description":"What we do NOT publish from this lane, and the measured precision that is the reason."},"unattributed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unattributed","description":"The lane's dominant loss channel in plain words: the share of recent filings that reach no company here because the issuer's EDGAR link is unconfirmed."},"link_coverage":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Link Coverage","description":"The same figure as data: window_days, per-form accession and unconfirmed counts, and the headline pct_unconfirmed."}},"type":"object","required":["generated_at","source","license","methodology","derivation","withheld"],"title":"V1FilingsMeta","description":"Provenance block for `/api/v1/filings`. Says where the rows came from and\n— deliberately — what is being held back and at what measured error rate."},"V1FilingsResponse":{"properties":{"_meta":{"$ref":"#/components/schemas/V1FilingsMeta"},"sections":{"items":{"$ref":"#/components/schemas/V1FilingSection"},"type":"array","title":"Sections"},"insider_sales":{"items":{"$ref":"#/components/schemas/V1InsiderRow"},"type":"array","title":"Insider Sales"},"insider_buys":{"items":{"$ref":"#/components/schemas/V1InsiderRow"},"type":"array","title":"Insider Buys"}},"type":"object","required":["_meta"],"title":"V1FilingsResponse","description":"`GET /api/v1/filings` — the SEC EDGAR daily pulse.\n\nPublic domain end to end: every row derives from SEC's own structured fields\n(the 8-K `items` array, Form-4 transaction codes) and cites its accession.\nNo model reads anything on this endpoint."},"V1InsiderRow":{"properties":{"entity_name":{"type":"string","title":"Entity Name"},"entity_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Slug"},"n":{"type":"integer","title":"N","description":"Reported transactions of this kind in the window"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"accession":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accession"},"accession_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accession Url"}},"type":"object","required":["entity_name","n"],"title":"V1InsiderRow","description":"One company's Form-4 insider buy or sell count over the window."},"V1KeyActor":{"properties":{"target_id":{"type":"string","title":"Target Id"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"role":{"type":"string","title":"Role","description":"Predicate label, e.g. 'CEO', 'founder', 'author'"},"predicate":{"type":"string","title":"Predicate"}},"type":"object","required":["target_id","name","role","predicate"],"title":"V1KeyActor","description":"A real person connected to this entity by a structural predicate.\n\nPer the 4ort.xyz scope boundary we expose biographical facts only —\nname + role + slug. We do NOT package real people as agent personas\nor behavioral profiles."},"V1MatchCandidate":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"type":"string","title":"Name"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"popularity_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Popularity Score"}},"type":"object","required":["id","name","confidence"],"title":"V1MatchCandidate"},"V1MatchRequest":{"properties":{"text":{"type":"string","maxLength":500,"minLength":1,"title":"Text","description":"Natural-language string to resolve to an entity, e.g. 'Apple'"},"entity_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entity Types","description":"Filter to specific entity types like 'company', 'person'"},"limit":{"type":"integer","maximum":25.0,"minimum":1.0,"title":"Limit","default":5}},"type":"object","required":["text"],"title":"V1MatchRequest"},"V1MatchResponse":{"properties":{"query":{"type":"string","title":"Query"},"candidates":{"items":{"$ref":"#/components/schemas/V1MatchCandidate"},"type":"array","title":"Candidates"},"primary":{"anyOf":[{"$ref":"#/components/schemas/V1MatchCandidate"},{"type":"null"}],"description":"Best match if confidence ≥ 0.7, else None"},"latency_ms":{"type":"integer","title":"Latency Ms"}},"type":"object","required":["query","candidates","latency_ms"],"title":"V1MatchResponse"},"V1MonthlyPoint":{"properties":{"month":{"type":"string","title":"Month","description":"YYYY-MM"},"views":{"type":"integer","title":"Views"}},"type":"object","required":["month","views"],"title":"V1MonthlyPoint"},"V1Popularity":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"monthly_volume":{"type":"integer","title":"Monthly Volume","description":"Pageviews in the current month (live, partial)"},"trailing_12mo_avg":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Trailing 12Mo Avg"},"annual_volume":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Annual Volume","description":"Sum of last 12 months"},"trend_12mo":{"items":{"$ref":"#/components/schemas/V1MonthlyPoint"},"type":"array","title":"Trend 12Mo","description":"One entry per month for the last 12 months"},"trend_30d":{"items":{"$ref":"#/components/schemas/V1DailyPoint"},"type":"array","title":"Trend 30D","description":"One entry per day for the last 30 days (when available)"},"trend_direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend Direction","description":"rising | falling | stable"},"yoy_change_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Yoy Change Pct"},"country_breakdown":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Country Breakdown","description":"ISO country → views (after multi-lang ingest is live). Null until non-EN pageview data is loaded."},"rank_within_domain":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Within Domain"},"domain_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Domain Size"},"rank_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rank Status","description":"Why rank_within_domain is what it is. 'ok' = ranked. 'unranked' = this entity has no harvest_domain to be ranked within. 'rebuilding' = the rank table is being rebuilt (it is derived and unlogged, so a database restart empties it until the next nightly build); the entity IS ranked, we just cannot tell you where yet. A null rank with no status means an older server."},"license":{"type":"string","title":"License","default":"CC0 (Wikimedia pageviews)"}},"type":"object","required":["entity_id","name","monthly_volume"],"title":"V1Popularity","description":"Wikipedia-pageview-derived 'real-world search volume'.\n\nThis is the Google-Keyword-Planner equivalent — but measured (not\nmodeled), CC0-licensed, and free. Volumes are total unique-visitor\nWikipedia hits aggregated from the official Wikimedia clickstream."},"V1TrendingEntity":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"views_in_window":{"type":"integer","title":"Views In Window"},"velocity_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Velocity Score","description":"views_in_window / (baseline_per_hour_avg × window_hours). None when we have no baseline. >1.0 = unusually high."},"baseline_per_hour_avg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Baseline Per Hour Avg","description":"Average hourly views for this entity over the last 30 days. The number lets the customer see WHY the trending count is or isn't surprising."},"is_chronically_popular":{"type":"boolean","title":"Is Chronically Popular","description":"True when the entity sustains >500 views/hour as its baseline — shows up in trending for structural reasons (bot probes, SEO halo, search-engine quirks) rather than a new event. We surface this transparently rather than filtering — chronic-popularity patterns ARE interesting signals about how the internet actually flows.","default":false},"chronic_traffic_explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chronic Traffic Explanation","description":"When is_chronically_popular, a short forensic line on WHY this entity is always getting traffic (e.g. 'TLD article — heavy bot/SEO probe baseline')."},"why_trending":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Trending","description":"Human-readable summary of the trending signal"}},"type":"object","required":["id","name","views_in_window"],"title":"V1TrendingEntity"},"V1TrendingResponse":{"properties":{"window_hours":{"type":"integer","title":"Window Hours"},"generated_at":{"type":"string","title":"Generated At"},"entities":{"items":{"$ref":"#/components/schemas/V1TrendingEntity"},"type":"array","title":"Entities"},"country_signals":{"items":{"$ref":"#/components/schemas/V1CountrySignal"},"type":"array","title":"Country Signals","description":"Top-level country-level event-spike signals from GDELT (NOT attached to individual entities — country isn't cheaply available per-entity on this hot path). Empty when no country is currently spiking. See /pulse for the full stability board."},"filing_signals":{"anyOf":[{"items":{"$ref":"#/components/schemas/V1FilingSignal"},"type":"array"},{"type":"null"}],"title":"Filing Signals","description":"SEC EDGAR filing-velocity signals for the last 7 days (8-K item codes + Form-4 insider buy/sell counts), ranked by 7-day count. Public domain, every row cites its accession. NOT joined to the pageview leaderboard above — a company can file without trending and vice versa; where both exist, the entity's `why_trending` carries the filing clause. None when the read degraded; [] when nothing filed. Full surface at /filings."},"license":{"type":"string","title":"License","default":"CC0 (Wikimedia pageviews) · SEC EDGAR filings are US public domain"}},"type":"object","required":["window_hours","generated_at","entities"],"title":"V1TrendingResponse"},"V1TrendingSignals":{"properties":{"monthly_pageviews":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Pageviews"},"velocity_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Velocity Score","description":"Recent-views vs 7-day baseline; >1 means rising"},"trend_direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend Direction","description":"rising | falling | stable (from 12-month trend)"},"yoy_change_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Yoy Change Pct"},"edits_last_7d":{"type":"integer","title":"Edits Last 7D","description":"Wikidata edits in the last 7 days","default":0},"rank_within_domain":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rank Within Domain"}},"type":"object","title":"V1TrendingSignals","description":"Velocity signals so writers can spot timely angles."},"V1WorldContext":{"properties":{"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"domain_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Domain Rank"},"monthly_views":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Views"},"popularity_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Popularity Score"}},"type":"object","title":"V1WorldContext","description":"Geo + popularity context — the 'world model' slice."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"Voice":{"properties":{"mentions":{"type":"integer","title":"Mentions"},"headline_mentions":{"type":"integer","title":"Headline Mentions"},"share_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share Pct"},"previous_mentions":{"type":"integer","title":"Previous Mentions"},"previous_share_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Previous Share Pct"},"share_shift_pp":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share Shift Pp"},"news_tracking":{"type":"string","enum":["tracked","queued"],"title":"News Tracking"},"news_counted_through":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"News Counted Through"}},"type":"object","required":["mentions","headline_mentions","share_pct","previous_mentions","previous_share_pct","share_shift_pp","news_tracking","news_counted_through"],"title":"Voice"},"WatchlistIn":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"entity_ids":{"items":{"type":"string"},"type":"array","maxItems":25,"title":"Entity Ids","description":"KG ids from /v1/workspaces/entity-search (no free text)"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"One category slug instead of entities"},"lang":{"type":"string","title":"Lang","default":"all"},"thresholds":{"$ref":"#/components/schemas/Thresholds"}},"type":"object","required":["name"],"title":"WatchlistIn"},"WatchlistPatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":80,"minLength":1},{"type":"null"}],"title":"Name"},"entity_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":25},{"type":"null"}],"title":"Entity Ids"},"lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"},"thresholds":{"anyOf":[{"$ref":"#/components/schemas/Thresholds"},{"type":"null"}]},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"WatchlistPatch"},"WhyBlock":{"properties":{"status":{"type":"string","title":"Status"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"reason_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Kind"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"},"why_status":{"anyOf":[{"type":"string","enum":["news","organic"]},{"type":"null"}],"title":"Why Status","description":"news: a verified headline matched the entity (evidence, not proven cause). organic: attention moved with no matched headline; a driver is likely but not named."},"why_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Label","description":"e.g. 'In the news', 'Organic surge', 'Organic interest'"},"why_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Summary","description":"One sentence for a person; never invents a cause"},"why_icon":{"anyOf":[{"type":"string","enum":["news","organic_surge","organic_interest","followup"]},{"type":"null"}],"title":"Why Icon","description":"Stable icon slug: news (headline found), organic_surge (climbing, no headline yet), organic_interest (steady, no single story), followup (alert update: likely driver found)"}},"type":"object","required":["status","reason","reason_kind","items"],"title":"WhyBlock"},"WhyTrendingEntity":{"properties":{"id":{"type":"string","title":"Id","description":"4ort KG id (stable)"},"wikidata_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wikidata Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"label":{"type":"string","title":"Label"},"type":{"type":"string","title":"Type"},"kg_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kg Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"rank":{"type":"integer","title":"Rank","description":"Original pageview rank within this language edition"},"pageviews_per_hour":{"type":"integer","title":"Pageviews Per Hour"},"baseline_per_hour":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Baseline Per Hour"},"delta_vs_baseline":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Vs Baseline"},"delta_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Pct"},"baseline_window_hours":{"type":"integer","title":"Baseline Window Hours"},"lang":{"type":"string","title":"Lang"},"window":{"additionalProperties":true,"type":"object","title":"Window"},"official_routes":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Official Routes"},"why":{"$ref":"#/components/schemas/WhyTrendingWhy"},"why_status":{"type":"string","enum":["news","organic"],"title":"Why Status","description":"news: a verified headline matched. organic: attention moved with no matched headline (why.why_label / why.why_summary carry the wording; no cause is invented)"},"why_icon":{"type":"string","enum":["news","organic_surge","organic_interest"],"title":"Why Icon","description":"Stable icon slug for the status, the same glyph on every 4ort surface"},"receipt":{"additionalProperties":true,"type":"object","title":"Receipt"}},"type":"object","required":["id","wikidata_id","slug","label","type","kg_type","description","rank","pageviews_per_hour","baseline_per_hour","delta_vs_baseline","delta_pct","baseline_window_hours","lang","window","official_routes","why","why_status","why_icon","receipt"],"title":"WhyTrendingEntity"},"WhyTrendingResponse":{"properties":{"resolver_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resolver Version"},"computed_at":{"type":"string","title":"Computed At"},"window":{"additionalProperties":true,"type":"object","title":"Window"},"receipts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Receipts"},"entities":{"items":{"$ref":"#/components/schemas/WhyTrendingEntity"},"type":"array","title":"Entities"},"lang":{"type":"string","title":"Lang"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"count":{"type":"integer","title":"Count"},"include_unexplained":{"type":"boolean","title":"Include Unexplained"},"coverage":{"additionalProperties":true,"type":"object","title":"Coverage"}},"type":"object","required":["computed_at","window","receipts","entities","lang","region","type","count","include_unexplained","coverage"],"title":"WhyTrendingResponse"},"WhyTrendingWhy":{"properties":{"status":{"type":"string","title":"Status"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"reason_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Kind"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"},"why_status":{"anyOf":[{"type":"string","enum":["news","organic"]},{"type":"null"}],"title":"Why Status","description":"news: a verified headline matched the entity (evidence, not proven cause). organic: attention moved with no matched headline; a driver is likely but not named."},"why_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Label","description":"e.g. 'In the news', 'Organic surge', 'Organic interest'"},"why_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Summary","description":"One sentence for a person; never invents a cause"},"why_icon":{"anyOf":[{"type":"string","enum":["news","organic_surge","organic_interest","followup"]},{"type":"null"}],"title":"Why Icon","description":"Stable icon slug: news (headline found), organic_surge (climbing, no headline yet), organic_interest (steady, no single story), followup (alert update: likely driver found)"},"receipt":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Receipt"}},"type":"object","required":["status","reason","reason_kind","items"],"title":"WhyTrendingWhy"},"Window":{"properties":{"start":{"type":"string","title":"Start"},"end":{"type":"string","title":"End"}},"type":"object","required":["start","end"],"title":"Window"},"WorkspaceIn":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"WorkspaceIn"},"WorkspacePatch":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":80,"minLength":1},{"type":"null"}],"title":"Name"},"email_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Email Enabled"},"slack_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Slack Enabled"},"digest_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Digest Enabled"},"digest_hour_utc":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Digest Hour Utc"},"alert_floors":{"anyOf":[{"$ref":"#/components/schemas/AlertFloors"},{"type":"null"}],"description":"Workspace-wide absolute volume floors; the stricter of this and a watchlist's own threshold applies"}},"type":"object","title":"WorkspacePatch"}}}}