Facturación FACe (B2G)
Envía facturas FacturaE 3.2.2 a FACe — códigos DIR3, XML firmado XAdES-EPES, estados de tramitación, anulación, simulación en sandbox y el scope facturae:write.
Facturar a una administración pública española (B2G) es obligatorio a través de FACe, el punto general de entrada de facturas electrónicas (Ley 25/2013). Factuarea genera el XML FacturaE 3.2.2 de cualquier factura emitida, lo firma XAdES-EPES con el certificado de tu empresa y lo presenta al web service de FACe — y después sigue rastreando el estado de tramitación que informa FACe hasta que la factura se paga (o se rechaza).
El ciclo de vida completo lo cubren las cinco operaciones del grupo FacturaE de la Referencia de la API:
- Descargar el XML FacturaE de una factura — firmado o sin firmar, con o sin FACe.
- Enviar una factura a FACe.
- Listar los envíos de una factura.
- Recuperar un envío para seguir su estado de tramitación.
- Solicitar la anulación de un envío.
Las lecturas usan el scope facturae:read; enviar y anular requieren
facturae:write. El módulo FacturaE está incluido en los planes
Empresario y Enterprise.
Antes de enviar
Configura los tres códigos DIR3 del cliente. Todo cliente
administración pública lleva tres códigos del directorio DIR3, cada uno con
el formato ^[A-Z][A-Z0-9]{8,9}$ (p. ej. L01280796). Configúralos al
crear o actualizar el cliente:
curl -X PUT https://api.factuarea.com/v1/clients/0197a2a8-4cf0-7a31-9a5e-3f2b8c1d6e42 \
-H "Authorization: Bearer fact_live_3pXnR2VbY7TcA9eFmN5z8KqW" \
-H "Content-Type: application/json" \
-d '{
"dir3_accounting_office": "L01280796",
"dir3_managing_body": "L01280796",
"dir3_processing_unit": "L01280796"
}'| Campo | Rol DIR3 |
|---|---|
dir3_accounting_office | Oficina contable (01) |
dir3_managing_body | Órgano gestor (02) |
dir3_processing_unit | Unidad tramitadora (03) |
La administración te indica los tres códigos (a menudo coinciden); también puedes consultarlos en el directorio público DIR3.
Sube un certificado de firma activo. FACe solo acepta facturas
firmadas, así que el envío requiere el certificado FNMT (PKCS#12) que tu
empresa ya usa para VeriFactu (POST /v1/verifactu/certificates). Sin
certificado activo el envío falla con signing_certificate_required.
Emite la factura. Las facturas en borrador no pueden viajar a FACe —
enviar o emitir antes la factura es lo que congela su contenido legal. Los
borradores responden invoice_not_emittable_for_facturae.
Descargar el XML FacturaE
Puedes descargar el XML en cualquier momento — para presentación manual, archivo o validación — sin involucrar a FACe:
curl -OJ https://api.factuarea.com/v1/invoices/0197b1c2-89ab-7def-8123-456789abcdef/facturae \
-H "Authorization: Bearer fact_live_3pXnR2VbY7TcA9eFmN5z8KqW"Con un certificado activo el cuerpo va firmado XAdES-EPES (política de firma
Facturae v3.1) y el fichero se llama .xsig; sin él, el XML vuelve sin
firmar como .xml. El header de respuesta X-Facturae-Signed: true|false
distingue ambos casos. Consulta la
referencia del endpoint.
La descarga tolera la ausencia de certificado (obtienes el XML sin firmar); el envío a FACe no — FACe exige la firma.
Enviar a FACe
La operación de envío no lleva cuerpo de petición: la factura viaja en la ruta y los códigos DIR3 se leen del cliente en el momento del envío (y se capturan en la submission):
curl -X POST https://api.factuarea.com/v1/invoices/0197b1c2-89ab-7def-8123-456789abcdef/face-submissions \
-H "Authorization: Bearer fact_live_3pXnR2VbY7TcA9eFmN5z8KqW" \
-H "Idempotency-Key: $(uuidgen)"Respuesta (201):
{
"data": {
"id": "0197c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
"object": "face_submission",
"invoice_id": "0197b1c2-89ab-7def-8123-456789abcdef",
"status": "submitted",
"registry_number": "202612345678",
"dir3_accounting_office": "L01280796",
"dir3_managing_body": "L01280796",
"dir3_processing_unit": "L01280796",
"error_code": null,
"error_message": null,
"status_updated_at": "2026-06-12T10:15:00Z",
"last_polled_at": null,
"created_at": "2026-06-12T10:15:00Z"
}
}registry_number es el asiento registral de FACe que acredita la
presentación — consérvalo para cualquier disputa con la administración.
Seguir el estado de tramitación
FACe informa de cómo la administración tramita la factura. Factuarea consulta FACe periódicamente y actualiza cada envío — recuperar el detalle del envío (o el historial de envíos de la factura) es la forma de seguir el progreso; no hay endpoint de refresco en v1:
curl https://api.factuarea.com/v1/face-submissions/0197c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d \
-H "Authorization: Bearer fact_live_3pXnR2VbY7TcA9eFmN5z8KqW"status | Significado |
|---|---|
submitted | Presentada en FACe; número de registro asignado. |
registered_rcf | Registrada en el RCF (el registro contable de facturas de la administración). |
accounted | Reconocida como obligación contable por la administración. |
paid | La administración informa de la factura como pagada. |
rejected | Rechazada por la administración — consulta el motivo en FACe y emite una factura corregida. |
cancellation_requested | Has solicitado la anulación; pendiente de confirmación de FACe. |
cancelled | Anulación confirmada por FACe. |
error | Error local de transmisión — error_code y error_message llevan el detalle. |
¿Prefieres push a polling? Suscríbete a los
eventos de webhook facturae.face_submitted,
facturae.face_status_changed y facturae.face_cancellation_requested.
Solicitar la anulación
Mientras la factura no se haya pagado ni rechazado puedes
solicitar su anulación
(anulación 4200). El reason es obligatorio y viaja a FACe:
curl -X POST https://api.factuarea.com/v1/face-submissions/0197c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d/cancel \
-H "Authorization: Bearer fact_live_3pXnR2VbY7TcA9eFmN5z8KqW" \
-H "Content-Type: application/json" \
-d '{ "reason": "Factura emitida por error al organismo equivocado." }'La anulación solo se permite en un estado anulable (submitted,
registered_rcf, accounted); en caso contrario la llamada responde
face_submission_not_cancellable. El envío pasa a
cancellation_requested hasta que FACe confirma el estado final
cancelled.
Modo de prueba
Con una clave de prueba (fact_test_) todo el flujo se simula: ninguna
llamada SOAP llega a FACe y el envío recibe un número de registro sintético
con prefijo FACE-SANDBOX-*. Las validaciones de firma y DIR3 siguen
aplicando, así que el sandbox ejercita los mismos caminos de error que
producción. Consulta el modo de prueba.
Errores
| HTTP | code / subcode | Cuándo |
|---|---|---|
| 404 | resource_not_found | La factura o el envío no existe o pertenece a otra empresa. |
| 422 | business_rule_violation / invoice_not_emittable_for_facturae | La factura está en borrador — emítela primero. |
| 422 | business_rule_violation / client_missing_dir3_codes | Al cliente le falta uno o más códigos DIR3. |
| 422 | business_rule_violation / signing_certificate_required | Sin certificado de firma activo — sube uno vía POST /v1/verifactu/certificates. |
| 422 | business_rule_violation / face_submission_not_cancellable | El envío no está en un estado anulable. |
| 409 | resource_already_exists / face_submission_already_exists | Ya existe un envío activo para la factura. |
| 403 | insufficient_scope | La clave no tiene el scope facturae:write. |
| 502 | face_transmission_failed | El web service de FACe está caído — no se persiste nada; reintenta más tarde. |
Subsanación de registros VeriFactu
Corrige y reenvía registros de facturación VeriFactu rechazados por la AEAT — cuándo aplica la subsanación, cuándo necesitas una anulación o una rectificativa, y el flujo exacto de la API.
Migración desde Holded
Mapeo de recursos Holded → Factuarea, nomenclatura, endpoints equivalentes y script en Python.