Analítica
Referencia de GET /v1/analytics: volumen de análisis, porcentaje de válidos, no válidos y a revisar, tiempos p50 y p95, créditos y motivos de rechazo más frecuentes, agrupados por tipo, día, plantilla o metadatos, en JSON o CSV.
GET /v1/analytics resume los análisis de un periodo: cuántos hubo, qué porcentaje salió válido, no válido o a revisar,
cuánto tardaron, cuántos créditos gastaron y por qué se rechazan más. Es la misma información que la sección
Analítica del panel, para llevarla a tu propio cuadro de mando o a una hoja de cálculo.
GET /v1/analytics?from=2026-09-01&to=2026-09-30&group_by=type
Authorization: Bearer ck_live_…Usa una clave secreta y cubre solo el modo de la clave: con ck_live_… los análisis reales, con ck_test_… los de
prueba.
Parámetros
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
from | fecha YYYY-MM-DD | 29 días antes de to | Primer día (incluido), en UTC. |
to | fecha YYYY-MM-DD | hoy | Último día (incluido), en UTC. |
group_by | type | day | template | metadata.<clave> | type | Cómo se agrupan los análisis en groups. |
format | json | csv | json | csv descarga un fichero en lugar del JSON. |
group_by | groups[].key | groups[].label | Orden |
|---|---|---|---|
type | Tipo detectado (es_dni…) | Nombre del tipo en el idioma de Accept-Language | Más análisis primero |
day | Día YYYY-MM-DD (UTC) | El mismo día | Cronológico; los días sin análisis no aparecen |
template | Id de la plantilla (tpl_…) | Nombre de la plantilla | Más análisis primero |
metadata.<clave> | Valor de esa clave de metadata (metadata.club_id) | El mismo valor | Más análisis primero |
Los análisis sin valor para la agrupación (sin tipo, sin plantilla o sin esa clave de metadata) se agrupan con
key: null y una etiqueta como «Sin plantilla». Como mucho 500 grupos.
Respuesta
{
"object": "analytics",
"from": "2026-09-01",
"to": "2026-09-30",
"group_by": "type",
"mode": "live",
"totals": {
"count": 1240, "completed": 1228, "failed": 12,
"valid": 1015, "invalid": 131, "review": 82,
"valid_rate": 0.8265, "invalid_rate": 0.1067, "review_rate": 0.0668,
"avg_ms": 3120, "p50_ms": 2410, "p95_ms": 7800,
"credits": 1412.4
},
"groups": [
{ "key": "es_dni", "label": "DNI (España)", "count": 802, "completed": 798, "failed": 4, "valid": 701, "invalid": 61, "review": 36, "valid_rate": 0.8784, "invalid_rate": 0.0764, "review_rate": 0.0451, "avg_ms": 2380, "p50_ms": 2100, "p95_ms": 4300, "credits": 802 }
],
"top_reasons": [
{ "code": "not_expired", "severity": "error", "count": 58, "example": "El documento caducó el 03/02/2026." },
{ "code": "low_confidence", "severity": "warning", "count": 41, "example": "No se ha podido leer con seguridad el número de documento." }
]
}| Campo | Descripción |
|---|---|
count | Análisis creados en el periodo (incluidos los que siguen en proceso). |
completed, failed | Terminados y fallidos. Los fallidos no se cobran. |
valid, invalid, review | Completados con ese veredicto. Si una persona revisó el análisis, cuenta su decisión (verdict.final_status). |
valid_rate, invalid_rate, review_rate | Proporción de 0 a 1 sobre los completados con veredicto (los que no tienen, como un generic sin expect, no cuentan). |
avg_ms, p50_ms, p95_ms | Tiempo de proceso (del inicio al fin del análisis) de los completados: media, mediana y percentil 95. null si no hay datos. |
credits | Créditos consumidos. En test, 0. |
top_reasons[] | Los 10 motivos warning y error más frecuentes de verdict.reasons: code, severity, count y un mensaje real de ejemplo (example). Los code están en Veredictos. |
Cuentan también los análisis cuyos resultados ya se borraron por retención: el registro mínimo (tipo, veredicto, créditos, metadatos) se conserva para la analítica.
CSV
Con format=csv la respuesta es un fichero analytics-<modo>-<agrupación>-<desde>-<hasta>.csv preparado para Excel:
separador ;, decimales con coma, BOM UTF-8, una fila por grupo (clave, grupo, totales, porcentajes, tiempo medio, p95
y créditos) y una fila final de total. Las cabeceras de columna van en el idioma de Accept-Language.
curl -G https://api.constaia.com/v1/analytics \
-H "Authorization: Bearer $CONSTAIA_API_KEY" \
-H "Accept-Language: es" \
--data-urlencode "from=2026-09-01" \
--data-urlencode "to=2026-09-30" \
--data-urlencode "group_by=metadata.club_id" \
--data-urlencode "format=csv" \
-o analitica-septiembre.csvEjemplos
curl -G https://api.constaia.com/v1/analytics \
-H "Authorization: Bearer $CONSTAIA_API_KEY" \
--data-urlencode "from=2026-09-01" \
--data-urlencode "to=2026-09-30" \
--data-urlencode "group_by=template"Ideas de uso
- Comparar plantillas:
group_by=templatemuestra qué configuración rechaza más o manda más a revisión. - Por cliente o evento: guarda su id en
metadataal analizar y agrupa congroup_by=metadata.<clave>. - Vigilar la calidad: si sube
review_rateo aparecelow_qualityentop_reasons, revisa las instrucciones de captura o usa el widget, que avisa de fotos borrosas antes de subir. - Coste:
creditspor grupo, junto conGET /v1/usagepara el detalle diario.
Errores
| HTTP | code | Cuándo |
|---|---|---|
422 | invalid_parameter | Una fecha no es YYYY-MM-DD válida o group_by no es uno de los admitidos (param indica cuál). |
Siguientes pasos
Saldo y consumo
Referencia de GET /v1/balance y GET /v1/usage: créditos de packs, plan gratuito, reservas y consumo diario por tipo de documento, con ejemplos.
Endpoints de webhook
Referencia de /v1/webhook-endpoints: crea, lista, consulta y borra las URLs que reciben los eventos de Constaia, con su secreto whsec_ y su modo.