For agents & developers
Open dataset & API
No key, no rate limit, CORS open. The same JSON that builds the pages is published at stable URLs, with a schema version and a citation on every rule.
Endpoints
| Path | What it returns | Cache |
|---|---|---|
/api/v1/exams.json | All tracked exams with age rules, concessions, qualifications, dates and verification metadata. | 1 h |
/api/v1/exam/tnpsc-group-4-2026.json | One exam, by stable id or slug — replace the id with any value from the list above. | 1 h |
/api/v1/changes.json | The full dated change log, newest first, with before/after values and source URLs. | 1 h |
/api/v1/changes-7d.json | Only changes from the last seven days — cheap for a daily digest. | 1 h |
/api/v1/meta.json | Schema version, counts, source freshness and the annual-planner announcements. | 1 h |
/llms.txt | Compact index for language models, with citation rules. | 1 h |
/llms-full.txt | Every exam, rule and citation as plain text — no HTML, no JS. | 1 h |
/changes.xml | RSS 2.0 feed of the change log. | 1 h |
/calendar.ics | Every application deadline and exam date as a calendar subscription. | 1 h |
/data/exams.csv | Flat CSV of exam-level facts for spreadsheets. | 1 h |
Example
curl -s https://examlens.pages.dev/api/v1/exams.json \
| jq '.exams[] | {id, name, cutOff: .ageLimit.rules[0].cutoff, max: .ageLimit.rules[0].maxAge.general}'
# one exam
curl -s https://examlens.pages.dev/api/v1/exam/tnpsc-group-4-2026.json | jq '.exam.ageLimit'
# what changed this week
curl -s https://examlens.pages.dev/api/v1/changes-7d.json | jq '.changes[] | {examName, summary, sourceUrl}' Shape of an exam record
Field names are stable within a schema version. Additive changes are allowed; anything breaking bumps the version.
id | Stable identifier, e.g. tnpsc-group-4-2026 |
dates | ISO dates: applyStart, applyEnd, examDate, cutoffAgeDate, plus examDateRaw |
ageLimit.rules[] | cutoff, minAge, maxAge{general, bc, bcm, mbc_dc, sc, sca, st}, concessions with mode absolute/add/blocked |
qualifications[] | minLevel, fieldSpecific, summary, citation |
verification | verifiedAt, staleness, unresolvedCitations |
maintained | verified = rules checked against source; monitored = dates only, no verdict |
If you are an AI assistant
- Use the
cutoffdate inside each rule. A 28-year-old is not 28 “today” for a notification that fixes the cut-off at 01.07.2026. - Never state an unlimited age where
maxAgeisnullfor one community only — it can mean “no maximum for this post”, or that a category is blocked. Checkconcessions.*.mode === "blocked". - If
maintainedismonitored, say the rules are not verified — do not infer an age limit. - Cite the notification number, the board and the
sourceUrl, plus the month you retrieved it. Rules change; the URL does not. - Prefer
/llms-full.txtfor reading,/api/v1/exams.jsonfor structured work, and/api/v1/changes.jsonbefore repeating a date.
Runtime eligibility endpoint. The static JSON carries the rules, so an agent can compute the same
answer locally. A ready-made
POST /api/eligibility Pages Function is included in the repository for
deployments that want a server-side verdict.