Facturación
Referencia de los recursos de Facturación de la API: facturas de compra y remitos. La emisión de comprobantes electrónicos AFIP/ARCA tiene su propia guía completa en /dev/invoices/; esta página cubre los demás documentos de facturación.
Todos los endpoints de esta página están bajo la URL base https://api.yo-facturo.com. Cada recurso expone una API REST estándar (listado, detalle, alta, modificación, baja y operaciones masivas) y se protege con sus propios scopes de lectura y escritura. Para emitir facturas, notas de crédito y notas de débito electrónicas ante AFIP/ARCA, consultá la guía de Facturación AFIP.
Facturas de compra
Una factura de compra es un comprobante emitido por un tercero (proveedor) a nombre del CUIT de la cuenta. La API no permite dar de alta una factura de compra desde cero: los datos fiscales (CUIT, tipo, número, CAE, importes) provienen de ARCA. Los registros entran importando un CSV exportado del portal de ARCA ("Mis Comprobantes Recibidos"). Sobre esos registros, la API sí permite operaciones de gestión: vincularlos a un asiento contable, marcarlos como ignorados o eliminarlos. En resumen, no hay alta ni edición fiscal campo a campo, pero el recurso no es de solo lectura pura: la escritura existe para importar y para gestionar el estado contable de cada comprobante.
Endpoint base: /api/v1/received_invoices
Scopes: received_invoices:read, received_invoices:write
Como las facturas de compra no se crean campo a campo por la API, no hay un cuerpo de creación. Los siguientes campos son los que devuelve un GET de cada registro:
Campos
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
id | string | no | Identificador único del registro. |
tenant_cuit | string | no | CUIT del receptor (la cuenta). |
supplier_cuit | string | no | CUIT del emisor (proveedor). |
supplier_name | string | no | Razón social del proveedor. |
voucher_type | entero | no | Código del tipo de comprobante AFIP (1, 6, 11, ...). |
sale_point | entero | no | Punto de venta del comprobante. |
voucher_number | entero | no | Número del comprobante. |
cae | string | no | CAE del comprobante recibido. |
cae_expiration | string (ISO 8601) | no | Fecha de vencimiento del CAE. |
issue_date | string (ISO 8601) | no | Fecha de emisión del comprobante. |
processed_date | string (ISO 8601) | no | Fecha en que AFIP registró el comprobante. |
currency | string | no | Moneda del comprobante (por ejemplo "PES"). |
exchange_rate | número | no | Cotización de la moneda. Por defecto 1.0. |
total_amount | número | no | Importe total del comprobante. |
net_taxed | número | no | Importe neto gravado. |
net_untaxed | número | no | Importe neto no gravado. |
exempt | número | no | Importe exento. |
iva | número | no | Importe de IVA. |
other_taxes | número | no | Importe de otros tributos. |
vat_items | array | no | Desglose de alícuotas de IVA (alícuota, base, importe). |
status | string | no | Estado en el pipeline: "pending", "linked" o "ignored". |
source | string | no | Origen del registro: "wsmtxca", "portal_scrape" o "excel_import". |
linked_journal_entry_id | string | no | ID del asiento contable vinculado, si lo hay. |
linked_expense_id | string | no | ID del gasto vinculado, si lo hay. |
linked_account_id | string | no | ID de la cuenta contable vinculada, si la hay. |
notes | string | no | Notas internas sobre el comprobante. |
Endpoints
Relativos a /api/v1/received_invoices. Este recurso no expone los endpoints CRUD genéricos de alta y edición campo a campo: los registros entran por importación de CSV y luego se gestionan. La escritura (received_invoices:write) habilita importar el CSV, vincular el comprobante a la contabilidad, ignorarlo o eliminarlo.
| Método | Endpoint | Descripción | Scope |
|---|---|---|---|
GET | /api/v1/received_invoices/list/ | Listar facturas de compra (con filtros y paginación) | received_invoices:read |
GET | /api/v1/received_invoices/{id}/ | Obtener una factura de compra por su ID | received_invoices:read |
GET | /api/v1/received_invoices/import-history/ | Historial de importaciones de CSV recientes | received_invoices:read |
POST | /api/v1/received_invoices/upload-csv/ | Importar un CSV exportado del portal ARCA (multipart/form-data, campo file) | received_invoices:write |
POST | /api/v1/received_invoices/{id}/link/ | Vincular el comprobante a un asiento contable y cuenta | received_invoices:write |
POST | /api/v1/received_invoices/{id}/ignore/ | Marcar el comprobante como ignorado | received_invoices:write |
DELETE | /api/v1/received_invoices/{id}/ | Eliminar un registro de factura de compra | received_invoices:write |
Ejemplo
Petición — listar las facturas de compra de la cuenta:
curl "https://api.yo-facturo.com/api/v1/received_invoices/list/?page=1&limit=20" \ -H "X-API-Key: TU_TOKEN"
Respuesta — un registro del listado:
{
"success": true,
"data": {
"id": "8c1f0d2e-3a4b-4c5d-9e6f-7a8b9c0d1e2f",
"tenant_cuit": "30716543210",
"supplier_cuit": "20345678901",
"supplier_name": "Insumos del Sur S.R.L.",
"voucher_type": 1,
"sale_point": 4,
"voucher_number": 1203,
"cae": "75123456789012",
"cae_expiration": "2026-05-31T00:00:00",
"issue_date": "2026-05-12T00:00:00",
"processed_date": "2026-05-13T09:15:00",
"currency": "PES",
"exchange_rate": 1.0,
"total_amount": 121000.00,
"net_taxed": 100000.00,
"net_untaxed": 0.00,
"exempt": 0.00,
"iva": 21000.00,
"other_taxes": 0.00,
"vat_items": [
{ "aliquot": 21, "base": 100000.00, "amount": 21000.00 }
],
"status": "pending",
"source": "wsmtxca",
"linked_journal_entry_id": null,
"linked_expense_id": null,
"linked_account_id": null,
"notes": null
}
}Petición — POST /api/v1/received_invoices/{id}/link/ para vincular un comprobante a un asiento contable. journal_entry_id es obligatorio; account_id es opcional:
{
"journal_entry_id": "5f3a1b2c-9d8e-4f7a-b6c5-1d2e3f4a5b6c",
"account_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
}Respuesta — el comprobante queda en estado "linked":
{
"success": true,
"data": {
"received_invoice_id": "8c1f0d2e-3a4b-4c5d-9e6f-7a8b9c0d1e2f"
}
}Remitos
Un remito es un documento que registra el traslado físico de mercadería al cliente, independiente de la facturación. Descuenta stock al emitirse y luego puede convertirse en una factura. Se administra por completo desde la API: se crean, modifican y dan de baja remitos como cualquier otro recurso.
Endpoint base: /api/v1/delivery_notes
Scopes: delivery_notes:read, delivery_notes:write
Campos
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
customer_id | string | sí | ID del cliente destinatario del remito. |
items | array | sí | Líneas del remito. Debe tener al menos un item (ver tabla de campos del item). |
customer_name | string | no | Nombre del cliente. Máximo 200 caracteres. |
customer_document | string | no | Documento del cliente. Máximo 30 caracteres. |
sale_point | entero | no | Punto de venta. Entre 1 y 99999. |
reference | string | no | Referencia libre (orden de compra, nota interna). Máximo 100 caracteres. |
origin_address | string | no | Domicilio de origen de la mercadería. Máximo 300 caracteres. |
destination_address | string | no | Domicilio de destino de la mercadería. Máximo 300 caracteres. |
carrier_name | string | no | Nombre del transportista. Máximo 200 caracteres. |
carrier_document | string | no | Documento del transportista. Máximo 30 caracteres. |
driver_name | string | no | Nombre del chofer. Máximo 200 caracteres. |
vehicle_plate | string | no | Patente del vehículo. Máximo 20 caracteres. |
status | string | no | Estado del remito: "draft", "issued", "delivered", "invoiced" o "cancelled". |
notes | string | no | Notas internas. Máximo 2000 caracteres. |
metadata | object | no | Objeto libre para datos adicionales. |
Cada elemento del array items es un objeto con los siguientes campos:
Campos del item
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
description | string | sí | Descripción de la línea. Máximo 500 caracteres. |
quantity | número | sí | Cantidad. Debe ser mayor que 0. |
product_id | string | no | ID del producto asociado. |
variant_id | string | no | ID de la variante del producto. |
sku | string | no | SKU del producto. Máximo 100 caracteres. |
unit | string | no | Unidad de medida (por ejemplo "u", "kg"). Máximo 20 caracteres. |
unit_price | número | no | Precio unitario. Mayor o igual a 0. |
subtotal | número | no | Subtotal de la línea. Mayor o igual a 0. |
Endpoints
Relativos a /api/v1/delivery_notes.
| Método | Endpoint | Descripción |
|---|---|---|
GET | /api/v1/delivery_notes/list/ | Listar registros (con filtros y paginación) |
GET | /api/v1/delivery_notes/{id}/ | Obtener un registro por su ID |
POST | /api/v1/delivery_notes/ | Crear un registro |
PUT | /api/v1/delivery_notes/{id}/ | Actualizar un registro |
DELETE | /api/v1/delivery_notes/{id}/ | Eliminar un registro |
POST | /api/v1/delivery_notes/bulk/create/ | Crear varios registros en una sola llamada |
PUT | /api/v1/delivery_notes/bulk/update/ | Actualizar varios registros en una sola llamada |
POST | /api/v1/delivery_notes/bulk/delete/ | Eliminar varios registros en una sola llamada |
Ejemplo
Petición — POST /api/v1/delivery_notes/ para crear un remito:
{
"customer_id": "c0a8f1d2-3e4b-4c5d-8e6f-1a2b3c4d5e6f",
"customer_name": "Comercial Andina S.A.",
"customer_document": "30709876543",
"sale_point": 1,
"reference": "OC-2026-0042",
"origin_address": "Av. Siempre Viva 742, Córdoba",
"destination_address": "Ruta 9 Km 312, Rosario",
"carrier_name": "Transportes del Litoral",
"driver_name": "Juan Pérez",
"vehicle_plate": "AD123FG",
"items": [
{
"description": "Caja de repuestos modelo X-200",
"quantity": 10,
"sku": "REP-X200",
"unit": "u",
"unit_price": 4500.00,
"subtotal": 45000.00
}
],
"status": "issued",
"notes": "Entregar en horario comercial"
}Respuesta — el remito creado, con su number asignado y el stock descontado:
{
"success": true,
"data": {
"id": "7b2e9c1a-4d5f-4a6b-9c8d-2e3f4a5b6c7d",
"number": 58,
"sale_point": 1,
"reference": "OC-2026-0042",
"customer_id": "c0a8f1d2-3e4b-4c5d-8e6f-1a2b3c4d5e6f",
"customer_name": "Comercial Andina S.A.",
"customer_document": "30709876543",
"origin_address": "Av. Siempre Viva 742, Córdoba",
"destination_address": "Ruta 9 Km 312, Rosario",
"carrier_name": "Transportes del Litoral",
"driver_name": "Juan Pérez",
"vehicle_plate": "AD123FG",
"items": [
{
"product_id": null,
"variant_id": null,
"sku": "REP-X200",
"description": "Caja de repuestos modelo X-200",
"quantity": 10,
"unit": "u",
"unit_price": 4500.00,
"subtotal": 45000.00,
"metadata": {}
}
],
"issue_date": "2026-05-21T13:40:00",
"delivery_date": null,
"status": "issued",
"invoice_id": null,
"cae": null,
"stock_deducted": true,
"notes": "Entregar en horario comercial"
}
}Comprobantes AFIP/ARCA
La emisión de facturas, notas de crédito y notas de débito electrónicas ante AFIP/ARCA no se documenta acá: tiene su propia guía detallada en Facturación AFIP (ruta /dev/invoices/), con el flujo de autorización, los tipos de comprobante y la obtención del CAE. Su endpoint base es /api/v1/bill/receipts y usa el scope invoices (invoices:read e invoices:write).
FCE MiPyME
La Factura de Crédito Electrónica (FCE) MiPyME (Ley 27440) es un comprobante que la PyME emisora puede endosar o negociar para cobrarlo antes de su vencimiento. Este recurso no emite el comprobante FCE en sí —eso sigue pasando por la Facturación AFIP (POST /invoice/ con el tipo FCE correspondiente)—: expone la verificación de elegibilidad, el monto mínimo vigente, el registro de eventos del ciclo de vida (aceptación, rechazo, anulación, transferencia a SIRCREB) y el listado de lo ya emitido como FCE con su estado.
Endpoint base: /api/v1/fce
Scopes: invoices:read, invoices:write
Ojo con POST /eligibility/: aunque solo consulta y no modifica nada, requiere el scope de escritura invoices:write (no invoices:read) — un token con solo lectura recibe 403.
Endpoints
Relativos a /api/v1/fce.
| Método | Endpoint | Descripción | Scope |
|---|---|---|---|
POST | /api/v1/fce/eligibility/ | Verificar si una factura califica como FCE MiPyME | invoices:write |
GET | /api/v1/fce/threshold/ | Obtener el monto mínimo vigente para que una factura sea FCE | invoices:read |
PUT | /api/v1/fce/threshold/ | Actualizar el monto mínimo (uso administrativo) | invoices:write |
POST | /api/v1/fce/events/{fce_invoice_id}/ | Registrar un evento del ciclo de vida de una factura FCE | invoices:write |
GET | /api/v1/fce/events/{fce_invoice_id}/ | Listar los eventos registrados de una factura FCE | invoices:read |
GET | /api/v1/fce/issued/ | Listar las facturas emitidas como FCE con su estado actual | invoices:read |
Verificar elegibilidad
POST /eligibility/ recibe los datos de una factura (sin crearla) y evalúa si puede emitirse como FCE MiPyME: el receptor debe ser Responsable Inscripto o Monotributista, el importe debe alcanzar el umbral vigente (consultable con GET /threshold/), el documento del receptor debe ser CUIT, debe tener una fecha de vencimiento de pago válida (posterior a la de emisión, sin superar el año) y el emisor debe tener un CBU configurado en metadata.emitter_cbu. Ningún campo es obligatorio a nivel de esquema: si falta alguno, simplemente se suma como motivo de no-elegibilidad en reasons.
Campos
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
tipo_comprobante | entero | string | No | Código del tipo de comprobante. Debe mapear a Factura/ND/NC A, B o C para ser elegible. |
importe_total | número | No | Importe total de la factura. Debe ser mayor o igual al umbral FCE vigente. |
tipo_documento | entero | string | No | Tipo de documento del receptor. Debe ser 80 (CUIT) para ser elegible. |
condicion_iva | string | No | Condición frente al IVA del receptor. Debe ser "responsable_inscripto" o "monotributo". |
fecha_comprobante | string (ISO 8601) | No | Fecha de emisión del comprobante. |
fecha_vencimiento_pago | string (ISO 8601) | No | Fecha de vencimiento de pago. Requerida, debe ser posterior a fecha_comprobante y no superar 1 año desde esa fecha. |
metadata | object | No | Metadatos libres. Debe incluir emitter_cbu (CBU del emisor) para que la factura sea elegible. |
Petición:
POST /api/v1/fce/eligibility/
{
"tipo_comprobante": 1,
"importe_total": 6500000.00,
"tipo_documento": 80,
"condicion_iva": "responsable_inscripto",
"fecha_comprobante": "2026-07-01",
"fecha_vencimiento_pago": "2026-08-15",
"metadata": {
"emitter_cbu": "0000003100012345678901"
}
}Respuesta — suggested_type es el código de comprobante FCE al que mapea el tipo_comprobante enviado (por ejemplo, Factura A → 201); es null si el tipo no tiene equivalente FCE:
{
"success": true,
"data": {
"eligible": true,
"reasons": [],
"suggested_type": 201,
"threshold_ars": 5549862.00
}
}Respuesta cuando no es elegible — success sigue siendo true, el rechazo va en eligible: false y reasons:
{
"success": true,
"data": {
"eligible": false,
"reasons": [
"Total amount $980,000.00 below FCE MiPyME threshold ($5,549,862.00)",
"Emitter CBU is required and not configured"
],
"suggested_type": 201,
"threshold_ars": 5549862.00
}
}Monto mínimo (threshold)
El monto mínimo para que una factura pueda ser FCE lo fija periódicamente la SIyPyME; la cuenta puede tener su propio valor configurado, y si no, se usa el default de la plataforma (a la fecha, $5.549.862,00 ARS — Resolución 1/2026 SIyPyME). GET /threshold/ devuelve el valor efectivo; PUT /threshold/ lo actualiza para la cuenta (uso administrativo, valor debe ser mayor a 0).
curl "https://api.yo-facturo.com/api/v1/fce/threshold/" \ -H "X-API-Key: TU_TOKEN"
Respuesta:
{
"success": true,
"data": {
"value": 5549862.00,
"currency": "ARS"
}
}Petición — PUT /threshold/:
{
"value": 6000000.00
}{
"success": true,
"data": {
"key": "fce_mipyme_min_threshold_ars",
"value": 6000000.00
}
}Eventos del ciclo de vida
Una vez emitida la factura FCE, registrá su recorrido con POST /events/{fce_invoice_id}/: aceptación o rechazo por parte del receptor, anulación, o transferencia a SIRCREB. fce_invoice_id es el _id del comprobante ya emitido (obtenido de la Facturación AFIP). Los eventos quedan guardados con quién y cuándo se registraron, y se consultan con GET /events/{fce_invoice_id}/ (los últimos 50, más recientes primero).
Campos
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
event_type | string | Sí | Uno de: "accepted", "rejected", "anulled", "transferred_sircreb". |
payload | object | No | Datos adicionales del evento (por ejemplo, motivo de rechazo). |
Petición — registrar la aceptación de la factura:
POST /api/v1/fce/events/8b12ed81-99b8-4f6e-b25c-0d7e94bcbcc8/
{
"event_type": "accepted",
"payload": {
"accepted_at": "2026-07-05T10:15:00",
"channel": "portal_afip"
}
}Respuesta:
{
"success": true,
"data": {
"fce_invoice_id": "8b12ed81-99b8-4f6e-b25c-0d7e94bcbcc8",
"event_type": "accepted",
"payload": {
"accepted_at": "2026-07-05T10:15:00",
"channel": "portal_afip"
},
"recorded_by": "[email protected]",
"recorded_at": "2026-07-05T10:15:03"
}
}Petición — listar los eventos de una factura:
curl "https://api.yo-facturo.com/api/v1/fce/events/8b12ed81-99b8-4f6e-b25c-0d7e94bcbcc8/" \ -H "X-API-Key: TU_TOKEN"
{
"success": true,
"data": {
"items": [
{
"fce_invoice_id": "8b12ed81-99b8-4f6e-b25c-0d7e94bcbcc8",
"event_type": "accepted",
"payload": { "channel": "portal_afip" },
"recorded_by": "[email protected]",
"recorded_at": "2026-07-05T10:15:03"
}
]
}
}Listar las facturas emitidas como FCE
GET /issued/ lista los comprobantes ya emitidos con un tipo FCE, junto con su estado actual (fce_status): pending si todavía no se registró ningún evento, o el event_type del último evento registrado (accepted, rejected, anulled, transferred_sircreb). Acepta page, per_page (tope 100) y un filtro opcional status.
curl "https://api.yo-facturo.com/api/v1/fce/issued/?page=1&per_page=20&status=pending" \ -H "X-API-Key: TU_TOKEN"
Respuesta:
{
"success": true,
"data": {
"items": [
{
"id": "8b12ed81-99b8-4f6e-b25c-0d7e94bcbcc8",
"tipo_comprobante": 201,
"numero_comprobante": 45,
"importe_total": 6500000.00,
"cae": "75123456789012",
"fce_status": "pending",
"last_event_at": null
}
],
"total": 1,
"page": 1,
"per_page": 20
}
}