{"openapi":"3.1.0","info":{"title":"baba News API","version":"1.3.0","description":"The Israeli press as structured JSON: stories by side, running multi-day threads, what is accelerating, coverage gaps as a first-class resource, newsroom profiles and measured behaviour, the desk register, an incremental change feed, the daily brief, search, and people. Authenticate with `Authorization: Bearer nk_live_…`. Keys carry scopes: stories, sources, brief, search, people."},"servers":[{"url":"https://news.itsbaba.com","description":"Production"}],"security":[{"bearer":[]}],"tags":[{"name":"stories","description":"Clustered coverage."},{"name":"sources","description":"Newsrooms in the wire."},{"name":"brief","description":"Today in Brief."},{"name":"search","description":"Headline and entity search."},{"name":"people","description":"People named in the last 24 hours."},{"name":"threads","description":"Running multi-day stories."},{"name":"trending","description":"What is accelerating right now."},{"name":"blindspots","description":"Coverage gaps, by camp."},{"name":"topics","description":"The desk register with live volume."},{"name":"changes","description":"Incremental change feed for sync."}],"paths":{"/api/v1/export":{"get":{"operationId":"export_get","summary":"Enterprise historical article and cluster export","tags":["export"],"security":[{"bearer":["export"]}],"description":"Inclusive UTC date range, at most 366 days. Up to 500 article records per page, grouped by storyId. Snapshot fixes the insertion cutoff; corrections and current cluster state may change during pagination. No full publisher article bodies.","parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"format","in":"query","schema":{"type":"string","enum":["csv","jsonl"],"default":"jsonl"}},{"name":"lang","in":"query","schema":{"type":"string","enum":["en","he"],"default":"en"},"description":"Export only stored records in this language; no fallback."},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"X-Next-Cursor from the previous page, with unchanged from/to/lang filters."}],"responses":{"200":{"description":"Export page. Empty X-Next-Cursor marks the final page.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"X-Next-Cursor":{"schema":{"type":"string"}},"X-Export-Snapshot":{"schema":{"type":"string","format":"date-time"}}},"content":{"text/csv":{"schema":{"type":"string"}},"application/x-ndjson":{"schema":{"type":"string"}}}},"400":{"description":"Invalid dates, range, format, language, or cursor.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/stories":{"get":{"operationId":"stories_list","summary":"List stories","tags":["stories"],"security":[{"bearer":["stories"]}],"parameters":[{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}},{"name":"state","in":"query","description":"Cluster state. Unknown values are ignored.","schema":{"type":"string"}},{"name":"topic","in":"query","description":"Desk id. Repeatable.","schema":{"type":"string"}},{"name":"source","in":"query","description":"Newsroom key. Repeatable.","schema":{"type":"string"}},{"name":"since","in":"query","description":"Jerusalem calendar dates back, 0-30, today inclusive. Non-integer or negative values are 400; values above 30 are clamped to 30.","schema":{"type":"integer","minimum":0,"maximum":30}},{"name":"limit","in":"query","description":"Page size. Non-integer or negative values are 400; values above 100 are clamped to 100 and echoed as page.limit.","schema":{"type":"integer","minimum":1,"maximum":100,"default":40}},{"name":"cursor","in":"query","description":"Opaque keyset cursor from a previous page nextCursor. Malformed values are 400.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":44,"url":"https://news.itsbaba.com/story/44/cabinet-approves","headline":"Cabinet approves the deal","summary":"Ministers voted after midnight.","topic":"politics","lang":"en","publishedAt":"2026-09-01T08:00:00.000Z","latestAt":"2026-09-01T08:00:00.000Z","outlets":3,"sides":{"centre":2,"left":1},"missingSides":["haredi"],"state":"consensus","verdict":null,"lean":{"left":1,"center":2,"right":0,"unrated":0},"sources":["ynet","kan","haaretz_he"],"thread":null,"updatedAt":null}],"nextCursor":null,"lang":"en","generatedAt":"2026-09-04T12:00:00.000Z","limit":40}}}},"304":{"description":"Not modified. Same ETag and Cache-Control as 200, empty body.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Invalid cursor, since, or limit; q belongs on /search.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/stories/{ckey}":{"get":{"operationId":"stories_get","summary":"Story detail: members, timeline, framing","tags":["stories"],"security":[{"bearer":["stories"]}],"parameters":[{"name":"ckey","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"id":44,"url":"https://news.itsbaba.com/story/44/cabinet-approves","headline":"Cabinet approves the deal","summary":"Ministers voted after midnight.","topic":"politics","lang":"en","publishedAt":"2026-09-01T08:00:00.000Z","latestAt":"2026-09-01T08:00:00.000Z","outlets":0,"sides":{"centre":2,"left":1},"missingSides":["haredi"],"state":"consensus","verdict":null,"lean":{"left":1,"center":2,"right":0,"unrated":0},"sources":["ynet","kan","haaretz_he"],"thread":null,"updatedAt":null,"members":[],"timeline":null,"framingNote":null}}}},"304":{"description":"Not modified.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Invalid story id.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"404":{"description":"Story not found.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/sources":{"get":{"operationId":"sources_list","summary":"List newsrooms","tags":["sources"],"security":[{"bearer":["sources"]}],"parameters":[{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"key":"ynet","name":"Ynet","language":"he","side":"centre","lean":"center","place":"Rishon LeZion","profile":null}],"nextCursor":null,"lang":"en","generatedAt":"2026-09-04T12:00:00.000Z"}}}},"304":{"description":"Not modified. Same ETag and Cache-Control as 200, empty body.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/sources/{key}":{"get":{"operationId":"sources_get","summary":"One newsroom, with profile when computed","tags":["sources"],"security":[{"bearer":["sources"]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"}}}},"304":{"description":"Not modified.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"404":{"description":"Source not found.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/brief":{"get":{"operationId":"brief_get","summary":"Today in Brief","tags":["brief"],"security":[{"bearer":["brief"]}],"parameters":[{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"lang":"en","generatedAt":"2026-09-04T04:30:00.000Z","intro":"Overnight.","items":[{"storyUrl":"https://news.itsbaba.com/1/a-story","headline":"A story","text":"It happened."}]}}}},"304":{"description":"Not modified.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"404":{"description":"No brief is available.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/search":{"get":{"operationId":"search_list","summary":"Search stories","tags":["search"],"security":[{"bearer":["search"]}],"parameters":[{"name":"q","in":"query","required":true,"description":"2-120 characters. Matches title, summary, and entities. Search lives on /search only.","schema":{"type":"string","minLength":2,"maxLength":120}},{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}},{"name":"state","in":"query","description":"Cluster state. Unknown values are ignored.","schema":{"type":"string"}},{"name":"topic","in":"query","description":"Desk id. Repeatable.","schema":{"type":"string"}},{"name":"source","in":"query","description":"Newsroom key. Repeatable.","schema":{"type":"string"}},{"name":"since","in":"query","description":"Jerusalem calendar dates back, 0-30, today inclusive. Non-integer or negative values are 400; values above 30 are clamped to 30.","schema":{"type":"integer","minimum":0,"maximum":30}},{"name":"limit","in":"query","description":"Page size. Non-integer or negative values are 400; values above 100 are clamped to 100 and echoed as page.limit.","schema":{"type":"integer","minimum":1,"maximum":100,"default":40}},{"name":"cursor","in":"query","description":"Opaque keyset cursor from a previous page nextCursor. Malformed values are 400.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":44,"url":"https://news.itsbaba.com/story/44/cabinet-approves","headline":"Cabinet approves the deal","summary":"Ministers voted after midnight.","topic":"politics","lang":"en","publishedAt":"2026-09-01T08:00:00.000Z","latestAt":"2026-09-01T08:00:00.000Z","outlets":3,"sides":{"centre":2,"left":1},"missingSides":["haredi"],"state":"consensus","verdict":null,"lean":{"left":1,"center":2,"right":0,"unrated":0},"sources":["ynet","kan","haaretz_he"],"thread":null,"updatedAt":null}],"nextCursor":null,"lang":"en","generatedAt":"2026-09-04T12:00:00.000Z","limit":40}}}},"304":{"description":"Not modified. Same ETag and Cache-Control as 200, empty body.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Invalid cursor, since, or limit, or q outside 2-120 characters.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/people":{"get":{"operationId":"people_list","summary":"People in the last 24 hours","tags":["people"],"security":[{"bearer":["people"]}],"parameters":[{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":41,"name":"A person","canonicalName":null,"role":null,"avatarUrl":null,"mentions":4}],"nextCursor":null,"lang":"en","generatedAt":"2026-09-04T12:00:00.000Z"}}}},"304":{"description":"Not modified. Same ETag and Cache-Control as 200, empty body.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/threads":{"get":{"operationId":"threads_list","summary":"List running stories","tags":["threads"],"security":[{"bearer":["stories"]}],"parameters":[{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}},{"name":"minNodes","in":"query","description":"Smallest number of instalments a thread must have, 1-50. One cluster is not yet a running story, so the default is 2.","schema":{"type":"integer","minimum":1,"maximum":50,"default":2}},{"name":"limit","in":"query","description":"Page size. Non-integer or negative values are 400; values above 100 are clamped to 100 and echoed as page.limit.","schema":{"type":"integer","minimum":1,"maximum":100,"default":40}},{"name":"cursor","in":"query","description":"Opaque keyset cursor from a previous page nextCursor. Malformed values are 400.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":7,"title":"The hostage deal","nodes":5,"days":3,"firstAt":"2026-09-01T06:00:00.000Z","newestAt":"2026-09-04T09:00:00.000Z","newestStoryId":44,"latest":{"id":44,"url":"https://news.itsbaba.com/story/44/cabinet-approves","headline":"Cabinet approves the deal","summary":"Ministers voted after midnight.","topic":"politics","lang":"en","publishedAt":"2026-09-01T08:00:00.000Z","latestAt":"2026-09-01T08:00:00.000Z","outlets":3,"sides":{"centre":2,"left":1},"missingSides":["haredi"],"state":"consensus","verdict":null,"lean":{"left":1,"center":2,"right":0,"unrated":0},"sources":["ynet","kan","haaretz_he"],"thread":null,"updatedAt":null}}],"nextCursor":null,"lang":"en","generatedAt":"2026-09-04T12:00:00.000Z","limit":40}}}},"304":{"description":"Not modified. Same ETag and Cache-Control as 200, empty body.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Invalid cursor, minNodes, or limit.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/threads/{id}":{"get":{"operationId":"threads_get","summary":"One running story and its whole arc","description":"Every instalment we still hold, newest first, in the same shape as a story on /v1/stories. The arc is bounded by limit and returned whole rather than paged.","tags":["threads"],"security":[{"bearer":["stories"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}},{"name":"limit","in":"query","description":"Instalments to return, 1-100. Non-integer or negative values are 400.","schema":{"type":"integer","minimum":1,"maximum":100,"default":40}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"id":7,"title":"The hostage deal","nodes":5,"days":3,"firstAt":"2026-09-01T06:00:00.000Z","newestAt":"2026-09-04T09:00:00.000Z","newestStoryId":44,"lang":"en","arc":[{"id":44,"url":"https://news.itsbaba.com/story/44/cabinet-approves","headline":"Cabinet approves the deal","summary":"Ministers voted after midnight.","topic":"politics","lang":"en","publishedAt":"2026-09-01T08:00:00.000Z","latestAt":"2026-09-01T08:00:00.000Z","outlets":3,"sides":{"centre":2,"left":1},"missingSides":["haredi"],"state":"consensus","verdict":null,"lean":{"left":1,"center":2,"right":0,"unrated":0},"sources":["ynet","kan","haaretz_he"],"thread":null,"updatedAt":null}]}}}},"304":{"description":"Not modified.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Invalid thread id or limit.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"404":{"description":"Thread not found.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/trending":{"get":{"operationId":"trending_list","summary":"Newsroom momentum ranked by an explicit computed metric (newsroom-momentum-v1)","tags":["trending"],"security":[{"bearer":["stories"]}],"parameters":[{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}},{"name":"metric","in":"query","description":"Which computed signal orders the page. Unknown values are 400.","schema":{"type":"string","enum":["acceleration","velocity","heat","importance"],"default":"acceleration"}},{"name":"window","in":"query","description":"How many minutes back to consider a state row current, 15-10080. Values below 15 are raised to 15; above 10080 are clamped.","schema":{"type":"integer","minimum":15,"maximum":10080}},{"name":"limit","in":"query","description":"Page size. Non-integer or negative values are 400; values above 100 are clamped to 100 and echoed as page.limit.","schema":{"type":"integer","minimum":1,"maximum":100,"default":40}},{"name":"cursor","in":"query","description":"Opaque keyset cursor from a previous page nextCursor. Ranked by the same metric, so a cursor is only valid for the metric that produced it. Malformed values are 400.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"storyId":44,"state":"breaking","label":null,"importance":8.4,"heat":5.1,"velocity":6,"acceleration":4,"significance":4,"sides":{"centre":2,"left":1},"missingSides":["haredi"],"threadId":null,"computedAt":"2026-09-04T11:55:00.000Z","rank":4,"story":{"id":44,"url":"https://news.itsbaba.com/story/44/cabinet-approves","headline":"Cabinet approves the deal","summary":"Ministers voted after midnight.","topic":"politics","lang":"en","publishedAt":"2026-09-01T08:00:00.000Z","latestAt":"2026-09-01T08:00:00.000Z","outlets":3,"sides":{"centre":2,"left":1},"missingSides":["haredi"],"state":"consensus","verdict":null,"lean":{"left":1,"center":2,"right":0,"unrated":0},"sources":["ynet","kan","haaretz_he"],"thread":null,"updatedAt":null}}],"nextCursor":null,"metric":"acceleration","rankingVersion":"newsroom-momentum-v1","windowMinutes":180,"lang":"en","generatedAt":"2026-09-04T12:00:00.000Z","limit":40}}}},"304":{"description":"Not modified. Same ETag and Cache-Control as 200, empty body.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Invalid cursor, metric, window, or limit.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/blindspots":{"get":{"operationId":"blindspots_list","summary":"Coverage gaps, by camp","tags":["blindspots"],"security":[{"bearer":["stories"]}],"parameters":[{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}},{"name":"state","in":"query","description":"Repeatable. Unknown values are 400, unlike on /v1/stories, because this resource is only about these two.","schema":{"type":"string","enum":["blindspot","undercovered"]}},{"name":"side","in":"query","description":"Return only stories the named group did not run. Unknown values are 400. Since 2026-10-01 the press is read in five groups (left, centre, right, haredi, arab), with the outlets outside them as other; the old values are still accepted as the group they became: religious as right, russian and business as other. Other is never missing, so other, russian and business return no stories.","schema":{"type":"string","enum":["left","centre","right","haredi","arab","other","official"]}},{"name":"window","in":"query","description":"How many minutes back to consider a state row current, 15-10080. Values below 15 are raised to 15; above 10080 are clamped.","schema":{"type":"integer","minimum":15,"maximum":10080}},{"name":"limit","in":"query","description":"Page size. Non-integer or negative values are 400; values above 100 are clamped to 100 and echoed as page.limit.","schema":{"type":"integer","minimum":1,"maximum":100,"default":40}},{"name":"cursor","in":"query","description":"Opaque keyset cursor from a previous page nextCursor. Malformed values are 400.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"storyId":44,"state":"blindspot","label":"Not in the Haredi press","importance":8.4,"heat":5.1,"velocity":6,"acceleration":4,"significance":4,"sides":{"centre":2,"left":1},"missingSides":["haredi"],"threadId":null,"computedAt":"2026-09-04T11:55:00.000Z","gaps":[{"side":"haredi","label":"Haredi press"}],"story":{"id":44,"url":"https://news.itsbaba.com/story/44/cabinet-approves","headline":"Cabinet approves the deal","summary":"Ministers voted after midnight.","topic":"politics","lang":"en","publishedAt":"2026-09-01T08:00:00.000Z","latestAt":"2026-09-01T08:00:00.000Z","outlets":3,"sides":{"centre":2,"left":1},"missingSides":["haredi"],"state":"consensus","verdict":null,"lean":{"left":1,"center":2,"right":0,"unrated":0},"sources":["ynet","kan","haaretz_he"],"thread":null,"updatedAt":null}}],"nextCursor":null,"states":["blindspot","undercovered"],"side":null,"windowMinutes":1440,"lang":"en","generatedAt":"2026-09-04T12:00:00.000Z","limit":40}}}},"304":{"description":"Not modified. Same ETag and Cache-Control as 200, empty body.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Invalid cursor, state, side, window, or limit.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/stories/{ckey}/members":{"get":{"operationId":"stories_members","summary":"Every article in a cluster, paged","description":"The same member records /v1/stories/{ckey} returns, but paged and filterable by side or lean. side and lean come from the source registry rather than the row, so a filtered page can be shorter than its limit while still issuing a cursor.","tags":["stories"],"security":[{"bearer":["stories"]}],"parameters":[{"name":"ckey","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}},{"name":"side","in":"query","description":"Only members from this group. Unknown values are 400. The old values religious, russian and business are accepted as right, other and other.","schema":{"type":"string","enum":["left","centre","right","haredi","arab","other","official"]}},{"name":"lean","in":"query","description":"Only members with this political lean. Unknown values are 400.","schema":{"type":"string","enum":["left","center","right","unrated"]}},{"name":"limit","in":"query","description":"Page size. Non-integer or negative values are 400; values above 100 are clamped to 100 and echoed as page.limit.","schema":{"type":"integer","minimum":1,"maximum":100,"default":40}},{"name":"cursor","in":"query","description":"Opaque keyset cursor from a previous page nextCursor. Malformed values are 400.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"storyId":44,"data":[{"articleId":9,"source":"ynet","headline":"Cabinet approves the deal","original":"הקבינט אישר","publishedAt":"2026-09-01T08:00:00.000Z","url":"https://www.ynet.co.il/a","language":"he","side":"centre","lean":"center","storyType":"report","framing":{"subject":"Cabinet","verb":"approves","actor":null},"updatedAt":null}],"nextCursor":null,"lang":"en","generatedAt":"2026-09-04T12:00:00.000Z","limit":40}}}},"304":{"description":"Not modified.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Invalid story id, cursor, side, lean, or limit.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"404":{"description":"Story not found.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/changes":{"get":{"operationId":"changes_list","summary":"Incremental change feed","tags":["changes"],"security":[{"bearer":["stories"]}],"parameters":[{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}},{"name":"since","in":"query","required":true,"description":"ISO 8601 instant. Runs forward in time from here. Values older than seven days are raised to seven days ago, which is as far back as cluster state is kept warm.","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","description":"Page size, 1-500. Non-integer or negative values are 400; values above 500 are clamped.","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"cursor","in":"query","description":"Opaque keyset cursor from a previous page nextCursor. Malformed values are 400.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"storyId":44,"state":"consensus","label":null,"missingSides":[],"threadId":7,"changedAt":"2026-09-04T11:55:00.000Z"}],"nextCursor":null,"checkpoint":"2026-09-04T11:55:00.000Z","since":"2026-09-04T00:00:00.000Z","lang":"en","generatedAt":"2026-09-04T12:00:00.000Z","limit":100}}}},"304":{"description":"Not modified. Same ETag and Cache-Control as 200, empty body.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Missing or invalid since, or invalid cursor or limit.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/topics":{"get":{"operationId":"topics_list","summary":"The desk register with live volume","tags":["topics"],"security":[{"bearer":["sources"]}],"parameters":[{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}},{"name":"days","in":"query","description":"Days back, 1-7. Non-integer or negative values are 400; values above 7 are clamped.","schema":{"type":"integer","minimum":1,"maximum":7,"default":1}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"data":[{"id":"politics","label":"Politics","hue":25,"articles":987}],"nextCursor":null,"days":1,"generatedAt":"2026-09-04T12:00:00.000Z"}}}},"304":{"description":"Not modified. Same ETag and Cache-Control as 200, empty body.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Invalid days.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/sources/{key}/activity":{"get":{"operationId":"sources_activity","summary":"Measured newsroom behaviour","description":"What a newsroom did rather than what its profile says it is: crawl outcomes over the window, and the byline, originality, opinion, press-release and filing-lag rates the profile cron computed over its own 30-day window. successRate is over finished runs only, so a crawl still in flight never reads as a failure.","tags":["sources"],"security":[{"bearer":["sources"]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"days","in":"query","description":"Days back, 1-30. Non-integer or negative values are 400; values above 30 are clamped.","schema":{"type":"integer","minimum":1,"maximum":30,"default":7}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"key":"ynet","windowDays":7,"crawl":{"windowDays":7,"runs":249,"okRuns":246,"errorRuns":2,"abortedRuns":0,"runningRuns":1,"discovered":5120,"scraped":980,"newArticles":412,"errors":14,"lastRunAt":"2026-09-04T11:50:00.000Z","lastFinishedAt":"2026-09-04T11:51:00.000Z","successRate":0.9919},"behaviour":{"windowDays":30,"stories":400,"bylineRate":0.8,"originalRate":0.6,"opinionShare":0.1,"pressReleaseShare":0.05,"medianLagMinutes":20,"computedAt":"2026-09-04T04:00:00.000Z"},"generatedAt":"2026-09-04T12:00:00.000Z"}}}},"304":{"description":"Not modified.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Invalid days.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"404":{"description":"Source not found.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/people/{id}":{"get":{"operationId":"people_get","summary":"One person, with every spelling folded into them","description":"Identity and aliases. recentCoverage is always null: resolving a person to their stories has no index behind it today, and the field is in the contract so filling it later is additive.","tags":["people"],"security":[{"bearer":["people"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"lang","in":"query","description":"Output language. Hebrew falls back to English per field when a row is missing.","schema":{"type":"string","enum":["en","he"],"default":"en"}}],"responses":{"200":{"description":"Success","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}},"content":{"application/json":{"schema":{"type":"object"},"example":{"id":2,"wikidataId":"Q57553","name":"Benjamin Netanyahu","nameEn":"Benjamin Netanyahu","nameHe":"בנימין נתניהו","role":"Prime Minister of Israel","mentions":1641,"avatarUrl":null,"aliases":[{"alias":"netanyahu","display":"Netanyahu","status":"resolved"}],"updatedAt":"2026-09-04T04:00:00.000Z","recentCoverage":null}}}},"304":{"description":"Not modified.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."},"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"private, max-age=60 on keyed GETs."}}},"400":{"description":"Invalid person id.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"401":{"description":"Missing or invalid API key.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"403":{"description":"This key cannot access this endpoint.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"404":{"description":"Person not found.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"429":{"description":"Rate limit or monthly quota exceeded.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed this minute. Omitted when no positive limit is known."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left this minute. Omitted when no positive limit is known."},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}},"503":{"description":"The News API is temporarily unavailable.","headers":{"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}}}}}}}},"/api/v1/openapi.json":{"get":{"operationId":"openapi_get","summary":"This OpenAPI document","tags":["stories"],"security":[],"responses":{"200":{"description":"OpenAPI 3.1 document.","headers":{"ETag":{"schema":{"type":"string"},"description":"Body hash. Send as If-None-Match on later GETs."},"Cache-Control":{"schema":{"type":"string"},"description":"public, max-age=3600"},"X-Request-Id":{"schema":{"type":"string"},"description":"Opaque id for this request."}},"content":{"application/json":{"schema":{"type":"object"}}}}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","bearerFormat":"API key","description":"News API key. Live keys are `nk_live_` plus 32 base62 characters; test keys use `nk_test_`. Scopes: stories, sources, brief, search, people."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","suspended","rate_limited","quota_exceeded","not_found","bad_request","internal","unavailable"]},"message":{"type":"string"}}}}},"UpdatedAt":{"type":"string","format":"date-time","nullable":true,"description":"When the article body last changed. Null if missing or not more than 60 seconds after publish."},"Story":{"type":"object","properties":{"updatedAt":{"$ref":"#/components/schemas/UpdatedAt"}}},"Member":{"type":"object","properties":{"updatedAt":{"$ref":"#/components/schemas/UpdatedAt"}}}}}}