Skip to content

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.

  1. Open the service and click Advanced Settings, below the Start Streaming button.
  2. Expand Webhook Integration and switch on Enable webhook notifications.
  3. Enter your Webhook URL, a public address on your server such as https://example.org/glossa/8f3a9c1d2e.
  4. Under Send content, choose Text translations, Audio files (the translated AI voice as MP3), or both. If both are off, the webhook is off.
  5. Under Languages to send, pick the languages you need. Leave the list empty to receive whatever languages listeners currently request.
  6. 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).

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.

Every request carries:

POST /glossa/8f3a9c1d2e HTTP/1.1
Content-Type: application/json
User-Agent: Glossa-Webhook/1.0
X-Service-Id: 3f9c1a2e-5b7d-4e8f-9a0b-1c2d3e4f5a6b
X-Sequence: 0
X-Timestamp: 2026-10-12T15:04:05.000Z

Requests 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.

  • 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.
  • 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/10 and 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.

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.

// npm i express
import 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);
  • 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.
Still stuck?Chat with us on glossa.live or write to info@glossa.live. Most questions get an answer within the day.