Para usar esta API necesitas una API key. Empieza gratis con API Starter (100 tokens/mes) o súbete a Growth / Enterprise.

API Documentation

Psicometrías Platform — REST API Reference

v1.0 JSON Bearer Auth
Base URL: https://psicometricas.alobri.com/api
¿Primera vez? Así obtienes tu API key
  1. Regístrate o inicia sesión en alobri.com.
  2. Elige un plan API: Starter (gratis, 100 tokens/mes), Growth o Enterprise.
  3. Entra a /mi-api y haz clic en «Generar mi token».
  4. Cópialo (sólo se muestra una vez) y úsalo abajo para probar los endpoints.
Cada llamada consume tokens del cap mensual de tu plan. Excedente se cobra a la tarifa USD/token de tu plan (Growth y Enterprise).
Autenticación
Bearer
Se usará automáticamente en las solicitudes de prueba.
X-Internal-Secret
Para endpoints /api/internal/*
Formato de Respuesta Estándar
Exitosa (2xx)
{ "success": true, "message": "...", "data": { ... } }
Error (4xx/5xx)
{ "success": false, "message": "...", "data": null }
Paginada
{ "success": true, "data": [ ... ], "meta": { "current_page": 1, "per_page": 25, "total": 112 } }
Rate Limit: Los headers X-RateLimit-Limit y X-RateLimit-Remaining se incluyen en cada respuesta. Al exceder el límite se retorna 429 con Retry-After.
Catálogo de Tests
Bearer Auth Rate Limit

Retorna el catálogo completo de pruebas psicométricas disponibles para el cliente.

Parámetros

Ninguno

Respuesta 200
{ "success": true, "message": "Test catalog retrieved.", "data": [ { "id": 1, "title": "Terman-Merrill", "type": "Inteligencia", "type_id": 3, "time": "45:00", "instructions": "Lea cada pregunta...", "token_cost": 2, "sections_count": 4, "questions_count": 80 } ] }
Probar Endpoint
Bearer Auth Rate Limit
Parámetros de Ruta
ParámetroTipoDescripción
id integer requerido ID interno del test
Respuesta 200
{ "success": true, "data": { "id": 1, "title": "Terman-Merrill", "type": "Inteligencia", // ... misma estructura que el listado } }
Respuesta 404
{ "success": false, "message": "Test not found." }
Probar Endpoint
Candidatos
Bearer Auth Rate Limit

Crea un nuevo candidato y lo vincula al cliente API mediante un external_candidate_id.

Body (JSON)
CampoTipoDescripción
external_candidate_idstring requeridoID externo único del candidato (max 255)
firstnamestring requeridoNombre
lastnamestring requeridoApellido
emailstring requeridoCorreo electrónico válido
phonestring opcionalTeléfono (max 50)
date_of_birthdate opcionalFecha de nacimiento
genderstring opcionalGénero
postal_codestring opcionalCódigo postal (max 10)
countrystring opcionalPaís (max 100)
Ejemplo de Request
{ "external_candidate_id": "EXT-001", "firstname": "Juan", "lastname": "Pérez", "email": "juan@ejemplo.com", "phone": "+52-555-0100" }
Respuesta 201
{ "success": true, "message": "Candidate created.", "data": { "external_id": "EXT-001", "id": 123, "name": "Juan Pérez", "email": "juan@ejemplo.com", "phone": "+52-555-0100", "created_at": "2026-02-26T10:00:00+00:00" } }
Probar Endpoint
Bearer Auth Rate Limit

Retorna todos los candidatos vinculados al cliente autenticado.

Parámetros

Ninguno

Respuesta 200
{ "success": true, "data": [ { "external_id": "EXT-001", "id": 123, "name": "Juan Pérez", "email": "juan@ejemplo.com" } ] }
Probar Endpoint
Bearer Auth Rate Limit
Parámetros de Ruta
ParámetroTipoDescripción
external_idstring requeridoID externo asignado al crear el candidato
Respuesta 404
{ "success": false, "message": "Candidate not found." }
Probar Endpoint
Evaluaciones
Bearer Auth Rate Limit Test Access Billing Quota

Asigna uno o más tests a un candidato. Consume cuota (tokens o suscripción). Retorna un código de acceso para que el candidato inicie sesión.

Body (JSON)
CampoTipoDescripción
external_candidate_idstring requeridoID externo del candidato existente o nuevo
test_idsarray[int] requeridoIDs de tests a asignar (mínimo 1)
candidateobject condicionalDatos del candidato si no existe aún
candidate.firstnamestringNombre (requerido si se envía candidate)
candidate.lastnamestringApellido (requerido si se envía candidate)
candidate.emailstringEmail (requerido si se envía candidate)
Ejemplo de Request
{ "external_candidate_id": "EXT-001", "test_ids": [1, 3], "candidate": { "firstname": "María", "lastname": "López", "email": "maria@ejemplo.com" } }
Respuesta 201
{ "success": true, "message": "Evaluations assigned successfully.", "data": { "access_code": "ABC123", "evaluation_url": "https://app.example.com/login#tab-candidate", "evaluations": [ { "id": 55, "test": { "id": 1, "title": "Terman-Merrill" }, "status": "pending", "progress": { "sections_completed": 0, "sections_total": 4 } } ] } }
Errores Posibles
CódigoCaso
402Saldo de tokens insuficiente o límite de suscripción alcanzado
422Tests no disponibles vía API o candidato no encontrado sin bloque candidate
Probar Endpoint
Bearer Auth Rate Limit
Query Params
ParámetroTipoDescripción
per_pageinteger opcionalItems por página (default: 25)
Respuesta 200
{ "success": true, "data": [ /* evaluaciones */ ], "meta": { "current_page": 1, "per_page": 25, "total": 50 } }
Probar Endpoint
Bearer Auth Rate Limit
Parámetros de Ruta
ParámetroTipoDescripción
idinteger requeridoID interno de la evaluación (UserAssignedTest)
Probar Endpoint
Resultados
Bearer Auth Rate Limit

