Skip to content
kchakhabarehकेखबर

Developers

A public JSON feed of today’s Nepali news.

One endpoint. No auth. CORS-enabled. Returns the same set of clustered stories the homepage renders — with bilingual headlines, English and Nepali summaries, and a canonical link back to the K cha khabar story page where the original sources are listed. Suitable for agents, dashboards, embeds, research, and class projects.

Last updated: May 18, 2026 (rev 2) · API version v1

Quick start

Hit the endpoint with any HTTP client. There’s nothing to sign up for.

curl

curl -sS https://kchakhabar.com/api/v1/today.json | jq .

JavaScript (browser or Node 18+)

const res = await fetch('https://kchakhabar.com/api/v1/today.json')
const { generated_at, story_count, stories } = await res.json()
console.log(`${story_count} stories as of ${generated_at}`)

Want more than the default 24? Append ?limit=N (max 100). Same shape, same cache, just more stories.

Topical channels

Two filtered slices of the same feed for partners building focused apps. Identical response shape; identical cache; same ?limit=N (default 24, max 100). Each adds a top-level "channel" field with the slug.

GET

GET https://kchakhabar.com/api/v1/today/finance.json

GET

GET https://kchakhabar.com/api/v1/today/international.json
  • finance — stories anchored to Nepal’s financial institutions and bodies: commercial & development banks, microfinance, life / non-life insurers and reinsurers, hydropower companies, the Nepal Rastra Bank, NEPSE, SEBON, CDS & Clearing, public funds (CIT / EPF / SSF), the Ministry of Finance, and World Bank / IMF / ADB, plus remittances and crypto. Crime, disaster, sports and entertainment stories are excluded even if they mention a finance institution or a large monetary value.
  • international — stories anchored to foreign countries, multilaterals, foreign figures, or tagged international / foreign_affairs / diaspora. Same crime / disaster exclusion.

Response shape

A single JSON object. The stories array contains up to limit items (default 24, max 100), ranked by coverage breadth and recency — newest, most-covered stories first.

Example response (truncated)

{
  "generated_at": "2026-05-18T08:00:00.000Z",
  "story_count": 24,
  "stories": [
    {
      "id": "25789",
      "slug": "sixty-year-old-grandmother-passes-see-exam-bhaktapur",
      "url": "https://kchakhabar.com/story/2026/05/15/sixty-year-old-grandmother-passes-see-exam-bhaktapur?utm_source=kchakhabar_api&utm_medium=api&utm_campaign=today_v1",
      "topic_en": "Sixty Year Old Grandmother Passes SEE Exam in Bhaktapur",
      "topic_ne": "भक्तपुरमा ६० वर्षीया हजुरआमाले गरिन् एसईई उत्तीर्ण",
      "summary_en": "Raminkumari Rai, a 60-year-old grandmother, has successfully passed the Secondary Education Examination (SEE) in Bhaktapur. …",
      "summary_ne": "भक्तपुरकी ६० वर्षीया हजुरआमा रमिनकुमारी राईले यस वर्षको माध्यमिक शिक्षा परीक्षा सफलतापूर्वक उत्तीर्ण गर्नुभएको छ। …",
      "source_count": 4,
      "first_reported": "2026-05-15T08:30:00.000Z",
      "updated_at": "2026-05-16T02:45:26.149Z",
      "sources": [
        {
          "publisher": "OnlineKhabar (English)",
          "publisher_slug": "onlinekhabar-en",
          "url": "https://english.onlinekhabar.com/grandmother-passes-see.html",
          "image_url": "https://english.onlinekhabar.com/wp-content/uploads/2026/05/grandmother-see.jpg"
        },
        {
          "publisher": "Setopati",
          "publisher_slug": "setopati",
          "url": "https://www.setopati.com/social/302145",
          "image_url": "https://www.setopati.com/uploads/shares/2026/05/grandmother-see.jpg"
        }
      ]
    }
  ]
}

Field reference

Top-level object

FieldTypeDescription
generated_atstring (ISO 8601)Server timestamp at which this response was rendered. Useful for cache-busting and freshness checks.
channelstringChannel slug (e.g. "finance", "international"). Present on /today/<channel>.json responses, absent from the bare /today.json.
story_countintegerNumber of stories in the array. Always equal to stories.length.
storiesarray<Story>Up to limit stories (default 24, max 100 via ?limit=N), ranked by coverage + decay. May be empty during low-news windows; not an error.

Story object

