Créditos y facturación
Cómo se calculan los créditos por página, qué no se cobra, plan gratis de 150 créditos al mes, packs en EUR y USD, caducidad, saldo, alertas y error 402.
Constaia funciona con créditos de pago por uso. No hay suscripción: compras packs cuando los necesitas y, mientras tanto, tienes 150 créditos gratis cada mes. Precios y comparativa en /es/precios.
Cuánto cuesta cada operación
| Operación | Créditos |
|---|---|
Análisis (POST /v1/analyze) de un documento de hasta 2 páginas | 1 |
| Cada 2 páginas adicionales | +1 |
Clasificación (POST /v1/classify) | 0,2 |
| Exportaciones (JSON, CSV, XLSX, XML, vCard, PDF) | Incluidas |
La regla es créditos = ceil(páginas / 2), con un mínimo de 1. Un DNI por las dos caras en un solo fichero o en un PDF de
2 páginas cuesta 1 crédito.
| Documento | Páginas | Créditos |
|---|---|---|
| DNI, anverso y reverso en un fichero | 2 | 1 |
| Certificado médico de una página | 1 | 1 |
| Factura de 3 páginas | 3 | 2 |
| Contrato de 10 páginas | 10 | 5 |
| 5 clasificaciones | — | 1 |
| Lote de 100 documentos de 2 páginas | 200 | 100 |
En un lote, cada documento se cuenta por separado con la misma regla. Cada análisis indica lo que ha costado en usage:
"usage": { "credits": 1, "pages": 2 }Qué no se cobra
- Modo test. Las claves
ck_test_no gastan créditos (usage.credits: 0). - Fallos por nuestra parte. Un análisis que acaba en
status: "failed"(por ejemploprocessing_failed) no se cobra. - Rechazos por calidad antes del OCR. Si la imagen se rechaza antes de leerla, no se cobra.
- Reintentos con la misma
Idempotency-Keyen 24 h: devuelven la respuesta guardada sin cobrar dos veces. - Exportaciones. Ya están incluidas.
Un análisis que termina en invalid o review sí se cobra: Constaia ha hecho el trabajo y te ha dado una respuesta.
Reserva y captura
Al empezar un análisis, Constaia reserva los créditos que costará. Al terminar:
- si se completa, la reserva se captura;
- si falla por nuestra parte o se rechaza por calidad antes del OCR, la reserva se libera y vuelve a tu saldo.
Mientras hay análisis en curso verás créditos en credits_reserved. Si no tienes saldo suficiente para reservar, la
petición falla con un 402 insufficient_credits y no se analiza nada.
En modo live, un lote comprueba al crearse que tienes al menos 1 crédito por documento; si no, lo rechaza entero con 402. Después cada documento cuesta lo que le corresponda por páginas.
Plan gratis
- 150 créditos al mes, que se renuevan el día 1 de cada mes (UTC). Los que no uses no se acumulan.
- Para gastarlos en modo live necesitas el email verificado.
free_tier_resets_aten el saldo te dice cuándo se renuevan.
Packs
Los packs son pagos únicos, sin suscripción. Precios sin IVA:
| Pack | EUR | ≈ €/crédito | USD | ≈ $/crédito |
|---|---|---|---|---|
| 1.000 créditos | 49 € | 0,049 | $55 | 0.055 |
| 5.000 créditos | 199 € | 0,040 | $219 | 0.044 |
| 25.000 créditos | 790 € | 0,032 | $869 | 0.035 |
| 100.000 créditos | 2.490 € | 0,025 | $2,740 | 0.027 |
| Enterprise | A medida | — | A medida | — |
- Los packs caducan a los 12 meses de la compra.
- Orden de consumo: primero el plan gratis del mes y después los packs, del más antiguo al más reciente (FIFO).
- Enterprise: contrato, DPA, SLA y límites propios. Detalles en /es/precios.
Compra packs en Facturación en app.constaia.com. El pago va por Stripe Checkout y los créditos se suman a tu saldo en cuanto se confirma.
IVA y facturas
- Los precios no incluyen IVA. Stripe Tax lo calcula al pagar según tus datos fiscales.
- Cada compra genera una factura que encontrarás en Facturación en el panel.
- Rellena los datos fiscales de tu empresa antes de la primera compra para que aparezcan en la factura.
Consultar el saldo
GET /v1/balance devuelve:
{
"object": "balance",
"credits_available": 4210,
"credits_reserved": 3,
"free_tier_remaining": 12,
"credits_spendable": 4222,
"free_tier_resets_at": "2026-10-01T00:00:00.000Z"
}| Campo | Significado |
|---|---|
credits_available | Créditos de packs disponibles (sin contar el plan gratis y descontadas las reservas que salen de packs). |
credits_reserved | Créditos reservados por análisis en curso. |
free_tier_remaining | Créditos gratis que te quedan este mes (descontadas sus reservas). |
credits_spendable | Lo que puedes gastar ahora mismo: credits_available + free_tier_remaining. |
free_tier_resets_at | Cuándo se renueva el plan gratis. |
Lo que puedes gastar ahora mismo es credits_spendable (credits_available + free_tier_remaining).
curl https://api.constaia.com/v1/balance \
-H "Authorization: Bearer $CONSTAIA_API_KEY"Consultar el consumo
GET /v1/usage?from=YYYY-MM-DD&to=YYYY-MM-DD agrega el consumo por día y tipo de documento (por defecto, los últimos
30 días del modo de la clave):
curl "https://api.constaia.com/v1/usage?from=2026-09-01&to=2026-09-30" \
-H "Authorization: Bearer $CONSTAIA_API_KEY"{
"object": "usage",
"from": "2026-09-01",
"to": "2026-09-30",
"livemode": true,
"data": [
{ "date": "2026-09-29", "type": "es_dni", "kind": "analysis", "livemode": true, "count": 42, "pages": 84, "credits": 42 }
],
"totals": { "count": 42, "pages": 84, "credits": 42 }
}Para repartir costes entre clientes o departamentos, envía metadata en cada análisis (por ejemplo
{ "club_id": "42" }) y filtra con GET /v1/analyses?metadata[club_id]=42. Más en
Saldo y consumo.
Alerta de saldo bajo
En los ajustes del panel defines un umbral de aviso (por defecto, 50 créditos). Cuando, tras un análisis cobrado en modo live, tu saldo gastable baja del umbral, Constaia:
- envía el webhook
credits.lowa los endpoints suscritos, y - manda un email a los propietarios y administradores de la cuenta.
{
"type": "credits.low",
"created_at": "2026-09-29T10:00:00Z",
"data": { "object": "balance", "credits_available": 0, "free_tier_remaining": 48, "credits_spendable": 48, "threshold": 50 }
}Los campos significan lo mismo que en GET /v1/balance: credits_available son solo créditos de packs y
credits_spendable es lo que puedes gastar (plan gratis más packs); el aviso salta cuando credits_spendable baja del
umbral. Se envía una sola vez hasta que recargas con un pack o se renueva el plan gratis. Suscríbete desde
Webhooks.
Gestionar el error 402
Sin saldo suficiente, la API responde:
{
"error": {
"type": "insufficient_credits",
"code": "insufficient_credits",
"message": "…",
"request_id": "req_…"
}
}No lo reintentes en bucle: no se resolverá solo. Deja el trabajo en cola, avisa a tu equipo y reanuda cuando haya saldo.
import { Constaia, InsufficientCreditsError } from "@constaia/sdk";
import { fromPath } from "@constaia/sdk/node";
const constaia = new Constaia();
try {
const analysis = await constaia.analyze(await fromPath("./dni.jpg"), { expect: "es_dni" });
console.log(analysis.verdict?.status);
} catch (err) {
if (err instanceof InsufficientCreditsError) {
// Guarda el documento para más tarde y avisa a quien compra los créditos.
console.error(`Sin créditos (request ${err.requestId})`);
} else {
throw err;
}
}Tope de gasto mensual
Puedes fijar un tope de créditos al mes para la cuenta: si un análisis en modo live lo superaría, se rechaza con
402 monthly_cap_reached sin cobrarse, y los owners y admins reciben un email al 80 % y al 100 %. Detalles en
Límites de uso.
Próximamente: revisión humana gestionada
Revisión humana de documentos por el equipo de Constaia: +0,40 € por documento. Todavía no está disponible; mientras tanto, monta tu propia cola con la guía de revisión humana. Sigue el changelog.
Siguientes pasos
Exportaciones
Descarga los resultados de Constaia en JSON, CSV, Excel, XML, vCard o PDF, por análisis o combinados por lote, con enlaces firmados de 24 horas o bajo demanda.
Versionado y changelog
Cómo versiona Constaia su API (v1 en la ruta) y sus SDK, qué cambios compatibles pueden llegar sin aviso y cómo escribir código que no se rompa con ellos.