Retorna los resultados calculados (scores) de una evaluación completada. Registra un evento result_queried.

Respuesta 200
{ "success": true, "data": { "user_id": 123, "user_name": "Juan Pérez", "token": "eval-token-string", "application": { "id": 10, "vacancy": "Software Engineer", "code": "APP-2026-001" }, "responses_count": 80, "scores": { /* estructura varía por tipo de test */ } } }
Probar Endpoint
Bearer Auth Rate Limit

Genera y descarga un reporte PDF con los resultados. Retorna Content-Type: application/pdf.

Respuesta 200
Content-Type: application/pdf Content-Disposition: attachment; filename="results_{id}.pdf" [Binary PDF stream]
Probar Endpoint
Bearer Auth Rate Limit

Encola el envío asíncrono del PDF al webhook configurado del cliente. Requiere tener un webhook_url configurado.

Body

Ninguno

Respuesta 200
{ "success": true, "message": "PDF webhook delivery queued." }
Respuesta 422
{ "success": false, "message": "No webhook URL configured for this client." }
Probar Endpoint
Facturación
Bearer Auth Rate Limit

Retorna el estado de facturación actual. La estructura varía según el tipo de cliente.

Respuesta por Tipo de Cliente
{ "data": { "client_type": "token", "token_balance": 150, "tokens_consumed_total": 42 } }
{ "data": { "client_type": "subscription", "subscription_plan": "default", "subscription_eval_limit": 100, "subscription_evals_used": 38, "subscription_evals_remaining": 62, "subscription_ends_at": "2026-03-31T23:59:59+00:00" } }
{ "data": { "client_type": "government", "access": "unlimited", "evaluations_assigned_total": 1540 } }
Probar Endpoint
Bearer Auth Rate Limit

Log paginado de todos los eventos de uso de la API.

Query Params
ParámetroTipoDescripción
per_pageinteger opcionalItems por página (default: 25)
Acciones Registradas
evaluation_assigned result_queried pdf_downloaded pdf_webhook_sent
Probar Endpoint
Configuración de Webhook
Verifica que el webhook viene de Alobri

Cada request POST a tu webhook_url incluye los headers:

  • X-Webhook-Event — tipo de evento (ej. evaluation.completed)
  • X-Webhook-Delivery — ID único de este intento
  • X-Webhook-Timestamp — epoch segundos del envío
  • X-Webhook-Signaturet=<timestamp>,v1=<hex>

El cliente debe:

  1. Extraer t y v1 del header.
  2. Rechazar si |now - t| > 300s (anti-replay).
  3. Calcular HMAC_SHA256(webhook_secret, "<t>." + raw_body).
  4. Comparar con v1 en tiempo constante (hash_equals).
  5. Solo entónces procesar el JSON.
