How a 5-state mandi price API got merged into public-apis
PR #6789 to public-apis — the GitHub list with over 460,000 stars that most "free API" roundups pull from — opened on August 6, 2026 and merged on August 8. Zero review comments. That wasn't luck. The repo's contribution guide is strict about format, and matching it exactly is what keeps a PR out of the back-and-forth entirely.
What the guide actually checks
public-apis rejects marketing listings outright — the API has to be free, or have a real free tier, with no purchased hardware behind it. Past that, every entry is one table row: API name and doc link, a description under 100 characters, whether it needs auth, HTTPS support, CORS support, inserted in strict alphabetical order within its category. No prose, no exceptions. I wrote the Mandi Price API's row to that exact shape before opening the PR, so there was nothing left for a maintainer to send back.
What's actually behind the listing
The Mandi Price API is a free, keyless REST API for daily Indian mandi (wholesale market) crop prices across five states — Maharashtra, Uttar Pradesh, Punjab, Madhya Pradesh, and Karnataka — sourced from the Government of India's open data portal, data.gov.in. A GitHub Actions job pulls fresh prices every day at 15:00 UTC (8:30 PM IST) and upserts them into Supabase. Every response comes back in the same envelope:
GET /v1/prices?state=Maharashtra&commodity=Onion
{
"success": true,
"data": [{
"state": "Maharashtra",
"market": "Nagpur APMC",
"commodity": "Onion",
"modal_price": 1500,
"arrival_date": "2026-07-28"
}],
"meta": { "count": 1, "latest_fetched_at": "2026-07-28T20:31:05.000Z" }
}Filtering cascades state → market → crop, so every combination the frontend can request resolves to a real, non-empty result instead of a dead-end query.
The constraint nobody sees in the PR
Daily ingestion at roughly 3,500 rows a day means unbounded growth — about 300 MB a year against Supabase's free-tier 500 MB ceiling. The fix is a one-line delete at the end of every ingestion run, purging anything older than 365 days, which caps storage at around 250 MB permanently. None of that is visible from the API response or the public-apis table row. It's the difference between a demo that works today and a free service that keeps working two years from now.
Try it
No API key, no signup: GET /v1/states. Full docs, the developer playground, and the ingestion pipeline source are on GitHub. It's one of a few things I've shipped end to end. The rest are on the projects page.