Primeros pasos
En esta guía emitís una factura de prueba y obtenés un CAE real de homologación de ARCA. Sirve para verificar que toda la cadena funciona antes de escribir una línea de tu integración.
Antes de empezar
Necesitás tres cosas, todas de una sola vez:
- Un certificado de ARCA activo → cómo obtenerlo
- Al menos un punto de venta habilitado → cómo configurarlo
- Una API Key con prefijo
TEST_→ cómo crearla
Anotá también tu id-empresa: es el código de tu empresa y va en todas las URLs. Lo ves en la barra de direcciones de la app, en …/app/administrar/<id-empresa>.
Una clave TEST_ factura contra el entorno de pruebas de ARCA. Los comprobantes no tienen validez fiscal y podés equivocarte todo lo que haga falta. Cuando funcione, cambiás la clave por una PROD_ y no tocás nada más del código.
Paso 1 — Verificá la conexión
Es la primera llamada que conviene hacer siempre: valida la clave y te dice si la empresa tiene lo mínimo para facturar.
curl https://nanofactura.com/api/mi-empresa/api-keys/test \
-H "Authorization: Bearer TEST_tu_api_key"
{ "ok": true, "environment": "homologation", "certificates": true, "pos": true }
Si certificates o pos vienen en false, falta configuración: volvé a los pasos de arriba. Si recibís 401, la clave está mal copiada o fue revocada.
Paso 2 — Emití la factura
Este ejemplo es una Factura C (la que emite un monotributista) a consumidor final. Si sos responsable inscripto, mirá qué comprobante te corresponde. Reemplazá los valores al momento de probar.
curl
curl -X POST https://nanofactura.com/api/mi-empresa/invoices \
-H "Authorization: Bearer TEST_tu_api_key" \
-H "Content-Type: application/json" \
-d '{
"idempotency": "prueba-0001",
"posNumber": 1,
"voucherType": 11,
"concept": 1,
"voucherDate": "20260811",
"customer": {
"docType": 96,
"docNumber": "35888999",
"name": "Pedro López",
"address": "Av. de Mayo 500, CABA",
"stateId": 0,
"taxType": 5
},
"items": [
{ "description": "Producto de prueba", "quantity": 2, "price": 15000 }
]
}'
JavaScript (Node.js 18+, sin dependencias)
const res = await fetch('https://nanofactura.com/api/mi-empresa/invoices', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.NANOFACTURA_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
idempotency: crypto.randomUUID(),
posNumber: 1,
voucherType: 11,
concept: 1,
voucherDate: '20260811',
customer: {
docType: 96,
docNumber: '35888999',
name: 'Pedro López',
address: 'Av. de Mayo 500, CABA',
stateId: 0,
taxType: 5,
},
items: [{ description: 'Producto de prueba', quantity: 2, price: 15000 }],
}),
})
const data = await res.json()
if (!data.ok) throw new Error(`${data.code}: ${data.error}`)
console.log('CAE:', data.result.cae)
PHP (8.1+, con cURL)
<?php
$payload = [
'idempotency' => bin2hex(random_bytes(16)),
'posNumber' => 1,
'voucherType' => 11,
'concept' => 1,
'voucherDate' => '20260811',
'customer' => [
'docType' => 96,
'docNumber' => '35888999',
'name' => 'Pedro López',
'address' => 'Av. de Mayo 500, CABA',
'stateId' => 0,
'taxType' => 5,
],
'items' => [
['description' => 'Producto de prueba', 'quantity' => 2, 'price' => 15000],
],
];
$ch = curl_init('https://nanofactura.com/api/mi-empresa/invoices');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('NANOFACTURA_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
if (!($data['ok'] ?? false)) {
throw new RuntimeException("{$data['code']}: {$data['error']}");
}
echo "CAE: {$data['result']['cae']}\n";
Python (3.9+, con requests)
import os
import uuid
import requests
payload = {
"idempotency": str(uuid.uuid4()),
"posNumber": 1,
"voucherType": 11,
"concept": 1,
"voucherDate": "20260811",
"customer": {
"docType": 96,
"docNumber": "35888999",
"name": "Pedro López",
"address": "Av. de Mayo 500, CABA",
"stateId": 0,
"taxType": 5,
},
"items": [
{"description": "Producto de prueba", "quantity": 2, "price": 15000}
],
}
response = requests.post(
"https://nanofactura.com/api/mi-empresa/invoices",
headers={"Authorization": f"Bearer {os.environ['NANOFACTURA_API_KEY']}"},
json=payload,
timeout=30,
)
data = response.json()
if not data.get("ok"):
raise RuntimeError(f"{data.get('code')}: {data.get('error')}")
print("CAE:", data["result"]["cae"])
La respuesta:
{
"ok": true,
"result": {
"id": 1485,
"voucherNumber": 45,
"cae": "76251489623547",
"totalAmount": 30000,
"arcaObservations": null,
"idempotencyHit": false
},
"quota": { "type": "invoices", "granted": 500, "used": 138, "remaining": 362 }
}
Ya está: ese cae lo otorgó ARCA. Guardá id, cae, voucherNumber, posNumber y voucherType contra tu operación — es lo único que necesitás conservar.
Paso 3 — Mirá el comprobante
Por API, con GET /invoices, o en la app web:
https://asistentefacturaelectronica.com/app/comprobantes/<id-empresa>
Si emitiste con una clave TEST_, activá la vista de homologación en el listado de la app. Sin eso el listado muestra únicamente los comprobantes fiscales y vas a creer que no se emitió nada.
Paso 4 — El PDF
El PDF se genera en segundo plano, unos segundos después de la emisión:
curl "https://nanofactura.com/api/mi-empresa/invoices/1485/pdf?versions=1" \
-H "Authorization: Bearer TEST_tu_api_key" \
-o factura.pdf
Pedilo en el momento en que alguien lo abre o lo imprime. Con el id lo traés siempre que lo necesites. Y si lo que querés es que le llegue a tu cliente, no lo bajes para reenviarlo: mandá los destinatarios en emails al emitir. Ver PDF y envío por email.
Y ahora
- Emisión de comprobantes — todos los campos, en detalle.
- Equivalencia de campos con ARCA — cómo se llama cada cosa en ARCA y cuándo es obligatoria.
- Ejemplos completos — repositorio con implementaciones listas en JavaScript, PHP y Python.
- Errores — qué reintentar y qué corregir.
Pasar a producción
Cuando la integración funcione en homologación:
- Verificá que tengas un certificado de producción activo (guía).
- Creá una API Key
PROD_desde la app. - Cambiá el valor de la variable de entorno. Nada más.
El código no cambia: el entorno lo decide el prefijo de la clave, no un parámetro del pedido. Confirmá con GET /api-keys/test que responda "environment": "production" y emitiste tu primer comprobante fiscal.