RoTV Guide API
Free, read-only JSON API for Romanian TV data: live EPG across 254 channels, prime-time lineups, tonight picks, important events, title details with streaming availability, full-text search and a what-to-watch concierge.
- No auth needed to try it — anonymous access is allowed.
- All responses are
application/json; CORS is enabled. - Schedule times are Europe/Bucharest; local timestamps carry the UTC offset
(e.g.
2026-07-20T20:30:00+03:00).
Quick start
What is on now and next, per channel:
curl -s https://tv.madeinro.eu/api/v1/now-next
Search movies airing tonight:
curl -s 'https://tv.madeinro.eu/api/v1/search?query=film&timeframe=tonight'
Endpoints
| Endpoint | Method | What it returns |
|---|---|---|
/api/v1/freshness | GET | Age of the EPG and streaming data snapshots. |
/api/v1/now | GET | Programs on air right now. |
/api/v1/now-next | GET | Current + next program per channel. |
/api/v1/prime-time | GET | Tonight's prime-time lineup (~20:00–23:00). |
/api/v1/tonight | GET | What's worth watching tonight. |
/api/v1/important-today | GET | Major broadcasts today (finals, big events), tiered. |
/api/v1/recommendations | GET | Ranked recommendations across TV and streaming. |
/api/v1/evening-plan | GET | A pre-built evening viewing plan. |
/api/v1/titles | GET | Index of known movie/series titles. |
/api/v1/titles/{id} | GET | One title, incl. streaming availability in Romania. |
/api/v1/search | GET, POST | Program search: query, channel, category, timeframe, exclude_news, limit. |
/api/v1/concierge | GET, POST | One decision: what to watch in your window (mood, duration, filters). |
/api/v1/keys | POST | Request a free API key ({email, note?}). |
/api/v1/health | GET | Service health. |
/feeds/important-today.json | GET | Static feed of today's major broadcasts. |
/feeds/tonight.json | GET | Static feed of tonight's picks. |
Full request/response schemas: see the OpenAPI spec.
Universal object
Collection endpoints return an envelope { generated_at, data_as_of, source,
attribution, items } where each item is:
{
"id": "pro-tv-stirile-pro-tv-1900", // stable slug
"type": "program", // movie | series | program
"title": "Știrile PRO TV",
"summary": "Principalul jurnal de știri al serii.", // optional
"channel": "PRO TV", // TV programs only
"channel_slug": "pro-tv",
"starts_at": "2026-07-20T19:00:00+03:00", // Europe/Bucharest offset
"ends_at": "2026-07-20T20:30:00+03:00",
"image": { "landscape": "…", "poster": "…" }, // optional
"canonical_url": "https://tv.madeinro.eu/canal-tv/pro-tv",
"watch_url": "…", // optional
"availability": { // optional; attribution: JustWatch
"country": "RO",
"platforms": ["Netflix"]
},
"updated_at": "2026-07-20T15:00:00+03:00"
}
Authentication & limits
- Anonymous: 60 requests/hour on the dynamic endpoints
(
/api/v1/search,/api/v1/concierge). Static endpoints and feeds are cacheable and uncounted. - Free key: 300 requests/minute. Send it as
Authorization: Bearer rotv_pk_…orX-Api-Key: rotv_pk_….
curl -s -X POST https://tv.madeinro.eu/api/v1/keys \
-H 'Content-Type: application/json' \
-d '{"email":"[email protected]","note":"my integration"}'
Get a key now
Save this key now — it is shown only once.
Integrations
- OpenAPI 3.1 spec — import as a GPT Action in a Custom GPT (auth: none).
- Gemini function declarations —
drop into
tools.function_declarationsfor Gemini function calling. - MCP manifest — public MCP server (Streamable HTTP, no auth) for MCP-capable agents: ChatGPT connectors, Claude, Grok and others.
Embeddable widget
A compact "now on TV" widget for partner sites — self-contained, auto-refreshing, works from 250px width up, adapts to light/dark. Embed it with one iframe:
<iframe src="https://tv.madeinro.eu/widgets/now"
width="300" height="420" style="border:0" loading="lazy"
title="Acum la TV — RoTV Guide"></iframe>
No API key needed. The widget links back to tv.madeinro.eu; content updates every 15 minutes.
Terms
- Read-only API; personal and commercial integrations welcome, no scraping at scale.
- Streaming availability data may not be redistributed onward. When you display platform availability, show the attribution “Streaming availability data: JustWatch”.
- No warranty; the service may change or rate-limit abusive clients.
- Contact: [email protected].
Freshness
data_as_of in every envelope is the timestamp of the underlying
EPG/streaming snapshot — not the time of your request. The EPG refreshes 4×/day;
the JSON feeds refresh every 15 minutes. Check /api/v1/freshness
(stale: true means the data is older than its expected cadence) before
caching answers for long.