Webhook po transkrypcji z podpisem HMAC-SHA256

Webhook po transkrypcji pozwala ci czekać na powiadomienie zamiast co chwilę odpytywać API o status. Dodaj webhook_url przy tworzeniu transkrypcji. Wyślemy podpisany POST, gdy się skończy albo nie uda.

  • Zdarzenia transcription.completed i transcription.failed
  • Każdy webhook z podpisem HMAC-SHA256
  • Do 6 prób, z coraz dłuższymi przerwami

Odbierz zdarzenie i pobierz gotowy tekst

Powiadomienie po zakończeniu lub błędzie
Wysyłamy transcription.completed albo transcription.failed. Jeśli anulujesz transkrypcję, webhook nie przyjdzie.
Podpis do sprawdzenia u ciebie
Nagłówek X-Transcript1-Signature zawiera czas i podpis HMAC-SHA256 surowego body. Do obliczenia podpisu używamy sekretu twojego zespołu z prefiksem whsec_.
Ponawiamy, gdy endpoint nie potwierdzi odbioru
Dowolny status 2xx kończy dostarczanie. W przeciwnym razie czekamy kolejno 2, 4, 8, 16 i 32 minuty przed następną próbą. Łącznie wykonujemy do 6 prób.
Tylko publiczny adres HTTPS
Sprawdzamy adres przy tworzeniu transkrypcji i przy każdej próbie dostarczenia webhooka. Musi używać HTTPS i prowadzić do publicznego adresu.
Tekst pobierzesz osobno
Zdarzenie zawiera obiekt transkrypcji bez tekstu. Po otrzymaniu transcription.completed pobierz gotową transkrypcję po ID w potrzebnym formacie.

Dodaj webhook_url do requestu

Podaj webhook_url przy wysyłaniu linku, rezerwacji uploadu w częściach lub jako pole formularza przy uploadzie jednym requestem. Nie można łączyć go z reuse_recent. Sprawdź parametry webhooka.

Webhook przydaje się, gdy aplikacja ma działać dalej po zamknięciu pierwszego requestu. Może przetwarzać wywiady, budować archiwum odcinków albo zbierać transkrypcje filmów z social mediów. Zapisz ID transkrypcji przy własnym zadaniu, żeby później dopasować powiadomienie do właściwej osoby i nagrania.

Podaj docelowy, publiczny endpoint HTTPS. Nie używaj adresu, który przekierowuje dalej. Sprawdzamy go przy tworzeniu i dostarczaniu. localhost nie zadziała jako odbiorca, również podczas developmentu.

Poniższy przykład wysyła własny plik. Możesz na takim nagraniu przetestować cały proces powiadamiania.

Upload z powiadomieniem po transkrypcji
curl -X POST "https://api.transcript1.com/v1/transcriptions" \
  -H "Authorization: Bearer $TRANSCRIPT1_API_KEY" \
  -F [email protected] \
  -F webhook_url=https://example.com/hooks/transcript1

Zapisz zdarzenie, potwierdź odbiór, potem pobierz tekst

W data dostaniesz obiekt transkrypcji bez tekstu. Para data.id i type pozwala rozpoznać powtórne dostarczenie. Gotowy tekst pobierz przez GET transkrypcji.

Ten sam webhook może przyjść ponownie, nawet jeśli go przetworzysz. Wystarczy, że odpowiedź twojego endpointu dotrze po limicie 10 sekund. Zanim opublikujesz artykuł lub powiadomisz użytkownika, trwale zapisz klucz złożony z ID transkrypcji i typu zdarzenia.

Po sprawdzeniu podpisu zapisz zdarzenie lub dodaj je do trwałej kolejki i szybko odpowiedz statusem 2xx. Pobieranie tekstu po data.id wykonaj w tle.

Przy transcription.failed odczytaj data.error i zaktualizuj status w swojej aplikacji. Anulowanie nie wywołuje webhooka, więc obsłuż zmianę statusu również tam, gdzie anulujesz transkrypcję.

