API reference
The API, for your church’s own tools.
Voclyn’s REST API lets your church’s tools read its rooms, press the service buttons, and fetch past services and their transcripts. It answers in JSON at https://voclyn.com/api/v1, with a key made in Dashboard › Integrations.
Keys
Owners and admins make keys in Dashboard › Integrations › API keys, up to 10 at once. A key is shown once, as it is made: we keep only a fingerprint of it and its first characters, so a lost key is replaced, never recovered. Revoking one stops it at its next request.
| Access | What it reaches |
|---|---|
| Booth buttons | The church, its rooms and the service buttons. For the booth computer: Stream Deck, Companion. |
| Full access | All of that, plus past services and their transcripts. For your own server, never for a web page anyone can read. |
Send the key in every request’s Authorization header:
curl https://voclyn.com/api/v1/rooms \
-H "Authorization: Bearer $VOCLYN_KEY"Requests and answers
Every answer is JSON and never cached. Times are ISO 8601 in UTC; languages are the codes of your per-language links (es, ko, zh-Hant). Lists come as { "data": [ … ] }. When something goes wrong, the status says what kind and the body says why, for programs and for people:
{ "error": { "code": "not_live", "message": "Worship needs a service running in this room, and none is." } }| Status | Code | Meaning |
|---|---|---|
| 200, 202 | — | Done; 202 when the sound desk page was asked to go live and hasn’t yet. |
| 400 | bad_request | A parameter is wrong; the message says which. |
| 401 | unauthorized | No key, or one that is revoked or copied in part. |
| 403 | plan_required, forbidden | The church is on Free, or a booth key asked for services or transcripts. |
| 404 | not_found, no_transcript | No such room, service or button; or the service has no saved transcript. |
| 409 | not_live, desk_closed | A button needs a running service, or (Go live) an open sound desk page. |
| 429 | rate_limited | More than 120 requests a minute; wait the seconds in Retry-After. |
| 503 | unavailable | The live service couldn’t be reached; try again in a minute. |
The API answers browsers from any site (CORS), because a key never travels in a cookie. That is also why a full key must stay on a server: anyone who can read a page’s code can read a key in it.
Rooms
GET /rooms lists the church’s rooms, the main one first; GET /rooms/{room} reads one. A room is named by its id or by its link word (grace in voclyn.com/grace). Each comes with its live state:
{
"id": "4f1c2a9e-8b3d-4e62-9a71-0c5d6e7f8a9b",
"name": "Sanctuary",
"slug": "grace",
"main": true,
"link": "https://voclyn.com/grace",
"screen_link": "https://voclyn.com/grace/screen",
"status": "paused",
"reason": "worship",
"desk_open": true,
"service_id": "9b2e5c1a-3d4f-4a6b-8c7d-1e2f3a4b5c6d",
"spoken_languages": ["en"],
"languages": ["es", "zh-Hant"],
"voice_languages": ["es", "zh-Hant"],
"last_live_at": "2026-11-01T17:02:11.004Z"
}status:idle,starting(the sound desk page was asked to go live),live,paused, orendedfor a while after a service, until the room turnsidleagain.reason: while paused,worship,privateorbreak.desk_open: a sound desk page is open for the room, so Go live can work.languagesandvoice_languages: the church’s own languages for the room, as its plan offers them, and those of them the AI voice reads (each that has a voice).
Services
GET /services lists past and running services, newest first, and needs a full key. room narrows it to one room, limit sets the page (1 to 100, 20 by default), and before pages back: pass the next_before of the last page while has_more is true. GET /services/{id} reads one, with whether its transcript is saved.
{
"id": "9b2e5c1a-3d4f-4a6b-8c7d-1e2f3a4b5c6d",
"room": { "id": "4f1c2a9e-8b3d-4e62-9a71-0c5d6e7f8a9b", "name": "Sanctuary", "slug": "grace" },
"status": "ended",
"started_at": "2026-11-01T17:02:11.004Z",
"ended_at": "2026-11-01T18:14:40.498Z",
"duration_seconds": 4349,
"peak_listeners": 38,
"listener_minutes": 2410,
"spoken_languages": ["en"],
"languages": ["es", "zh-Hant"],
"voice_languages": ["es", "zh-Hant"],
"listeners_by_language": { "es": { "peak": 24 }, "zh-Hant": { "peak": 14 } },
"sentences": 612,
"transcript": true
}Transcripts
GET /services/{id}/transcript returns a saved transcript, if the room saves them. Add lang for one listener language and format for json (the default), txt or srt subtitles. In JSON, text is null for a line nobody was reading in that language at the time; text and SRT show the words as spoken there.
{
"service_id": "9b2e5c1a-3d4f-4a6b-8c7d-1e2f3a4b5c6d",
"language": "es",
"lines": [
{
"seq": 1,
"start_ms": 0,
"end_ms": 4200,
"speaker": "1",
"spoken_language": "en",
"original": "Good morning, church.",
"text": "Buenos días, iglesia."
}
]
}curl "https://voclyn.com/api/v1/services/9b2e5c1a-3d4f-4a6b-8c7d-1e2f3a4b5c6d/transcript?lang=es&format=srt" \
-H "Authorization: Bearer $VOCLYN_KEY" -o sermon-es.srtTranscripts are kept for the plan’s period: 90 days on Chapel and 12 months on Church and Campus. A private moment is never saved.
The church
GET /church names the church the key belongs to, its time zone, its plan today, and whether the key is a booth or a full key. GET /api/v1 needs no key and says where these pages are.
Changes
Version 1 keeps its paths and fields. New fields and new buttons may appear in it, so read the fields you need and ignore the rest; anything that would break a working tool comes as version 2, announced in advance. Webhooks are described in their own page.
Questions
What churches ask.
Something else on your mind? Write to us at hello@voclyn.com.
Yes. Voclyn's REST API at https://voclyn.com/api/v1 reads a church's rooms with their live state, presses the service buttons, and returns past services and their transcripts as JSON, text or SRT. It comes with Chapel, Church and Campus, and the free month.
An owner or admin makes one in Dashboard › Integrations › API keys. It is shown once; choose Booth buttons for a Stream Deck, Full access for your own server.
It asks the room's open sound desk page to go live, because the sound comes from there. With no sound desk page open, it answers 409 desk_closed.
Yes: GET /services/{id}/transcript?lang=es&format=srt returns SubRip subtitles in that language, when the room saves transcripts.
Try it this Sunday.
Set up your church in a minute and hear it live with your own voice. Your QR code keeps working after the free month.
Your first month is on us: the Church plan, normally $99 a month, with unlimited listeners, translation hours and AI voiceover. No card; then choose a plan, or stay on Free.