Webhooks
A webhook turns a Glossa service into a feed: for each sentence the speaker finishes, Glossa sends one HTTP POST to a URL you choose, carrying the original text and the translations you asked for. Use it to drive your own captions display, store a transcript in your own system, or connect to n8n, Make or Zapier. Webhooks are on every plan.
Turn it on
Section titled “Turn it on”- Open the service and click Advanced Settings, below the Start Streaming button.
- Expand Webhook Integration and switch on Enable webhook notifications.
- Enter your Webhook URL, a public address on your server such as
https://example.org/glossa/8f3a9c1d2e. - Under Send content, choose Text translations, Audio files (the translated AI voice as MP3), or both. If both are off, the webhook is off.
- Under Languages to send, pick the languages you need. Leave the list empty to receive whatever languages listeners currently request.
- Save, then stream as usual.
Settings are stored per service. Changes take effect on the next stream (the service settings are cached for up to 10 minutes).
What your server receives
Section titled “What your server receives”One POST per utterance, carrying every language you selected:
{ "serviceId": "3f9c1a2e-5b7d-4e8f-9a0b-1c2d3e4f5a6b", "originalText": "Welcome, everyone, to our Sunday service.", "translations": { "es": "Bienvenidos todos a nuestro servicio dominical.", "fr": "Bienvenue à tous à notre culte du dimanche." }, "audioData": { "es": "<base64 MP3>", "fr": "<base64 MP3>" }, "timestamp": "2026-10-12T15:04:05.000Z", "sequence": 0}| Field | Type | Meaning |
|---|---|---|
serviceId |
string | The service id, the same UUID as in your listener link. |
originalText |
string | What the speaker said, in the speaker’s language, after your transcript replacements. |
translations |
object | Translated text keyed by language code. {} when text sending is off. |
audioData |
object | Base64 MP3 of the translated voice, keyed by language. Present only when audio sending is on. |
timestamp |
string | ISO 8601, UTC. Set when the utterance started. |
sequence |
integer | Counts up from 0 for the stream. Restarts at 0 if the stream is idle for 30 minutes or the service restarts. |
There is no source-language field. The speaker language is in your service settings.
Headers
Section titled “Headers”Every request carries:
POST /glossa/8f3a9c1d2e HTTP/1.1Content-Type: application/jsonUser-Agent: Glossa-Webhook/1.0X-Service-Id: 3f9c1a2e-5b7d-4e8f-9a0b-1c2d3e4f5a6bX-Sequence: 0X-Timestamp: 2026-10-12T15:04:05.000ZRequests are not signed and carry no secret header. Treat the URL itself as the secret: use a long, random path segment that only Glossa knows, and reject requests whose X-Service-Id is not one of your services.
Delivery, order and retries
Section titled “Delivery, order and retries”- One POST per utterance, in spoken order. Glossa waits until every language you asked for is ready (up to 30 seconds), then sends. When 50 utterances are already waiting for a slow endpoint, new ones are dropped until the backlog drains.
- Reply within 5 seconds with any 2xx status. Do the slow work after you have replied.
- Retries. A network error, a timeout, a 5xx, a 408 or a 429 is retried twice, after 0.5 s and then 1 s, three attempts in total. Any other 4xx is not retried.
- Redirects are not followed. Point the URL at the final endpoint.
- No size cap. With audio on, a single request for several languages can be a few megabytes. Raise your body-size limit.
URL rules
Section titled “URL rules”https:is recommended;http:is accepted.- The host must resolve to a public address. Private and local ranges are refused, including
localhost,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.254.0.0/16,100.64.0.0/10and their IPv6 equivalents. The refusal is logged only on Glossa’s side: from yours, nothing arrives. Write to info@glossa.live if you suspect this and we will check. - To test from a laptop, use a tunnel (ngrok, Cloudflare Tunnel) or a throwaway endpoint such as webhook.site.
Billing
Section titled “Billing”Every language in Languages to send is translated for the whole stream, even when nobody is listening to it, and with audio on it is also voiced. Each one is billed like a listener language: per minute of speech, $5 per hour per language on Pay As You Go, or from your plan’s included hours. Select only what you need.
A minimal receiver
Section titled “A minimal receiver”// npm i expressimport express from 'express';
const app = express();app.use(express.json({ limit: '10mb' })); // audio payloads are large
app.post('/glossa/8f3a9c1d2e', (req, res) => { res.sendStatus(200); // acknowledge first, work second const { sequence, originalText, translations } = req.body; console.log(sequence, originalText, translations.es);});
app.listen(3000);If nothing arrives
Section titled “If nothing arrives”- The stream must be live and someone must be speaking. Silence produces no sentences.
- Check that at least one of Text translations or Audio files is on, and that the URL is public.
- A 4xx from your server stops delivery for that sentence without retries. Log the status you return.
- Paste a webhook.site URL and start a one-minute test stream to see real payloads.