ERPNext API REST y webhooks: guía completa
ERPNext expone una API REST nativa autogenerada para todos los DocTypes y un sistema de webhooks built-in. Esta guía cubre autenticación (API Key + Secret, OAuth 2.0), endpoints CRUD, webhooks y ejemplos prácticos en Python, JS y curl.

La filosofía de la API en ERPNext
ERPNext está construido sobre Frappe Framework, donde cada entidad de negocio (Customer, Item, Sales Invoice, etc.) es un DocType. Cada DocType tiene asociado, sin que tengas que hacer nada, un conjunto completo de endpoints REST: GET para leer, POST para crear, PUT para actualizar, DELETE para borrar.
Esto es muy distinto a Django o Rails, donde para cada modelo defines manualmente Serializers, ViewSets y Routes. En ERPNext la API existe el día que defines el DocType (incluso si lo creas desde la UI sin escribir código). Para apps con muchas entidades (un ERP típico tiene 200+ DocTypes), el ahorro de boilerplate es enorme.
El formato de comunicación es JSON. La autenticación recomendada para integraciones server-to-server es API Key + API Secret en el header Authorization. Para apps de terceros que actúan en nombre de un usuario, OAuth 2.0 estándar.
Los endpoints REST de ERPNext
Estructura idéntica para cualquier DocType del sistema.
| Método | Endpoint | Para qué |
|---|---|---|
| GET | /api/resource/{doctype} | Listar registros con filtros y paginación |
| GET | /api/resource/{doctype}/{name} | Obtener un registro específico (ej: Customer/CUST-001) |
| POST | /api/resource/{doctype} | Crear un nuevo registro (Customer, Item, Sales Invoice, etc.) |
| PUT | /api/resource/{doctype}/{name} | Actualizar un registro existente |
| DELETE | /api/resource/{doctype}/{name} | Eliminar un registro |
| POST | /api/method/{module.path.to.function} | Llamar a un método personalizado expuesto con @frappe.whitelist() |
Ejemplos de integración
Crear un Customer en Python
import requests
API_URL = "https://erp.miempresa.com/api/resource/Customer"
HEADERS = {
"Authorization": "token MI_API_KEY:MI_API_SECRET",
"Content-Type": "application/json",
}
response = requests.post(API_URL, headers=HEADERS, json={
"customer_name": "Distribuciones López SL",
"customer_type": "Company",
"customer_group": "Comercial",
"territory": "España",
"tax_id": "B12345678",
})
print(response.json()) # {"data": {"name": "CUST-2026-00001", ...}}Listar facturas con filtro en curl
curl -H "Authorization: token MI_KEY:MI_SECRET" \
"https://erp.miempresa.com/api/resource/Sales Invoice?filters=[[\"status\",\"=\",\"Paid\"]]&limit_page_length=50"Crear un webhook desde la UI
Setup → Integrations → Webhook → New. Configura:
- DocType: Sales Invoice
- DocEvent: On Submit
- Request URL: https://hooks.tu-sistema.com/erpnext/sales-invoice
- Request Method: POST
- Webhook Headers: Authorization, Content-Type
- Webhook Data: campos a enviar (name, customer, total, posting_date...)
— FAQ
Preguntas frecuentes sobre ERPNext API REST
Las dudas reales del developer o arquitecto de integraciones.
Ver todas las preguntas¿ERPNext tiene API REST nativa o hay que construirla?+−
¿Cómo me autentico con la API REST de ERPNext?+−
¿Cómo se generan las API Keys en ERPNext?+−
¿Qué son los webhooks en ERPNext?+−
¿ERPNext se integra con Zapier, Make o n8n?+−
¿Hay rate limit en la API de ERPNext?+−
¿Puedo crear endpoints REST personalizados en ERPNext?+−
¿Cómo se monitorizan las integraciones API en producción?+−
Recursos relacionados
Sigue investigando.