{"openapi":"3.1.0","info":{"title":"baba News API","version":"1.0.0","description":"The Israeli press as structured JSON: stories by side, newsroom profiles, 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."}],"paths":{"/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}],"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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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,"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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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}],"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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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"}}],"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":[{"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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","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","rate_limited","quota_exceeded","not_found","bad_request","unavailable"]},"message":{"type":"string"}}}}}}}}