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.
Endpoint
GET https://kchakhabar.com/api/v1/today.jsoncurl
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.jsonGET
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
| Field | Type | Description |
|---|---|---|
| generated_at | string (ISO 8601) | Server timestamp at which this response was rendered. Useful for cache-busting and freshness checks. |
| channel | string | Channel slug (e.g. "finance", "international"). Present on /today/<channel>.json responses, absent from the bare /today.json. |
| story_count | integer | Number of stories in the array. Always equal to stories.length. |
| stories | array<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
| Field | Type | Description |
|---|---|---|
| id | string | Stable opaque identifier. Encoded as a string so JavaScript clients do not lose precision on large integers. |
| slug | string | URL-safe slug used in the public story page path. |
| url | string | Canonical 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_en | string | Headline-style topic in English. Always present. |
| topic_ne | string | null | Headline-style topic in Nepali. Null if no Nepali headline was generated. |
| summary_en | string | null | 2–3 sentence English summary. Null if only a Nepali summary exists. |
| summary_ne | string | null | 2–3 sentence Nepali summary. Null if only an English summary exists. |
| source_count | integer | Total 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_reported | string (ISO 8601) | null | Timestamp 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_at | string (ISO 8601) | When the story cluster was last updated (new article joined, summary regenerated, etc.). |
| sources | array<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
| Field | Type | Description |
|---|---|---|
| publisher | string | Display name of the publisher. |
| publisher_slug | string | Stable slug for the publisher (e.g. "setopati", "onlinekhabar"). Useful for client-side dedup or per-publisher styling. |
| url | string | Canonical URL of the publisher’s article. Opens directly on their site — we do not proxy. |
| image_url | string | Cover 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
| Field | Type | Description |
|---|---|---|
| limit | integer (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 preflightOPTIONSrequests. 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/…;v1stays available for a minimum of 90 days after a successor goes live. - New, optional fields may be added to
v1responses 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
urlfield 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 storyurlfield 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.