API
ссылка.
312 конечных точек, полная спецификация OpenAPI, идемпотентность при каждой мутации и публичный контракт безотказной работы. Никаких черных ящиков.
"color:#22D3EE">curl "color:#22D3EE">-X "цвет:#34D399;вес шрифта:600">ПОСТ https://api.rozper.com/v2/calls\
"цвет:#22D3EE">-H «Разрешение: предъявитель $ROZPER_API_KEY" \
"цвет:#22D3EE">-H «Тип контента: приложение/json» \
"цвет:#22D3EE">-д '{
"к": "+14155551234",
"от": "+12025550100",
"URL-адрес": "https://your.app/voice/ответ"
}'{
"id": "call_01HXY7ZQ9V3J3X8K5N",
"status": "queued",
"to": "+14155551234",
"from": "+12025550100",
"created_at": "2026-05-12T14:23:01Z"
}Токены на предъявителя.
Ограничено. Вращающийся.
Каждый запрос содержит ключ проекта в качестве токена-носителя. Ключи имеют ограниченную область действия (чтение, запись, выставление счетов), могут меняться без простоев и могут быть закреплены по IP-адресу с панели управления.
- Ключи для каждой среды (тестовые/действующие)
- Поддерживаются учетные данные клиента OAuth 2.0.
- Взаимный TLS доступен на предприятии
# .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 }
}Исследуйте каждую конечную точку.
Создать звонок
Выполните исходящий вызов по телефонной сети общего пользования. Немедленно возвращает объект вызова в очереди — прослушивайте веб-перехватчики на предмет изменений состояния.
toнитьнеобходимыйНомер назначения E.164.
fromнитьнеобходимыйПроверенный или арендованный номер Розпера.
urlнитьКонечная точка HTTPS, которая возвращает голосовые инструкции при подключении вызова.
recordлогическое значениеЗапишите обе ноги в свое хранилище. По умолчанию ложь.
timeoutцелое числоТаймаут звонка в секундах. По умолчанию 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"
}Предсказуемые, машиночитаемые ошибки.
Каждые 4xx и 5xx возвращают одну и ту же форму: стабильную code, удобочитаемое сообщение и идентификатор запроса, который вы можете вставить в службу поддержки.
{
"error": {
"code": "invalid_param",
"message": "to: must be E.164",
"request_id": "req_01HXY7…",
"param_errors": [
{ "param": "to", "reason": "format" }
]
}
}bad_requestНеверный формат тела запроса или отсутствие обязательного поля.
unauthorizedКлюч API отсутствует, срок его действия истек или отозван.
forbiddenКлючу не хватает объема, необходимого для этого ресурса.
not_foundИдентификатор ресурса не существует для этой учетной записи.
conflictКлюч идемпотентности конфликтует с другой полезной нагрузкой.
invalid_paramПараметр не прошел проверку. Проверьте param_errors[].
rate_limitedОткат с использованием заголовка Retry-After.
server_errorНас уведомили. Повторите идемпотентные вызовы.
Подписано, повторено, защищено от повторного воспроизведения.
Каждое событие доставляется с подписью HMAC, уникальным идентификатором события и меткой времени UTC. Мы повторяем попытку с экспоненциальной задержкой на срок до 24 часов.
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.initiatedИсходящий вызов принят оператором связи.
call.ringingНа дальнем конце звонят.
call.answeredОтветил дальний конец (или AMD обнаружила человека).
call.completedЗвонок завершился. Включает продолжительность, выставление счетов и метаданные этапа.
recording.readyРесурс записи загружен и доступен подписанный URL-адрес.
message.deliveredКвитанция о доставке транспортной компанией (если поддерживается).
agent.handoffИИ-агент перерос в человеческую очередь.
number.purchasedПолучение номера завершено.
Каждое изменение, на простом английском языке.
- 2026-05-10v2026.05
- подвигГолосовые агенты теперь поддерживают вызов инструментов с потоковой передачей ответов.
- подвигНовая конечная точка /v2/numbers/port для программных отправок LNP.
- 2026-04-22v2026.04
- исправитьКэш идемпотентности теперь правильно учитывает 24-часовой TTL при POST/вызовах.
- работа по домуУстаревшие конечные точки версии 1 удалены (объявлено в 2025–2011 гг.).
- 2026-03-31v2026.03
- подвигБета-версия медиапотоков WebSocket теперь общедоступна.
- подвигСообщения шаблона WhatsApp добавлены в /v2/messages.