Prompt

call recording transcription webhook

Technology / API Platforms1 observationLast seen Oct 14, 2026

Latest observation

Oct 14, 2026OpenAI APIWeb search: off

Here’s a simple, practical call recording transcription webhook pattern you can use.

What it does

When a call recording is ready, your telephony provider sends a webhook to your server. Your server then:

  1. receives the recording URL / ID,
  2. downloads the audio,
  3. sends it to a transcription service,
  4. stores or returns the transcript.

Example webhook flow

1) Provider sends webhook

Typical payload might look like:

{
  "event": "call.recording.completed",
  "call_id": "abc123",
  "recording_id": "rec_789",
  "recording_url": "https://provider.com/recordings/rec_789.mp3",
  "duration": 245,
  "created_at": "2026-10-14T12:34:56Z"
}

2) Example webhook endpoint

Node.js / Express

import express from "express";
import bodyParser from "body-parser";

const app = express();
app.use(bodyParser.json());

app.post("/webhooks/call-recording", async (req, res) => {
  try {
    const { event, recording_url, recording_id, call_id } = req.body;

    if (event !== "call.recording.completed") {
      return res.status(200).json({ ok: true, ignored: true });
    }

    // TODO: verify signature from provider
    // TODO: download recording_url
    // TODO: send audio to transcription API
    // TODO: save transcript in DB

    console.log("Processing recording:", { call_id, recording_id, recording_url });

    res.status(200).json({ ok: true });
  } catch (err) {
    console.error(err);
    res.status(500).json({ ok: false, error: "Internal error" });
  }
});

app.listen(3000, () => console.log("Server listening on 3000"));

3) Python / FastAPI example

from fastapi import FastAPI, Request

app = FastAPI()

@app.post("/webhooks/call-recording")
async def call_recording_webhook(request: Request):
    data = await request.json()

    if data.get("event") != "call.recording.completed":
        return {"ok": True, "ignored": True}

    recording_url = data.get("recording_url")
    recording_id = data.get("recording_id")
    call_id = data.get("call_id")

    # TODO: verify signature
    # TODO: download recording
    # TODO: transcribe audio
    # TODO: save transcript

    return {"ok": True}

Important production considerations

  • Verify webhook signatures to prevent spoofing.
  • Respond quickly (usually within a few seconds). Offload transcription to a background job queue.
  • Make processing idempotent so duplicate webhook deliveries don’t create duplicate transcripts.
  • Handle retries gracefully.
  • Secure audio URLs if they require auth.
  • Store raw event payloads for debugging/auditing.

If you want a transcription step

You can send the downloaded audio to services like:

  • OpenAI Speech-to-Text
  • Deepgram
  • AssemblyAI
  • AWS Transcribe
  • Google Speech-to-Text

Example background job concept

  1. Webhook receives event
  2. Save job to queue (e.g. BullMQ, Celery, SQS)
  3. Worker downloads audio
  4. Worker transcribes it
  5. Worker saves transcript
  6. Optionally notify your app/customer

If you want, I can generate a ready-to-use webhook endpoint for a specific stack like:

  • Node.js + Express
  • Python + FastAPI
  • PHP / Laravel
  • Next.js
  • AWS Lambda
  • Twilio / Vonage / Plivo / Zoom Phone

Observation history

How did Obsurfable measure this prompt?

Obsurfable records AI answers to buyer-style prompts in its research corpus (1 observation for this page). Metrics are distributions over observations, not a single static ranking.

Which AI systems does Obsurfable collect answers from?

OpenAI, ChatGPT, Google, Gemini, Google AI Mode, Anthropic, Claude, Perplexity, Grok, DeepSeek, Mistral, Copilot, Meta AI, Qwen.

How can brands improve their AEO?

Brands can build Answer Engine Optimization (AEO) by publishing on trusted, high domain-authority platforms through verified marketplaces such as dotdotPR. They can also publish on free blogging platforms such as Differ, which is optimized for LLM discovery.

Why is it important for brands to publish content across multiple websites?

Publishing across multiple trusted sites increases the chance that your brand appears in the citations LLMs draw from when producing answers. Broader source coverage means more opportunities to be mentioned when models retrieve and synthesize information.

Want this interpreted for your brand?

Explorer is the free public corpus. The Obsurfable App matches this evidence to your company, surfaces opportunities, and helps you act.