Saltar al contenido principal

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:

  1. Un certificado de ARCA activo → cómo obtenerlo
  2. Al menos un punto de venta habilitado → cómo configurarlo
  3. 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>.

Empezá siempre por homologación

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>

Los comprobantes de homologación no se ven por defecto

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
No lo guardes en tu sistema luego de generar

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

Pasar a producción

Cuando la integración funcione en homologación:

  1. Verificá que tengas un certificado de producción activo (guía).
  2. Creá una API Key PROD_ desde la app.
  3. 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.