Logo Lanfrica

natinael96/EOTCDevAPI

Domain:

digital infrastructure

Record type:

software
Creator:
nat
Host:
Open, free REST API for the Ethiopian Orthodox Tewahedo Church calendar: date conversion, fasting, feasts, Bahire Hasab, and the Gitsawe/Sinksar lectionary. No auth, no keys, no database. # EOTCDev API An open, free REST API for the **Ethiopian Orthodox Tewahedo Church calendar** — Ethiopian↔Gregorian date conversion, fasting-day status, fasting periods, feast dates, and a date-level bridge between the Gitsawe, Sinksar, and Bible. Coptic developers have `coptic.io` and `katameros-api` to build on. EOTC has content mega-apps but no open backend. This is that backend: **infrastructure, not another app.** No auth. No API key. No database. The public deployment uses a generous anonymous rate limit to prevent abuse. ```bash curl eotcdev-api.natinael-96.wor… ``` ```json { "gregorian": { "date": "2026-04-12" }, "ethiopic": { "date": "2018-08-04", "monthName": { "amharic": "ሚያዝያ" } }, "weekday": { "amharic": "እሑድ", "english": "Sunday" }, "fasting": { "isFasting": false, "reason": "Not a fasting day." }, "feasts": [ { "amharic": "ትንሣኤ", "english": "Easter (Resurrection)" } ] } ``` ## Two implementations, one behaviour | | Stack | Runs on | |---|---|---| | **`ts/`** | TypeScript + Hono | Cloudflare Workers (free tier), Node, Deno, Bun | | **`py/`** | Python + FastAPI | Any host; auto Swagger UI at `/docs` | They are not "a port and a copy" — they are held identical by tests: - **`spec/conformance.json`** — 9,154 golden vectors. Both suites assert against it. - **`spec/responses.json`** — every route's exact HTTP response. The Python suite replays every fixture route and asserts byte-identical JSON, **including error bodies and status codes**. Change one implementation without the other and a build fails. ## Endpoints | Endpoint | Description | |---|---| | `GET /v1/today` | Today, fully described. `?tz=Africa/Addis_Ababa` | | `GET /v1/date/{date}` | Describe any date. `?calendar=gregorian\|ethiopian` | | `GET /v1/convert/{date}` | Convert between calendars | | `GET /v1/fasting/{date}` | Is it a fasting day, and **why** | | `GET /v1/fasts/{year}` | All fasting periods of an Ethiopian year | | `GET /v1/feasts/{year}` | …