Developers
The egg rate API, free to read.
Every number on this site comes from the same endpoints documented below. Prices are returned as integer paise per egg, alongside rupee values and per-unit prices, so your client never has to do price maths.
- Markets covered
- 34
- Latest rate date
- 17 August 2026
- Read auth
- None
- Response format
- JSON
NECC declared zones
Refreshed daily
No API key needed
Envelope with meta and data
Quickstart
One request, the whole board.
# today's rates for every market
curl https://eggrate-api.eggrates19.workers.dev/api/v1/rates/today
# one market, all four unit prices
curl https://eggrate-api.eggrates19.workers.dev/api/v1/rates/barwala
# 90 days of history
curl "https://eggrate-api.eggrates19.workers.dev/api/v1/rates/namakkal/history?days=90"
# only Tamil Nadu, cheapest first
curl "https://eggrate-api.eggrates19.workers.dev/api/v1/rates/today?state=tamil-nadu&sort=rate_asc"Live response, trimmed to one row
{
"success": true,
"meta": {
"rate_date": "2026-08-17",
"count": 34,
"currency": "INR",
"source": "necc"
},
"data": [
{
"market": "namakkal",
"name": "Namakkal",
"state": {
"slug": "tamil-nadu",
"name": "Tamil Nadu",
"code": "TN"
},
"zone": "South",
"rate_date": "2026-08-17",
"paise": 564,
"rupees": 5.64,
"prices": {
"piece": {
"eggs": 1,
"paise": 564,
"rupees": 5.64,
"display": "₹5.64"
},
"tray": {
"eggs": 30,
"paise": 16920,
"rupees": 169.2,
"display": "₹169"
},
"hundred": {
"eggs": 100,
"paise": 56400,
"rupees": 564,
"display": "₹564"
},
"peti": {
"eggs": 210,
"paise": 118440,
"rupees": 1184.4,
"display": "₹1,184"
}
},
"change": {
"paise": 0,
"rupees": 0,
"percent": 0,
"direction": "flat",
"display": "No change",
"since": "2026-08-16"
}
}
]
}Captured from the live API when this page was rendered. `paise` is authoritative; `rupees` and `display` are conveniences derived from it.
17 endpoints
Full reference
All paths are relative to https://eggrate-api.eggrates19.workers.dev/api/v1
| Endpoint | What it returns | Query params |
|---|---|---|
GET/rates/today | The full rate board for one day, one row per market. | date, state, zone, sort, unit |
GET/rates/{market} | Current declared rate for a single market, with all four unit prices. | date |
GET/rates/{market}/history | Daily price series plus average, low, high, change and volatility. | days (2–730), date |
GET/rates/{market}/monthly | Monthly average, low and high for a market. | months (1–36) |
GET/summary | National roll-up and per-zone averages. | date |
GET/trends | Biggest gainers and decliners, plus cheapest and dearest markets. | date, limit (1–34) |
GET/markets | Market master list with state, zone and coordinates. | state, zone |
GET/markets/{market} | Everything for one market in a single call: rate, series, monthly, neighbours. | date, days, months |
GET/states | Every state with today’s average, low and high. | date |
GET/states/{state} | One state with each of its markets. | date |
GET/catalog | States and markets together, handy for sitemaps. | — |
GET/health | Liveness plus row counts and coverage window. | — |
GET/openapi.json | OpenAPI 3.1 schema for the whole API. | — |
POST/subscribe | Add an email to the daily rate list. | — |
POST/contact | Send a message to the team. | — |
POST/admin/rates | Ingest declared rates for a date. | — |
POST/admin/carry-forward | Repeat the last known rate for markets missing a date. | — |
Response shape
Envelope, prices and change
Every successful response is { success, meta, data }. meta always carries generated_at, and on rate endpoints it also carries as_of, rate_date, stale and a human date_label.
as_of is the date you asked about. rate_date is the newest print actually returned. When a market has not declared for your requested date, its row keeps the last declared price and its own rate_date reflects that, with stale: true on the envelope. Nothing is silently invented.
prices holds all four selling units, each with eggs, paise, rupees and a preformatted display string. change compares against the market’s own previous declared rate and includes since, the date being compared with.
Errors
{
"success": false,
"error": {
"code": "not_found",
"message": "No market called \"nope\".",
"details": { "hint": "GET /api/v1/markets lists every available market slug." }
}
}Codes: bad_request, not_found, unauthorized, rate_limited, conflict, unprocessable, internal_error, no_data.
Fair use
Caching and limits
Read endpoints are cached at Cloudflare’s edge for five minutes with a stale-while-revalidate window, and they set Cache-Control accordingly. Honour it and you will rarely hit origin. Rates change once a day, so polling more often than hourly gains you nothing.
There is no hard rate limit on read endpoints today, and no key to request. Write endpoints (/subscribe, /contact) are throttled per email address. Ingestion endpoints under /admin require a bearer token.
Rates are NECC declared wholesale prices republished for information. Attribution back to this site is appreciated but not required.
Building something with this? Tell us and we will keep your use case in mind before changing anything.