POST na twój endpoint
X-Transcript1-Signature: t=<unix seconds>,v1=<hex digest>

{
  "type": "transcription.completed",
  "created_at": "2026-10-13T09:30:04.000Z",
  "data": {
    "id": "tr_8fK2Lm0PqRsTuVwXyZaBcD",
    "object": "transcription",
    "status": "completed",
    "transcript_source": "speech_to_text",
    "billed_minutes": 4,
    "error": null
  }
}

Jak zweryfikować podpis webhooka HMAC-SHA256

Oblicz HMAC-SHA256 dla ciągu t, kropki i surowego body, używając swojego sekretu whsec_. Porównaj podpisy w stałym czasie i odrzuć zbyt odległy znacznik czasu. Sprawdź pełną procedurę weryfikacji.

Zachowaj body dokładnie w takiej postaci, w jakiej przyjdzie, zanim parser JSON je przetworzy. Ponowna serializacja może zmienić spacje lub kolejność pól i zepsuć weryfikację.

Najpierw sprawdź nagłówek, czas i podpis. Skróty muszą mieć tę samą długość, a porównanie powinno działać w stałym czasie. Dopiero po poprawnej weryfikacji parsuj JSON. Krótki przykład poniżej zakłada, że t i v1 są już wyciągnięte z nagłówka i sprawdzone.

W dokumentacji znajdziesz kompletne przykłady dla Node.js i Pythona z tolerancją czasu 5 minut. Używaj całego sekretu, razem z prefiksem whsec_. Po zmianie sekretu od razu podpisujemy nim kolejne webhooki.

Node.js
const expected = crypto
  .createHmac('sha256', secret)
  .update(`${t}.${rawBody}`)
  .digest('hex');
const valid = v1.length === expected.length
  && crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));

Przetestuj błędy i powtórne dostarczenie

Wyślij do swojego handlera zdarzenie zakończenia, błędu i duplikat. Sprawdź, czy nie publikuje dwa razy tej samej treści i nie próbuje publikować tekstu po nieudanej transkrypcji. Odrzucenie złego podpisu testuj osobno od błędów dalszego przetwarzania.

Endpoint ma 10 sekund na odpowiedź. Nie czekaj w nim na indeksowanie ani pracę modelu. Po potwierdzeniu odbioru dalsze próby powinny należeć do kolejki w twojej aplikacji. Nasze ponawianie webhooków jej nie zastępuje.

Przy odpowiedzi innej niż 2xx, błędzie połączenia lub przekroczeniu czasu ponowimy dostarczenie po przerwach 2, 4, 8, 16 i 32 minut. Łącznie wykonujemy do 6 prób. Nie podążamy za przekierowaniami.

Loguj ID transkrypcji, typ zdarzenia i to, czy dostarczenie się udało. Nie loguj sekretu. Gdy próby się wyczerpią, sprawdź zapisane ID przez API transkrypcji. Zachowuj je już przy tworzeniu, żeby brak powiadomienia dało się wyjaśnić bez ponownego wysyłania nagrania.

Na start dostajesz 60 minut

Załóż konto, potwierdź e-mail i wykorzystaj 60 minut za darmo. To jednorazowa pula. Bez karty.

Utwórz klucz API

Najczęstsze pytania

Nie ma tu odpowiedzi na twoje pytanie? Napisz do nas

Gdzie znajdę sekret do sprawdzania podpisu?

W panelu na stronie „Webhooks”. Zaczyna się od whsec_ i należy do całego zespołu. Możesz go tam w każdej chwili zmienić.

Co jeśli mój endpoint chwilowo nie działa?

Ponawiamy dostarczenie z coraz dłuższymi przerwami, do 6 prób łącznie w ciągu około godziny. Każda próba ma limit 10 sekund. Nie podążamy za przekierowaniami.

Webhooki działają też przez MCP?

Nie. Dodasz je tylko przez REST API. Narzędzia MCP czekają na transkrypcję albo zwracają ID, żeby asystent mógł odczytać ją później.