Ejemplos prácticos
Aprende a integrar la API de Verifactu con ejemplos reales, código funcional y guías paso a paso. Desde casos básicos hasta implementaciones avanzadas.
Casos de uso populares
E-commerce
Integra facturación automática en tu tienda online con Verifactu y Ticketbai.
ERP/CRM
Conecta tu sistema de gestión empresarial con las obligaciones fiscales.
Apps móviles
Añade capacidades de facturación a tu aplicación móvil de forma sencilla.
Automatización
Automatiza procesos de facturación con webhooks y procesamiento en lote.
Ejemplos de código
Crear una factura básica
Aprende a crear tu primera factura con la API de Verifactu
-
1
Instalar el SDK
Instala la librería oficial de Python para Verifactu-API
-
2
Configurar autenticación
Configura tu API key para autenticar las peticiones
-
3
Crear la factura
Envía los datos de la factura y recibe la confirmación
# Instalar el SDK de Python
pip install verifactu-api
# O con poetry
poetry add verifactu-api
from verifactu_api import VerifactuClient
# Configurar cliente
client = VerifactuClient(api_key="tu_api_key_aqui")
# Datos de la factura
factura_data = {
"nif_emisor": "12345678A",
"nif_receptor": "87654321B",
"numero_factura": "FAC-2025-001",
"fecha_expedicion": "2025-01-15",
"lineas": [
{
"descripcion": "Servicio de consultoría",
"cantidad": 1,
"precio_unitario": 1000.00,
"tipo_iva": 21
}
]
}
# Crear factura
try:
factura = client.facturas.create(factura_data)
print(f"Factura creada: {factura.id}")
print(f"Estado: {factura.estado}")
except Exception as e:
print(f"Error: {e}")
{
"id": "fac_456789",
"numero_factura": "FAC-2025-001",
"estado": "procesando",
"verifactu_estado": "pendiente",
"ticketbai_estado": "pendiente",
"qr_code": null,
"created_at": "2025-01-15T10:30:00Z",
"updated_at": "2025-01-15T10:30:00Z"
}
La factura se crea exitosamente y queda en estado "procesando" mientras se envía a Verifactu y Ticketbai. Recibirás webhooks cuando cambie el estado.
Integración con e-commerce
Automatiza la facturación en tu tienda online con Node.js
-
1
Configurar webhook endpoint
Crea un endpoint para recibir notificaciones de pedidos
-
2
Procesar pedido
Convierte los datos del pedido en formato de factura
-
3
Enviar a Verifactu
Crea la factura automáticamente y maneja errores
// package.json dependencies
{
"dependencies": {
"@verifactu-api/sdk": "^1.8.2",
"express": "^4.18.0",
"body-parser": "^1.20.0"
}
}
// Instalar dependencias
npm install @verifactu-api/sdk express body-parser
const express = require('express');
const { VerifactuClient } = require('@verifactu-api/sdk');
const app = express();
const client = new VerifactuClient({
apiKey: process.env.VERIFACTU_API_KEY
});
app.use(express.json());
// Webhook para nuevos pedidos
app.post('/webhook/order-completed', async (req, res) => {
try {
const order = req.body;
// Validar webhook signature (recomendado)
if (!validateWebhookSignature(req)) {
return res.status(401).send('Unauthorized');
}
// Procesar pedido
await processOrder(order);
res.status(200).send('OK');
} catch (error) {
console.error('Error processing order:', error);
res.status(500).send('Error');
}
});
function validateWebhookSignature(req) {
// Implementar validación de firma
return true; // Simplificado para el ejemplo
}
async function processOrder(order) {
// Convertir pedido a formato de factura
const facturaData = {
nif_emisor: "12345678A", // Tu NIF
nif_receptor: order.customer.nif,
numero_factura: `ORD-${order.id}`,
fecha_expedicion: new Date().toISOString().split('T')[0],
lineas: order.items.map(item => ({
descripcion: item.name,
cantidad: item.quantity,
precio_unitario: item.price,
tipo_iva: item.vat_rate || 21
}))
};
try {
// Crear factura en Verifactu
const factura = await client.facturas.create(facturaData);
// Guardar ID de factura en tu base de datos
await updateOrderWithInvoice(order.id, factura.id);
console.log(`Factura ${factura.id} creada para pedido ${order.id}`);
// Opcional: Enviar email al cliente
await sendInvoiceEmail(order.customer.email, factura);
} catch (error) {
// Manejar errores y reintentar si es necesario
console.error(`Error creating invoice for order ${order.id}:`, error);
await scheduleRetry(order.id);
}
}
async function updateOrderWithInvoice(orderId, invoiceId) {
// Actualizar tu base de datos
// db.orders.update({id: orderId}, {invoice_id: invoiceId});
}
async function sendInvoiceEmail(email, factura) {
// Enviar email con la factura
console.log(`Sending invoice ${factura.id} to ${email}`);
}
Cada vez que se complete un pedido en tu tienda, se creará automáticamente una factura en Verifactu. El cliente recibirá un email con la factura y todos los datos quedarán registrados para cumplir con las obligaciones fiscales.
Procesamiento en lote
Procesa múltiples facturas de forma eficiente con PHP
-
1
Preparar datos en lote
Organiza múltiples facturas para procesamiento eficiente
-
2
Implementar rate limiting
Respeta los límites de la API para evitar errores
-
3
Manejar errores y reintentos
Implementa lógica robusta para casos de error
pushHandler(new StreamHandler('logs/batch.log', Logger::INFO));
// Configurar cliente API
$client = new Client([
'api_key' => $_ENV['VERIFACTU_API_KEY'],
'timeout' => 30,
'retry_attempts' => 3
]);
client = $client;
$this->logger = $logger;
}
public function processBatch($invoices) {
$batches = array_chunk($invoices, $this->batchSize);
$results = [];
foreach ($batches as $batchIndex => $batch) {
$this->logger->info("Processing batch " . ($batchIndex + 1) . "/" . count($batches));
$batchResults = $this->processSingleBatch($batch);
$results = array_merge($results, $batchResults);
// Rate limiting - esperar entre lotes
if ($batchIndex < count($batches) - 1) {
sleep($this->delayBetweenBatches);
}
}
return $results;
}
private function processSingleBatch($batch) {
$results = [];
foreach ($batch as $invoiceData) {
try {
$result = $this->processInvoice($invoiceData);
$results[] = [
'success' => true,
'invoice_id' => $result['id'],
'original_data' => $invoiceData
];
$this->logger->info("Invoice created successfully", [
'invoice_id' => $result['id'],
'numero_factura' => $invoiceData['numero_factura']
]);
} catch (Exception $e) {
$results[] = [
'success' => false,
'error' => $e->getMessage(),
'original_data' => $invoiceData
];
$this->logger->error("Failed to create invoice", [
'error' => $e->getMessage(),
'numero_factura' => $invoiceData['numero_factura']
]);
}
// Pequeña pausa entre facturas individuales
usleep(100000); // 0.1 segundos
}
return $results;
}
private function processInvoice($invoiceData) {
return $this->client->facturas()->create($invoiceData);
}
}
processBatch($invoices);
// Analizar resultados
$successful = array_filter($results, fn($r) => $r['success']);
$failed = array_filter($results, fn($r) => !$r['success']);
echo "Procesamiento completado:\n";
echo "Exitosas: " . count($successful) . "\n";
echo "Fallidas: " . count($failed) . "\n";
// Guardar resultados para seguimiento
saveProcessingResults($results);
// Programar reintentos para las fallidas
if (!empty($failed)) {
scheduleRetries($failed);
}
function loadPendingInvoices() {
// Cargar desde tu base de datos
return [
[
'nif_emisor' => '12345678A',
'nif_receptor' => '87654321B',
'numero_factura' => 'BATCH-001',
'fecha_expedicion' => date('Y-m-d'),
'lineas' => [
[
'descripcion' => 'Producto 1',
'cantidad' => 1,
'precio_unitario' => 100.00,
'tipo_iva' => 21
]
]
],
// ... más facturas
];
}
function saveProcessingResults($results) {
// Guardar en base de datos para auditoría
file_put_contents(
'results/batch_' . date('Y-m-d_H-i-s') . '.json',
json_encode($results, JSON_PRETTY_PRINT)
);
}
function scheduleRetries($failed) {
// Programar reintentos para facturas fallidas
foreach ($failed as $failedInvoice) {
// Añadir a cola de reintentos
echo "Scheduling retry for: " . $failedInvoice['original_data']['numero_factura'] . "\n";
}
}
El sistema procesará cientos o miles de facturas de forma eficiente, respetando los límites de la API, manejando errores graciosamente y proporcionando logs detallados para auditoría y seguimiento.
Recursos adicionales
📚 Documentación completa
Guías detalladas, referencia de API y mejores prácticas para cada endpoint y funcionalidad.
🧪 Playground interactivo
Prueba todos los endpoints en tiempo real sin escribir código. Perfecto para explorar la API.
💬 Soporte técnico
Únete a nuestro Slack de desarrolladores o contacta directamente con nuestro equipo técnico.
¿Necesitas un ejemplo específico?
Si no encuentras el ejemplo que necesitas, contáctanos. Nuestro equipo puede crear ejemplos personalizados para tu caso de uso específico.