{"openapi":"3.1.0","info":{"title":"UpContent Content API","description":"The API Consists of 5 main areas: pages, domains, sources, indexes, and monitors. Each one is detailed below.\n\n### Pages\nA page is any web page, a page has one canonical url but may have many urls that point at it. You can add a page by url and we'll automatically handle finding the canonical. We currently understand HTML web pages but if we support formats like PDF in the future it will likely still be a page.\n\nWe track a wide variety of metadata, scores, and other facts about every page.\n\n### Domains\nA domain is any domain whether a top-level domain or subdomain. Each domain will have different crawling rules and permissions and a collection of sources associated with it. When a new domain is added we automatically find new sources for that domain. When a page is added we also add the relevant domain.\n\n### Sources\nA source is a specific url and any other accompanying data that we can crawl to find new pages, domains, or sources. We automatically crawl these on a frequency that factors in update frequency, monitors, popularity, and minimum standards of service.\n\nThe plan is to support:\n- Feeds (RSS or Atom)\n- Sitemaps (Either regular or index, by default just indexes news but if you monitor will add what you monitor as well)\n- JSON APIs (eventually also XML)\n- Pages (by default just finds Feeds but with a monitor added it can also find other pages)\n\n### Monitors\nMonitors allow you to monitor a source or domain and receive updates when we find new content. Usually there will be some sort of filter criteria such as a only news, only certain path patterns, or only a certain selector. The second part of a monitor is how to alert you with the current options being webhook or SNS. Monitors also allow you to ensure that pages we otherwise might not be sure enough of to index get indexed.\n\n### Indexes\nIndexes allow you to query our records of the internet in a variety of ways. The two currently (planned) indexes are text and similarity. Indexes may support one or multiple methods of querying. Text supports text queries whether simple keyword or Lucene style boolean queries. Similarity takes a url and gives you similar articles","version":"0.0.1"},"paths":{"/v1/session-info":{"get":{"tags":["Authentication"],"summary":"Session Info","description":"Get information about the current JWT session.\n\nReturns the decoded JWT payload if authenticated, or an error if not.\nThis endpoint is useful for testing JWT authentication and scopes.","operationId":"session_info_v1_session_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/domains/{domain}":{"post":{"tags":["Domains"],"summary":"Add Domain","description":"Create or look up a domain.\n\nIf an optional `domain_discovery_settings` block is provided, those toggles\nare applied ONLY when this call creates a new domain. When the domain\nalready exists, the settings block is silently ignored; use\n`PUT /v1/domains/{domain}/discovery-settings` to update discovery toggles\non an existing domain.","operationId":"add_domain_v1_domains__domain__post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DomainPostRequestBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DomainPost"},{"type":"null"}],"title":"Response Add Domain V1 Domains  Domain  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Domains"],"summary":"Get Domain","operationId":"get_domain_v1_domains__domain__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DomainGet"},{"type":"null"}],"title":"Response Get Domain V1 Domains  Domain  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/sources":{"get":{"tags":["Domains"],"summary":"Get Domain Sources","description":"Get all sources associated with a domain.\n\nReturns feeds, sitemaps, HTML sources, and API sources for the specified domain.","operationId":"get_domain_sources_v1_domains__domain__sources_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainSourcesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/robots":{"get":{"tags":["Domains"],"summary":"Get Domain Robots","description":"Get robots.txt information for a domain.\n\nReturns robots.txt status, sitemap URLs, and crawl permissions by user agent.","operationId":"get_domain_robots_v1_domains__domain__robots_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainRobotsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/config":{"get":{"tags":["Domains"],"summary":"Get Domain Config","description":"Get parsing configuration for a domain.\n\nReturns the domain's custom parsing configuration including field selectors,\nscraper settings, and other parsing rules.","operationId":"get_domain_config_v1_domains__domain__config_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/subdomains":{"get":{"tags":["Domains"],"summary":"Get Domain Subdomains","description":"Get all subdomains of a given domain.\n\nReturns all subdomains found in the database for the specified domain.\nFor example, for 'example.com', this returns 'blog.example.com', 'api.example.com', etc.","operationId":"get_domain_subdomains_v1_domains__domain__subdomains_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainSubdomainsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/news":{"get":{"tags":["Domains"],"summary":"Get Domain News","operationId":"get_domain_news_v1_domains__domain__news_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PageGet"},"title":"Response Get Domain News V1 Domains  Domain  News Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/discovery-settings":{"put":{"tags":["Domains"],"summary":"Put Domain Discovery Settings","description":"Update per-domain discovery/indexing toggles.\n\nOnly fields included in the request body are changed. Fields omitted are\nleft unchanged. A field set to null clears the override (default enabled).\nRequires internal.config_write scope.","operationId":"put_domain_discovery_settings_v1_domains__domain__discovery_settings_put","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverySettingsPutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverySettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/monitor/paths":{"post":{"tags":["Domains","Monitors"],"summary":"Monitor Domain Path","operationId":"monitor_domain_path_v1_domains__domain__monitor_paths_post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/monitor/news":{"post":{"tags":["Domains","Monitors"],"summary":"Monitor Domain News","operationId":"monitor_domain_news_v1_domains__domain__monitor_news_post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/monitor/feeds":{"post":{"tags":["Domains","Monitors"],"summary":"Monitor Domain Feeds","operationId":"monitor_domain_feeds_v1_domains__domain__monitor_feeds_post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/bulk/import":{"post":{"tags":["Domains","Import"],"summary":"Domain Bulk Import","description":"Import domains in bulk from a CSV or plain text file.\n\nAccepted formats:\n- CSV: `domain` column (required) plus optional boolean columns\n  `discover_sources`, `discover_pages`, `index_pages`\n  (accepts true/false, 1/0, yes/no; blank leaves the default). Discovery\n  columns apply ONLY to rows that result in a new domain being created;\n  rows for pre-existing domains silently ignore them. Use\n  `PUT /v1/domains/{domain}/discovery-settings` to mutate after create.\n- Plain text: One domain per line (no discovery columns supported).\n\nMaximum 100 domains per import to prevent timeouts.\n\nReturns:\n    Summary of import results including successful and failed domains","operationId":"domain_bulk_import_v1_domains_bulk_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_domain_bulk_import_v1_domains_bulk_import_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Domain Bulk Import V1 Domains Bulk Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/refresh":{"post":{"tags":["Domains"],"summary":"Refresh Domain","description":"Refresh a domain's robots.txt by queueing it for fetching.\n\nThis endpoint queues the domain's robots.txt source for immediate refresh,\nprovided it hasn't been processed in the last 10 minutes.\n\nArgs:\n    domain: The domain name (e.g., 'example.com')\n\nReturns:\n    Dict containing refresh status and timing information\n\nRaises:\n    HTTPException: 404 if domain or robots.txt not found\n    HTTPException: 429 if robots.txt was recently processed\n    HTTPException: 500 for other errors","operationId":"refresh_domain_v1_domains__domain__refresh_post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Refresh Domain V1 Domains  Domain  Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/integrations":{"put":{"tags":["Domains"],"summary":"Write Domain Integrations","operationId":"write_domain_integrations_v1_domains__domain__integrations_put","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DomainIntegrationsPutItem"},"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Domains"],"summary":"Read Domain Integrations","operationId":"read_domain_integrations_v1_domains__domain__integrations_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DomainIntegrationsGetItem"},"title":"Response Read Domain Integrations V1 Domains  Domain  Integrations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/integrations/bulk/import":{"post":{"tags":["Domains","Import"],"summary":"Integrations Bulk Import","description":"Import domain integrations in bulk from a CSV file.\n\nCSV Columns: integration_name (required), active (optional), is_default (optional), deactivates_sources (optional)\n\nMaximum 100 rows per import.\n\nReturns:\n    Summary of import results including successful and failed rows","operationId":"integrations_bulk_import_v1_domains__domain__integrations_bulk_import_post","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_integrations_bulk_import_v1_domains__domain__integrations_bulk_import_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Integrations Bulk Import V1 Domains  Domain  Integrations Bulk Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/indexes/text/search":{"get":{"tags":["Indexes"],"summary":"Text Search","operationId":"text_search_v1_indexes_text_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"culture","in":"query","required":false,"schema":{"type":"string","default":"en-US","title":"Culture"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PageGet"},"title":"Response Text Search V1 Indexes Text Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/indexes/similarity/similar":{"get":{"tags":["Indexes"],"summary":"Similar Pages","operationId":"similar_pages_v1_indexes_similarity_similar_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"culture","in":"query","required":false,"schema":{"type":"string","default":"en-US","title":"Culture"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PageGet"},"title":"Response Similar Pages V1 Indexes Similarity Similar Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/search/boolean":{"post":{"tags":["Indexes","Search"],"summary":"Boolean Search","description":"Execute a boolean text search query using Lucene syntax.\n\nSupports Lucene query syntax including:\n- Boolean operators: AND, OR, NOT\n- Field-specific searches: title:\"machine learning\"\n- Wildcards: machin* or m?chine\n- Phrase searches: \"exact phrase\"\n- Grouping: (term1 OR term2) AND term3\n\nProvides flexible filtering options for date, language, culture, content type,\nand adult content. By default, adult content is excluded.\n\nExamples:\n    - Simple: \"machine learning\"\n    - Boolean: \"python AND (machine learning OR data science)\"\n    - Field-specific: title:\"AI\" AND type:article\n    - Phrase: \"natural language processing\"","operationId":"boolean_search_v1_search_boolean_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BooleanSearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BooleanSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/integrations/{integration_name}/sources":{"get":{"tags":["Integrations"],"summary":"Get Integration Sources","description":"Debug endpoint: return sources an integration sees for a domain.","operationId":"get_integration_sources_v1_domains__domain__integrations__integration_name__sources_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"integration_name","in":"path","required":true,"schema":{"type":"string","title":"Integration Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Get Integration Sources V1 Domains  Domain  Integrations  Integration Name  Sources Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/integrations/{integration_name}/sources/{url_or_id}":{"get":{"tags":["Integrations"],"summary":"Get Integration Pages For Source","description":"Debug endpoint: return the JsonFeed an integration produces for a source.\n\n`url_or_id` should be URL-encoded by the caller when it contains slashes.\n`domain` is accepted for parity with the other routes but is not used here —\n`get_pages_for_source` is keyed by source URL/id alone.","operationId":"get_integration_pages_for_source_v1_domains__domain__integrations__integration_name__sources__url_or_id__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"integration_name","in":"path","required":true,"schema":{"type":"string","title":"Integration Name"}},{"name":"url_or_id","in":"path","required":true,"schema":{"type":"string","title":"Url Or Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonFeed"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/integrations/{integration_name}/pages/{url_or_id}":{"get":{"tags":["Integrations"],"summary":"Get Integration Page","description":"Debug endpoint: return the full PageParsingResult an integration produces for a page.\n\n`url_or_id` uses the FastAPI `:path` converter so embedded slashes match.\n`domain` is accepted for parity with the other routes but is not used here.","operationId":"get_integration_page_v1_domains__domain__integrations__integration_name__pages__url_or_id__get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}},{"name":"integration_name","in":"path","required":true,"schema":{"type":"string","title":"Integration Name"}},{"name":"url_or_id","in":"path","required":true,"schema":{"type":"string","title":"Url Or Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageParsingResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/livefeed":{"get":{"tags":["Livefeed"],"summary":"Get Livefeed","description":"Return the most recently indexed articles from OpenSearch.","operationId":"get_livefeed_v1_livefeed_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Maximum number of results","default":50,"title":"Limit"},"description":"Maximum number of results"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Return articles indexed after this UTC datetime (default: past hour)","title":"Since"},"description":"Return articles indexed after this UTC datetime (default: past hour)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveFeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/sources":{"post":{"tags":["Monitors"],"summary":"Create Source Monitor","description":"Create a monitor attached to a specific source.\n\nResolves the source from ``url`` + ``source_type`` (404 if no such source),\nbuilds the monitor, persists it via ``MonitorsService.create_monitor``, and echoes\nthe created monitor. ``account_id`` comes from the request body.","operationId":"create_source_monitor_v1_monitors_sources_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceMonitorCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/domains":{"post":{"tags":["Monitors"],"summary":"Create Domain Monitor","description":"Create a monitor attached to a whole domain (optionally narrowed by\n``source_type``).\n\nValidates the domain exists (404 if not), builds the monitor, and persists it via\n``MonitorsService.create_monitor``.","operationId":"create_domain_monitor_v1_monitors_domains_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DomainMonitorCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors":{"get":{"tags":["Monitors"],"summary":"List Monitors","description":"List monitors, filtered by the supplied query parameters (empty list if none).","operationId":"list_monitors_v1_monitors_get","parameters":[{"name":"source_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter to monitors attached to this source.","title":"Source Id"},"description":"Filter to monitors attached to this source."},{"name":"domain_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter to monitors attached to this domain.","title":"Domain Id"},"description":"Filter to monitors attached to this domain."},{"name":"external_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to monitors with this exact external_id (AC 12.2).","title":"External Id"},"description":"Filter to monitors with this exact external_id (AC 12.2)."},{"name":"url","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to source monitors whose source has this exact URL (resolved via the source relationship).","title":"Url"},"description":"Filter to source monitors whose source has this exact URL (resolved via the source relationship)."},{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to domain monitors on this exact domain name (resolved via the domain relationship).","title":"Domain"},"description":"Filter to domain monitors on this exact domain name (resolved via the domain relationship)."},{"name":"account_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Account-scope filter. Omit to list across all accounts. Soft-deleted monitors are always omitted.","title":"Account Id"},"description":"Account-scope filter. Omit to list across all accounts. Soft-deleted monitors are always omitted."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MonitorResponse"},"title":"Response List Monitors V1 Monitors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/{monitor_id}":{"get":{"tags":["Monitors"],"summary":"Get Monitor","description":"Get a single monitor by id (404 if not found, soft-deleted, or account mismatch).","operationId":"get_monitor_v1_monitors__monitor_id__get","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"account_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Account-scope filter; when supplied and it does not match (or the monitor is soft-deleted) the response is 404.","title":"Account Id"},"description":"Account-scope filter; when supplied and it does not match (or the monitor is soft-deleted) the response is 404."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Monitors"],"summary":"Update Monitor","description":"Partially update a monitor's mutable fields.\n\nScope (``source_id``/``domain_id``/``source_type``) and ``account_id`` are\nimmutable. When ``conditions`` is supplied it replaces the monitor's full condition\nset. 404 if not found, soft-deleted, or account mismatch.","operationId":"update_monitor_v1_monitors__monitor_id__put","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"account_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Account-scope filter; a mismatch behaves as 404.","title":"Account Id"},"description":"Account-scope filter; a mismatch behaves as 404."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Monitors"],"summary":"Delete Monitor","description":"Soft-delete a monitor (stamps ``deleted``; conditions/target rows are retained).\n\nThe monitor thereafter disappears from all reads. 404 if not found, already\nsoft-deleted, or account mismatch. Returns 204 with no body.","operationId":"delete_monitor_v1_monitors__monitor_id__delete","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"account_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Account-scope filter; a mismatch behaves as 404.","title":"Account Id"},"description":"Account-scope filter; a mismatch behaves as 404."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/{monitor_id}/pages":{"get":{"tags":["Monitors"],"summary":"Get Monitor Pages","description":"Test/debug helper: URLs of the monitor's discovered pages that match its conditions.\n\nEvaluates the monitor's conditions over the discovered pages of its source (for a\nsource monitor) or of the domain's sources of the matching type (for a domain\nmonitor), and returns the matching URLs. Provided to aid testing that conditions\nevaluate correctly over real source data.\n\nRuns the same ``MonitorsService.get_matching_pages_for_monitors`` the source-monitor\nworker uses, so a preview here reflects what the worker would force-ingest. The\nsource HTML is reloaded from the ref persisted on the source\n(``Source.last_content_ref``), so selector conditions and HTML-source candidate\ndiscovery both work here — but only once the source has been fetched at least once\nsince that column was added; until then a selector-bearing monitor returns no matches.","operationId":"get_monitor_pages_v1_monitors__monitor_id__pages_get","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Monitor Id"}},{"name":"account_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Account-scope filter; a mismatch behaves as 404.","title":"Account Id"},"description":"Account-scope filter; a mismatch behaves as 404."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Get Monitor Pages V1 Monitors  Monitor Id  Pages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["Observability"],"summary":"Health","description":"Health check endpoint.\n\nReturns a simple status indicating the service is running.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/pages":{"post":{"tags":["Pages"],"summary":"Add Page","description":"Add or look up a page.\n\nAn optional `domain_discovery_settings` block is honored ONLY when this\ncall results in the underlying domain being created for the first time.\nIf the domain already exists, the settings block is silently ignored;\nuse `PUT /v1/domains/{domain}/discovery-settings` instead.","operationId":"add_page_v1_pages_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PagePost"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PagePostResponse"},{"type":"null"}],"title":"Response Add Page V1 Pages Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Pages"],"summary":"Get Page By Url","description":"Get page by its URL","operationId":"get_page_by_url_v1_pages_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageGet"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pages/{page_id}":{"get":{"tags":["Pages"],"summary":"Get Page","description":"Get page by its hash/ID","operationId":"get_page_v1_pages__page_id__get","parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","title":"Page Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageGet"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pages/{hash}/fulltext":{"get":{"tags":["Pages"],"summary":"Get Page Fulltext","description":"Get page fulltext content by hash/ID","operationId":"get_page_fulltext_v1_pages__hash__fulltext_get","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string","title":"Hash"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Get Page Fulltext V1 Pages  Hash  Fulltext Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pages/{page_id}/page.html":{"get":{"tags":["Pages"],"summary":"Get Page Html","description":"Serve the raw HTML body a page was crawled/parsed from (DEV-2839).\n\nReturns the stored HTML with ``Content-Type: text/html`` (no response\ncontract beyond that). Returns 404 when the page has no stored body\n(``content_ref`` is null) — e.g. a page that was never successfully\ncrawled; the caller (UpContent fallback) relies on existing retry rather\nthan a live re-fetch.\n\nAuthorization (DEV-2839 A3, Open Question 6): no dedicated scope. Like the\nsibling read endpoints (`get_page`, `get_page_fulltext`), this is a `/v1/*`\nroute and is therefore authenticated by the global `JWTAuthMiddleware`\n(a valid bearer token is required), but carries no `@require_scopes` and no\nnew `pages:*` action. That is deliberate: the response is only the raw HTML\nthe page was parsed from — it exposes none of the internal-only fields\n(`integration_name`, `found_by`) that are gated by `internal.statistics_read`\nelsewhere — so any authenticated caller may read it.","operationId":"get_page_html_v1_pages__page_id__page_html_get","parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","title":"Page Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pages/{hash}/vector/fulltext":{"get":{"tags":["Pages"],"summary":"Get Page Vector Fulltext","operationId":"get_page_vector_fulltext_v1_pages__hash__vector_fulltext_get","parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string","title":"Hash"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"number"},"title":"Response Get Page Vector Fulltext V1 Pages  Hash  Vector Fulltext Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/search":{"post":{"tags":["Search"],"summary":"Advanced Search","description":"Advanced search endpoint supporting multiple query types and comprehensive filters.\n\nSupports:\n- Lucene query syntax (uses OpenSearch query_string)\n- Natural language queries (uses hybrid BM25 + kNN)\n- Simple keyword searches (uses hybrid BM25 + kNN)\n- Similarity search (uses hybrid BM25 + kNN)","operationId":"advanced_search_v1_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchQuery"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pages/similar":{"post":{"tags":["Pages","Search"],"summary":"Find Similar Pages","description":"Find pages similar to a given page using kNN vector similarity search.\n\nAccepts either a PageID (UUID) or a canonical URL as input. If a URL is provided,\nit will be converted to a PageID using UUID5 hashing.\n\nReturns a list of similar pages ranked by relevance score, including metadata\nsuch as title, summary, publisher, and publication date.","operationId":"find_similar_pages_v1_pages_similar_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimilaritySearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimilaritySearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pages/bulk/import":{"post":{"tags":["Pages","Import"],"summary":"Page Bulk Import","operationId":"page_bulk_import_v1_pages_bulk_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_page_bulk_import_v1_pages_bulk_import_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Page Bulk Import V1 Pages Bulk Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/feeds":{"post":{"tags":["Sources","Feeds"],"summary":"Add Feed","description":"Add a new RSS/Atom feed source to the system.\n\nThis endpoint validates the feed URL, determines the associated domain,\nand creates the appropriate database record. The feed gets added with\nis_valid=None so the scheduler will pick it up for processing.\n\nAn optional `domain_discovery_settings` block is honored ONLY when this\ncall results in the domain being created for the first time. If the\ndomain already exists, the settings block is silently ignored; use\n`PUT /v1/domains/{domain}/discovery-settings` instead.\n\nArgs:\n    body: The feed addition request\n\nReturns:\n    AddFeedResponse: Details of the created feed\n\nRaises:\n    HTTPException: 400 for invalid URLs, 409 for duplicates, 500 for errors","operationId":"add_feed_v1_sources_feeds_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddFeedRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddFeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Sources","Feeds"],"summary":"Get Feed By Url","description":"Get a feed by URL.","operationId":"get_feed_by_url_v1_sources_feeds_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri","minLength":1,"maxLength":2083,"title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/feeds/{id}":{"get":{"tags":["Sources","Feeds"],"summary":"Get Feed By Id","description":"Get a feed by ID.","operationId":"get_feed_by_id_v1_sources_feeds__id__get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/feeds/{id}/items":{"get":{"tags":["Sources","Feeds"],"summary":"Get Feed Content","operationId":"get_feed_content_v1_sources_feeds__id__items_get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{},"title":"Response Get Feed Content V1 Sources Feeds  Id  Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/feeds/{id}/refresh":{"post":{"tags":["Sources","Feeds"],"summary":"Refresh Feed Content","operationId":"refresh_feed_content_v1_sources_feeds__id__refresh_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/feeds/{id}/monitor":{"post":{"tags":["Sources","Feeds","Monitors"],"summary":"Monitor Feed","operationId":"monitor_feed_v1_sources_feeds__id__monitor_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectorMonitor"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Monitor Feed V1 Sources Feeds  Id  Monitor Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/feeds/bulk/import":{"post":{"tags":["Sources","Feeds","Import"],"summary":"Feed Bulk Import","description":"Import feeds in bulk from a CSV or plain text file.\n\nAccepted formats:\n- CSV: url (required), continue_running (optional), min_frequency (optional),\n  discover_sources (optional), discover_pages (optional), index_pages (optional).\n  The three discovery columns (boolean: true/false/1/0/yes/no; blank = default)\n  apply to the feed's domain ONLY when this row causes the domain to be\n  created for the first time. For pre-existing domains they are silently\n  ignored; use `PUT /v1/domains/{domain}/discovery-settings` instead.\n- Plain text: One feed URL per line (no discovery columns supported).\n\nMaximum 100 feeds per import to prevent timeouts.\n\nReturns:\n    Summary of import results including successful and failed feeds","operationId":"feed_bulk_import_v1_sources_feeds_bulk_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_feed_bulk_import_v1_sources_feeds_bulk_import_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Feed Bulk Import V1 Sources Feeds Bulk Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/html":{"post":{"tags":["Sources","HTML"],"summary":"Add Html Source","description":"Add a new HTML page source to the system.\n\nThis endpoint validates the HTML page URL, determines the associated domain,\nand creates the appropriate database record. The HTML source gets added with\nis_valid=None and desired_next_poll=None so the scheduler will pick it up for processing.\n\nAn optional `domain_discovery_settings` block is honored ONLY when this\ncall results in the domain being created for the first time. If the\ndomain already exists, the settings block is silently ignored; use\n`PUT /v1/domains/{domain}/discovery-settings` instead.\n\nArgs:\n    body: The HTML page addition request\n\nReturns:\n    AddHtmlResponse: Details of the created HTML source\n\nRaises:\n    HTTPException: 400 for invalid URLs, 409 for duplicates, 500 for errors","operationId":"add_html_source_v1_sources_html_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddHtmlRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddHtmlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Sources","HTML"],"summary":"Get Html Source By Url","description":"Retrieve an HTML page source by its URL.\n\nArgs:\n    url (HttpUrl): The URL of the HTML source to retrieve\n    response (Response): FastAPI response object to set status codes\n\nReturns:\n    Union[ErrorResponseBody, HtmlSourceResult]:\n        - HtmlSourceResult: Contains HTML source details if found\n        - ErrorResponseBody: Contains error message if source is not found or invalid\n\nRaises:\n    HTTPException: 400 for invalid URL, 500 for server errors","operationId":"get_html_source_by_url_v1_sources_html_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri","minLength":1,"maxLength":2083,"title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ErrorResponseBody"},{"$ref":"#/components/schemas/HtmlSourceResult"}],"title":"Response Get Html Source By Url V1 Sources Html Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/html/{id}":{"get":{"tags":["Sources","HTML"],"summary":"Get Html Source By Id","description":"Retrieve an HTML page source by its unique identifier.\n\nArgs:\n    id (UUID): The unique identifier of the HTML source to retrieve\n    response (Response): FastAPI response object to set status codes\n\nReturns:\n    Union[ErrorResponseBody, HtmlSourceResult]:\n        - HtmlSourceResult: Contains HTML source details if found\n        - ErrorResponseBody: Contains error message if source is not found or invalid\n\nRaises:\n    HTTPException: 400 for invalid UUID, 500 for server errors","operationId":"get_html_source_by_id_v1_sources_html__id__get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ErrorResponseBody"},{"$ref":"#/components/schemas/HtmlSourceResult"}],"title":"Response Get Html Source By Id V1 Sources Html  Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/html/{id}/items":{"get":{"tags":["Sources","HTML"],"summary":"Get Html Source Content","operationId":"get_html_source_content_v1_sources_html__id__items_get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{},"title":"Response Get Html Source Content V1 Sources Html  Id  Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/html/{id}/refresh":{"post":{"tags":["Sources","HTML"],"summary":"Refresh Html Source","operationId":"refresh_html_source_v1_sources_html__id__refresh_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/html/{id}/monitor/paths":{"post":{"tags":["Sources","HTML","Monitors"],"summary":"Monitor Html Source Paths","operationId":"monitor_html_source_paths_v1_sources_html__id__monitor_paths_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PathMonitor"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Monitor Html Source Paths V1 Sources Html  Id  Monitor Paths Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/html/{id}/monitor/selector":{"post":{"tags":["Sources","HTML","Monitors"],"summary":"Monitor Html Source Selector","operationId":"monitor_html_source_selector_v1_sources_html__id__monitor_selector_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectorMonitor"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Monitor Html Source Selector V1 Sources Html  Id  Monitor Selector Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/html/bulk/import":{"post":{"tags":["Sources","HTML","Import"],"summary":"Html Source Bulk Import","operationId":"html_source_bulk_import_v1_sources_html_bulk_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_html_source_bulk_import_v1_sources_html_bulk_import_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/apis/json":{"post":{"tags":["Sources","API Sources"],"summary":"Add Api","operationId":"add_api_v1_sources_apis_json_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"string","title":"Response Add Api V1 Sources Apis Json Post"}}}}}},"get":{"tags":["Sources","API Sources"],"summary":"Get Json Api By Id","operationId":"get_json_api_by_id_v1_sources_apis_json_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Json Api By Id V1 Sources Apis Json Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/apis/json/{id}":{"get":{"tags":["Sources","API Sources"],"summary":"Get Json Api","operationId":"get_json_api_v1_sources_apis_json__id__get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Get Json Api V1 Sources Apis Json  Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/apis/json/{id}/items":{"get":{"tags":["Sources","API Sources"],"summary":"Get Json Api Content","operationId":"get_json_api_content_v1_sources_apis_json__id__items_get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{},"title":"Response Get Json Api Content V1 Sources Apis Json  Id  Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/apis/json/{id}/refresh":{"post":{"tags":["Sources","API Sources"],"summary":"Get Json Api Content","operationId":"get_json_api_content_v1_sources_apis_json__id__refresh_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/apis/json/{id}/monitor/selector":{"post":{"tags":["Sources","API Sources","Monitors"],"summary":"Monitor Json Api Selector","operationId":"monitor_json_api_selector_v1_sources_apis_json__id__monitor_selector_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JqMonitor"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Monitor Json Api Selector V1 Sources Apis Json  Id  Monitor Selector Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/apis/json/bulk/import":{"post":{"tags":["Sources","API Sources","Import"],"summary":"Json Api Bulk Import","operationId":"json_api_bulk_import_v1_sources_apis_json_bulk_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_json_api_bulk_import_v1_sources_apis_json_bulk_import_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/{id}/pages":{"get":{"tags":["Sources","Parsed Data"],"summary":"Get Source Pages","description":"Get pages discovered from a parsed source.\n\nThis endpoint retrieves the list of pages that were discovered when\nthis source was last parsed. The data comes from the parsed_sources\nMongoDB collection.\n\nArgs:\n    id: The source ID (UUID)\n    response: FastAPI response object\n\nReturns:\n    list[dict]: List of discovered pages with their metadata\n    ErrorResponseBody: Error details if source not found or error occurs\n\nExample:\n    GET /v1/sources/123e4567-e89b-12d3-a456-426614174000/pages","operationId":"get_source_pages_v1_sources__id__pages_get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ParsedSourcePageResult"}},{"$ref":"#/components/schemas/ErrorResponseBody"}],"title":"Response Get Source Pages V1 Sources  Id  Pages Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/{id}/sources":{"get":{"tags":["Sources","Parsed Data"],"summary":"Get Source Sources","description":"Get sources discovered from a parsed source.\n\nThis endpoint retrieves the list of child sources that were discovered when\nthis source was last parsed. For example, a sitemap index might discover\nmultiple child sitemaps, or a sitemap might discover RSS feeds.\nThe data comes from the parsed_sources MongoDB collection.\n\nArgs:\n    id: The source ID (UUID)\n    response: FastAPI response object\n\nReturns:\n    list[dict]: List of discovered sources with their metadata\n    ErrorResponseBody: Error details if source not found or error occurs\n\nExample:\n    GET /v1/sources/123e4567-e89b-12d3-a456-426614174000/sources","operationId":"get_source_sources_v1_sources__id__sources_get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ParsedSourceSourceResult"}},{"$ref":"#/components/schemas/ErrorResponseBody"}],"title":"Response Get Source Sources V1 Sources  Id  Sources Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/{source_id}/refresh":{"post":{"tags":["Sources"],"summary":"Refresh Source","description":"Refresh a source by queueing it for immediate fetching.\n\nThis endpoint allows API clients to manually trigger a refresh of a source,\nprovided it hasn't been processed in the last 10 minutes. This prevents\nexcessive load on target servers and our processing infrastructure.\n\nArgs:\n    source_id: UUID of the source to refresh\n\nReturns:\n    RefreshSourceResponse: Details of the refresh request\n\nRaises:\n    HTTPException: 404 if source not found\n    HTTPException: 429 if source was recently processed (< 10 minutes ago)\n    HTTPException: 500 for other errors","operationId":"refresh_source_v1_sources__source_id__refresh_post","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshSourceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/sitemaps":{"post":{"tags":["Sources","Sitemaps"],"summary":"Add Sitemap","description":"Add a new sitemap source to the system.\n\nThis endpoint validates the sitemap URL, determines the associated domain,\nand creates the appropriate database record. The sitemap gets added with\nis_valid=None so the scheduler will pick it up for processing.\n\nAn optional `domain_discovery_settings` block is honored ONLY when this\ncall results in the domain being created for the first time. If the\ndomain already exists, the settings block is silently ignored; use\n`PUT /v1/domains/{domain}/discovery-settings` instead.\n\nArgs:\n    body: The sitemap addition request\n\nReturns:\n    AddSitemapResponse: Details of the created sitemap\n\nRaises:\n    HTTPException: 400 for invalid URLs, 409 for duplicates, 500 for errors","operationId":"add_sitemap_v1_sources_sitemaps_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddSitemapRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddSitemapResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Sources","Sitemaps"],"summary":"Get Sitemap By Url","description":"Retrieve a sitemap source by its URL.\n\nArgs:\n    url (HttpUrl): The URL of the sitemap to retrieve\n    response (Response): FastAPI response object to set status codes\n\nReturns:\n    Union[ErrorResponseBody, SitemapResult]:\n        - SitemapResult: Contains sitemap details if found\n        - ErrorResponseBody: Contains error message if sitemap is not found or invalid\n\nRaises:\n    Exception: If an error occurs during the database operation\n\nExample:\n    GET /v1/sources/sitemaps?url=https://example.com/sitemap.xml\n\nNotes:\n    The URL is converted to a source ID internally using the business ID context.\n    The URL must be properly URL-encoded in the query parameter.","operationId":"get_sitemap_by_url_v1_sources_sitemaps_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri","minLength":1,"maxLength":2083,"title":"Url"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ErrorResponseBody"},{"$ref":"#/components/schemas/SitemapResult"}],"title":"Response Get Sitemap By Url V1 Sources Sitemaps Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/sitemaps/{id}":{"get":{"tags":["Sources","Sitemaps"],"summary":"Get Sitemap By Id","description":"Retrieve a sitemap source by its unique identifier.\n\nArgs:\n    id (UUID): The unique identifier of the sitemap to retrieve\n    response (Response): FastAPI response object to set status codes\n\nReturns:\n    Union[ErrorResponseBody, SitemapResult]:\n        - SitemapResult: Contains sitemap details if found\n        - ErrorResponseBody: Contains error message if sitemap is not found or invalid\n\nRaises:\n    Exception: If an error occurs during the database operation\n\nExample:\n    GET /v1/sources/sitemaps/123e4567-e89b-12d3-a456-426614174000","operationId":"get_sitemap_by_id_v1_sources_sitemaps__id__get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ErrorResponseBody"},{"$ref":"#/components/schemas/SitemapResult"}],"title":"Response Get Sitemap By Id V1 Sources Sitemaps  Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/sitemaps/{id}/items":{"get":{"tags":["Sources","Sitemaps"],"summary":"Get Sitemap Content","operationId":"get_sitemap_content_v1_sources_sitemaps__id__items_get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{},"title":"Response Get Sitemap Content V1 Sources Sitemaps  Id  Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/sitemaps/{id}/refresh":{"post":{"tags":["Sources","Sitemaps"],"summary":"Refresh Sitemap","operationId":"refresh_sitemap_v1_sources_sitemaps__id__refresh_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/sitemaps/{id}/monitor":{"post":{"tags":["Sources","Sitemaps","Monitors"],"summary":"Monitor Sitemap","operationId":"monitor_sitemap_v1_sources_sitemaps__id__monitor_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectorMonitor"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Monitor Sitemap V1 Sources Sitemaps  Id  Monitor Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/sitemaps/{id}/monitor/paths":{"post":{"tags":["Sources","Sitemaps","Monitors"],"summary":"Monitor Sitemap Path","operationId":"monitor_sitemap_path_v1_sources_sitemaps__id__monitor_paths_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PathMonitor"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/sitemaps/{id}/monitor/news":{"post":{"tags":["Sources","Sitemaps","Monitors"],"summary":"Monitor Sitemap News","operationId":"monitor_sitemap_news_v1_sources_sitemaps__id__monitor_news_post","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","title":"Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectorMonitor"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources/sitemaps/bulk/import":{"post":{"tags":["Sources","Sitemaps","Import"],"summary":"Sitemap Bulk Import","operationId":"sitemap_bulk_import_v1_sources_sitemaps_bulk_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_sitemap_bulk_import_v1_sources_sitemaps_bulk_import_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Sitemap Bulk Import V1 Sources Sitemaps Bulk Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/parsing-config":{"get":{"tags":["Admin","Domains"],"summary":"Get Parsing Config","description":"Get the parsing configuration for a domain.\n\nRequires internal.config_read scope.\n\nArgs:\n    domain: The domain name\n    request: FastAPI request object\n\nReturns:\n    ParsingConfigGetResponse with config data","operationId":"get_parsing_config_v1_domains__domain__parsing_config_get","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParsingConfigGetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin","Domains"],"summary":"Put Parsing Config","description":"Update the parsing configuration for a domain.\n\nRequires internal.config_write scope.\n\nArgs:\n    domain: The domain name\n    config_data: The new parsing configuration\n    request: FastAPI request object\n\nReturns:\n    ParsingConfigPutResponse with updated config","operationId":"put_parsing_config_v1_domains__domain__parsing_config_put","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParsingConfigPutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParsingConfigPutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/domains/{domain}/sources/deactivate-all":{"put":{"tags":["Admin","Domains"],"summary":"Deactivate All Sources","description":"Deactivate all sources for a domain except robots.txt.\n\nRequires internal.config_write scope.\n\nArgs:\n    domain: The domain name\n    request: FastAPI request object\n\nReturns:\n    DeactivateSourcesResponse with counts of deactivated and skipped sources","operationId":"deactivate_all_sources_v1_domains__domain__sources_deactivate_all_put","parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeactivateSourcesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AddFeedRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"active":{"type":"boolean","title":"Active","default":true},"domain_discovery_settings":{"anyOf":[{"$ref":"#/components/schemas/DomainDiscoverySettings"},{"type":"null"}]}},"type":"object","required":["url"],"title":"AddFeedRequest","description":"Request model for adding a feed."},"AddFeedResponse":{"properties":{"source_id":{"type":"string","title":"Source Id"},"url":{"type":"string","title":"Url"},"domain_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain Id"},"active":{"type":"boolean","title":"Active"},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"message":{"type":"string","title":"Message"}},"type":"object","required":["source_id","url","domain_id","active","is_valid","message"],"title":"AddFeedResponse","description":"Response model for adding a feed."},"AddHtmlRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"active":{"type":"boolean","title":"Active","default":true},"domain_discovery_settings":{"anyOf":[{"$ref":"#/components/schemas/DomainDiscoverySettings"},{"type":"null"}]}},"type":"object","required":["url"],"title":"AddHtmlRequest","description":"Request model for adding an HTML page source."},"AddHtmlResponse":{"properties":{"source_id":{"type":"string","title":"Source Id"},"url":{"type":"string","title":"Url"},"domain_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain Id"},"active":{"type":"boolean","title":"Active"},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"message":{"type":"string","title":"Message"}},"type":"object","required":["source_id","url","domain_id","active","is_valid","message"],"title":"AddHtmlResponse","description":"Response model for adding an HTML page source."},"AddSitemapRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"active":{"type":"boolean","title":"Active","default":true},"domain_discovery_settings":{"anyOf":[{"$ref":"#/components/schemas/DomainDiscoverySettings"},{"type":"null"}]}},"type":"object","required":["url"],"title":"AddSitemapRequest","description":"Request model for adding a sitemap."},"AddSitemapResponse":{"properties":{"source_id":{"type":"string","title":"Source Id"},"url":{"type":"string","title":"Url"},"domain_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain Id"},"active":{"type":"boolean","title":"Active"},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"message":{"type":"string","title":"Message"}},"type":"object","required":["source_id","url","domain_id","active","is_valid","message"],"title":"AddSitemapResponse","description":"Response model for adding a sitemap."},"AllowFilters":{"properties":{"adult":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Adult","default":false},"premium":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Premium","default":false},"publisher_libraries":{"anyOf":[{"items":{"type":"string","maxLength":50,"examples":["dow-jones"]},"type":"array"},{"type":"null"}],"title":"Publisher Libraries","description":"Premium publisher libraries this caller may see (e.g. 'dow-jones'). WIDENS the result set: content from these libraries is returned ALONGSIDE free content, not instead of it. To restrict to a library, use only.publisher_libraries. ENTITLEMENT: not checked by the Content Engine — callers must send only libraries the account is provisioned for."}},"type":"object","title":"AllowFilters","description":"Predicates that WIDEN the default result set.\n\nThe Content Engine suppresses some content by default. Setting a flag here\npermits that content *alongside* the default set rather than restricting to\nit: `premium=True` with `publisher_libraries` builds an OR (free content OR\nthe named libraries). That is why it cannot guarantee premium\nrepresentation — premium competes with the whole corpus on relevance, which\nis the DEV-2890 problem. To restrict instead, use `only`/`require`.\n\nNOTE: `publisher_libraries` is a value list living in a predicate block,\nwhich breaks the taxonomy described in `Filters`. It is retained for\nbackward compatibility. New library filtering belongs in\n`only`/`exclude.publisher_libraries`."},"AwsSnsTarget":{"properties":{"arn":{"type":"string","title":"Arn"}},"type":"object","required":["arn"],"title":"AwsSnsTarget"},"Body_domain_bulk_import_v1_domains_bulk_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_domain_bulk_import_v1_domains_bulk_import_post"},"Body_feed_bulk_import_v1_sources_feeds_bulk_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_feed_bulk_import_v1_sources_feeds_bulk_import_post"},"Body_html_source_bulk_import_v1_sources_html_bulk_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_html_source_bulk_import_v1_sources_html_bulk_import_post"},"Body_integrations_bulk_import_v1_domains__domain__integrations_bulk_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_integrations_bulk_import_v1_domains__domain__integrations_bulk_import_post"},"Body_json_api_bulk_import_v1_sources_apis_json_bulk_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_json_api_bulk_import_v1_sources_apis_json_bulk_import_post"},"Body_page_bulk_import_v1_pages_bulk_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_page_bulk_import_v1_pages_bulk_import_post"},"Body_sitemap_bulk_import_v1_sources_sitemaps_bulk_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_sitemap_bulk_import_v1_sources_sitemaps_bulk_import_post"},"BooleanSearchRequest":{"properties":{"query":{"type":"string","minLength":1,"title":"Query","description":"Lucene query string (supports AND, OR, NOT, field:value, etc.)"},"size":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Size","description":"Number of results to return (1-100)","default":50},"published_after":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published After","description":"Only return content published after this date (ISO 8601 format)"},"language":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Language","description":"Filter by language code(s), e.g., 'en' or ['en', 'es']"},"culture":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Culture","description":"Filter by culture code(s), e.g., 'en-US' or ['en-US', 'en-GB']"},"include_adult":{"type":"boolean","title":"Include Adult","description":"Whether to include adult content (default: false, filters out adult content)","default":false},"content_type":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Content Type","description":"Filter by content type(s), e.g., 'article' or ['article', 'tutorial']"},"domain":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Domain","description":"Filter by domain(s), e.g., 'example.com' or ['example.com', 'test.com']"},"publisher":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Publisher","description":"Filter by publisher name(s)"}},"type":"object","required":["query"],"title":"BooleanSearchRequest","description":"Request model for boolean (Lucene syntax) search endpoint."},"BooleanSearchResponse":{"properties":{"query":{"type":"string","title":"Query","description":"The original query string"},"results":{"items":{"$ref":"#/components/schemas/BooleanSearchResult"},"type":"array","title":"Results","description":"List of matching pages"},"count":{"type":"integer","title":"Count","description":"Number of results returned"},"total_hits":{"type":"integer","title":"Total Hits","description":"Total number of matching documents"},"filters_applied":{"additionalProperties":true,"type":"object","title":"Filters Applied","description":"Summary of filters that were applied to the search"}},"type":"object","required":["query","count","total_hits"],"title":"BooleanSearchResponse","description":"Response model for boolean search endpoint."},"BooleanSearchResult":{"properties":{"id":{"type":"string","title":"Id","description":"Page ID"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Url","description":"Canonical URL of the page"},"title":{"type":"string","title":"Title","description":"Page title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Page summary/excerpt"},"fulltext":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fulltext","description":"Full text content"},"date_published":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Published","description":"Publication date"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher","description":"Publisher name"},"type":{"type":"string","title":"Type","description":"Content type","default":"Unknown"},"relevance_score":{"type":"number","title":"Relevance Score","description":"Relevance in [0, 1], relative to this response. The best result scores 1.0. Not comparable across queries."},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain","description":"Domain name"}},"type":"object","required":["id","title","relevance_score"],"title":"BooleanSearchResult","description":"A single result from the boolean/Lucene endpoint (POST /v1/search/boolean).\n\nDistinct from SearchResult, which serves POST /v1/search. This model does\ninclude `fulltext`, matching what that endpoint already returns."},"DeactivateSourcesResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"deactivated_count":{"type":"integer","title":"Deactivated Count"},"skipped_count":{"type":"integer","title":"Skipped Count"},"message":{"type":"string","title":"Message"}},"type":"object","required":["domain","deactivated_count","skipped_count","message"],"title":"DeactivateSourcesResponse","description":"Response model for PUT /v1/domains/{domain}/sources/deactivate-all"},"DiscoverySettingsPutRequest":{"properties":{"discover_sources":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discover Sources"},"discover_pages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discover Pages"},"index_pages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Index Pages"}},"additionalProperties":false,"type":"object","title":"DiscoverySettingsPutRequest","description":"Request model for PUT /v1/domains/{domain}/discovery-settings.\n\nSame shape as DomainDiscoverySettings (flat fields); omitted fields are\nleft unchanged, explicit null clears the override."},"DiscoverySettingsResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"discover_sources":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discover Sources"},"discover_pages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discover Pages"},"index_pages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Index Pages"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"}},"type":"object","required":["domain"],"title":"DiscoverySettingsResponse","description":"Response model for discovery-settings endpoints."},"DomainConfigResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"}},"type":"object","required":["domain"],"title":"DomainConfigResponse","description":"Response model for GET /v1/domains/{domain}/config"},"DomainData":{"properties":{"domain":{"type":"string","title":"Domain","description":"The domain"},"publisher_name":{"type":"string","title":"Publisher Name","description":"The publisher for the domain"},"publisher_name_source":{"anyOf":[{"$ref":"#/components/schemas/PublisherNameSource"},{"type":"null"}],"description":"The source from where the publisher name was discovered"},"popularity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Popularity","description":"The popularity of the domain"}},"type":"object","required":["domain","publisher_name"],"title":"DomainData"},"DomainDiscoverySettings":{"properties":{"discover_sources":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discover Sources"},"discover_pages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discover Pages"},"index_pages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Index Pages"}},"additionalProperties":false,"type":"object","title":"DomainDiscoverySettings","description":"Per-domain discovery/indexing toggles.\n\nShared model used wherever a request can optionally set discovery settings\nfor a domain (POST /v1/domains/{domain}, POST /v1/sources/*, POST /v1/pages).\nAll fields optional: omitted fields are not modified; null explicitly clears\nan override."},"DomainGet":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"domain":{"type":"string","title":"Domain"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"influence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Influence"},"popularity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Popularity"},"is_adult":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Adult"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"culture":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Culture"},"is_snippable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Snippable"},"is_snippable_with_proxy":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Snippable With Proxy"},"discover_sources":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discover Sources"},"discover_pages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Discover Pages"},"index_pages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Index Pages"}},"type":"object","required":["id","domain"],"title":"DomainGet"},"DomainIntegrationsGetItem":{"properties":{"integration_name":{"type":"string","title":"Integration Name"},"active":{"type":"boolean","title":"Active","default":true},"is_default":{"type":"boolean","title":"Is Default","default":false},"deactivates_sources":{"type":"boolean","title":"Deactivates Sources","default":true},"allow_user_edit_deactivates_sources":{"type":"boolean","title":"Allow User Edit Deactivates Sources","default":true},"deactivates_other":{"type":"boolean","title":"Deactivates Other","default":true},"last_scheduled":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scheduled"},"last_started":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Started"},"last_complete":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Complete"}},"type":"object","required":["integration_name"],"title":"DomainIntegrationsGetItem"},"DomainIntegrationsPutItem":{"properties":{"integration_name":{"type":"string","title":"Integration Name"},"active":{"type":"boolean","title":"Active","default":true},"is_default":{"type":"boolean","title":"Is Default","default":false},"deactivates_sources":{"type":"boolean","title":"Deactivates Sources","default":true}},"type":"object","required":["integration_name"],"title":"DomainIntegrationsPutItem"},"DomainMonitorCreate":{"properties":{"account_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Account Id","description":"Owning account (opaque UpContent account id). Optional: creation requires only standard auth, and internal callers may create account-less monitors (CONT-16 Access Control & Tenancy). A non-internal caller's account is its own (from auth context). CE does not validate this value."},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id","description":"Optional opaque caller label. Filterable in list, returned by get, echoed in event payloads; CE does not interpret it (AC 12.2)."},"min_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Frequency","description":"Minimum frequency in hours for checking this monitor"},"max_content_age_days":{"anyOf":[{"type":"integer"},{"type":"string","enum":["forever","default"]},{"type":"null"}],"title":"Max Content Age Days","description":"Caps forced ingestion to pages whose publish/discovery date is within this many days. Accepts a number of days, 999999 or 'forever' (no cap), or null / 'default' (no opinion — defer to other monitors / default stale behavior). Strings are normalized to numeric/null before storage."},"keep_checking":{"type":"boolean","title":"Keep Checking","description":"Whether to keep checking even when encountering errors","default":true},"domain":{"type":"string","title":"Domain"},"source_type":{"anyOf":[{"$ref":"#/components/schemas/SourceType"},{"type":"null"}],"description":"Which source type to monitor on this domain. Optional (AC 2.1): omit to monitor all source types on the domain; set it to narrow to one type. Note the condition/source-type matrix still applies per matched source (e.g. a news condition only matches sitemap sources)."},"target":{"anyOf":[{"$ref":"#/components/schemas/MonitorTargetCreate"},{"type":"null"}]},"conditions":{"items":{"anyOf":[{"$ref":"#/components/schemas/PathConditionCreate"},{"$ref":"#/components/schemas/SelectorConditionCreate"},{"$ref":"#/components/schemas/NewsConditionCreate"}]},"type":"array","minItems":1,"title":"Conditions","description":"List of conditions that must all be met for this monitor (>=1; 'all content' is an explicit /* or /** pattern, not an empty list)"}},"type":"object","required":["domain","conditions"],"title":"DomainMonitorCreate","description":"Model for creating a domain monitor."},"DomainPost":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"domain":{"type":"string","title":"Domain"}},"type":"object","required":["id","domain"],"title":"DomainPost"},"DomainPostRequestBody":{"properties":{"domain_discovery_settings":{"anyOf":[{"$ref":"#/components/schemas/DomainDiscoverySettings"},{"type":"null"}]}},"type":"object","title":"DomainPostRequestBody","description":"Optional body for POST /v1/domains/{domain}. Fully optional."},"DomainRobotsResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"robots_txt_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Robots Txt Url"},"exists":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Exists"},"last_checked":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked"},"sitemaps":{"items":{"type":"string"},"type":"array","title":"Sitemaps","default":[]},"permissions":{"items":{"$ref":"#/components/schemas/RobotAgentPermission"},"type":"array","title":"Permissions","default":[]}},"type":"object","required":["domain"],"title":"DomainRobotsResponse","description":"Response model for GET /v1/domains/{domain}/robots"},"DomainSourceGet":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"type":{"type":"string","title":"Type"},"url":{"type":"string","title":"Url"},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"last_processed":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Processed"},"last_scheduled":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Scheduled"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"failure_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Failure Count"},"failure_status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Status Code"}},"type":"object","required":["id","type","url"],"title":"DomainSourceGet","description":"Response model for a single source associated with a domain"},"DomainSourcesResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"sources":{"items":{"$ref":"#/components/schemas/DomainSourceGet"},"type":"array","title":"Sources"}},"type":"object","required":["domain","sources"],"title":"DomainSourcesResponse","description":"Response model for GET /v1/domains/{domain}/sources"},"DomainSubdomainsResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"subdomains":{"items":{"$ref":"#/components/schemas/DomainGet"},"type":"array","title":"Subdomains"}},"type":"object","required":["domain","subdomains"],"title":"DomainSubdomainsResponse","description":"Response model for GET /v1/domains/{domain}/subdomains"},"ErrorResponseBody":{"properties":{"error":{"type":"string","title":"Error"}},"type":"object","required":["error"],"title":"ErrorResponseBody"},"FeedResult":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"url":{"type":"string","title":"Url"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"domain_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Domain Id"},"active":{"type":"boolean","title":"Active","default":false},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"low_latency":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Low Latency"},"last_processed":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Processed"},"desired_next_poll":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Desired Next Poll"},"failure_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Failure Count"},"failure_status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Status Code"},"min_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Frequency"},"ave_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ave Frequency"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"last_fetch_status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Fetch Status Code"}},"type":"object","required":["id","url","name"],"title":"FeedResult"},"Filters":{"properties":{"only":{"anyOf":[{"$ref":"#/components/schemas/ModedFilters"},{"type":"null"}]},"exclude":{"anyOf":[{"$ref":"#/components/schemas/ModedFilters"},{"type":"null"}]},"allow":{"anyOf":[{"$ref":"#/components/schemas/AllowFilters"},{"type":"null"}]},"require":{"anyOf":[{"$ref":"#/components/schemas/RequireFilters"},{"type":"null"}]}},"type":"object","title":"Filters","description":"Comprehensive filter configuration.\n\nFilter blocks come in two families, and the family decides which block a\ngiven filter belongs in:\n\n- `only` / `exclude` -- SET MEMBERSHIP. Match a document field against a\n  list of values (domains, phrases, publisher_libraries). Polarity comes\n  from the block you choose. Lists only, never booleans.\n- `allow` / `require` -- PER-DOCUMENT PREDICATE. Test a property of the\n  document itself (premium, iframeable, text_length). Polarity comes from\n  the value. `allow` widens what is suppressed by default; `require`\n  narrows to documents having the property.\n\nPrecedence: the more specific block wins. If `only.publisher_libraries` is\nset, or `require.premium` is given (`true` or `false`), the `allow`/default\npremium branch is not evaluated at all — the blocks do not compose.\n\nIMPLEMENTED FIELDS. Much of this model is accepted but not yet wired up. A\nrequest using an unimplemented field returns 200 with that filter silently\nignored, so check here before relying on one:\n  - working: `only.domains`, `only.publisher_libraries`, `allow.premium`,\n    `allow.publisher_libraries`, `require.premium`\n  - accepted and ignored: `only.phrases`, all of `exclude`, `allow.adult`,\n    and every `require` field except `premium`\n\nEntitlement is NOT enforced here. `publisher_libraries` in any block is\nentitlement-bearing and unchecked; callers must send only libraries the\naccount is provisioned for."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HtmlSourceResult":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"domain_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Domain Id"},"active":{"type":"boolean","title":"Active"},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"low_latency":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Low Latency"},"last_processed":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Processed"},"desired_next_poll":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Desired Next Poll"},"failure_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Failure Count"},"failure_status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Status Code"},"min_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Frequency"},"ave_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ave Frequency"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","url","domain_id","active","is_valid","last_processed","desired_next_poll","failure_count","failure_status_code"],"title":"HtmlSourceResult","description":"Response model for retrieving an HTML page source."},"JqMonitor":{"properties":{"target":{"$ref":"#/components/schemas/SourceMonitorTarget"},"array_prop":{"type":"string","title":"Array Prop"},"url_prop":{"type":"string","title":"Url Prop"}},"type":"object","required":["target","array_prop","url_prop"],"title":"JqMonitor"},"JsonFeed":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version","default":"https://jsonfeed.org/version/1.1"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"home_page_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Page Url"},"feed_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feed Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"user_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Comment"},"next_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Url"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"favicon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favicon"},"authors":{"anyOf":[{"items":{"$ref":"#/components/schemas/JsonFeedAuthor"},"type":"array"},{"type":"null"}],"title":"Authors"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"expired":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Expired"},"hubs":{"anyOf":[{"items":{"$ref":"#/components/schemas/JsonFeedHub"},"type":"array"},{"type":"null"}],"title":"Hubs"},"items":{"items":{"$ref":"#/components/schemas/JsonFeedItem"},"type":"array","title":"Items"}},"type":"object","required":["title"],"title":"JsonFeed"},"JsonFeedAttachment":{"properties":{"url":{"type":"string","title":"Url"},"mime_type":{"type":"string","title":"Mime Type"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"size_in_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size In Bytes"},"duration_in_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration In Seconds"}},"type":"object","required":["url","mime_type"],"title":"JsonFeedAttachment"},"JsonFeedAuthor":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar"}},"type":"object","title":"JsonFeedAuthor"},"JsonFeedHub":{"properties":{"type":{"type":"string","title":"Type"},"url":{"type":"string","title":"Url"}},"type":"object","required":["type","url"],"title":"JsonFeedHub"},"JsonFeedItem":{"properties":{"id":{"type":"string","title":"Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"external_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Html"},"content_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Text"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"banner_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Image"},"date_published":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date Published"},"date_modified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date Modified"},"authors":{"anyOf":[{"items":{"$ref":"#/components/schemas/JsonFeedAuthor"},"type":"array"},{"type":"null"}],"title":"Authors"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"attachments":{"anyOf":[{"items":{"$ref":"#/components/schemas/JsonFeedAttachment"},"type":"array"},{"type":"null"}],"title":"Attachments"}},"type":"object","required":["id"],"title":"JsonFeedItem"},"LiveFeedItem":{"properties":{"id":{"type":"string","title":"Id","description":"Page ID"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Url","description":"Canonical URL of the page"},"title":{"type":"string","title":"Title","description":"Page title","default":""},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Page summary/excerpt"},"date_published":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Published","description":"Publication date"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher","description":"Publisher name"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain","description":"Domain name"},"type":{"type":"string","title":"Type","description":"Content type","default":"Unknown"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"When the article was indexed (UTC)"}},"type":"object","required":["id"],"title":"LiveFeedItem","description":"A single item in the livefeed."},"LiveFeedResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/LiveFeedItem"},"type":"array","title":"Results","description":"List of recently indexed articles"},"count":{"type":"integer","title":"Count","description":"Number of results returned"},"since":{"type":"string","format":"date-time","title":"Since","description":"The since cutoff used for this query (UTC)"}},"type":"object","required":["count","since"],"title":"LiveFeedResponse","description":"Response model for the livefeed endpoint."},"ModedFilters":{"properties":{"domains":{"anyOf":[{"items":{"type":"string","maxLength":253,"examples":["example.com"]},"type":"array"},{"type":"null"}],"title":"Domains"},"phrases":{"anyOf":[{"items":{"type":"string","examples":["401k"]},"type":"array"},{"type":"null"}],"title":"Phrases"},"publisher_libraries":{"anyOf":[{"items":{"type":"string","maxLength":50,"examples":["dow-jones"]},"type":"array"},{"type":"null"}],"title":"Publisher Libraries","description":"Restrict results to these publisher libraries (e.g. 'dow-jones'). ENTITLEMENT: not checked by the Content Engine. With require.premium unspecified this returns premium content unconditionally, so callers must send only libraries the account is provisioned for."}},"type":"object","title":"ModedFilters","description":"Set-membership filters, applied in 'only' or 'exclude' mode.\n\nEvery field is a list of values matched against a document field. `only`\nkeeps documents that match; `exclude` drops them.\n\nNOT ALL FIELDS ARE IMPLEMENTED. Only `only.domains` and\n`only.publisher_libraries` currently affect results. `only.phrases` and\nevery field of `exclude` are accepted and silently ignored — a request\nusing them returns 200 with unfiltered results.\n\nThis one class backs BOTH blocks, so the block already carries the polarity.\nNever add a boolean here — it would double-encode polarity, making\n`only.x=False` and `exclude.x=True` synonyms and `exclude.x=False`\nmeaningless. Predicates belong in `allow`/`require`. See `Filters`."},"MonitorResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"account_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Account Id"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"source_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Source Id"},"domain_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Domain Id"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"source_type":{"anyOf":[{"$ref":"#/components/schemas/SourceType"},{"type":"null"}]},"min_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Frequency"},"max_content_age_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Content Age Days"},"keep_checking":{"type":"boolean","title":"Keep Checking"},"created":{"type":"string","format":"date-time","title":"Created"},"updated":{"type":"string","format":"date-time","title":"Updated"},"target":{"anyOf":[{"$ref":"#/components/schemas/MonitorTargetResponse"},{"type":"null"}]},"conditions":{"items":{"anyOf":[{"$ref":"#/components/schemas/PathConditionResponse"},{"$ref":"#/components/schemas/SelectorConditionResponse"},{"$ref":"#/components/schemas/NewsConditionResponse"}]},"type":"array","title":"Conditions"}},"type":"object","required":["id","keep_checking","created","updated","conditions"],"title":"MonitorResponse","description":"Response model for a monitor."},"MonitorTargetCreate":{"properties":{"upcontent":{"anyOf":[{"$ref":"#/components/schemas/UpContentTargetModel"},{"type":"null"}]}},"type":"object","title":"MonitorTargetCreate","description":"Model for creating a monitor target (exactly one of webhook / sns / upcontent).\n\nOnly `upcontent` is implemented in CONT-16; webhook/sns are Future State."},"MonitorTargetResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"upcontent":{"anyOf":[{"$ref":"#/components/schemas/UpContentTargetModel"},{"type":"null"}]}},"type":"object","required":["id"],"title":"MonitorTargetResponse","description":"Response model for monitor target."},"MonitorUpdateRequest":{"properties":{"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"min_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Frequency"},"max_content_age_days":{"anyOf":[{"type":"integer"},{"type":"string","enum":["forever","default"]},{"type":"null"}],"title":"Max Content Age Days"},"keep_checking":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Keep Checking"},"conditions":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/components/schemas/PathConditionCreate"},{"$ref":"#/components/schemas/SelectorConditionCreate"},{"$ref":"#/components/schemas/NewsConditionCreate"}]},"type":"array","minItems":1},{"type":"null"}],"title":"Conditions","description":"If supplied, replaces the monitor's full condition set (>=1; same all-content rules as create)."},"target":{"anyOf":[{"$ref":"#/components/schemas/MonitorTargetCreate"},{"type":"null"}]}},"type":"object","title":"MonitorUpdateRequest","description":"Model for updating a monitor. `account_id` is intentionally absent — a monitor\ncannot be moved between accounts (delete and recreate instead); for non-internal\ncallers `account_id` is supplied as a request-scoping parameter, not a body field.\n\nScope (`source_id`/`domain_id`/`source_type`) is likewise absent — it is immutable.\nEverything else is editable (AC 1.2), including `conditions`: when supplied it\nreplaces the monitor's entire condition set."},"MustMatchExact":{"type":"string","enum":["auto","words","phrase","no"],"title":"MustMatchExact","description":"Enum controlling how strictly search results must match the query.\n\n- AUTO: Smart behavior based on word count:\n    * 2 words: treat as exact phrase\n    * 3-5 words: all words must be present\n    * >5 words: no strict matching requirement\n- WORDS: ALL words from the query must be present in results\n- PHRASE: Results must contain the exact phrase\n- NO: No strict matching requirement (standard search behavior)"},"NewsConditionCreate":{"properties":{},"additionalProperties":false,"type":"object","title":"NewsConditionCreate","description":"News content condition for monitoring."},"NewsConditionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"}},"additionalProperties":false,"type":"object","required":["id"],"title":"NewsConditionResponse","description":"Response model for news condition."},"PageData":{"properties":{"id":{"type":"string","format":"uuid5","title":"Id"},"canonical_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Canonical Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Excerpt"},"image_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Image Url"},"domain":{"anyOf":[{"$ref":"#/components/schemas/DomainData"},{"type":"null"}]},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"culture":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Culture"},"image_is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Image Is Valid"},"can_iframe":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Iframe"},"is_adult":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Adult"},"is_paywalled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Paywalled"},"is_premium":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Premium","description":"True if the page is from a premium/licensed content provider (e.g. Dow Jones)"},"crawl_failed":{"type":"boolean","title":"Crawl Failed","description":"True if the page was saved from source metadata only because the fetch was blocked or failed.","default":false},"publisher_library":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Library"},"publish_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Publish Date","description":"Published/content date of the page"},"ttl":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl","default":720},"first_discovered_by_source_id":{"anyOf":[{"type":"string","format":"uuid5"},{"type":"null"}],"title":"First Discovered By Source Id","description":"UUID5 identifier of the source that first discovered this page"},"integration_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Integration Name","description":"Registry key of the integration that created this page (e.g. 'dowjones', 'tollbit'), or None if the page was not created by an integration. Only exposed to callers with the internal.statistics_read scope."},"found_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Found By","description":"How this page was first ingested. One of: 'api' (added via POST /v1/pages); 'integration:{integration_name}' (ingested by an integration loop); 'source:{source_type}' where source_type is the lowercased SourceType value (e.g. 'source:feed', 'source:sitemap', 'source:html'). The source's UUID is separately stored on first_discovered_by_source_id. Only exposed to callers with the internal.statistics_read scope."},"content_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Ref","description":"File-store ref (<domain>/<sha256>.<ext>) of the fetched body this page was parsed from. Persisted so callers that did not perform the fetch — e.g. the monitor condition-preview endpoint — can reload the HTML later instead of only the worker holding it in its task payload."}},"type":"object","required":["id","canonical_url"],"title":"PageData"},"PageGet":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"canonical_url":{"type":"string","title":"Canonical Url"},"title":{"type":"string","title":"Title"},"excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Excerpt"},"image":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Image"},"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"},"domain":{"$ref":"#/components/schemas/DomainGet"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"culture":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Culture"},"shareability":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shareability"},"is_adult":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Adult"},"is_snippable_without_proxy":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Snippable Without Proxy"},"is_snippable_with_proxy":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Snippable With Proxy"},"image_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Image Valid"},"ttl":{"type":"integer","title":"Ttl","default":720},"integration_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Integration Name"},"found_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Found By"}},"type":"object","required":["id","canonical_url","title","excerpt","image","date","domain","language","culture","shareability","is_adult","is_snippable_without_proxy","is_snippable_with_proxy","image_valid"],"title":"PageGet"},"PageParsingResult":{"properties":{"page_data":{"$ref":"#/components/schemas/PageData"},"urls":{"items":{"$ref":"#/components/schemas/URLData"},"type":"array","title":"Urls"},"full_text":{"type":"string","title":"Full Text"}},"type":"object","required":["page_data","urls","full_text"],"title":"PageParsingResult"},"PagePost":{"properties":{"url":{"type":"string","title":"Url"},"ttl":{"type":"integer","title":"Ttl","default":720},"domain_discovery_settings":{"anyOf":[{"$ref":"#/components/schemas/DomainDiscoverySettings"},{"type":"null"}]}},"type":"object","required":["url"],"title":"PagePost"},"PagePostResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"url":{"type":"string","title":"Url"},"ttl":{"type":"integer","title":"Ttl","default":720}},"type":"object","required":["id","url"],"title":"PagePostResponse"},"ParsedSourcePageResult":{"properties":{"url":{"type":"string","title":"Url","description":"The page URL"},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created","description":"When the page was discovered"},"updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated","description":"When the page was last updated"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Page metadata"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher","description":"Publisher name if available"}},"type":"object","required":["url"],"title":"ParsedSourcePageResult","description":"Response model for a discovered page from a parsed source."},"ParsedSourceSourceResult":{"properties":{"url":{"type":"string","title":"Url","description":"The source URL"},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created","description":"When the source was discovered"},"updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated","description":"When the source was last updated"},"source_type":{"type":"string","title":"Source Type","description":"Type of source (feed, sitemap, html, etc.)"}},"type":"object","required":["url","source_type"],"title":"ParsedSourceSourceResult","description":"Response model for a discovered source from a parsed source."},"ParsingConfigGetResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"}},"type":"object","required":["domain"],"title":"ParsingConfigGetResponse","description":"Response model for GET /v1/domains/{domain}/parsing-config"},"ParsingConfigPutRequest":{"properties":{"config":{"additionalProperties":true,"type":"object","title":"Config"}},"type":"object","required":["config"],"title":"ParsingConfigPutRequest","description":"Request model for PUT /v1/domains/{domain}/parsing-config"},"ParsingConfigPutResponse":{"properties":{"domain":{"type":"string","title":"Domain"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"},"message":{"type":"string","title":"Message"}},"type":"object","required":["domain","config","message"],"title":"ParsingConfigPutResponse","description":"Response model for PUT /v1/domains/{domain}/parsing-config"},"PathConditionCreate":{"properties":{"pattern":{"type":"string","title":"Pattern","description":"Path/URL pattern; must start with '/' or 'http(s):'. Matched via the approved path library + urlparse, not raw string parsing."}},"additionalProperties":false,"type":"object","required":["pattern"],"title":"PathConditionCreate","description":"Path pattern condition for monitoring. The pattern must start with '/'\n(path-only) or 'http(s):' (absolute; domain may be wildcarded). Validated at\ncreate time and matched via the approved path library (pathspec preferred) +\nurlparse — see spec §8 and the requirements appendix for semantics."},"PathConditionResponse":{"properties":{"pattern":{"type":"string","title":"Pattern","description":"Path/URL pattern; must start with '/' or 'http(s):'. Matched via the approved path library + urlparse, not raw string parsing."},"id":{"type":"string","format":"uuid","title":"Id"}},"additionalProperties":false,"type":"object","required":["pattern","id"],"title":"PathConditionResponse","description":"Response model for path condition."},"PathMonitor":{"properties":{"target":{"$ref":"#/components/schemas/SourceMonitorTarget"},"path":{"type":"string","title":"Path"}},"type":"object","required":["target","path"],"title":"PathMonitor"},"PublisherNameSource":{"type":"integer","enum":[1,2,3],"title":"PublisherNameSource"},"RedirectType":{"type":"string","enum":["302","301","CAN","FMT","MAP"],"title":"RedirectType"},"RefreshSourceResponse":{"properties":{"source_id":{"type":"string","title":"Source Id"},"message":{"type":"string","title":"Message"},"last_processed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Processed"},"last_scheduled":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Scheduled"}},"type":"object","required":["source_id","message","last_processed","last_scheduled"],"title":"RefreshSourceResponse","description":"Response model for source refresh requests."},"RequireFilters":{"properties":{"iframeable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Iframeable","default":false},"image_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Image Valid","default":false},"text_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Text Length"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields","default":[]},"unpaywalled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Unpaywalled","default":false},"premium":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Premium"},"viewable_with_premium":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Viewable With Premium","default":false}},"type":"object","title":"RequireFilters","description":"Predicates every result must satisfy — NARROWS the result set.\n\nOverrides `allow`; see `Filters` for precedence.\n\n`premium` is tri-state:\n  True  - return only premium content.\n  False - return only non-premium content. Not overridable: combined with a\n          premium-only publisher library this legitimately returns zero\n          results rather than being silently repaired.\n  None  - unspecified. Ignored ONLY when `only.publisher_libraries` is set,\n          in which case no premium term is applied at all and the named\n          libraries return premium and free content alike. With no library\n          restriction, unspecified still suppresses premium (the default) —\n          otherwise every ordinary search would leak premium content.\n\nThe remaining booleans default to False and are NOT implemented. When they\nare, they should move to `None` for the same tri-state reason. Until then,\ndo not assume this block is uniformly tri-state."},"RobotAgentPermission":{"properties":{"agent":{"type":"string","title":"Agent"},"allowed":{"items":{"type":"string"},"type":"array","title":"Allowed","default":[]},"disallowed":{"items":{"type":"string"},"type":"array","title":"Disallowed","default":[]}},"type":"object","required":["agent"],"title":"RobotAgentPermission","description":"Permissions for a specific user agent"},"SearchQuery":{"properties":{"similarity":{"anyOf":[{"$ref":"#/components/schemas/SimilarityQuery"},{"type":"null"}]},"lucene":{"anyOf":[{"type":"string","maxLength":256,"examples":["401k and (finance or investments or \"retirement plan\")"]},{"type":"null"}],"title":"Lucene"},"natural":{"anyOf":[{"type":"string","maxLength":256,"examples":["investing in 401k for retirement"]},{"type":"null"}],"title":"Natural"},"simple":{"anyOf":[{"type":"string","examples":["401k"]},{"type":"null"}],"title":"Simple"},"filters":{"anyOf":[{"$ref":"#/components/schemas/Filters"},{"type":"null"}]},"after":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"After"},"culture":{"anyOf":[{"type":"string","examples":["en-US","en","fr","fr-ca"]},{"type":"null"}],"title":"Culture"},"strict_culture":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Strict Culture","default":false},"must_match_exact":{"anyOf":[{"$ref":"#/components/schemas/MustMatchExact"},{"type":"null"}],"description":"Controls how strictly results must match the query terms","default":"auto"},"max_distance":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Distance","description":"Maximum cosine distance for kNN results (0 to 1, where 0 = identical). Applies to natural/simple searches with kNN."},"limit":{"anyOf":[{"type":"integer","maximum":200.0,"minimum":1.0},{"type":"null"}],"title":"Limit","description":"Maximum number of results to return (1-200)","default":50}},"type":"object","title":"SearchQuery","description":"Comprehensive search query model supporting multiple query types and filters."},"SearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/SearchResult"},"type":"array","title":"Results","description":"List of matching pages"},"count":{"type":"integer","title":"Count","description":"Number of results returned"}},"type":"object","required":["count"],"title":"SearchResponse","description":"Response model for search endpoint."},"SearchResult":{"properties":{"id":{"type":"string","title":"Id","description":"Page ID"},"canonical_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Canonical Url","description":"Canonical URL of the page"},"title":{"type":"string","title":"Title","description":"Page title","default":""},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Page summary/excerpt"},"date_published":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Published","description":"Publication date"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher","description":"Publisher name"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain","description":"Domain name"},"relevance_score":{"type":"number","title":"Relevance Score","description":"Relevance in [0, 1], relative to this response. The best result scores 1.0. Not comparable across queries.","default":0.0}},"type":"object","required":["id","canonical_url"],"title":"SearchResult","description":"A single result from the advanced search endpoint (POST /v1/search).\n\nDistinct from BooleanSearchResult, which serves the boolean endpoint. Both\nwere once named SearchResult, which forced FastAPI to publish them as\ncontent__api__v1__models__indexes__SearchResult__1 and __2.\n\n`fulltext` is deliberately absent: the lucene-only path returns OpenSearch\nhits verbatim, so including it would emit full article text — including\nlicensed premium content — from this endpoint.\n\n`canonical_url` is REQUIRED and must never be null. PageData.canonical_url\nis itself non-optional and the indexer always writes it, so every indexed\ndocument has one. It was previously declared `HttpUrl = Field(None)` — a\nnon-optional annotation with a None default, which Pydantic does not\nvalidate, so it silently yielded None when the key was absent. Declaring it\nrequired means a document without one fails loudly instead of returning a\nresult the caller cannot link to."},"SelectorConditionCreate":{"properties":{"selector":{"type":"string","title":"Selector","description":"CSS selector for link/<a> elements whose href is followed to discover pages"}},"additionalProperties":false,"type":"object","required":["selector"],"title":"SelectorConditionCreate","description":"CSS selector condition for HTML (page) sources — its matched elements'\nhref attributes are followed to discover pages."},"SelectorConditionResponse":{"properties":{"selector":{"type":"string","title":"Selector","description":"CSS selector for link/<a> elements whose href is followed to discover pages"},"id":{"type":"string","format":"uuid","title":"Id"}},"additionalProperties":false,"type":"object","required":["selector","id"],"title":"SelectorConditionResponse","description":"Response model for selector condition."},"SelectorMonitor":{"properties":{"target":{"$ref":"#/components/schemas/SourceMonitorTarget"},"path":{"type":"string","title":"Path"}},"type":"object","required":["target","path"],"title":"SelectorMonitor"},"SimilarPageResult":{"properties":{"id":{"type":"string","title":"Id","description":"Page ID"},"title":{"type":"string","title":"Title","description":"Page title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"Page summary/excerpt"},"fulltext":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fulltext","description":"Full text content"},"date_published":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Published","description":"Publication date"},"publisher":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher","description":"Publisher name"},"type":{"type":"string","title":"Type","description":"Content type","default":"Unknown"},"relevance_score":{"type":"number","title":"Relevance Score","description":"Similarity in [0, 1], relative to this response. The most similar result scores 1.0. Not comparable across queries."},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"URL of the page's primary image"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain","description":"Domain name"}},"type":"object","required":["id","title","relevance_score"],"title":"SimilarPageResult","description":"Model for a single similar page result."},"SimilarityQuery":{"properties":{"points":{"items":{"$ref":"#/components/schemas/SimilarityQueryPoint"},"type":"array","title":"Points"},"max_distance":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Distance"}},"type":"object","required":["points"],"title":"SimilarityQuery","description":"Similarity query configuration."},"SimilarityQueryPoint":{"properties":{"url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Url"},"text":{"anyOf":[{"type":"string","maxLength":256,"examples":["investing in 401k for retirement"]},{"type":"null"}],"title":"Text"},"weight":{"type":"number","exclusiveMinimum":0.0,"title":"Weight","default":1.0}},"type":"object","title":"SimilarityQueryPoint","description":"A single point in a similarity query."},"SimilaritySearchRequest":{"properties":{"page_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Page Id","description":"PageID (UUID4) of the article to find similar content for"},"canonical_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Url","description":"Canonical URL of the article to find similar content for"},"k":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"K","description":"Number of similar articles to return (1-50)","default":5}},"type":"object","title":"SimilaritySearchRequest","description":"Request model for similarity search endpoint (legacy)."},"SimilaritySearchResponse":{"properties":{"source_page_id":{"type":"string","title":"Source Page Id","description":"ID of the source page used for similarity search"},"results":{"items":{"$ref":"#/components/schemas/SimilarPageResult"},"type":"array","title":"Results","description":"List of similar pages"},"count":{"type":"integer","title":"Count","description":"Number of results returned"}},"type":"object","required":["source_page_id","count"],"title":"SimilaritySearchResponse","description":"Response model for similarity search endpoint."},"SitemapResult":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"has_news":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has News"},"is_index":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Index"},"domain_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Domain Id"},"active":{"type":"boolean","title":"Active","default":false},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"low_latency":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Low Latency"},"last_processed":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Processed"},"last_checked":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked"},"last_publish_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Publish Date"},"desired_next_poll":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Desired Next Poll"},"failure_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Failure Count"},"failure_status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Status Code"},"min_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Frequency"},"ave_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ave Frequency"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"last_fetch_status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Fetch Status Code"}},"type":"object","required":["id","url","has_news","last_checked","last_publish_date"],"title":"SitemapResult"},"SourceMonitorCreate":{"properties":{"account_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Account Id","description":"Owning account (opaque UpContent account id). Optional: creation requires only standard auth, and internal callers may create account-less monitors (CONT-16 Access Control & Tenancy). A non-internal caller's account is its own (from auth context). CE does not validate this value."},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id","description":"Optional opaque caller label. Filterable in list, returned by get, echoed in event payloads; CE does not interpret it (AC 12.2)."},"min_frequency":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Frequency","description":"Minimum frequency in hours for checking this monitor"},"max_content_age_days":{"anyOf":[{"type":"integer"},{"type":"string","enum":["forever","default"]},{"type":"null"}],"title":"Max Content Age Days","description":"Caps forced ingestion to pages whose publish/discovery date is within this many days. Accepts a number of days, 999999 or 'forever' (no cap), or null / 'default' (no opinion — defer to other monitors / default stale behavior). Strings are normalized to numeric/null before storage."},"keep_checking":{"type":"boolean","title":"Keep Checking","description":"Whether to keep checking even when encountering errors","default":true},"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"source_type":{"$ref":"#/components/schemas/SourceType","description":"Source type of the monitored source (validated against the resolved source's actual type)"},"target":{"anyOf":[{"$ref":"#/components/schemas/MonitorTargetCreate"},{"type":"null"}]},"conditions":{"items":{"anyOf":[{"$ref":"#/components/schemas/PathConditionCreate"},{"$ref":"#/components/schemas/SelectorConditionCreate"},{"$ref":"#/components/schemas/NewsConditionCreate"}]},"type":"array","minItems":1,"title":"Conditions","description":"List of conditions that must all be met for this monitor (>=1; 'all content' is an explicit /* or /** pattern, not an empty list)"}},"type":"object","required":["url","source_type","conditions"],"title":"SourceMonitorCreate","description":"Model for creating a source-specific monitor."},"SourceMonitorTarget":{"properties":{"webhook":{"anyOf":[{"$ref":"#/components/schemas/WebhookTarget"},{"type":"null"}]},"sns":{"anyOf":[{"$ref":"#/components/schemas/AwsSnsTarget"},{"type":"null"}]}},"type":"object","required":["webhook","sns"],"title":"SourceMonitorTarget"},"SourceType":{"type":"string","enum":["FEED","SITEMAP","ROBOTS_TXT","HTML"],"title":"SourceType"},"URLData":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"final_url":{"type":"string","title":"Final Url"},"canonical":{"type":"boolean","title":"Canonical","default":false},"redirect_type":{"anyOf":[{"$ref":"#/components/schemas/RedirectType"},{"type":"null"}]},"next_":{"type":"string","title":"Next"}},"type":"object","required":["url"],"title":"URLData"},"UpContentTargetModel":{"properties":{},"type":"object","title":"UpContentTargetModel","description":"UpContent notification target — publishes to an SNS topic resolved from\nenvironment config (see CONT-296). Has no fields; selecting it opts the monitor\ninto the env-configured UpContent topic."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebhookTarget":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"WebhookTarget"}}}}