Secuencias NCF (e-CF)
Gestiona las secuencias de comprobantes fiscales electrónicos (NCF electrónicos / e-CF) de tu empresa por programación — lo mismo que haces manualmente en el portal bajo Secuencias, ahora vía API.
| Método | Path | Para qué |
|---|---|---|
GET | /ncf | Listar tus secuencias + tipos disponibles |
POST | /ncf | Crear o editar una secuencia (upsert por prefijo) |
DELETE | /ncf/:prefix | Eliminar la secuencia de un prefijo |
Todos requieren Authorization: Bearer <JWT>.
El worker sólo necesita una secuencia ACTIVA por prefijo para resolver
la FechaVencimientoSecuencia (fecha de vencimiento) al firmar tus e-CF.
Tú mandas el eNCF completo en cada POST /invoices; esta API es donde
registras el rango autorizado por DGII y su vencimiento.
¿Por qué gestionar secuencias por API?
Si provisionas tenants o sucursales de forma automatizada (POS/ERP,
onboarding self-service, scripts de despliegue), estos endpoints te evitan
entrar al portal a mano: creas las secuencias E31, E32, … junto con el
resto del alta del cliente.
Tipos de e-CF (prefijos)
Para comprobantes electrónicos el prefijo ES el tipo — type === prefix.
Sólo se aceptan estos prefijos:
| Prefijo | Tipo de documento |
|---|---|
E31 | Factura de Crédito Fiscal |
E32 | Factura de Consumo |
E33 | Nota de Débito Electrónica |
E34 | Nota de Crédito Electrónica |
E41 | Compras |
E43 | Gastos Menores |
E44 | Régimen Especial |
E45 | Gubernamental |
E46 | Comprobante de Pago al Exterior |
E47 | Régimen Especial de Pago al Exterior |
Cualquier otro prefijo → 400 Bad Request.
GET /ncf
Lista todas las secuencias electrónicas del tenant y, por conveniencia, el catálogo de tipos disponibles.
GET /api/v1/fe/ncf
Authorization: Bearer <JWT>Scope requerido: ncf:read
Response — 200 OK
{
"availableTypes": [
{ "code": "E31", "name": "Factura de Crédito Fiscal" },
{ "code": "E32", "name": "Factura de Consumo" }
/* ... el resto de tipos ... */
],
"items": [
{
"id": "9e5c8010-fa9a-4190-9c3c-d727aa99b26c",
"type": "E31",
"prefix": "E31",
"description": "Factura de Crédito Fiscal",
"minSequence": "1",
"maxSequence": "9999999999",
"currentSequence": "1",
"isActive": true,
"expireAt": "2026-12-31T00:00:00.000Z"
}
/* ... una entry por secuencia configurada ... */
]
}| Campo | Descripción |
|---|---|
type / prefix | El prefijo e-CF. Para electrónicos, iguales. |
minSequence | Primer número de la secuencia autorizada (string). |
maxSequence | Último número autorizado (string). |
currentSequence | Próximo número a consumir (string). |
isActive | false = configurada pero ignorada por el worker. |
expireAt | Vencimiento de la secuencia (ISO 8601) o null. |
minSequence, maxSequence y currentSequence vienen como strings
porque el rango llega hasta 9999999999, cerca de Number.MAX_SAFE_INTEGER.
Conviértelos a BigInt si necesitas operar con ellos.
POST /ncf
Upsert por prefijo. Si el prefijo aún no existe, lo crea; si ya lo
tienes, lo actualiza en su lugar. Es idempotente — no necesitas conocer
ningún id interno, el prefix es la clave natural.
POST /api/v1/fe/ncf
Authorization: Bearer <JWT>
Content-Type: application/jsonScope requerido: ncf:write
Request body
| Campo | Tipo | Requerido | Default | Descripción |
|---|---|---|---|---|
prefix | string | ✅ | — | Uno de E31…E47 |
minSequence | number | ❌ | 1 | Inicio del rango (1…9999999999) |
maxSequence | number | ❌ | 9999999999 | Fin del rango (≥ minSequence) |
expireAt | ISO date | ❌ | null | Vencimiento (YYYY-MM-DD o ISO completo) |
isActive | boolean | ❌ | true | false para dejarla inactiva |
{
"prefix": "E31",
"minSequence": 1,
"maxSequence": 9999999999,
"expireAt": "2026-12-31",
"isActive": true
}El mínimo es sólo { "prefix": "E31" }. Rellenamos minSequence=1,
maxSequence=9999999999, expireAt=null, isActive=true por ti.
Comportamiento del rango
- Si
maxSequence < minSequence→400. - Al editar, si el
currentSequenceactual queda fuera del nuevo rango, lo ajustamos al borde más cercano (nunca lo dejamos inválido). - Al crear,
currentSequencearranca enminSequence.
Response — 200 OK
Devuelve la secuencia resultante (misma forma que un item de GET /ncf):
{
"id": "9e5c8010-fa9a-4190-9c3c-d727aa99b26c",
"type": "E31",
"prefix": "E31",
"description": "Factura de Crédito Fiscal",
"minSequence": "1",
"maxSequence": "9999999999",
"currentSequence": "1",
"isActive": true,
"expireAt": "2026-12-31T00:00:00.000Z"
}Response — 400 Bad Request
{
"message": "prefix debe ser un tipo e-CF válido (E31, E32, … E47)",
"statusCode": 400
}Otros 400 comunes:
La secuencia máxima debe ser mayor o igual a la mínima.Tipo de e-CF inválido.
DELETE /ncf/:prefix
Elimina la secuencia de un prefijo. Sólo afecta secuencias de tu tenant — nunca podrás borrar la de otro aunque adivines un prefijo.
DELETE /api/v1/fe/ncf/E31
Authorization: Bearer <JWT>Scope requerido: ncf:write
Path params
| Campo | Tipo | Descripción |
|---|---|---|
prefix | string | Uno de E31…E47 |
Response — 200 OK
{
"ok": true,
"prefix": "E31"
}Response — 404 Not Found
{
"message": "No existe una secuencia NCF para el prefijo E31.",
"statusCode": 404
}Eliminar una secuencia no revoca los e-CF ya emitidos con ella, pero el worker dejará de poder resolver su vencimiento en emisiones futuras de ese prefijo hasta que la vuelvas a crear. Bórrala sólo si de verdad ya no vas a emitir ese tipo.
Scopes y keys existentes
Los endpoints NCF usan dos scopes nuevos:
| Scope | Otorga |
|---|---|
ncf:read | GET /ncf |
ncf:write | POST /ncf, DELETE /ncf/:prefix |
No necesitas recrear tus keys. Al hacer POST /login, el JWT hereda
los scopes NCF a partir de la capacidad de facturación de la key: una key
con invoices:write recibe ncf:read + ncf:write; una key de sólo
lectura (invoices:read) recibe ncf:read. Revisa el array scopes en
la respuesta de /login para confirmar lo que tu key puede hacer.
Ver también: Autenticación → Scopes, POST /invoices (donde consumes estas secuencias).