API
référence.
312 points de terminaison, spécifications OpenAPI complètes, idempotence sur chaque mutation et contrat de disponibilité public. Pas de boîtes noires.
"color:#22D3EE">curl "color:#22D3EE">-X "couleur : #34D399 ; poids de la police : 600 »> POSTER https://api.rozper.com/v2/calls\
"couleur : #22D3EE">-H "Autorisation : Porteur $ROZPER_API_KEY" \
"couleur : #22D3EE">-H "Type de contenu : application/json" \
"couleur : #22D3EE">-d '{
"à": "+14155551234",
"depuis": "+12025550100",
"url": "https://votre.app/voice/answer"
}'{
"id": "call_01HXY7ZQ9V3J3X8K5N",
"status": "queued",
"to": "+14155551234",
"from": "+12025550100",
"created_at": "2026-05-12T14:23:01Z"
}Jetons au porteur.
Portée. Rotatif.
Chaque requête comporte une clé de projet en tant que jeton Bearer. Les clés sont limitées (lecture, écriture, facturation), rotatives sans temps d'arrêt et peuvent être épinglées par IP à partir du tableau de bord.
- Clés par environnement (test / live)
- Identifiants client OAuth 2.0 pris en charge
- TLS mutuel disponible sur 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 }
}Explorez chaque point de terminaison.
Créer un appel
Émettez un appel PSTN sortant. Renvoie immédiatement avec un objet d'appel en file d'attente - écoutez les webhooks pour les changements d'état.
tochaînerequisNuméro de destination E.164.
fromchaînerequisNuméro Rozper vérifié ou loué.
urlchaînePoint de terminaison HTTPS qui renvoie des instructions vocales lorsque l'appel est connecté.
recordbooléenEnregistrez les deux jambes dans votre stockage. Faux par défaut.
timeoutentierDélai d'expiration de la sonnerie en secondes. Par défaut 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"
}Erreurs prévisibles et lisibles par machine.
Tous les 4xx et 5xx renvoient la même forme : une stable code, un message lisible par l'homme et un identifiant de demande que vous pouvez coller sur le support.
{
"error": {
"code": "invalid_param",
"message": "to: must be E.164",
"request_id": "req_01HXY7…",
"param_errors": [
{ "param": "to", "reason": "format" }
]
}
}bad_requestCorps de la demande mal formé ou champ obligatoire manquant.
unauthorizedClé API manquante, expirée ou révoquée.
forbiddenLa clé n'a pas la portée requise pour cette ressource.
not_foundL'ID de ressource n'existe pas pour ce compte.
conflictLa clé d'idempotence entre en collision avec une charge utile différente.
invalid_paramLa validation d'un paramètre a échoué. Inspectez param_errors[].
rate_limitedInterruption à l’aide de l’en-tête Retry-After.
server_errorNous avons été prévenus. Réessayez les appels idempotents.
Signé, réessayé, protégé contre la relecture.
Chaque événement est livré avec une signature HMAC, un identifiant d'événement unique et un horodatage UTC. Nous réessayons avec une interruption exponentielle pendant 24 heures maximum.
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.initiatedAppel sortant accepté par l'opérateur.
call.ringingL'extrémité sonne.
call.answeredL'extrémité distante a répondu (ou AMD a détecté un humain).
call.completedAppel terminé. Inclut la durée, la facturation et les métadonnées des étapes.
recording.readyActif d'enregistrement téléchargé et URL signée disponible.
message.deliveredRécépissé de livraison par le transporteur (si pris en charge).
agent.handoffL'agent IA a été transféré vers une file d'attente humaine.
number.purchasedAcquisition du numéro terminée.
Chaque changement, dans un anglais simple.
- 2026-05-10v2026.05
- exploitLes agents vocaux prennent désormais en charge les appels d'outils avec des réponses en continu.
- exploitNouveau point de terminaison /v2/numbers/port pour les soumissions LNP programmatiques.
- 2026-04-22v2026.04
- réparerLe cache d'idempotence honore désormais correctement le TTL 24h sur les appels POST/.
- corvéePoints de terminaison v1 obsolètes supprimés (annoncé le 2025-11).
- 2026-03-31v2026.03
- exploitLa version bêta de WebSocket Media-Streams est désormais généralement disponible.
- exploitModèles de messages WhatsApp ajoutés sous /v2/messages.