Skip to main content

Factura electrónica de compra

Endpoint
POST /api/2.0/documentos-electronicos/emision/compra

Crea y envía a Hacienda una factura electrónica de compra con la disposición 4.4. Es el comprobante que el comprador se autoemite cuando adquiere bienes o servicios de alguien que no puede emitir un comprobante electrónico —por ejemplo, un productor agrícola no inscrito—, de modo que la compra quede respaldada como gasto deducible.

En este documento los papeles están invertidos respecto de los demás comprobantes. Los campos cedula, tipo_cedula, nombre, nombre_comercial y correo que se envían en el cuerpo describen al vendedor, que figura como emisor del XML. El receptor es siempre la cuenta que hace la petición, y sus datos se toman del perfil, no del cuerpo.

Autenticación

Todas las peticiones requieren los cuatro encabezados siguientes.

EncabezadoDescripción
api-tokenToken de API de la cuenta.
access-tokenToken de acceso asociado al api-token.
Content-Typeapplication/json
Acceptapplication/json. Obligatorio. Si se omite, una petición no autenticada responde con una redirección al formulario de inicio de sesión en lugar de un error JSON.

La emisión por API requiere un plan con acceso a API activo y documentos disponibles en el ciclo vigente.

Ejemplo mínimo

El siguiente ejemplo documenta la compra de 100 kg de papaya a un productor no inscrito.

curl --location 'https://app.facturadorvirtual.com/api/2.0/documentos-electronicos/emision/compra' \
--header 'api-token: iuJPbVCYQY3AmWuVHMflT9ZySlwzxb9ehviLbHNsz6yQnBm4' \
--header 'access-token: IDq4ME4ZUO9YmQ0fOc43AFp7mMO6talIuIALFaUUcs2H2pwLpYN2' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-raw '{
    "actividad": "014002",
    "codigo_actividad_receptor": "014002",
    "condicion_venta": "01",
    "moneda": "CRC",
    "tipo_cambio": 1,
    "medio_pago": {
        "01": {
            "codigo": "01",
            "total": 50000
        }
    },
    "incliuir_receptor": 1,
    "tipo_cedula": "01",
    "cedula": "601230456",
    "nombre": "Juan Rodríguez Mora",
    "correo": "jrodriguez@example.com",
    "tipo_documento": "99",
    "tipo_documento_otro": "Compra a productor no inscrito",
    "numero_referencia": "PAPAYA-2026-0001",
    "codigo_referencia": "04",
    "fecha_emision": "15/01/2026",
    "razon_referencia": "Compra de producto agrícola a productor no inscrito",
    "comentarios": "Compra de papaya a productor local",
    "lineas": [
        {
            "codigo": "PAPAYA",
            "codigoCabys": "0113101000000",
            "descripcion": "Papaya fresca",
            "cantidad": "100",
            "unidad": "Kg",
            "descuento": 0,
            "naturalezaDescuento": "",
            "precioUnitario": 500,
            "impuestos": {
                "01": {
                    "tarifa": "01"
                }
            }
        }
    ]
}'

El vendedor

Los datos del vendedor se envían activando el indicador incliuir_receptor:

"incliuir_receptor": 1,
"tipo_cedula": "01",
"cedula": "601230456",
"nombre": "Juan Rodríguez Mora",
"correo": "jrodriguez@example.com",
"nombre_comercial": "Finca La Esperanza"

El indicador se llama incliuir_receptor, con esa grafía exacta. Es el nombre del campo tal como lo espera el sistema en todas sus interfaces; escrito de otra forma, el indicador no se reconoce y los datos del vendedor dejan de ser obligatorios. Pese al nombre, en este documento gobierna los datos del emisor del XML, que es el vendedor.

