Quick start
The five newest explained updates for Jammu and Kashmir:
curl "https://publicfeed.in/api/v1/updates?state=jk&limit=5"
Deadlines in the next two weeks, anywhere in India:
curl "https://publicfeed.in/api/v1/deadlines?days=14"
In Python, with no extra packages:
import json, urllib.request
url = "https://publicfeed.in/api/v1/updates?q=consultation&limit=10"
with urllib.request.urlopen(url) as response:
page = json.load(response)
for update in page["data"]:
print(update["issued_date"], update["headline"], update["source"]["official_url"])
Keys
Without a key you are on the free plan, counted per IP address. With a paid plan, send your key in a header. Paid keys (the full archive, bulk exports and higher limits) are arranged by email for now: write to the maintainer.
curl -H "Authorization: Bearer YOUR_KEY" "https://publicfeed.in/api/v1/me"
X-API-Key: YOUR_KEY also works. Never put a key in a URL: URLs end up in logs and browser history. Each response says which plan served it in the X-PublicFeed-Plan header.
Endpoints
All under https://publicfeed.in/api/v1, all GET.
| Path | Returns | Plans |
|---|---|---|
/updates | Explained updates, newest first, with filters | All (free: last 30 days) |
/updates/{id} | One update | All |
/deadlines | Dated deadlines, effective dates and end dates, soonest first | All (free: next 30 days) |
/alerts | Weather and disaster alerts in force (CAP, from NDMA SACHET) | All |
/sources | Source websites represented in updates | All |
/export/{dataset}.{jsonl|csv} | A whole dataset as a file | Developer, Pro |
/me | Your plan and remaining requests | All |
/openapi.json | OpenAPI 3.1 description | All |
Updates
Filters combine. Text matching is case-insensitive.
| Parameter | Meaning |
|---|---|
q | Words that must all appear in the headline, summary, issuer, number, topics or places |
state | A state or union territory code, such as jk, mh, dl; in for national items only |
topic | A reader topic such as Budget, or a word from the document's own topics |
source | A source key, such as pib or cag_reports (see /sources and each record's source.key) |
type | The source's document type, such as Press release or Notification |
intent | changes, consultations, opportunities or updates (a browsing aid, not a legal status) |
issuer | Words in the issuing body's or department's name |
since, until | Issue date range, YYYY-MM-DD |
changed_since | Records written to the feed after this timestamp (see sync) |
limit, offset | Paging; follow meta.next |
Deadlines
/deadlines?days=60&state=mh&kind=deadline lists dated rows from the updates: deadline (last date to comment, apply or comply) and effective (takes effect). Ask for kind=period_end to get the end dates of periods such as rosters and schemes. Deadlines worded relative to another event have no fixed date and appear only in the update's dates. The same calendar is on the deadlines page.
Records
Every response has data, meta (totals, paging, plan, feed_updated_at), attribution and license. An update looks like this (a live record):
{
"schema": "publicfeed.update.v1",
"id": "PIB-2327720",
"url": "https://publicfeed.in/orders/PIB-2327720",
"headline": "India Post expands 24 Speed Post service with 27 new lanes in Maharashtra",
"summary": "The Department of Posts, Maharashtra Circle announced on 23 October 2026 the expansion of its premium 24 Speed Post service beyond the existing metro-to-metro network. The expansion adds 27 new lanes—25 for documents and 2 for parcels—to provide faster, time-bound delivery for retail and bulk customers in Mumbai, Thane, Navi Mumbai, Pune, Nashik, and Nagpur. The release does not say when these changes take effect, but it lists designated booking and delivery offices across the region. Customers can access these services at specific booking offices and verify lane availability at their nearest post office.",
"key_points": [
"27 new lanes added: 25 for documents and 2 for parcels.",
"New routes connect Mumbai, Thane, Navi Mumbai, Pune, Nashik, Nagpur, and Ahmedabad.",
"Parcel lanes operational on Mumbai–Pune and Mumbai–Ahmedabad routes.",
"Bookings accepted at 28 designated offices per lane for Mumbai outbound routes.",
"Bookings accepted at 12 designated offices per lane for Thane & Navi Mumbai outbound routes."
],
"issued_date": "2026-10-23",
"listing_date": "2026-10-23",
"document": {
"form": "Press release",
"number": "2327720",
"type": "Press release",
"legal_character": "informational_communication",
"functions": [
"announces"
],
"cites": []
},
"issuer": "Department of Posts, Maharashtra Circle",
"department": "Ministry of Communications",
"source": {
"key": "pib",
"name": "Press Information Bureau",
"site": "pib.gov.in",
"official_url": "https://www.pib.gov.in/PressReleseDetail.aspx?PRID=2327720"
},
"topics": [
"postal services",
"logistics",
"maharashtra"
],
"reader_topics": [
"Government services"
],
"intent": "updates",
"states": [
"mh"
],
"national": false,
"places": [
"Maharashtra Circle"
],
"applies_to": [
"retail and bulk customers"
],
"dates": [],
"revision": "1402317412f95694",
"recorded_at": "2026-10-23T17:14:29.006112+00:00",
"provenance": {
"method": "ai_summary",
"automated_check": "pass",
"human_review": "pending"
}
}
summary and key_points are AI-generated explanations (see provenance); source.official_url is the authority. issued_date is the document's date. recorded_at is when that revision was written to the feed, not a publication date.
Keeping in sync
Poll /updates?changed_since=… with the time of your last successful sync, then upsert by id. revision changes only when an update's content changes, so you can skip records whose revision you already have. Paid plans can start from a full /export/updates.jsonl.
Limits and errors
| Plan | Per hour | Per day | Rows per page | History |
|---|---|---|---|---|
| Free | 60 | 1,000 | 25 | Last 30 days |
| Developer | 2,000 | 20,000 | 100 | Full archive |
| Pro | 10,000 | 100,000 | 500 | Full archive |
A bulk export counts as 25 requests. Responses carry X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (seconds). Errors are JSON: {"error": {"code", "message", "docs"}} with status 400 (bad parameter), 401 (unknown key), 403 (upgrade_required), 404, 429 (rate_limited, with Retry-After) or 503.
Within v1, fields may be added but existing ones are not renamed or removed.
MCP for AI agents
The remote MCP server at https://publicfeed.in/mcp (Streamable HTTP) offers the tools search_updates, get_update, upcoming_deadlines, weather_alerts and list_sources, on the same plans and limits as the API.
Claude Code:
claude mcp add --transport http publicfeed https://publicfeed.in/mcp
Claude, ChatGPT and other apps with custom connectors: add a connector with the URL above. Clients configured with JSON, such as Cursor or VS Code:
{"mcpServers": {"publicfeed": {"url": "https://publicfeed.in/mcp"}}}
With a paid key, add a header: "headers": {"Authorization": "Bearer YOUR_KEY"}.
Widget for your site
Show the latest official updates for a state or topic on your own website, free. Paste this where the list should appear; change edition to a state code such as mh, or add &topic=Health, &limit=8 or &theme=dark.
<iframe src="https://publicfeed.in/embed?edition=jk&limit=5" title="Latest official updates from PublicFeed" width="100%" height="420" style="border:0" loading="lazy"></iframe>
The widget has no scripts, cookies or tracking. Its links open PublicFeed in a new tab.
Attribution
Where you show PublicFeed data, show a visible credit with a link, and keep each record's official source link. For example:
Source: <a href="RECORD_URL">PublicFeed</a>, from <a href="OFFICIAL_URL">the official document</a>
Do not present summaries as official text or as legal advice. The full conditions are in the data terms. Questions or a bug? Email the maintainer.