Autenticación
Todas las solicitudes a la API requieren autenticación mediante una API Key privada. Debés incluirla en el header X-API-KEY en cada request. Podés generar o regenerar tu clave desde el Dashboard → API Key.
Header Requerido
X-API-KEY: sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFormato de Error de Auth
{
"code": "UNAUTHORIZED",
"message": "Invalid or missing API Key",
"timestamp": "2026-04-15T18:00:00Z"
}⚠️Tu API Key otorga acceso completo a tu cuenta. Nunca la expongas en código cliente (browser). Usala exclusivamente en tu backend o scripts de servidor.
Enviar OTP por SMS
Envía un código OTP de 6 dígitos a un número de teléfono vía SMS. Cuesta 1 crédito por envío exitoso. El mensaje contendrá automáticamente el nombre de tu aplicación registrada. Podés configurar la longitud del código y el tiempo de expiración. Para reintentos seguros, enviá una clave única en Idempotency-Key; repetirla devuelve el mismo OTP sin generar otro envío.
https://api.rufiar.com/api/v1/otpEnvía el OTP al teléfono especificado vía SMS. Requiere saldo suficiente y autenticación via X-API-KEY.
curl -X POST "https://api.rufiar.com/api/v1/otp" \
-H "Content-Type: application/json" \
-H "X-API-KEY: sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Idempotency-Key: checkout-otp-2026-0001" \
-d '{
"channel": "SMS",
"destinationPhone": "+5491112345678",
"expiresInMinutes": 5,
"otpLength": 6
}'Enviar OTP por Email
Envía un código OTP a una dirección de email. Cuesta 0.1 créditos por envío. El asunto y cuerpo del email se generan automáticamente. Podés reintentar de forma segura usando la misma clave Idempotency-Key; no la reutilices con otro payload.
https://api.rufiar.com/api/v1/otpEnvía el OTP al email especificado. Requiere saldo suficiente y autenticación via X-API-KEY.
curl -X POST "https://api.rufiar.com/api/v1/otp" \
-H "Content-Type: application/json" \
-H "X-API-KEY: sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Idempotency-Key: email-otp-2026-0001" \
-d '{
"channel": "EMAIL",
"destinationEmail": "user@example.com",
"expiresInMinutes": 10,
"otpLength": 4
}'Verificar OTP
Valida el código ingresado por el usuario contra el OTP enviado. Necesitás el id retornado por el endpoint de envío y el código de 6 dígitos. Un OTP solo puede verificarse una vez; si ya fue verificado, expirado o falló, retorna error.
https://api.rufiar.com/api/v1/otp/{id}/verifyVerifica el código OTP. Reemplazá {id} por el UUID retornado en el envío. El código es comparado usando BCrypt.
curl -X POST "https://api.rufiar.com/api/v1/otp/e8a9b3d2-1f4c-4a2e-9c7d-0f3b8e6a1d5f/verify" \
-H "Content-Type: application/json" \
-H "X-API-KEY: sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-d '{
"code": "482916"
}'💡El campo verified: false en HTTP 200 indica código incorrecto sin bloquear. Si el OTP ya expiró o fue usado, la respuesta será HTTP 422.
Consultar Saldo
Consultá el saldo de créditos disponibles para tu cuenta. Cada SMS exitoso descuenta 1 crédito. Podés recargar créditos desde el Dashboard → Billing.
https://api.rufiar.com/api/v1/balance/meRetorna el saldo actual de créditos asociado a tu API Key. Requiere autenticación mediante X-API-KEY o Bearer Token JWT.
curl -X GET "https://api.rufiar.com/api/v1/balance/me" \ -H "X-API-KEY: sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ -H "Accept: application/json"
Historial de OTPs
Obtiene el historial paginado de todos los OTPs enviados desde tu cuenta, ordenados por fecha de creación descendente. Útil para auditoría, debugging y monitoreo de tus flujos de verificación.
https://api.rufiar.com/api/v1/otp/history?page=0&size=10&sortDir=descRetorna una página de OTPs enviados. Soporta paginación y ordenamiento. Los parámetros son opcionales.
curl -X GET "https://api.rufiar.com/api/v1/otp/history?page=0&size=10&sortDir=desc" \ -H "X-API-KEY: sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ -H "Accept: application/json"
Parámetros de Query
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
page | integer | 0 | Número de página (base 0). |
size | integer | 10 | Cantidad de resultados por página. |
sortBy | string | createdAt | Campo por el que se ordena. |
sortDir | string | desc | Dirección: asc | desc. |
Códigos de Error
Todos los errores siguen el mismo formato JSON con los campos code, message y timestamp.
// Formato estándar de error
{
"code": "INSUFFICIENT_CREDITS", // Código de error interno
"message": "Descripción del error", // Mensaje legible
"timestamp": "2026-04-15T21:00:00Z",// ISO 8601
"fieldErrors": [ ... ] // Solo en errores de validación (400)
}| HTTP | Código | Escenario |
|---|---|---|
| 200 OK | — | Operación exitosa. |
| 201 Created | — | OTP creado y enviado correctamente. |
| 400 | VALIDATION_ERROR | Campos faltantes o con formato inválido. |
| 401 | UNAUTHORIZED | API Key inválida, ausente o expirada. |
| 402 | INSUFFICIENT_CREDITS | Saldo insuficiente. Recargá créditos. |
| 403 | FORBIDDEN | No tenés permisos para este recurso. |
| 404 | OTP_NOT_FOUND / USER_NOT_FOUND | El recurso solicitado no existe. |
| 409 | CONFLICT | Estado inconsistente, por ej. OTP ya procesado. |
| 422 | INVALID_OTP | OTP expirado, ya verificado, o fallido. |
| 429 | RATE_LIMIT_EXCEEDED | Superaste el límite de 5 envíos/hora por número. |
| 503 | OTP_SEND_FAILED | Error del proveedor SMS al enviar el mensaje. |
| 500 | INTERNAL_ERROR | Error inesperado del servidor. |
Sandbox (Entorno Seguro)
Para correr tests automatizados (CI/CD) o verificar tu integración sin consumir créditos, disponemos de un número mágico de sandbox que siempre responde exitosamente pero no envía mensajes a la red telefónica real.
Número de Test (SMS)
+54900000000Comportamiento:
- Devuelve HTTP 201 Created inmediatamente.
- No descuenta créditos de tu balance de cuenta (costCredits: 0).
- Genera un UUID válido que podés usar para probar el endpoint de Historial.
- Para probar la verificación, podés consultar el OTP Code: "123456" simulado.