CampoDescripción
incliuir_receptorIndicador de inclusión de los datos del vendedor. Envíe 1.
tipo_cedulaTipo de identificación del vendedor: 01 física, 02 jurídica, 03 DIMEX, 04 NITE, 05 extranjero no domiciliado. No se valida contra el catálogo.
cedulaIdentificación del vendedor, máximo 20 caracteres. Los guiones se eliminan automáticamente.
nombreNombre del vendedor, máximo 80 caracteres.
correoCorreo electrónico del vendedor. Debe ser una dirección válida.
nombre_comercialNombre comercial del vendedor, entre 3 y 80 caracteres.
otras_sennas_extranjeroDirección del vendedor. Solo se incorpora cuando tipo_cedula es 05. Nótese la grafía del campo.

Información de referencia

A diferencia del resto de comprobantes, en la factura de compra el bloque de información de referencia siempre se construye y no depende de ningún indicador. Los cinco campos siguientes son obligatorios en la práctica: si falta cualquiera de ellos, la petición responde 500 antes de llegar a Hacienda. No están cubiertos por la validación, así que el error no llega como 422.

CampoDescripción
tipo_documentoTipo del documento de referencia. Ver la tabla de tipos.
numero_referenciaNúmero o identificador del documento de referencia.
codigo_referenciaCódigo que indica el motivo de la referencia. Ver la tabla de códigos.
fecha_emisionFecha del documento de referencia, en formato dd/mm/aaaa.
razon_referenciaDescripción del motivo de la referencia.
tipo_documento_otroDescripción cuando tipo_documento es 99.
codigo_referencia_otroDescripción cuando codigo_referencia es 99.

Tipos de documento de referencia

CódigoDescripción
01Factura electrónica
02Nota de débito electrónica
03Nota de crédito electrónica
04Tiquete electrónico
05Nota de despacho
06Contrato
07Procedimiento
08Comprobante emitido en contingencia
09Devolución de mercadería
10Sustituye factura rechazada por el Ministerio de Hacienda
11Sustituye factura rechazada por el receptor del comprobante
12Sustituye factura de exportación
13Factura mes vencido
14Comprobante aportado por contribuyente del Régimen de Tributación Simplificado
15Sustituye una factura electrónica de compra
16Comprobante de proveedor no domiciliado
17Nota de crédito a factura electrónica de compra
18Nota de débito a factura electrónica de compra
99Otros. Requiere tipo_documento_otro.

Códigos de referencia

CódigoDescripción
01Anula documento de referencia
02Corrige texto de documento de referencia
03Corrige monto
04Referencia a otro documento
05Sustituye comprobante provisional por contingencia
99Otros. Requiere codigo_referencia_otro.

Campos del documento

Obligatorios

CampoTipoDescripción
codigo_actividad_receptorstringCódigo de actividad económica. Es el único campo de actividad exigido por la validación.
actividadstringCódigo de la actividad económica registrada en la cuenta. Obligatorio en la práctica: si se omite la petición responde 500. Cuando se envía, también tiene precedencia sobre codigo_actividad_receptor como actividad registrada para el receptor.
monedastringCódigo de moneda, por ejemplo CRC. Obligatorio en la práctica: si se omite la petición responde 500.
condicion_ventastringCódigo de condición de venta. Ver la tabla más abajo.
medio_pagoobjectDe 1 a 4 medios de pago. Se ignora cuando la condición de venta es a crédito.
lineasarrayAl menos una línea de detalle. Ver la sección correspondiente.

Opcionales

CampoTipoDescripción
tipo_cambionumberTipo de cambio, mayor que cero. Si se omite se asume 1.
sucursalstringCódigo de sucursal, por ejemplo 004. Si se omite, se usa el valor configurado en las preferencias de facturación.
puntostringPunto de emisión, por ejemplo 00001. Si se omite, se usa el valor configurado en las preferencias de facturación.
comentariosstringNotas del comprobante.

Campos condicionales

