API reference

Everything Blog API

Base URL https://api.everythingblog.in · version v1 · openapi.yaml · openapi.json

The endpoint table below is generated from that document when this page loads, so it cannot describe an endpoint the API does not serve.

Authentication

Send your key in X-API-Key or Authorization: Bearer <key>. Keys are eb_live_… (production) or eb_test_…; both authenticate against the same data today, and the prefix identifies the key in logs. A key can carry a lower per-minute limit, a lower monthly limit and an expiry date; the dashboard sets them at creation.

Never put a key in a query string. URLs are logged by proxies, kept in browser history and leaked in Referer headers, and every request carries the credential in a header instead.

Endpoints

The live endpoint table is unavailable right now. The same information is in the OpenAPI document.

Metered means the request consumes the plan's monthly allowance. Account endpoints (usage, keys, billing) are never metered: being throttled out of checking your own usage would be absurd. A 5xx on a metered endpoint is refunded automatically.

Feed item shape

GET /v1/feed?limit=&cursor=&category=&rank= returns up to 50 items (20 by default). Fields that your plan does not include are omitted rather than nulled, so tldr and summary are absent on the free plan.

{
  "items": [
    {
      "id": "6f1c8a2e-1f4e-4f1a-9c2f-0a1b2c3d4e5f",
      "story_id": "0b7f...",
      "title": "Central bank holds rates as inflation cools",
      "tldr": "Policymakers left the benchmark rate unchanged for a third meeting.",
      "summary": "The central bank kept its policy rate...",
      "publisher": "Example News",
      "category": "Business",
      "sentiment": "neutral",
      "published_at": "2026-10-18T06:12:00Z",
      "read_time": 4,
      "is_bookmarked": false,
      "is_liked": false,
      "confidence_score": 0.87,
      "url": "https://example.com/story"
    }
  ],
  "next_cursor": "eyJvZmZzZXQiOjIwfQ",
  "total": 412
}

Limits and quotas

Two independent limits apply to every request: a per-minute rate limit and a monthly allowance. Every metered response carries both in its headers (account endpoints like this one do not, because they never consume allowance):

HeaderMeaning
X-RateLimit-LimitRequests allowed this minute for this key.
X-RateLimit-RemainingRequests left in the current minute.
X-RateLimit-ResetUnix timestamp (seconds) when the minute resets.
X-Quota-LimitEffective monthly limit (includes anything your spend cap buys). Omitted on unmetered plans.
X-Quota-RemainingRequests left this period.
X-Quota-ResetUnix timestamp (seconds) your allowance resets at.
Retry-AfterSeconds to wait — sent with 429 responses.
X-Request-IdCorrelation id for this request; include it in bug reports.
X-Required-FeatureSent with 403 when the plan is missing a feature.

A rejected request is never billed: throttling and quota refusals do not consume allowance and do not appear in your usage numbers at all. The allowance resets on your own billing anniversary (the date shown in the dashboard), not on the first of the month.

Overage is only possible after you set a spend cap in the dashboard. Requests stop at the cap instead of quietly billing past it.

Errors

Every failure is one JSON shape, with a stable machine code to switch on:

{
  "error": "the plan's monthly allowance is spent",
  "code": "quota_exceeded",
  "request_id": "req_9f2c41ab77d0"
}
StatusCodeMeaning
400invalid_requestThe request body or parameters failed validation. The message names the field.
401unauthorizedNo credential was sent.
401invalid_api_keyThe key is not recognised.
401key_revokedThe key was revoked (rotating a key revokes the previous one).
401key_expiredThe key's expiry date has passed.
402quota_exceededThe plan's monthly allowance is spent. Read X-Quota-Reset.
402spend_cap_reachedYour own spend cap is reached. Raise it or wait for the reset.
403plan_requiredThe plan does not include this endpoint; X-Required-Feature names the feature.
403key_limit_reachedThe plan's key limit is reached. Revoke a key or upgrade.
404not_foundThe resource does not exist, or is not visible to this account.
409conflictThe resource already exists (for example a taken username).
429rate_limitedToo many requests this minute. Read Retry-After.
5xxinternal_errorOur fault. The request is refunded against your monthly counter.
503service_unavailableA dependency is down or the feature is not configured here. Retryable.

Pagination

List endpoints return items, total and, when more remain, next_cursor. Send it back as ?cursor=. A cursor points at a position, so items arriving while you page cannot make you skip or repeat one. Treat next_cursor as opaque, and stop when it is absent.

Retries and idempotency

Reads (GET) are always safe to retry. Retry only after a 429 (respecting Retry-After) or a 5xx/503, and use exponential backoff with jitter so a bad minute does not become a thundering herd.

Versioning and deprecation

Legal and operational

Acceptable use, attribution requirements and data retention are in the terms and acceptable use policy. Current availability is on the status page.