FieldTypeDescription
idstringStable opaque identifier. Encoded as a string so JavaScript clients do not lose precision on large integers.
slugstringURL-safe slug used in the public story page path.
urlstringCanonical kchakhabar.com URL for this story, with UTM parameters identifying the API as the referrer. The story page lists every original source URL — link there if you need attribution beyond the top 3 in sources[].
topic_enstringHeadline-style topic in English. Always present.
topic_nestring | nullHeadline-style topic in Nepali. Null if no Nepali headline was generated.
summary_enstring | null2–3 sentence English summary. Null if only a Nepali summary exists.
summary_nestring | null2–3 sentence Nepali summary. Null if only an English summary exists.
source_countintegerTotal number of original articles backing this story across all tracked publishers. Often greater than sources.length (which is capped at 3 and only includes sources that carry an image).
first_reportedstring (ISO 8601) | nullTimestamp of the earliest article in the cluster — when this story was first reported by any tracked publisher. Null in the rare case where no article carries a usable timestamp.
updated_atstring (ISO 8601)When the story cluster was last updated (new article joined, summary regenerated, etc.).
sourcesarray<Source>Up to 3 contributing publishers that carry a cover image, ordered trusted-publishers first then by earliest published. May be an empty array when no source in the cluster has an image — design your layout for both cases. We do not host or proxy these images; each one is attributed to its publisher in this array. For the full source list (including image-less ones) visit the cluster page.

Source object

FieldTypeDescription
publisherstringDisplay name of the publisher.
publisher_slugstringStable slug for the publisher (e.g. "setopati", "onlinekhabar"). Useful for client-side dedup or per-publisher styling.
urlstringCanonical URL of the publisher’s article. Opens directly on their site — we do not proxy.
image_urlstringCover image hosted on the publisher’s CDN. Always non-null in this array (we only return sources that have one). Show with attribution to the listed publisher; render a fallback on load error since a few publishers block hotlinking from unknown referers.

Query parameters

Supported on /today.json and /today/<channel>.json

FieldTypeDescription
limitinteger (1–100, default 24)How many stories to return. Invalid or out-of-range values fall back to the default. The CDN caches each distinct value separately, so polling the same ?limit= value is free.

Caching & freshness

The endpoint is served with Cache-Control: public, max-age=300, s-maxage=300, stale-while-revalidate=600. That means:

  • Fresh for 5 minutes. Browsers, CDNs, and edge caches may serve the same body for up to 5 minutes after the first miss. The ingest pipeline runs more often than that, so 5 minutes is a good freshness floor for clients.
  • Stale-while-revalidate 10 minutes. Past the freshness window, intermediaries may keep serving the cached response while a fresh fetch happens in the background. Plan for response timestamps to lag wall-clock time by up to ~15 minutes during high-traffic windows.
  • No published rate limit. Because every response is cacheable, we expect normal traffic to be absorbed by the CDN. Please don’t poll faster than once per minute — you’ll get the same bytes. If you need a webhook or push feed, get in touch.

CORS & access

  • No authentication. No API key, no signup, no token. The endpoint is fully public.
  • CORS open. The response sets Access-Control-Allow-Origin: * and answers preflight OPTIONS requests. Browsers on any origin can call this directly from client-side JavaScript.
  • HTTPS only in production. The http:// URL redirects.

Versioning & stability

  • The path includes a version segment — /api/v1/…. Any backwards-incompatible change ships under /api/v2/…;v1 stays available for a minimum of 90 days after a successor goes live.
  • New, optional fields may be added to v1 responses without notice. Treat any unfamiliar key as additive.
  • Existing field names and types are stable. We will not silently change a string to an integer.

Attribution & use

  • K cha khabar aggregates headlines from 35+ Nepali newsrooms. Each story’s url field points at our cluster page, which lists every original source — please send readers there so they can pick a publisher and read the full piece on the original site.
  • You’re welcome to render headlines, summaries, and topic labels in your own UI. If you do, a credit line like “via K cha khabar” linking back to kchakhabar.com is appreciated.
  • We add a default UTM tag (utm_source=kchakhabar_api) to the story url field so traffic from API integrations shows up separately in our analytics. Leave it as-is if you can.

Not in v1

This is intentionally a tiny surface. The following are not exposed in v1 and may or may not arrive later:

  • Single-story lookup by id or slug
  • Historical or date-ranged queries (we cap at 48h)
  • Cursor pagination beyond the 100-item limit
  • Per-publisher feeds
  • Search, filters, or language scoping
  • Write endpoints, webhooks, or push

If one of those would unblock something you’re building, tell us what you need.

Get in touch

Found a bug, want a field added, or building something you’d like to show off? Email [email protected] or check out how the pipeline works for context on where the data comes from.

Developers · K cha khabar