CampoSe vuelve obligatorio cuando…Reglas
plazo_creditocondicion_venta es 02 o 10Entero entre 1 y 99999, expresado en días.
condicion_venta_otroscondicion_venta es 99Texto entre 5 y 100 caracteres.
medio_pago.<codigo>.detalleEl código del medio de pago es 99Texto entre 3 y 100 caracteres.
cedula, nombre, correoSe envía incliuir_receptorVer la sección «El vendedor».

Campos que este endpoint no aplica

CampoComportamiento
devolucionSe valida como número mayor que cero, pero no se aplica: la devolución de IVA del resumen queda siempre en cero.
cargosNo se procesa. La factura de compra no admite otros cargos.
ordenNo se procesa. Tampoco se extrae un número de orden desde comentarios, como sí ocurre en la factura.
correo-copiaNo se acepta ni se procesa.
provincia, canton, distrito, barrio, direccionNo se procesan. Para un vendedor extranjero use otras_sennas_extranjero.

Condición de venta

CódigoDescripción
01Contado
02Crédito
03Consignación
04Apartado
05Arrendamiento con opción de compra
06Arrendamiento en función financiera
07Cobro a favor de un tercero
08Servicios prestados al Estado
09Pago de servicios prestados al Estado
10Venta a crédito en IVA hasta 90 días
11Pago de venta a crédito en IVA hasta 90 días
12Venta de mercancía no nacionalizada
13Venta de bienes usados no contribuyente
14Arrendamiento operativo
15Arrendamiento financiero
99Otros. Requiere condicion_venta_otros.

Con las condiciones de venta 02, 08 y 10 el comprobante se emite a crédito y los medios de pago enviados se descartan: el XML no incluye el nodo de medio de pago.

Medios de pago

medio_pago es un objeto con hasta cuatro entradas, donde la clave y el campo codigo coinciden. total es el monto cubierto por ese medio y debe ser mayor que cero.

"medio_pago": {
    "01": { "codigo": "01", "total": 50000 }
}
CódigoDescripción
01Efectivo
02Tarjeta
03Cheque
04Transferencia o depósito bancario
05Recaudado por terceros
06SINPE Móvil
07Plataforma digital
99Otros. Requiere detalle.

Líneas de detalle

Campos obligatorios de la línea

CampoTipoDescripción
codigostringCódigo del producto o servicio, máximo 20 caracteres.
descripcionstringDetalle de la línea, entre 3 y 200 caracteres.
cantidadnumberCantidad, mayor que cero. Se redondea a 3 decimales.
unidadstringCódigo de unidad de medida del catálogo de Hacienda. Debe coincidir con un código del catálogo, por ejemplo Unid, Kg, L, Sp, Os.
precioUnitarionumberPrecio unitario, mayor o igual a cero.
descuentonumberMonto del descuento. Envíe 0 si no aplica.
naturalezaDescuentostringNaturaleza del descuento. Envíe cadena vacía si no aplica; si se envía texto, debe tener entre 3 y 80 caracteres.

codigoCabys no es rechazado por la validación, pero Hacienda exige el código CABYS en todos los comprobantes. Omitirlo produce un rechazo del lado de Hacienda, no del API.

Campos opcionales de la línea

CampoTipoDescripción
codigoCabysstringCódigo CABYS de 13 dígitos.
partidaArancelariastringPartida arancelaria. Si se envía, debe tener exactamente 12 caracteres.
codigoInternoFVstringCódigo del producto en el catálogo de Facturador Virtual.
id_productointegerIdentificador del producto en Facturador Virtual.
unidadMedidaComercialstringUnidad de medida comercial, máximo 20 caracteres.
tipoTransaccionstringCódigo de tipo de transacción de la versión 4.4.
tipoDescuentostringCódigo del tipo de descuento, máximo 2 caracteres. Si se omite se asume 08.
tipoDescuentoOtrostringDescripción cuando tipoDescuento corresponde a «otros». Entre 5 y 100 caracteres.
ivaCobradoFabricanumberIVA cobrado en fábrica.
vinSeriestringNúmero VIN o serie, para vehículos.
esCabysMedicamentobooleanMarca la línea como medicamento. Al activarse se toman registroMedicamento y formaFarmaceutica.
es_combobooleanMarca la línea como combo. Los componentes se envían en componentes.
impuestosobjectImpuestos aplicados a la línea. Ver la siguiente sección.

