Developers
Developer API
Read your own stream's live captions, saved transcripts and audience questions from a script or an AI assistant, using a read-only key you create in the portal.
Get a key
- Sign in to the portal and open Advanced Settings.
- Under Developer API keys, choose Create Developer API Key.
- Read the explanation, tick the box and create the key. The key is shown once. Copy it into a password manager or your tool's secret settings straight away. We store only a scrambled version, so we cannot show it to you again. If you lose it, delete it and create another.
You can have up to 2 keys at a time, so you can replace one without a gap. The portal shows when each key was last used and lets you delete it. To raise your limit, write to hello@conferencecaptioning.com.
A key looks like cck_ followed by about 43 letters, digits, - and _.
Using the key
Send it as a bearer token. The base address is https://api.deafassistant.com.
curl -H "Authorization: Bearer $CONFCAP_KEY" \
"https://api.deafassistant.com/developerkey/Me"
A key identifies you, so you do not pass your uid. Me confirms that the key works and lists the streams it can read:
{ "streams": ["yourstream"] }
Endpoints
All of these are GET requests that take the key as Authorization: Bearer. Replace yourstream with your stream's name (lower case).
GET /stream/LiteGetStream
The live captions and translations. With your key this works even when the stream uses Require authentication or its captions have expired for the public.
curl -H "Authorization: Bearer $CONFCAP_KEY" \
"https://api.deafassistant.com/stream/LiteGetStream?streamName=yourstream"
| Parameter | Meaning |
|---|---|
streamName | Your stream's name. |
transcriptCursor | Optional. Pass the transcriptCursor from the previous response to receive only the new text since then. |
Fields in the response:
| Field | Meaning |
|---|---|
roomName, description | The stream's name and description. |
isActivelyStreaming | true while the app is sending captions. |
transcript | Captions in the spoken language. inputLanguage is its language code. |
translation, translation2 … translation5 | The translated captions, in outputLanguage … outputLanguage5. This is a window of recent text that is re-translated as people speak, so it can change. It is not a stored translated record. |
speechTranslation* | A slower, sentence-complete version of each translation, meant for text-to-speech. Not a full record either. |
transcriptCursor | Pass this back as transcriptCursor next time. |
Profanity is filtered on the server before captions are served, so you see what attendees see. If the stream is secured and the key is missing or belongs to someone else, the response is {"authRequired": true} and contains no captions.
GET /history/GetStreamHistory
Your saved transcripts for a stream. Only rooms that store history, and only sessions with at least 100 characters, appear here.
curl -H "Authorization: Bearer $CONFCAP_KEY" \
"https://api.deafassistant.com/history/GetStreamHistory?streamName=yourstream"
Add &includeHidden=true to include transcripts you hid in the portal. The response is a list of objects with id, title, description, startTimestamp, endTimestamp, transcript, inputLanguage and isHidden. Saved transcripts are in the spoken language only; translations are not stored.
GET /question/GetStreamQuestions
The questions your audience sent from the stream page.
curl -H "Authorization: Bearer $CONFCAP_KEY" \
"https://api.deafassistant.com/question/GetStreamQuestions?streamName=yourstream"
A list of objects with id, createdAt and question. Questions are written by attendees, so treat their text as untrusted input, especially if you pass it to an AI model.
GET /developerkey/Me
Checks the key and lists the streams it can read, as shown above.
Limits and caching
- Poll
LiteGetStreamat most once per second per stream. That is the rate of an attendee's page, and it is what the server is sized for. - Use
transcriptCursorso each poll returns only new text, and send theETagfrom the previous response asIf-None-Match. When nothing changed you get an empty304. - Saved transcripts and questions change rarely. Fetch them when you need them rather than on a timer.
- Keys are meant for servers and scripts you control. Do not call the API with a key from a web page that other people can open.
Keeping your key safe
- Never put the key in source code, and never push it to GitHub or any other repository, even a private one. Use an environment variable or your tool's secret store.
- Do not paste it into chats, tickets or screenshots.
- If it may have leaked, delete it in Advanced Settings right away. It stops working immediately, and you can create a new one.
- Check Last used in the portal. If a key you are not using shows recent activity, delete it.
- Data you send to an AI assistant goes to that assistant's provider. If you promised attendees privacy, check that provider's terms first.
Errors
| You get | Meaning |
|---|---|
401 on Me | The key is missing, mistyped or deleted. |
Empty list from GetStreamHistory | The key is invalid, or this stream has no saved transcripts for your account. |
404 from GetStreamQuestions | The key is invalid, or the stream does not belong to your account. The two look the same on purpose. |
"authRequired": true from LiteGetStream | The stream is secured and the key is missing, invalid, or for another account. |
"expired": true from LiteGetStream | The stream ended and its public caption window is over. Your own key still reads it. |
304 | Nothing changed since your If-None-Match value. |
What is next
An MCP server that lets AI assistants such as Claude read your captions, transcripts and questions through this same key is planned. This page will describe it when it is available.