Live worship broadcasts for your website — open access
Introduction
The Synodal Commission of the UOC for Monastery Affairs maintains a list of live worship broadcasts from the official channels of monasteries of the Ukrainian Orthodox Church. We give the same data to any website that wants to show these services on its own pages: a parish, a diocese, a monastery, an Orthodox community abroad. Free, no registration, no keys, no agreement to sign.
The reason is simple. Someone looking for a service online usually arrives not at a central portal but at their own parish website — and that is where they should see which service is on air right now. Keeping a channel list of its own is beyond a parish; for us it costs nothing, because the list already exists.
What we provide
Two feeds, each in three languages — Ukrainian, Russian and English.
On air right now — embedded players for the services being broadcast at this moment. When nothing is on air the feed is empty, and that is the normal expected state, not a failure: most monasteries serve to their own schedule rather than around the clock.
The channel list — icon, monastery name, diocese and region, link to the channel. It works as a standalone "Services online" section on your site.
The data is refreshed roughly every ten minutes.
Option one — a single line
The simplest way. Put this line where the block should appear:
<script src="https://inok.info/api/embed.js" data-type="live" data-lang="en" async></script>
The script creates its own container immediately after itself and loads the broadcasts into it. It uses no document.write, adds nothing to <head>, creates no global variables, sets no cookies and collects no analytics of any kind. Two such lines on one page do not conflict.
Settings come from data- attributes:
| Attribute | Value | Default |
|---|---|---|
data-type | live (on air now) or channels (channel list) | live |
data-lang | uk, ru, en | uk |
data-limit | 1–50, how many entries to show | all |
data-refresh | refresh period in seconds, minimum 60 | no refresh |
data-attribution | 0 removes the credit line from the block | 1 |
A value outside the permitted range (data-limit outside 1–50, data-refresh below 60) is not an error — the parameter simply falls back to its default.
Refreshing pauses while the tab is hidden and resumes when the reader comes back. If our server is unreachable, the container shows a plain text link to the broadcasts page — your page is never left with an empty hole.
Note: data-attribution="0" removes the line from the block, and you then place the credit yourself — see "Terms of use", item 1.
Option two — a request to /api/live/
If you build the presentation yourself, take the data directly:
https://inok.info/api/live/
The response comes as ready-made HTML, JSON or JSONP. The request is anonymous, the method is GET (also HEAD and OPTIONS); no keys, no registration. The Access-Control-Allow-Origin: * header is present, so the address can be loaded straight from a browser — fetch, XMLHttpRequest, any library.
Parameters
| Parameter | Value | Default |
|---|---|---|
type | live, channels | live |
lang | uk, ru, en | uk |
format | html, json, jsonp | html |
callback | function name; only together with format=jsonp | — |
limit | integer 1–50 | all entries |
id | channel numbers, comma-separated, max 20 | all |
attribution | 1, 0 — the credit line in html format | 1 |
theme | none, light, dark — adds one wrapper class | none |
pretty | 1, 0 — formatted JSON | 0 |
Unknown parameters are simply ignored. An invalid value returns 400 with an explanation in JSON, for example:
{"error":"bad_parameter","parameter":"limit","allowed":["integer 1-50"]}
An empty feed is 200 with "count": 0, never 404: no service on air is not an error. A POST, PUT or DELETE request receives 405 — nothing here is writable, the endpoint is read-only.
Ready-made HTML
https://inok.info/api/live/?type=live&lang=en&format=html
The response is a plain fragment: no <html>, no <head>, no styles or scripts of its own. It inherits your page's styling, so it looks like part of the page rather than a foreign insert. Include it server-side:
<?php
echo file_get_contents('https://inok.info/api/live/?type=live&lang=en&format=html');
JSON
https://inok.info/api/live/?type=live&lang=en&format=json
{
"version": 1,
"type": "live",
"lang": "en",
"generated_at": "2026-08-16T02:40:05+00:00",
"count": 1,
"source": "https://inok.info/live/?lang=en",
"attribution": { "text": "…", "url": "…", "rel": "nofollow", "html": "…" },
"items": [
{
"id": 1686,
"title": "Live broadcast of the divine service † Holy Dormition Pochaiv Lavra",
"name": "Pochaiv Dormition Lavra",
"eparchy": "Kyiv",
"region": "Ternopil",
"channel_url": "https://www.youtube.com/channel/…",
"image": "https://inok.info/images/live/1686/channel/ico150.webp",
"video_id": "…",
"embed_url": "https://www.youtube-nocookie.com/embed/…",
"html": "…"
}
]
}
Each entry's html field is the same fragment format=html returns, so you can take either the ready-made presentation or the raw fields. In the channel list (type=channels) the title, video_id and embed_url fields are empty (null): a channel has no single broadcast of its own.
Caching
The response carries Cache-Control: public, max-age=300 and an ETag. Send the ETag back in an If-None-Match header and the server answers 304 with no body — the cheapest way to check for updates often. Keeping your own copy for about five minutes is plenty; more frequent requests add nothing.
Option three — the permanent fragment addresses
The same two feeds are also served at their own permanent addresses. We keep them unchanged for sites that embedded them earlier, and we do not plan to change them:
https://inok.info/local/templates/skm1c/php/html_blocks/html_live_out_en.php
https://inok.info/local/templates/skm1c/php/html_blocks/html_live_out_channels_en.php
Replace en with uk or ru. The content of these addresses is byte-identical to the /api/live/?format=html response. For a new integration the first or second option is more convenient — it offers the language choice, a limit and a per-channel filter.
Styling classes
You style everything with your own rules — we send no CSS at all.
Current broadcasts: html-live-block, html-live-description, html-live-title, html-live-location, html-live-video, youtube-live-block.
Channel list: html-end-live-block, html-end-live-img, html-end-live-description, html-end-live-title, html-end-live-name, html-end-live-location.
In both feeds, the credit line: html-live-attribution. The theme=light or theme=dark parameter wraps the block in api-live-theme-light / api-live-theme-dark — a hook for your own stylesheet; it ships no styling of its own.
Channel icons load from inok.info; there is no need to copy them.
Terms of use
We ask for no registration, no payment and no written agreement. The terms are these five items in full.
- The credit line stays visible. A line reading "Broadcasts provided by inok.info" comes with the data. It must remain present, legible and visible to a human reader — at a size and contrast comparable to the surrounding content. It is the only thanks we ask and the only condition we set. If you need to remove it from the block (
attribution=0ordata-attribution="0"), place your own visible link toinok.infoalongside — that is permitted, and more honest than stripping our markup. - Use is free, including commercial use. You may display the data, restyle it and redistribute it, including on sites carrying advertising or other income. The condition is the one in item 1 — the source credit is kept. The attribution clause of CC BY 4.0 is the model we follow.
- We license our own compilation, not the broadcasts themselves. What is ours is the list, the description and the markup we hand you. Rights in the worship broadcasts belong to the monasteries and their channels, and the video plays through YouTube's own player under that service's terms. We cannot and do not attempt to grant you rights in someone else's video.
- The source link carries
rel="nofollow", permanently. Search engine rules require this for links distributed through embedded blocks. Do not remove the attribute — doing so puts both your site and ours at risk. - The feed changes, and we promise no uptime. Monasteries are added, broadcasts start and end, and an empty response is a normal state. Do not rely on a fixed number of entries and do not store the response as a static file — fetch it each time.
Where to go next
The broadcasts page itself — Services online. Who we are and why we keep this list — about the Commission. The directory of UOC monasteries with a map and contacts — monasteries.
If your monastery broadcasts services and its channel is missing from the list, or something does not work — write to us: contacts.