Empresas y certificados
RECE.API es multi-empresa: podés operar varios CUIT desde la misma instalación, cada uno con su certificado por ambiente. Esta página cubre el alta de empresas y la gestión de certificados digitales.
Cómo se resuelve el certificado
En cada emisión, la API busca el certificado que corresponde a la combinación de CUIT +
ambiente. El mismo CUIT puede tener dos certificados distintos, uno de homologación y otro de
producción, y se elige según el campo ambiente del request.
Request con cuit + ambiente
│
├─ 1. Certificado activo en la base de datos para ese CUIT y ambiente
│
└─ 2. Si no hay: archivo .pfx configurado en el servidor
Listar empresas
Devuelve las empresas definidas en la configuración del servidor.
[
{
"cuit": "30712345678",
"razonSocial": "Mi Empresa SRL",
"ambiente": "Homologacion",
"activa": true,
"tieneCertificado": true
}
]
GET /api/empresas lee del archivo de configuración; GET /api/empresas/db lee de la base de datos. No son intercambiables. Además, tieneCertificado solo indica que hay una ruta configurada: no verifica que el archivo exista ni que el certificado sea válido. Para eso está el diagnóstico.
Una empresa puntual. Acepta ?ambiente=, por defecto homologacion. Devuelve 404 si no existe.
El CUIT que se usa cuando un request no especifica cuit.
Subir un certificado
El certificado se guarda en la base y queda activo para ese CUIT y ambiente.
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
ambiente | string | No | Por defecto "homologacion". |
razonSocial | string | Sí | Nombre de la empresa. |
certificadoBase64 | string | Sí | El .pfx o .p12 codificado en Base64. |
password | string | No | Clave del certificado. |
Convertir el certificado a Base64
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\certs\produccion.pfx"))
base64 -w 0 produccion.pfx
var bytes = File.ReadAllBytes("produccion.pfx");
var base64 = Convert.ToBase64String(bytes);
Respuesta
{
"ok": true,
"id": 3,
"message": "Certificado guardado correctamente en base de datos",
"venceEn": "15/04/2027",
"diasRestantes": 455,
"advertencia": null
}
- Si el certificado vence en menos de 30 días,
advertenciatrae el aviso. - Si ya venció, la respuesta es
400y no se guarda. - Si el archivo no contiene la clave privada, la carga falla: exportá el
.pfxincluyéndola.
Usá siempre HTTPS para este endpoint. La clave del certificado va en texto plano dentro del JSON y queda almacenada en la base de datos sin cifrar. Tratá el acceso a este endpoint y a la base con el mismo cuidado que al archivo .pfx original.
Listar certificados
[
{
"id": 3,
"cuit": "30712345678",
"ambiente": "produccion",
"razonSocial": "Mi Empresa SRL",
"esActivo": true,
"creadoEn": "2026-01-15T12:00:00Z",
"venceEn": "2027-04-15T00:00:00Z",
"tamanoBytes": 4096,
"diasHastaVencimiento": 455,
"estadoVigencia": "VIGENTE"
}
]
estadoVigencia | Significado |
|---|---|
VIGENTE | Más de 30 días para vencer. |
POR VENCER | Vence en menos de 30 días. Momento de renovarlo. |
VENCIDO | Ya expiró. Las emisiones van a fallar. |
Sin fecha | No se registró fecha de vencimiento. |
Diagnóstico de certificado
La consulta a hacer cuando una emisión falla por autenticación. Verifica que el certificado exista, tenga clave privada y esté vigente.
curl "https://api.tudominio.com/api/empresas/30712345678/certificado/diagnostico?ambiente=produccion" \
-H "X-Api-Token: abc123XYZ..."
Devuelve 404 si no hay empresa para ese CUIT, y 500 si el certificado no se puede cargar.
Desactivar un certificado
{ "ok": true, "message": "Certificado desactivado" }
No borra el registro: lo marca como inactivo. Para renovar un certificado, subí el nuevo y desactivá el anterior; conviene además invalidar el caché de WSAA para que los tickets viejos no se sigan usando.
Empresas en base de datos
Aparte de las empresas de configuración, existe un registro de empresas en la base con parámetros adicionales de integración.
{
"nombre": "Mi Empresa SRL",
"cuit": "30712345678",
"ambiente": "produccion",
"color": "#0078D4",
"activa": true,
"dbTipo": "SQL",
"dbConnectionString": "Server=192.168.1.1;Database=ERP;User Id=usuario;Password=...;",
"dbPrefijoTablas": "IV_",
"monitorHabilitado": true,
"monitorIntervaloSegundos": 30,
"monitorLoteTamano": 10,
"monitorValidarNumeracion": true,
"monitorModoDebug": false
}
GET /api/empresas/db devuelve cadenas de conexión
La respuesta incluye dbConnectionString en texto plano, con usuario y contraseña de la base del ERP. Cualquier portador de un token válido puede leerla. Si no necesitás este endpoint para tu integración, no lo uses; y si lo usás, restringí quién tiene tokens.
Los campos monitor* y db* aplican solo a instalaciones que usan el componente de monitoreo automático sobre la base de un ERP. Si te integrás directamente contra la API, no te afectan.