Saltar al contenido principal

Integracion Partner para ERP multi-tenant

Esta es la integracion para un ERP que administra varios contribuyentes. El usuario final trabaja dentro del ERP; el ERP orquesta la certificacion y la emision usando una sola credencial Partner de backend. El cliente final no necesita crear API keys, llamar a PSFE ni conocer los endpoints.

Regla de seguridad

El ERP guarda X-PARTNER-KEY exclusivamente en su backend. Nunca la envies al navegador ni la incluyas en una aplicacion movil. Las cargas de certificados usan una sesion temporal y Authorization: Upload <uploadToken>; PSFE recibe el .p12/.pfx directamente y el ERP no debe conservar el archivo ni su contraseña.

X-PARTNER-KEY: <credencial-del-erp>
Content-Type: application/json

La base del contrato es la URL HTTPS entregada durante el onboarding, seguida de /partner/v1. En el staging de referencia es https://api-psfe-staging.zarela-consulting.com/partner/v1; no codifiques el host en el ERP. El Partner identifica cada contribuyente con un externalTenantId estable del ERP; normalmente debe ser el UUID del tenant porque el webhook global lo usa para enrutar el evento. PSFE devuelve un fiscalAccountId opaco que el ERP debe conservar.

Flujo que debe implementar el ERP

La solicitud de producción no equivale a aprobación. La activación solo ocurre cuando PSFE registra la decisión interna o la evidencia DGII correspondiente. El ERP debe mostrar estados pendientes y bloquear la emisión productiva mientras production.state no sea active.

Rutas del contrato

Todas las rutas siguientes están bajo /partner/v1 y requieren X-PARTNER-KEY, salvo la carga binaria indicada.

EtapaRutaUso
ProvisionamientoPUT /fiscal-accounts/by-external-id/{externalTenantId}Crea o recupera la cuenta de un tenant.
PerfilPATCH /fiscal-accounts/{id}/profileActualiza datos no identificadores. El RNC no se cambia aquí.
EstadoGET /fiscal-accounts/{id}/statusEstado consolidado de CerteCF y eCF.
CertificadoPOST /fiscal-accounts/{id}/certificate-upload-sessionsCrea carga temporal.
CertificadoPUT /certificate-upload-sessions/{uploadId}Envía el multipart con Authorization: Upload <uploadToken>.
CertificadoGET /fiscal-accounts/{id}/certificateLee metadata, nunca la clave privada.
CertificaciónPOST /fiscal-accounts/{id}/certification-casesVincula el caso a un set oficial habilitado.
CertificaciónPOST /fiscal-accounts/{id}/certification-cases/{caseId}/runsEjecuta el set oficial de CerteCF.
CertificaciónGET /fiscal-accounts/{id}/certification-cases/{caseId}Consulta checklist y siguiente acción.
CertificaciónGET .../certification-cases/{caseId}/runsRecupera runs recientes si se perdió una respuesta.
CertificaciónGET .../runs/{runId}Consulta el resultado del run.
EvidenciaGET .../runs/{runId}/evidenceObtiene el ZIP de evidencia en base64 cuando está listo.
AtestacionesPOST .../attestationsRegistra acciones humanas del integrador.
ProducciónPOST /fiscal-accounts/{id}/production-activation-requestsSolicita activación; no aprueba.
ProducciónGET /fiscal-accounts/{id}/productionConsulta autorización real.
EmisiónPOST /fiscal-accounts/{id}/production/documents?validate=truePreflight sin efectos fiscales.
EmisiónPOST /fiscal-accounts/{id}/production/documentsConvierte, firma y encola el e-CF.
ConciliaciónPOST .../production/documents/status/batchReconciliación periódica de estados.
ConciliaciónGET .../production/documents/{documentId}Consulta puntual de un documento.
WebhooksGET/POST /webhook-endpointsConfigura eventos del ERP.
WebhooksPOST /webhook-endpoints/{endpointId}/testEncola una entrega webhook.test firmada para validar recepción.

Para validar recepción, llama POST /webhook-endpoints/{endpointId}/test con el fiscalAccountId del tenant y, opcionalmente, environment (certecf por defecto). PSFE encola una entrega webhook.test durable y la procesa el worker; no crea un documento ni envía nada a DGII. El payload conserva stateVersion: 1, externalTenantId, fiscalAccountId y environment para que el ERP pruebe su deduplicación y enrutamiento.

Emisión e idempotencia

El ERP asigna el eNCF antes de enviar el JSON y conserva esa secuencia en su POS. No se requiere que el integrador genere un Idempotency-Key para la emisión normal: PSFE deduplica por tenant, ambiente y eNCF, y rechaza una reutilización con contenido fiscal distinto. Los reintentos deben enviar el mismo JSON y el mismo eNCF.

validate=true permite detectar errores de estructura/XSD sin registrar una emisión ni enviar a DGII. La emisión normal es asíncrona: guarda documentId, encf y correlationId, acepta el webhook y reconcilia con status/batch.

Los runs de certificación sí requieren Idempotency-Key. Conserva una clave estable por intento lógico: repetir la misma clave y parámetros devuelve el mismo runId; reutilizarla con parámetros distintos devuelve 409 IDEMPOTENCY_CONFLICT. Si la respuesta se pierde, consulta la lista de runs antes de crear otro.

Webhooks Partner

Configura el endpoint con POST /webhook-endpoints. El secreto se muestra una sola vez al crear o rotar. Para verificar cada solicitud, calcula HMAC-SHA256 sobre:

{timestamp}.{rawBody}

Usa Zarela-Signature: t=<unix>,v1=<hex> y compara en tiempo constante. Persiste Zarela-Event-Id con una restricción única antes de aplicar el evento. El payload Partner incluye schemaVersion, externalTenantId, fiscalAccountId, environment, stateVersion y resource; usa stateVersion para ignorar eventos atrasados.

Cada reintento lleva un timestamp y una firma nuevos, pero conserva el mismo Zarela-Event-Id y cuerpo. Por eso debes deduplicar por event ID y validar la firma de cada intento, no guardar una firma anterior.

Eventos principales: fiscal_account.state_changed, certificate.validated, certification.state_changed, certification.run_completed, certification.action_required, production.state_changed, document.state_changed y document.action_required.

Ambientes

El flujo Partner usa CerteCF para certificación y eCF para producción. TesteCF es solo una superficie de pruebas técnicas del producto; no sustituye el caso oficial de certificación ni habilita producción. El ERP debe mostrar el ambiente al usuario, pero no mezclar certificados, estados ni secuencias entre ambientes.

Errores que el ERP debe manejar

  • 401/403: credencial Partner ausente o scope insuficiente; no reintentar automáticamente.
  • 404 FISCAL_ACCOUNT_NOT_FOUND: provisiona primero o corrige el identificador.
  • 409 CERTIFICATION_*_NOT_READY: muestra la acción pendiente y espera el webhook.
  • 409 CERTIFICATION_EVIDENCE_NOT_READY: vuelve a consultar más tarde.
  • 423 PRODUCTION_NOT_ACTIVE: no intentes emitir; espera production.state_changed con active.
  • 429 PLAN_LIMIT_EXCEEDED: el tenant agotó la cuota que PSFE asignó al Partner; no cambies el plan desde el ERP y contacta al proveedor.
  • Otros 429: reintenta con backoff respetando Retry-After.

Descarga el contrato OpenAPI público para generar tipos o clientes; consulta también la guía de webhooks.