PASE API v1
REST API para verificación de formación y descarga de certificados —
Base URL: https://api.paselearning.com
Descripción general
PASE API permite a organizaciones autorizadas consultar el estado de formación de personas registradas en la plataforma PASE y descargar los certificados emitidos en formato PDF.
La integración se basa en dos operaciones:
- Consulta de estado: enviás una lista de DNIs y recibís los cursos completados y certificados disponibles para cada persona.
- Descarga de PDF: con el token de descarga obtenido en la consulta, descargás el PDF de cada certificado individualmente.
Convenciones
| Elemento | Detalle |
|---|---|
| Protocolo | HTTPS obligatorio |
| Formato | JSON (UTF-8) para requests y responses. PDF binario para descargas. |
| Content-Type | application/json; charset=utf-8 |
| Versión | Prefijo /v1/ en todas las rutas |
| Fechas | ISO 8601 — YYYY-MM-DD HH:MM:SS (UTC-3 Buenos Aires) |
Autenticación
Todos los endpoints requieren un Bearer token en el header Authorization.
Cada organización cliente recibe un token único que no debe compartirse ni exponerse en código del lado del cliente.
# Header requerido en cada request
Authorization: Bearer {tu_token}
Obtención de credenciales
Los tokens son provistos por PASE al momento de la habilitación del acceso. Para solicitar acceso o reportar un token comprometido, contactar a administracion@paseaog.com.
Códigos de error
La API usa códigos HTTP estándar. Todos los errores devuelven un objeto JSON con status y message.
{
"status": "error",
"message": "Descripción del error"
}
| Código | Significado | Causa común |
|---|---|---|
| 400 | Bad Request | JSON malformado, operator_id incorrecto, batch de más de 1000 DNIs. |
| 401 | Unauthorized | Header Authorization ausente o Bearer token inválido. |
| 403 | Forbidden | El operator_id del body no coincide con el token Bearer usado. |
| 404 | Not Found | Ruta inexistente. |
| 410 | Gone | Token de descarga vencido (más de 10 min) o con usos agotados. |
| 429 | Too Many Requests | Se superó la cuota por minuto o la cuota diaria. |
| 500 | Internal Server Error | Error interno. Si persiste, contactar soporte. |
| 503 | Service Unavailable | El servicio (o solo las descargas de PDF) fue pausado temporalmente por mantenimiento. No es un error del cliente: reintentar más tarde. |
503, la consulta de estado puede seguir disponible aunque la descarga de PDF esté pausada. Recomendamos implementar reintento con espera (backoff) y no interpretar el 503 como "sin datos".Cuotas y límites
| Límite | Valor | Alcance |
|---|---|---|
| DNIs por request | 1 000 | Límite fijo por llamada al endpoint de status |
| Requests por minuto | Según contrato | Por cliente |
| DNIs por día | Según contrato | Por cliente |
| PDFs por día | Según contrato | Por cliente |
| Vigencia token descarga | 10 minutos | Desde la emisión |
| Usos token descarga | 3 | Por token |
429.POST /v1/certificates/status
Consulta el estado de formación para una lista de DNIs. Devuelve los cursos completados y un token de descarga para cada certificado disponible.
Request
| Header | Valor | |
|---|---|---|
| Authorization | Bearer {token} | requerido |
| Content-Type | application/json | requerido |
Body
| Campo | Tipo | Descripción | |
|---|---|---|---|
| operator_id | string | Identificador del operador asignado a tu cuenta (ej: "VISTA"). | requerido |
| people | array | Lista de personas a consultar. Máx. 1000 elementos. | requerido |
| people[].dni | string | DNI del empleado o contratista. | requerido |
{
"operator_id": "VISTA",
"people": [
{ "dni": "2591137" },
{ "dni": "30456789" },
{ "dni": "99999999" }
]
}
Response 200 OK
| Campo | Tipo | Descripción |
|---|---|---|
| status | string | "success" |
| operator_id | string | Operador de la consulta. |
| total_requested | integer | Cantidad de DNIs enviados. |
| results | array | Un objeto por cada DNI consultado. |
| results[].dni | string | DNI consultado. |
| results[].found | boolean | true si el DNI existe en la plataforma. |
| results[].courses | array | Lista de certificados emitidos. Vacío si no tiene o no fue encontrado. |
| courses[].course_id | integer | Identificador interno del curso. |
| courses[].course_name | string | Nombre del curso. |
| courses[].certificate_code | string | Código único del certificado. |
| courses[].approved | boolean | Siempre true cuando aparece en la lista. |
| courses[].approved_at | string | Fecha y hora de aprobación. |
| courses[].pdf_available | boolean | true si el PDF puede descargarse. |
| courses[].download_token | string | Token de 64 caracteres para descargar el PDF. Válido por 10 min, máx. 3 usos. |
{
"status": "success",
"operator_id": "VISTA",
"total_requested": 3,
"results": [
{
"dni": "2591137",
"found": true,
"courses": [
{
"course_id": 141,
"course_name": "SGA Etiquetado Químico",
"certificate_code": "mj285TvggX",
"approved": true,
"approved_at": "2026-05-12 08:29:13",
"pdf_available": true,
"download_token": "4428f2fc4d74516e06897f49ed41aacf..."
},
{
"course_id": 136,
"course_name": "Línea de Fuego",
"certificate_code": "KGGSJwdWyy",
"approved": true,
"approved_at": "2024-09-04 11:22:47",
"pdf_available": true,
"download_token": "98318d8da2713ca6156a345079fc39..."
}
]
},
{
"dni": "30456789",
"found": true,
"courses": []
},
{
"dni": "99999999",
"found": false,
"courses": []
}
]
}
found es false y courses es un array vacío — no se devuelve error.GET /v1/certificates/download/{token}
Descarga el PDF del certificado asociado al token obtenido en el endpoint de status. Devuelve el binario del PDF directamente.
Parámetros de URL
| Parámetro | Tipo | Descripción |
|---|---|---|
| token | string (64 hex) | Token de descarga obtenido en /v1/certificates/status. |
Request
GET /v1/certificates/download/4428f2fc4d74516e06897f49ed41aacf312595e0e3776bdd86b25d555556c4f5
Host: api.paselearning.com
Authorization: Bearer {tu_token}
Response 200 OK
| Header | Valor |
|---|---|
| Content-Type | application/pdf |
| Content-Disposition | inline; filename="certificado_{codigo}.pdf" |
El cuerpo de la respuesta es el binario del PDF. Guardarlo con extensión .pdf.
Errores posibles
| Código | Mensaje | Causa |
|---|---|---|
| 410 | Download token has expired. |
Han pasado más de 10 minutos desde que se generó el token. |
| 410 | Download token maximum uses reached. |
El token ya fue usado 3 veces. |
| 401 | Token does not belong to this client. |
El token fue generado por otro cliente. |
download_token es válido por 10 minutos y hasta 3 usos. Si el token vence, llamar nuevamente a /v1/certificates/status para obtener tokens frescos. El certificado no se pierde, solo el token expira.Ejemplo con curl
# Descargar un certificado y guardarlo como PDF
curl -s \
-H "Authorization: Bearer {tu_token}" \
"https://api.paselearning.com/v1/certificates/download/{download_token}" \
-o certificado_mj285TvggX.pdf
Objetos de respuesta
Objeto course
| Campo | Tipo | Descripción |
|---|---|---|
| course_id | integer | Identificador único del curso en la plataforma. |
| course_name | string | Nombre del curso tal como aparece en el certificado. |
| certificate_code | string | Código alfanumérico único del certificado emitido. Puede usarse para verificación independiente. |
| approved | boolean | Siempre true. Solo se devuelven cursos con certificado emitido. |
| approved_at | string | Fecha y hora de emisión del certificado en formato YYYY-MM-DD HH:MM:SS. |
| pdf_available | boolean | Indica si el PDF está disponible para descarga. |
| download_token | string | Token de 64 caracteres hexadecimales para descargar el PDF vía /v1/certificates/download. |
Ejemplos completos
Flujo completo: consulta y descarga
# Paso 1: Consultar estado de formación para 2 DNIs
curl -s -X POST \
-H "Authorization: Bearer {tu_token}" \
-H "Content-Type: application/json" \
-d '{"operator_id":"VISTA","people":[{"dni":"2591137"},{"dni":"30456789"}]}' \
"https://api.paselearning.com/v1/certificates/status"
# Paso 2: Descargar el PDF de cada certificado usando su download_token
curl -s \
-H "Authorization: Bearer {tu_token}" \
"https://api.paselearning.com/v1/certificates/download/{download_token}" \
-o certificado.pdf
Batch de múltiples DNIs (Python)
import requests
BASE_URL = "https://api.paselearning.com"
TOKEN = "{tu_token}"
HEADERS = {"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}
# 1. Consultar estado
resp = requests.post(
f"{BASE_URL}/v1/certificates/status",
headers=HEADERS,
json={"operator_id": "VISTA", "people": [{"dni": d} for d in ["2591137", "30456789"]]}
)
data = resp.json()
# 2. Descargar cada certificado
for person in data["results"]:
for course in person.get("courses", []):
if course["pdf_available"]:
pdf = requests.get(
f"{BASE_URL}/v1/certificates/download/{course['download_token']}",
headers=HEADERS
)
filename = f"cert_{course['certificate_code']}.pdf"
with open(filename, "wb") as f:
f.write(pdf.content)
print(f"✓ {person['dni']} — {course['course_name']} → {filename}")
PASE API v1 · Documentación técnica · Última actualización: = date('Y') ?>