Szybki start
Prześlij swoją pierwszą rozmowę i odczytaj transkrypcję.
Prześlij nagranie, poczekaj na jego przetworzenie i odczytaj wynik. Potrzebujesz klucza API — utwórz go w
aplikacji w sekcji Organizacja → Ustawienia → Klucze API (zobacz uwierzytelnianie) — oraz
nagrania; w przykładach używamy pliku call.wav. Kroki w powłoce wymagają curla w wersji 7.76 lub nowszej oraz
jq do wyciągania identyfikatorów z odpowiedzi.
1. Ustaw klucz i wybierz projekt
export AFTERTALK_KEY="at_live_..."
export BASE="https://app.aftertalk.co/api"
# The first project in your organization. GET /v1/projects lists them all.
export PROJECT_ID=$(curl -sS --fail-with-body "$BASE/v1/projects" \
-H "X-API-Key: $AFTERTALK_KEY" | jq -r '.[0].id')
echo "$PROJECT_ID"2. Prześlij nagranie
UPLOAD=$(curl -sS -X POST "$BASE/v1/projects/$PROJECT_ID/calls/upload" \
-H "X-API-Key: $AFTERTALK_KEY" \
-F "file=@call.wav;type=audio/wav")
export JOB_ID=$(echo "$UPLOAD" | jq -r '.jobId // .existingJobId')
if [ "$JOB_ID" = null ]; then
echo "Upload failed: $(echo "$UPLOAD" | jq -r '.message')"
else
echo "$JOB_ID"
fiWeryfikacja formatu odczytuje Content-Type części formularza z plikiem, więc określ go przez ;type= — w przeciwnym
razie curl wyśle application/octet-stream, co zostanie odrzucone z kodem 400. Jeśli to samo nagranie jest już
w projekcie, API zwraca 409, a identyfikator pierwotnego zadania przetwarzania podaje w polu existingJobId — właśnie
po nie sięga filtr jq, gdy brakuje jobId. Odpowiedź z każdym innym błędem nie zawiera żadnego z tych pól, więc skrypt
wypisuje wtedy message z API, zamiast kontynuować z wartością null.
{ "jobId": "8f14e45f-ea0f-4e21-9c1a-2b3c4d5e6f70", "status": "PENDING", "submittedAt": "2026-07-25T10:00:00Z" }3. Poczekaj na przetworzenie
Odpytuj API o zadanie przetwarzania co kilka sekund, aż jego status nie będzie już PENDING ani PROCESSING:
while :; do
JOB=$(curl -sS "$BASE/v1/projects/$PROJECT_ID/calls/jobs/$JOB_ID" \
-H "X-API-Key: $AFTERTALK_KEY")
STATUS=$(echo "$JOB" | jq -r '.status')
[ "$STATUS" = PENDING ] || [ "$STATUS" = PROCESSING ] || break
sleep 5
done
case "$STATUS" in
COMPLETED | BILLING_FAILED)
export TRANSCRIPT_ID=$(echo "$JOB" | jq -r '.transcriptId')
echo "$STATUS $TRANSCRIPT_ID" ;;
FAILED) echo "Processing failed: $(echo "$JOB" | jq -r '.errorMessage')" ;;
*) echo "Request failed: $(echo "$JOB" | jq -r '.message')" ;;
esacZarówno COMPLETED, jak i BILLING_FAILED mają wyniki do odczytania. FAILED nie ma transkrypcji —
errorMessage podaje przyczynę. Nieudane żądanie (błędny klucz, nieznane zadanie przetwarzania) zwraca treść błędu API,
której status to kod statusu HTTP, więc ono również kończy pętlę. Pełną listę statusów znajdziesz na stronie Pobieranie wyników, a
webhooki pozwalają całkowicie zrezygnować z odpytywania.
4. Odczytaj wynik
curl -sS --fail-with-body "$BASE/v1/projects/$PROJECT_ID/calls/$TRANSCRIPT_ID" \
-H "X-API-Key: $AFTERTALK_KEY" \
| jq '{title, durationS, summary: .summary.summary.executiveSummary}'Pełna odpowiedź zawiera transkrypcję w polu turns — podzieloną na wypowiedzi przypisane do mówców — oraz analizy
skonfigurowane w Twoim projekcie: summary, classification i templateAnalysis. Tworzenie analiz jest wykonywane
w miarę możliwości: nawet w pomyślnie przetworzonej rozmowie niektórych pól może brakować, więc
przed odczytem zawsze sprawdzaj, czy pole istnieje.
Wszystkie kroki w jednym skrypcie
Te same cztery kroki, gotowe do zapisania i uruchomienia. Nieudane żądanie zatrzymuje skrypt, który wypisuje wiersz statusu z curla oraz treść błędu API:
#!/usr/bin/env bash
set -euo pipefail
BASE="https://app.aftertalk.co/api"
AUTH="X-API-Key: $AFTERTALK_KEY"
# 1. The first project in your organization.
PROJECT_ID=$(curl -sS --fail-with-body "$BASE/v1/projects" -H "$AUTH" | jq -r '.[0].id')
# 2. Upload. A 409 means this audio is already in the project; carry on with that job.
UPLOAD=$(curl -sS -X POST "$BASE/v1/projects/$PROJECT_ID/calls/upload" -H "$AUTH" \
-F "file=@call.wav;type=audio/wav")
JOB_ID=$(echo "$UPLOAD" | jq -r '.jobId // .existingJobId')
if [ "$JOB_ID" = null ]; then
echo "Upload failed: $(echo "$UPLOAD" | jq -r '.message')" >&2
exit 1
fi
# 3. Poll until the job leaves PENDING / PROCESSING.
while :; do
JOB=$(curl -sS --fail-with-body "$BASE/v1/projects/$PROJECT_ID/calls/jobs/$JOB_ID" -H "$AUTH")
STATUS=$(echo "$JOB" | jq -r '.status')
[ "$STATUS" = PENDING ] || [ "$STATUS" = PROCESSING ] || break
sleep 5
done
if [ "$STATUS" = FAILED ]; then
echo "Processing failed: $(echo "$JOB" | jq -r '.errorMessage')" >&2
exit 1
fi
# 4. COMPLETED and BILLING_FAILED both have results.
TRANSCRIPT_ID=$(echo "$JOB" | jq -r '.transcriptId')
curl -sS --fail-with-body "$BASE/v1/projects/$PROJECT_ID/calls/$TRANSCRIPT_ID" -H "$AUTH" \
| jq -r '.summary.summary.executiveSummary // "(no summary for this call)"'Co dalej
- Przesyłanie rozmów — formaty, role mówców, obsługa duplikatów
- Pobieranie wyników — statusy zadań przetwarzania i częściowa analiza
- Webhooki — otrzymuj powiadomienie, gdy rozmowa jest gotowa, zamiast odpytywać
- Błędy — co oznaczają kody statusu HTTP