Developer API
Programmatic access to our stories, AI bias analysis, framing spectra, cross-border coverage and the curated source-ownership directory.
Authentication
Create a key on the API keys page (requires a Researcher / Professional subscription or an API plan). Send it with every request:
curl -H "Authorization: Bearer <key>" \ "https://objective-news.org/api/v1/stories?scope=WORLD&take=20" # or: -H "x-api-key: <key>"
Endpoints
GET /api/v1/stories ?scope=WORLD|NATIONAL &country=SI &order=recent|sources|views &take (<=100) &offset
GET /api/v1/stories/{slug} ?locale=en|sl|de|hr|it|es|fr – detail: synthesis, outlets, claims
GET /api/v1/stories/{slug}/spectrum ?locale=… – progressive/center/conservative framing of the event
GET /api/v1/stories/{slug}/crossborder ?locale=… – the same event covered in other countries
GET /api/v1/sources ?country=SI – outlet directory: ownership type + editorial lean
GET /api/v1/publications ?topic=MEDICINE &journal=nature &order=latest|top &minScore=70 &oa=1 &take (<=100) &offset
– newsworthy scientific studies with plain-language summariesExample
GET /api/v1/stories returns the story list; each entry links to the detail endpoints above. Fields are stable (v1 is additive-only, see below).
curl -H "Authorization: Bearer <key>" "https://objective-news.org/api/v1/stories?scope=WORLD&order=recent&take=2"
{
"stories": [
{
"slug": "eu-ai-act-enforcement-begins",
"title": "EU begins enforcing the AI Act's rules for general-purpose models",
"summary": "The first obligations for foundation-model providers took effect ...",
"topic": "TECH",
"scope": "WORLD",
"country": null,
"sourceCount": 14,
"leanScore": -0.13,
"overlooked": false,
"createdAt": "2026-08-01T07:12:41.000Z",
"url": "https://objective-news.org/en/stories/eu-ai-act-enforcement-begins"
},
...
]
}leanScore is the average framing lean of the story's coverage on a -1 (Progressive) to +1 (Conservative) scale, 0 = Center;/stories/{slug} adds the neutral synthesis, the per-outlet list (ownership type + lean) and the claims comparison.
Plans, limits & headers
| Plan | Requests / month | Requests / minute (per key) | Keys | Use |
|---|---|---|---|---|
| Researcher / Professional – €10/mo or €100/yr | 100,000 | 120 | 10 | academic / professional, non-commercial |
| API Starter – €19/mo or €190/yr | 100,000 | 120 | 10 | commercial OK |
| API Pro – €79/mo or €790/yr | 1,000,000 | 300 | 20 | commercial OK |
The monthly quota is per account (across all keys, calendar month, UTC); the per-minute limit is per key. Subscribe or upgrade on the pricing page. Every response carries the current limits:
X-RateLimit-Limit: requests/minute for your plan X-RateLimit-Remaining: remaining this minute X-Quota-Limit: requests/month for your plan X-Quota-Remaining: remaining this month Retry-After: seconds to wait (on 429 rate_limited only)
Errors
Errors are JSON: { "error": "...", "code": "..." } Match on code; the message text may change.
| Status | code | Meaning |
|---|---|---|
| 401 | unauthorized | Missing or invalid API key. |
| 403 | forbidden | Key owner has no Researcher / Professional subscription or API plan. |
| 404 | not_found | Unknown story slug / resource. |
| 429 | rate_limited | Per-minute rate limit exceeded. Retry after Retry-After seconds. |
| 429 | quota_exceeded | Monthly quota exhausted. Upgrade or wait for the month to roll over (UTC). |
Versioning & terms
v1 is additive-only: new fields and new endpoints may appear at any time; clients must ignore unknown fields. Removals, renames or semantic changes only happen in a future /api/v2, with at least 6 months of v1 overlap, signalled via Deprecation and Sunset headers.
Commercial use (products, services or internal tooling for a business) requires an API Starter or Pro plan; the Researcher / Professional tier is for personal, academic and other non-commercial projects. Attribution with a link to the story page is appreciated.
Not offered in v1: per-key scopes/permissions, OAuth, push webhooks, or SLAs. Need custom volume or terms? support@objective-news.org.