Impuestos

impuestos es un objeto cuya clave es el código del impuesto. El campo tarifa recibe el código de tarifa, no el porcentaje.

"impuestos": {
    "01": {
        "tarifa": "01"
    }
}
Código de impuestoDescripción
01Impuesto al Valor Agregado
02Impuesto Selectivo de Consumo
03Impuesto Único a los Combustibles
04Impuesto específico de Bebidas Alcohólicas
05Impuesto Específico sobre las bebidas envasadas sin contenido alcohólico y jabones de tocador
06Impuesto a los Productos de Tabaco
07IVA (cálculo especial)
08IVA Régimen de Bienes Usados (Factor)
12Impuesto Específico al Cemento
99Otros. Se describe en descripcionOtro.
Código de tarifaDescripciónPorcentaje aplicado
01Tarifa 0% (Artículo 32, num 1, RLIVA)0
02Tarifa reducida 1%1
03Tarifa reducida 2%2
04Tarifa reducida 4%4
05Transitorio 0%0
06Transitorio 4%4
07Tarifa transitoria 8%8
08Tarifa general 13%13
09Tarifa reducida 0.5%0.5
10Tarifa exenta0
11Tarifa 0% sin derecho a crédito0

Respuesta

Una emisión procesada devuelve HTTP 200. El campo codigo del cuerpo indica el resultado de la recepción en Hacienda y es independiente del código HTTP.

{
  "codigo": 200,
  "contenidoXml": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV…",
  "contenidoXmlFirmado": "Nfdsfffadeec2lvbj0iMS4wIiBlbmNvZGluZz0iV…",
  "documento": {
    "clave": "50622032000070175094600400001080000000009118491223",
    "consecutivo": "00400001080000000009",
    "recepcion": "recibido",
    "comprobacion": "por_comprobar"
  },
  "errores": []
}

El tipo de documento 08 dentro del consecutivo identifica la factura electrónica de compra.

CampoDescripción
codigoResultado de la recepción en Hacienda. 200 si el documento fue recibido; 500 si no se pudo entregar.
contenidoXmlXML generado, codificado en base64.
contenidoXmlFirmadoXML firmado, codificado en base64. Es null cuando la firma o el envío no se completaron.
documento.claveClave numérica de 50 dígitos del comprobante.
documento.consecutivoConsecutivo de 20 dígitos del comprobante.
documento.recepcionEstado de la recepción: recibido o por_enviar.
documento.comprobacionEstado de la comprobación: por_comprobar, aceptado o rechazado.
erroresArreglo de objetos {"tipo": "...", "mensaje": "..."} devueltos por Hacienda.

Errores

HTTPCuerpoCausa
302Redirección al inicio de sesiónFalta el encabezado Accept: application/json en una petición no autenticada.
401{"message": "Unauthenticated."}api-token o access-token inválidos o ausentes.
403{"error": "No posee un Plan Api activo"}El plan de la cuenta no incluye acceso a API.
403{"error": "Ha llegado al límite de facturas del Plan Api contratado"}Se agotaron los documentos del ciclo vigente.
422{"errors": {"campo": ["mensaje"]}}Uno o más campos no cumplen las reglas de validación.
500{"0": "Ha ocurrido un error", "error": "...", "stack": [...]}Error no controlado. Las causas más frecuentes son omitir alguno de los cinco campos de información de referencia, omitir actividad u omitir moneda.

Comprobación

La recepción es el primer paso: significa que Hacienda recibió el documento, no que lo aprobó. La comprobación se realiza automáticamente, por lo general en uno o dos minutos, y el estado pasa de por_comprobar a aceptado o rechazado.