Ejemplo Node.js
// Express + body-parser raw const crypto = require('crypto'); app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => { const sigHeader = req.headers['x-webhook-signature'] || ''; const [tPart, sigPart] = sigHeader.split(','); const ts = tPart?.split('=')[1]; const sig = sigPart?.split('=')[1]; if (Math.abs(Date.now()/1000 - ts) > 300) return res.sendStatus(401); const expected = crypto.createHmac('sha256', process.env.WEBHOOK_SECRET) .update(ts + '.' + req.body.toString()).digest('hex'); if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) return res.sendStatus(401); const payload = JSON.parse(req.body); // ...procesa el evento res.sendStatus(200); });
Ejemplo PHP
$body = file_get_contents('php://input'); $header = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? ''; parse_str(str_replace(',', '&', $header), $parts); if (abs(time() - (int) $parts['t']) > 300) http_response_code(401); $expected = hash_hmac('sha256', $parts['t'] . '.' . $body, $_ENV['WEBHOOK_SECRET']); if (! hash_equals($expected, $parts['v1'])) http_response_code(401);

Si haces tu primer PUT /api/v1/webhook sin pasar webhook_secret, generamos uno por ti y te lo devolvemos en el campo webhook_secret del response (sólo esa única vez). Para rotar, manda un nuevo valor en otro PUT.

Bearer Auth Rate Limit
Respuesta 200
{ "data": { "webhook_url": "https://partner.example.com/hooks/psico", "has_secret": true } }
Probar Endpoint
Bearer Auth Rate Limit
Body (JSON)
CampoTipoDescripción
webhook_urlstring requeridoURL válida del webhook (max 2048)
webhook_secretstring opcionalNuevo secreto HMAC-SHA256 (max 255). Si se omite, se conserva el actual.
Probar Endpoint
Bearer Auth Rate Limit

Envía un evento de prueba al webhook configurado y retorna el resultado de la entrega.

Respuesta 200 (entrega exitosa)
{ "data": { "success": true, "delivery_id": 7, "http_status": 200, "message": "Webhook delivered successfully." } }
Detalles de Entrega
  • Método: POST al webhook_url
  • Timeout: 30 segundos
  • Headers: X-Webhook-Event, X-Webhook-Delivery
  • Si hay secret: X-Webhook-Signature: hmac-sha256(payload, secret)
  • Reintentos en caso de falla: 30s, 2m, 10m, 1h, 2h (máx 5 intentos)
Probar Endpoint
API Interna (Aprovisionamiento de Clientes)
Autenticación: Header X-Internal-Secret verificado contra la tabla ApiInternalConsumer. Uso exclusivo para comunicación máquina a máquina.
Query Params
ParámetroTipoDescripción
employer_idinteger opcionalFiltrar por employer_id en el campo notes
Respuesta 200
{ "data": [ { "client_id": 1, "slug": "acme-corp", "name": "ACME Corp", "client_type": "government", "is_active": true, "company_id": 10 } ] }
Probar Endpoint

Crea un nuevo cliente API y emite su primer token Sanctum. Si un cliente con el mismo slug fue eliminado, lo restaura y emite un token nuevo.

Body (JSON)
CampoTipoDescripción
namestring requeridoNombre del cliente (se genera slug automáticamente)
emailstring requeridoEmail de contacto
company_idinteger opcionalID de compañía interna
client_typestring opcionaltoken | government | subscription (default: government)
employer_idinteger opcionalAlmacenado en notes
token_balanceinteger opcionalBalance inicial (solo tipo token, default: 0)
subscription_daysinteger opcionalDuración en días (solo tipo subscription, default: 30)
subscription_eval_limitinteger opcionalLímite de evaluaciones (solo tipo subscription, default: 100)
Respuesta 201
{ "data": { "client_id": 5, "slug": "acme-corp", "client_type": "token", "is_active": true, "api_token": "1|plaintexttoken..." } } // IMPORTANTE: El api_token solo se muestra una vez.
Probar Endpoint
Parámetros de Ruta
ParámetroTipoDescripción
slugstring requeridoSlug del cliente (generado del nombre)
Respuesta 200
{ "data": { "client_id": 5, "slug": "acme-corp", "name": "ACME Corp", "client_type": "token", "is_active": true, "has_token": true, "billing": { "token_balance": 150, "subscription_plan": null } } }
Probar Endpoint

Alterna el estado activo/inactivo del cliente. Si se reactiva sin tokens existentes, genera uno nuevo.

Body (JSON)
CampoTipoDescripción
enableboolean opcionalForzar estado. Si se omite, alterna el actual.
Respuesta 200
{ "data": { "client_id": 5, "slug": "acme-corp", "is_active": true, "api_token": "3|newtoken..." // solo si se generó nuevo } }
Probar Endpoint
Tipos de Cliente
TipoModelo de FacturaciónCuotaUnidad de Costo
governmentSin facturaciónIlimitadaN/A
tokenBalance de tokensPre-verificado por requesttoken_cost por test (tabla ApiTestTokenCost)
subscriptionLímite de evals + fecha de expiraciónPre-verificado por request1 eval por test asignado