Factuarea API

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:

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"
  }'
CampoRol DIR3
dir3_accounting_officeOficina contable (01)
dir3_managing_bodyÓrgano gestor (02)
dir3_processing_unitUnidad 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"
statusSignificado
submittedPresentada en FACe; número de registro asignado.
registered_rcfRegistrada en el RCF (el registro contable de facturas de la administración).
accountedReconocida como obligación contable por la administración.
paidLa administración informa de la factura como pagada.
rejectedRechazada por la administración — consulta el motivo en FACe y emite una factura corregida.
cancellation_requestedHas solicitado la anulación; pendiente de confirmación de FACe.
cancelledAnulación confirmada por FACe.
errorError 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

HTTPcode / subcodeCuándo
404resource_not_foundLa factura o el envío no existe o pertenece a otra empresa.
422business_rule_violation / invoice_not_emittable_for_facturaeLa factura está en borrador — emítela primero.
422business_rule_violation / client_missing_dir3_codesAl cliente le falta uno o más códigos DIR3.
422business_rule_violation / signing_certificate_requiredSin certificado de firma activo — sube uno vía POST /v1/verifactu/certificates.
422business_rule_violation / face_submission_not_cancellableEl envío no está en un estado anulable.
409resource_already_exists / face_submission_already_existsYa existe un envío activo para la factura.
403insufficient_scopeLa clave no tiene el scope facturae:write.
502face_transmission_failedEl web service de FACe está caído — no se persiste nada; reintenta más tarde.

En esta página