Referencia de API
Referencia completa de todos los endpoints de verificación de Novauth. Cada canal comparte el mismo modelo de autenticación y la misma URL base; solo difieren la ruta y el payload.
https://api.novauth.com/api/v1/connect-hubAutenticación
Cada solicitud debe incluir dos encabezados. Puedes encontrar tus credenciales en la sección Desarrollador → Claves de API del panel. Las credenciales se almacenan en caché del lado del servidor durante 5 minutos, por lo que las claves recién creadas estarán activas en segundos.
x-api-keyTu clave de API. Trátala como una contraseña: nunca la expongas en código del lado del cliente.x-account-idTu identificador de cuenta. Se muestra en el panel junto a cada clave de API.x-request-idID de correlación opcional. Pasa cualquier UUID; se devuelve en las respuestas de error para facilitar el rastreo.Almacena las credenciales en variables de entorno (BETATEL_API_KEY, BETATEL_ACCOUNT_ID). Nunca las codifiques directamente en los archivos fuente.
Las claves con prefijo sk_test_ son claves de sandbox: nunca interactúan con operadores reales y no generan cargos. Úsalas durante el desarrollo y luego cámbialas por tu clave BTEL_ cuando pases a producción. Modo Sandbox →
Al crear una clave de API puedes asociar opcionalmente una o más direcciones IP o rangos CIDR. Si se configura una lista blanca de IP, cualquier solicitud proveniente de una IP que no figure en ella será rechazada con 401 Unauthorized, aunque la clave de API sea válida. Esto te permite restringir una clave a la IP de tu servidor para que no pueda usarse si se filtra.
curl -X POST https://api.novauth.com/api/v1/connect-hub/call/flash \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{"callee": "+14155552671"}'Verify Call
Inicia una llamada de corta duración que suena y se cuelga. El ID de llamada codifica el OTP; tu SDK móvil lee el número entrante sin que el usuario tenga que contestar.
calleestringobligatoriocallerstringmax_ring_timenumberuuidstring (ULID)callerstringcalleestringcurl -X POST https://api.novauth.com/api/v1/connect-hub/call/flash \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"callee": "+14155552671",
"caller": "+38761000001",
"max_ring_time": 5
}'
# Response:
# {
# "uuid": "01KAK9KATW01A437PSXS5EVDCR",
# "caller": "+38761000001",
# "callee": "+14155552671"
# }hangup_causestringdurationnumberbillsecnumberpddnumberdestination_countrystringstart_stampstring (ISO 8601)curl https://api.novauth.com/api/v1/connect-hub/call/flash/01KAK9KATW01A437PSXS5EVDCR/cdr \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID"
# Response:
# {
# "uuid": "01KAK9KATW01A437PSXS5EVDCR",
# "caller": "+38761000001",
# "callee": "+14155552671",
# "hangup_cause": "NORMAL_CLEARING",
# "duration": 6,
# "billsec": 0,
# "pdd": 2,
# "start_stamp": "2024-06-01T10:30:00.000Z",
# "destination_country": "United States",
# "destination_country_code": "US"
# }Devuelve una lista paginada de todas las llamadas de tu cuenta. Usa filter para acotar los resultados por cualquier campo del CDR (p. ej. callee, hangup_cause).
pagenumberrows_per_pagenumbersort_bystringsort_direction"ASC" | "DESC"filterobjecttotalnumbertotal_pagesnumberhas_next_pagebooleanhas_previous_pagebooleanlistCDR[]curl -X POST https://api.novauth.com/api/v1/connect-hub/call/flash/cdr \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"page": 1,
"rows_per_page": 20,
"sort_by": "start_stamp",
"sort_direction": "DESC"
}'Finaliza una llamada activa antes de que termine de forma natural. Devuelve 204 No Content en caso de éxito.
# Terminate an active call before it naturally ends
curl -X DELETE https://api.novauth.com/api/v1/connect-hub/call/flash/01KAK9KATW01A437PSXS5EVDCR \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID"
# Returns 204 No Content on successSMS
Entrega un mensaje de texto vía SMPP. Se utiliza habitualmente para enviar un código OTP numérico que el usuario introduce en tu aplicación.
tostringobligatoriotextstringobligatoriofromstringmessageIdstring (UUID)fromstringtostringcurl -X POST https://api.novauth.com/api/v1/connect-hub/sms \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"to": "+14155552671",
"text": "Your verification code is 482910. Valid for 5 minutes.",
"from": "Novauth"
}'
# Response:
# {
# "messageId": "0a62face-6d15-11f0-962f-d89d6729654c",
# "from": "Novauth",
# "to": "14155552671"
# }Recupera el estado de entrega de un mensaje enviado. El estado se actualiza de forma asíncrona a medida que llegan los informes de entrega del operador (DLR).
deliveredEntrega confirmada en el dispositivo.sentEnviado al operador; en espera del DLR.failedEntrega fallida (número inválido, bloqueado).undeliveredEl operador lo aceptó pero la entrega no está confirmada.curl https://api.novauth.com/api/v1/connect-hub/sms/0a62face-6d15-11f0-962f-d89d6729654c/sdr \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID"
# Response:
# {
# "uuid": "...",
# "messageId": "0a62face-6d15-11f0-962f-d89d6729654c",
# "from": "Novauth",
# "to": "+14155552671",
# "status": "delivered",
# "timestamp": "2024-06-01T10:30:00.000Z"
# }Devuelve una lista paginada de todos los mensajes enviados. Acepta el mismo cuerpo de paginación que otros endpoints de listado (page, rows_per_page, sort_by, filter).
curl -X POST https://api.novauth.com/api/v1/connect-hub/sms/sdr \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"page": 1,
"rows_per_page": 20,
"sort_direction": "DESC"
}'OTP de Telegram
Envía un OTP numérico a través de la Gateway API oficial de Telegram. Admite comprobaciones de alcanzabilidad, validación de código del lado del servidor y revocación con reembolso automático.
tostringobligatoriocodestringobligatoriottlnumbersender_usernamestringcallback_urlstringuuidstring (ULID)request_idstringstatusstringrequest_costnumberremaining_balancenumbercurl -X POST https://api.novauth.com/api/v1/connect-hub/telegram \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"to": "+14155552671",
"code": "482910",
"ttl": 300
}'
# Response:
# {
# "uuid": "01KNV9CWW9ZEYVDFBJ1N7M1DVR",
# "request_id": "tg_req_abc123",
# "to": "14155552671",
# "status": "sent",
# "request_cost": 0.05,
# "remaining_balance": 49.95
# }Verifica si el número tiene una cuenta de Telegram antes de enviar. Si is_refunded es true, el usuario no tiene cuenta de Telegram; el costo de la comprobación se reembolsa y debes recurrir a SMS o Verify Call.
curl -X POST https://api.novauth.com/api/v1/connect-hub/telegram/check-send-ability \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{"to": "+14155552671"}'
# Response:
# {
# "request_id": "tg_req_abc123",
# "phone_number": "14155552671",
# "request_cost": 0.01,
# "is_refunded": false,
# "remaining_balance": 49.99,
# "delivery_status": { "status": "sent", "updated_at": 1713350400 }
# }Consulta el resultado de la entrada del código para un request_id dado. Opcionalmente, pasa el code introducido por el usuario para la validación del lado del servidor.
code_validEl usuario introdujo el código correcto.code_invalidEl usuario introdujo un código incorrecto.code_max_attempts_exceededDemasiados intentos fallidos.expiredEl TTL del código expiró antes de que se introdujera.curl -X POST https://api.novauth.com/api/v1/connect-hub/telegram/check-verification-status \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"request_id": "tg_req_abc123",
"code": "482910"
}'
# Response:
# {
# "request_id": "tg_req_abc123",
# "verification_status": {
# "status": "code_valid",
# "updated_at": 1713350400
# }
# }Cancela una solicitud OTP activa antes de que el usuario la complete. Si el mensaje aún no ha sido leído, is_refunded será true y el cargo se devuelve a tu saldo.
curl -X POST https://api.novauth.com/api/v1/connect-hub/telegram/revoke-verification \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{"request_id": "tg_req_abc123"}'
# Response:
# {
# "request_id": "tg_req_abc123",
# "is_refunded": true,
# "remaining_balance": 50.0
# }Obtiene el registro de entrega completo de Telegram (TDR) para un uuid dado (el ID de correlación de Novauth devuelto por el endpoint de envío). Incluye el estado de entrega, el estado de verificación, el costo y el país.
curl https://api.novauth.com/api/v1/connect-hub/telegram/01KNV9CWW9ZEYVDFBJ1N7M1DVR/tdr \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID"
# Response includes full TDR:
# {
# "uuid": "01KNV9CWW9ZEYVDFBJ1N7M1DVR",
# "to": "+14155552671",
# "status": "DELIVERED",
# "delivery_status": "delivered",
# "verification_status": "code_valid",
# "request_cost": 0.05,
# "country": "United States",
# "created_at": "2024-06-01T10:30:00.000Z"
# }Devuelve una lista paginada de todos los registros de entrega de Telegram. Filtra por <code>verification_status</code>, <code>delivery_status</code> o cualquier otro campo del TDR.
curl -X POST https://api.novauth.com/api/v1/connect-hub/telegram/tdr \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"page": 1,
"rows_per_page": 20,
"sort_direction": "DESC"
}'Envía un mensaje OTP a través de la API de WhatsApp Business. El usuario lee el código en la conversación de WhatsApp y lo introduce en tu aplicación.
tostringobligatoriotextstringobligatoriouuidstring (ULID)tostringcurl -X POST https://api.novauth.com/api/v1/connect-hub/whatsapp/otp \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"to": "+14155552671",
"text": "Your verification code is 482910. Valid for 5 minutes."
}'
# Response:
# {
# "uuid": "01KAK9KATW01A437PSXS5EVDCR",
# "to": "+14155552671"
# }Tras el envío, informa el resultado de verificación del usuario mediante POST /whatsapp/webhook. Consulta la referencia de Webhooks para más detalles.
Obtiene el registro de entrega de WhatsApp (WDR) para un uuid devuelto por el endpoint de envío.
curl https://api.novauth.com/api/v1/connect-hub/whatsapp/01KAK9KATW01A437PSXS5EVDCR/wdr \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID"
# Response:
# {
# "uuid": "01KAK9KATW01A437PSXS5EVDCR",
# "to": "+14155552671",
# "status": "DELIVERED",
# "created_at": "2024-06-01T10:30:00.000Z"
# }Devuelve una lista paginada de todos los registros de entrega de WhatsApp. Admite el mismo cuerpo <code>page</code>, <code>rows_per_page</code>, <code>filter</code> que todos los demás endpoints de listado.
curl -X POST https://api.novauth.com/api/v1/connect-hub/whatsapp/wdr \
-H "x-api-key: YOUR_API_KEY" \
-H "x-account-id: YOUR_ACCOUNT_ID" \
-H "Content-Type: application/json" \
-d '{
"page": 1,
"rows_per_page": 20,
"sort_direction": "DESC"
}'Códigos de error
Todas las respuestas de error siguen el mismo envelope JSON. El campo error contiene una cadena legible por máquina; proporciona tu x-request-id al soporte cuando reportes incidencias.
| Estado | Código | Descripción |
|---|---|---|
| 400 | BAD_REQUEST | Cuerpo de solicitud inválido: campo obligatorio faltante, formato incorrecto o número de teléfono inválido. |
| 401 | UNAUTHORIZED | Encabezados x-api-key / x-account-id faltantes o inválidos. |
| 402 | PAYMENT_REQUIRED | Saldo de cuenta insuficiente. Recarga tu cuenta para continuar. |
| 403 | FORBIDDEN | La clave de API existe pero no tiene permiso para esta operación. |
| 404 | NOT_FOUND | El UUID o recurso solicitado no existe. |
| 409 | CONFLICT | Solicitud duplicada o estado conflictivo (p. ej. revocar una solicitud ya expirada). |
| 480 | TEMPORARY_UNAVAILABLE | Gateway temporalmente inaccesible. Reintenta con retroceso exponencial. |
| 486 | BUSY_HERE | (Verify Call) El destinatario está ocupado o la llamada fue rechazada por la red. |
| 500 | INTERNAL_SERVER_ERROR | Error inesperado del servidor. Contacta a soporte con tu x-request-id. |
| 503 | SERVICE_UNAVAILABLE | Gateway desconectado o servicio en mantenimiento. Consulta la página de estado. |
| 603 | DECLINE | (Verify Call) El destinatario rechazó explícitamente la llamada. |
Para una lista completa de códigos de error con pasos de remediación sugeridos, consulta la guía de gestión de errores.