API
referencia.
312 puntos finales, especificaciones OpenAPI completas, idempotencia en cada mutación y un contrato público de tiempo de actividad. Sin cajas negras.
"color:#22D3EE">curl "color:#22D3EE">-X "color:#34D399;peso de fuente:600"> PUBLICAR https://api.rozper.com/v2/calls\
"color:#22D3EE">-H "Autorización: Portador $ROZPER_API_KEY" \
"color:#22D3EE">-H "Tipo de contenido: aplicación/json" \
"color:#22D3EE">-d '{
"a": "+14155551234",
"de": "+12025550100",
"URL": "https://tu.aplicación/voice/answer"
}'{
"id": "call_01HXY7ZQ9V3J3X8K5N",
"status": "queued",
"to": "+14155551234",
"from": "+12025550100",
"created_at": "2026-05-12T14:23:01Z"
}Fichas al portador.
Alcance. Giratorio.
Cada solicitud lleva una clave de proyecto como token de portador. Las claves tienen alcance (lectura, escritura, facturación), se pueden rotar sin tiempo de inactividad y se pueden fijar mediante IP desde el panel.
- Claves por entorno (prueba/en vivo)
- Se admiten credenciales de cliente OAuth 2.0
- TLS mutuo disponible en 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 }
}Explore cada punto final.
crear una llamada
Originar una llamada PSTN saliente. Regresa inmediatamente con un objeto de llamada en cola: escuche en webhooks para detectar cambios de estado.
tocadenarequeridoNúmero de destino E.164.
fromcadenarequeridoNúmero de Rozper verificado o alquilado.
urlcadenaPunto final HTTPS que devuelve instrucciones de voz cuando se conecta la llamada.
recordbooleanoGraba ambas piernas en tu almacenamiento. Por defecto es falso.
timeoutenteroTiempo de espera del timbre en segundos. Por defecto 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"
}Errores predecibles y legibles por máquina.
Cada 4xx y 5xx devuelve la misma forma: un establo code, un mensaje legible por humanos y una identificación de solicitud que puede pegar en el soporte.
{
"error": {
"code": "invalid_param",
"message": "to: must be E.164",
"request_id": "req_01HXY7…",
"param_errors": [
{ "param": "to", "reason": "format" }
]
}
}bad_requestCuerpo de solicitud mal formado o falta un campo obligatorio.
unauthorizedClave API faltante, caducada o revocada.
forbiddenKey carece del alcance necesario para este recurso.
not_foundLa identificación del recurso no existe para esta cuenta.
conflictLa clave de idempotencia choca con una carga útil diferente.
invalid_paramUn parámetro falló en la validación. Inspeccione param_errors[].
rate_limitedRetroceda usando el encabezado Retry-After.
server_errorNos avisaron. Vuelva a intentar llamadas idempotentes.
Firmado, reintentado y protegido contra reproducción.
Cada evento se entrega con una firma HMAC, una identificación de evento única y una marca de tiempo UTC. Volvemos a intentarlo con un retroceso exponencial de hasta 24 horas.
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.initiatedLlamada saliente aceptada por el operador.
call.ringingEl otro extremo está sonando.
call.answeredRespondió el extremo lejano (o AMD detectó a un humano).
call.completedLa llamada finalizó. Incluye duración, facturación y metadatos del tramo.
recording.readyActivo de grabación cargado y URL firmada disponible.
message.deliveredRecibo de entrega del transportista (donde sea compatible).
agent.handoffEl agente de IA pasó a una cola humana.
number.purchasedAdquisición de números completada.
Cada cambio, en un lenguaje sencillo.
- 2026-05-10v2026.05
- logroLos agentes de voz ahora admiten llamadas mediante herramientas con respuestas en tiempo real.
- logroNuevo punto final /v2/numbers/port para envíos LNP programáticos.
- 2026-04-22v2026.04
- arreglarLa caché de idempotencia ahora respeta correctamente el TTL de 24 horas en POST/llamadas.
- faenaSe eliminaron los puntos finales v1 obsoletos (anunciados en 2025-11).
- 2026-03-31v2026.03
- logroLa versión beta de WebSocket Media-streams ya está disponible de forma generalizada.
- logroMensajes de plantilla de WhatsApp agregados en /v2/messages.