Webhooks
Seja avisado quando uma transcrição termina, sem ficar consultando.
Passe webhook_url ao criar
curl -sS "$NOUS_API_BASE_URL/transcriptions?webhook_url=https://seusistema.com.br/nous" \
-H "Authorization: Bearer $NOUS_API_KEY" \
-H "Content-Type: audio/mpeg" \
--data-binary "@aula-longa.mp3"O endereço precisa ser https e público.
Receba o aviso
A Nous faz um POST no seu endereço com um destes eventos:
transcription.completedtranscription.failed
{ "event": "transcription.completed", "data": { "id": "tr_8f2k9d7c", "status": "completed", "text": "..." } }data é o mesmo objeto de consultar transcrição.
Confira a assinatura
Todo aviso vem com o cabeçalho:
Nous-Signature: t=1757770000,v1=5158a312be6bb5deec8b1cac7033264e34825fcd722c39f66699f843d7091d9fv1 é o HMAC-SHA256, em hexadecimal, de t.corpo com o segredo de webhook da sua conta. Recuse avisos com t a mais de 5 minutos do relógio e compare em tempo constante.
import hashlib
import hmac
import re
import time
def assinatura_valida(segredo: str, corpo: str, cabecalho: str) -> bool:
achado = re.fullmatch(r"t=(\d+),v1=([0-9a-f]+)", cabecalho or "")
if not achado:
return False
momento, recebido = achado.group(1), achado.group(2)
if abs(time.time() - int(momento)) > 300:
return False
esperado = hmac.new(segredo.encode(), f"{momento}.{corpo}".encode(), hashlib.sha256).hexdigest()
return hmac.compare_digest(esperado, recebido)Use o corpo exatamente como chegou, antes de converter o JSON.
Responda 2xx
Se o seu servidor não responder 2xx, a Nous tenta de novo depois de 1 s, 10 s e 60 s.