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.