API · Hacienda v4.4

API de facturación electrónica de Costa Rica

Una sola API REST para emitir cualquier comprobante electrónico de Hacienda v4.4. Vos hacés un POST con los datos de la venta; nosotros generamos el XML, lo firmamos con XAdES, lo enviamos a Hacienda y le mandamos al receptor el PDF y los XML por correo.

¿Qué resuelve la API?

La parte difícil de la facturación electrónica en Costa Rica no es la venta: es el XML v4.4, la firma digital, los consecutivos, el envío a Hacienda y el manejo de rechazos. La API se ocupa de todo eso para que tu ERP, POS o e-commerce solo tenga que declarar qué se vendió.

  • Endpoints para los 6 tipos de comprobante electrónico
  • Generación del XML v4.4 con todos los campos que exige Hacienda
  • Firma XAdES con tu certificado .p12 (nosotros la aplicamos)
  • Envío a Hacienda y consulta automática del estado (aceptado/rechazado)
  • Correo al receptor con el PDF y los XML, como exige la normativa
  • Búsqueda de códigos CABYS y gestión de emisores, sucursales y cajas

¿Cómo emito un comprobante?

Un POST a /api/procesar con el tipo_documento y los datos de la venta. La respuesta es HTTP 202: recibís la clave numérica de 50 dígitos y el consecutivo al instante, mientras la firma y el envío a Hacienda ocurren en background. El resultado final (aceptado/rechazado) se consulta después.

emitir.js
const res = await fetch('https://api.plaxp.com/api/procesar', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': process.env.PLAXP_API_KEY,
  },
  body: JSON.stringify({
    tipo_documento: '01',          // 01=FE · 04=Tiquete · 03=NC · 02=ND
    codigo_sucursal: '001',
    codigo_caja: '001',
    consecutivo: 1,
    condicion_venta: '01',         // 01 = contado
    medios_pago: [{ tipo: '01', monto: 56500 }],
    receptor: {
      tipo_identificacion: '01',   // 01 = cédula física
      identificacion: '123456789',
      nombre: 'Juan Pérez',
      correo: '[email protected]',
    },
    lineas: [{
      codigo_cabys: '8399000000000',
      detalle: 'Servicio profesional',
      cantidad: 1,
      precio_unitario: 50000,
      codigo_tarifa: '08',         // 08 = IVA 13%
      tarifa: 13,
    }],
  }),
});

const doc = await res.json();
// 202 → { success, mensaje, data: { clave, consecutivo } }
// La firma y el envío a Hacienda ocurren en background.

Un endpoint genérico o uno por tipo

/api/procesar sirve para los seis comprobantes (definís el tipo en el body). Si preferís rutas explícitas, hay una por tipo: /api/factura, /api/tiquete, /api/nota-credito, /api/nota-debito, /api/factura-compra y /api/factura-exportacion. Las notas de crédito y débito exigen el objeto referencia al documento original.

Los totales los calculamos nosotros

Podés enviar los totales o dejar que la API los calcule desde cantidad, precio_unitario y codigo_tarifa. De hecho, el backend recalcula el desglose de impuestos y el total con 5 decimales antes de firmar — así evitás los rechazos por totales inconsistentes.

¿Qué tipos de comprobante puedo emitir?

Los seis comprobantes electrónicos de la versión 4.4. Cambiás el campo tipo_documento:

códigotipocuándo
01Factura electrónica (FE)Venta a un receptor identificado; la más común.
04Tiquete electrónico (TE)Venta al consumidor final sin datos del receptor.
03Nota de crédito (NC)Corrige, anula o devuelve sobre un comprobante previo.
02Nota de débito (ND)Aumenta el monto de un comprobante ya emitido.
09Factura de exportación (FEE)Ventas al exterior con requisitos aduaneros.
08Factura de compra (FEC)Compras a proveedores de régimen simplificado.

¿Cómo me autentico?

Dos opciones. La más simple: tu API Key en el header X-API-Key (cada emisor tiene la suya; nunca la expongas en el frontend).

header
X-API-Key: sk_live_tu_clave_secreta

Para integraciones de producción recomendamos OAuth (JWT): pedís un token con tu client_id y client_secret y lo mandás como Bearer. El token dura 15 minutos y se renueva con un refresh_token (7 días).

obtener-token.sh
curl -X POST 'https://api.plaxp.com/auth/token' \
  -H 'Content-Type: application/json' \
  -d '{ "client_id": "tu_client_id", "client_secret": "tu_secret" }'
# → { access_token, refresh_token, token_type: "Bearer", expires_in: 900 }

# luego, en cada emisión:
#   Authorization: Bearer <access_token>

¿Cómo sé si Hacienda lo aceptó?

Hacienda no responde aceptado al instante: valida de forma asíncrona. Al emitir recibís la clave. Del lado de Plaxp nosotros consultamos a Hacienda por vos (con reintentos y backoff) hasta que responde; vos solo leés el estado final por la clave — sin implementar polling contra Hacienda:

consultar.sh
curl 'https://api.plaxp.com/api/consultar/<clave-de-50-digitos>' \
  -H "X-API-Key: $PLAXP_API_KEY"
# → { estado_hacienda: "aceptado" | "rechazado" | "procesando",
#     mensaje_hacienda, respuesta_xml_hacienda }

También hay una por clave, sin autenticación, con los datos reducidos del comprobante.

Si sale rechazado

Cada rechazo trae un código de Hacienda. Tenemos el catálogo de los más frecuentes con la causa y cómo evitarlo: .

¿Cómo pruebo sin emitir en real?

Hacienda tiene un ambiente de pruebas (staging). Te damos credenciales de sandbox para que integres y valides el flujo completo sin generar comprobantes reales. La guía paso a paso está acá: . Y si querés entender la firma: .

¿Listo para integrar?

Te damos credenciales de sandbox y te acompañamos en la integración. Escribinos y arrancamos hoy.

Solicitar acceso a la API

Te acompañamos en la puesta en marcha · soporte rápido de gente real · fácil de usar para todo tu equipo. Somos gente ayudando gente.