API
odniesienie.
312 punktów końcowych, pełna specyfikacja OpenAPI, idempotencja dla każdej mutacji i publiczna umowa dotycząca dostępności. Żadnych czarnych skrzynek.
"color:#22D3EE">curl "color:#22D3EE">-X "kolor:#34D399;grubość czcionki:600">POST https://api.rozper.com/v2/calls \
„kolor:#22D3EE”>-H „Upoważnienie: Na okaziciela $ROZPER_API_KEY" \
„kolor:#22D3EE”>-H „Typ zawartości: aplikacja/json” \
„kolor:#22D3EE”>-d '{
"Do": "+14155551234",
"z": "+12025550100",
„adres URL”: „https://twoja.aplikacja/głos/odpowiedź”
}'{
"id": "call_01HXY7ZQ9V3J3X8K5N",
"status": "queued",
"to": "+14155551234",
"from": "+12025550100",
"created_at": "2026-05-12T14:23:01Z"
}Żetony okaziciela.
Zakres. Obrotowy.
Każde żądanie zawiera klucz projektu jako token okaziciela. Klucze mają określony zakres (odczyt, zapis, fakturowanie), można je obracać bez przestojów i można je przypinać do adresu IP z poziomu pulpitu nawigacyjnego.
- Klucze dla poszczególnych środowisk (testowe/aktywne)
- Obsługiwane poświadczenia klienta OAuth 2.0
- Wzajemny TLS dostępny w Enterprise
# .env → never commit me
ROZPER_API_KEY=sk_live_8FzqQ...XW7p
# request
curl https://api.rozper.com/v2/account \
-H "Authorization: Bearer $ROZPER_API_KEY"
# 200 OK
{
"id": "acct_01HXY7ZQ9V3J3X8K5N",
"scopes": ["calls.write", "messages.write", "numbers.read"],
"rate_limit": { "limit": 1000, "remaining": 998, "reset": 1715520000 }
}Przeglądaj każdy punkt końcowy.
Utwórz połączenie
Rozpocznij połączenie wychodzące PSTN. Zwraca natychmiast z obiektem wywołania w kolejce — nasłuchuj na elementach webhook pod kątem zmian stanu.
tosmyczkowywymaganyNumer docelowy E.164.
fromsmyczkowywymaganyZweryfikowany lub wypożyczony numer Rozper.
urlsmyczkowyPunkt końcowy HTTPS, który zwraca instrukcje głosowe po nawiązaniu połączenia.
recordwartość logicznaNagraj obie nogi w swoim magazynie. Domyślnie fałsz.
timeoutliczba całkowitaLimit czasu dzwonienia w sekundach. Domyślnie 60.
const call = await rozper.calls.create({
to: "+14155551234",
from: "+12025550100",
url: "https://your.app/voice/answer",
}){
"id": "call_01HXY7ZQ9V3J3X8K5N",
"object": "call",
"created_at": "2026-05-12T14:23:01Z"
}Przewidywalne błędy do odczytu maszynowego.
Każde 4xx i 5xx zwraca ten sam kształt: stajnię code, wiadomość czytelną dla człowieka i identyfikator żądania, który możesz wkleić do pomocy technicznej.
{
"error": {
"code": "invalid_param",
"message": "to: must be E.164",
"request_id": "req_01HXY7…",
"param_errors": [
{ "param": "to", "reason": "format" }
]
}
}bad_requestNieprawidłowo sformułowana treść żądania lub brak wymaganego pola.
unauthorizedBrakujący, wygasły lub unieważniony klucz API.
forbiddenKlucz nie ma zakresu wymaganego dla tego zasobu.
not_foundIdentyfikator zasobu nie istnieje dla tego konta.
conflictKlucz idempotencji koliduje z innym ładunkiem.
invalid_paramSprawdzanie poprawności parametru nie powiodło się. Sprawdź param_errors[].
rate_limitedWycofywanie za pomocą nagłówka Retry-After.
server_errorZostaliśmy powiadomieni. Ponów próbę wywołań idempotentnych.
Podpisano, ponowiono próbę, zabezpieczono przed ponownym odtwarzaniem.
Każde zdarzenie jest dostarczane z podpisem HMAC, unikalnym identyfikatorem zdarzenia i znacznikiem czasu UTC. Ponawiamy próbę z wykładniczym wycofywaniem przez maksymalnie 24 godziny.
import { verify } from "@rozper/sdk/webhooks"
app.post("/webhooks/rozper", (req, res) => {
const ok = verify({
payload: req.rawBody,
signature: req.header("Rozper-Signature"),
secret: process.env.ROZPER_WEBHOOK_SECRET,
})
if (!ok) return res.status(401).end()
const event = JSON.parse(req.rawBody)
switch (event.type) {
case "call.completed": /* … */
case "recording.ready": /* … */
}
res.json({ received: true })
})call.initiatedPołączenie wychodzące zaakceptowane przez operatora.
call.ringingDaleki koniec dzwoni.
call.answeredOdpowiedział zdalny terminal (lub AMD wykrył człowieka).
call.completedPołączenie zostało zakończone. Obejmuje czas trwania, rozliczenia i metadane dotyczące nogi.
recording.readyDostępny jest zasób nagrania i podpisany adres URL.
message.deliveredPotwierdzenie dostawy przewoźnika (jeśli jest obsługiwane).
agent.handoffAgent AI przekształcił się w ludzką kolejkę.
number.purchasedZakończono pobieranie numeru.
Każda zmiana, prostym angielskim.
- 2026-05-10wersja 2026.05
- wyczynAgenci głosowi obsługują teraz wywoływanie narzędzi z odpowiedziami przesyłanymi strumieniowo.
- wyczynNowy punkt końcowy /v2/numbers/port dla programowych zgłoszeń LNP.
- 2026-04-22wersja 2026.04
- naprawićPamięć podręczna idempotencji teraz prawidłowo honoruje 24-godzinny czas TTL w przypadku połączeń POST/call.
- obowiązekUsunięto przestarzałe punkty końcowe w wersji 1 (ogłoszone na rok 2025–2011).
- 2026-03-31wersja 2026.03
- wyczynWersja beta strumieni multimediów WebSocket jest już ogólnie dostępna.
- wyczynWiadomości szablonowe WhatsApp dodane w /v2/messages.