Tutorial de integración de API REST y XML-RPC de Odoo: conecte cualquier sistema
Odoo expone todo su modelo de datos a través de API externas, lo que permite la integración con prácticamente cualquier sistema: plataformas de comercio electrónico, herramientas CRM, software de inteligencia empresarial, aplicaciones móviles y aplicaciones personalizadas. Este tutorial cubre los tres protocolos API (XML-RPC, JSON-RPC y REST), métodos de autenticación, operaciones CRUD y patrones de integración del mundo real con ejemplos de código y mejores prácticas.
Conclusiones clave
- Odoo proporciona tres protocolos API: XML-RPC (el más maduro), JSON-RPC (compatible con el navegador) y REST (Odoo 19, compatible con OpenAPI)
- Todas las API requieren autenticación mediante el nombre de la base de datos, el nombre de usuario y la contraseña o clave API
- Las operaciones CRUD siguen un patrón consistente en todos los protocolos: buscar, leer, crear, escribir, desvincular
- Los filtros de dominio utilizan una sintaxis de notación polaca para consultas complejas.
- La paginación, la selección de campos y las operaciones por lotes optimizan el rendimiento para grandes conjuntos de datos.
Comparación de protocolos API
| Característica | XML-RPC | JSON-RPC | DESCANSO (Odoo 19) |
|---|---|---|---|
| Madurez | Estable desde Odoo 8 | Estable desde Odoo 10 | Nuevo en Odoo 19 |
| Autenticación | Nombre de usuario/contraseña | Basado en sesiones | Clave API u OAuth 2.0 |
| Documentación | manuales | manuales | OpenAPI generada automáticamente |
| Formato de respuesta | XML | JSON | JSON |
| Operaciones por lotes | Sí | Sí | Sí |
| Webhooks | No (requires custom module) | No | Sí (configurable) |
| Soporte de idiomas | Cualquiera (XML-RPC es universal) | Compatible con JavaScript | Cualquiera (estándar HTTP) |
Autenticación
Autenticación XML-RPC
La autenticación XML-RPC utiliza un proceso de dos pasos: autenticarse para obtener un ID de usuario (uid) y luego usar ese uid para llamadas posteriores.
La llamada de autenticación llega al punto final /xmlrpc/2/common con el método authenticate, pasando el nombre de la base de datos, el nombre de usuario, la contraseña y un objeto vacío. La respuesta es el ID de usuario numérico. Todas las llamadas de datos posteriores utilizan /xmlrpc/2/object con el método execute_kw, pasando la base de datos, el uid, la contraseña, el nombre del modelo, el nombre del método y los argumentos.
Autenticación JSON-RPC
JSON-RPC utiliza autenticación basada en sesiones a través del punto final /web/session/authenticate. El cuerpo de la solicitud es un objeto JSON con jsonrpc: "2.0", un método de call y parámetros que contienen db, login y password. La respuesta incluye un ID de sesión en la cookie que autentica las solicitudes posteriores.
Autenticación de API REST (Odoo 19)
La API REST admite claves API generadas en el backend de Odoo:
- Vaya a Configuración > Usuarios > Claves API
- Genere una nueva clave con permisos específicos.
- Incluya la clave en el encabezado
Authorization: Bearer
Los puntos finales REST siguen el patrón /api/{model} para colecciones y /api/{model}/{id} para registros individuales.
Operaciones CRUD
Buscar y leer
La operación más común es buscar registros con criterios específicos y leer los valores de sus campos.
Los filtros de dominio utilizan notación polaca (notación de prefijo) con operadores:
| Operador | Descripción | Ejemplo |
|---|---|---|
| CÓDIGO0 | Iguales | CÓDIGO1 |
| CÓDIGO0 | No es igual | CÓDIGO1 |
| CÓDIGO0 | Mayor que | CÓDIGO1 |
| CÓDIGO0 | Menos de | CÓDIGO1 |
| CÓDIGO0 | Mayor o igual | CÓDIGO1 |
| CÓDIGO0 | En lista | CÓDIGO1 |
| CÓDIGO0 | Coincidencia de patrones | CÓDIGO1 |
| CÓDIGO0 | Patrón que no distingue entre mayúsculas y minúsculas | CÓDIGO1 |
Condiciones combinadas: utilice & (AND), | (OR) y ! (NOT) como operadores de prefijo:
- AND:
['&', ['state', '=', 'sale'], ['amount_total', '>', 1000]]coincide con pedidos de venta superiores a 1000 - O:
['|', ['state', '=', 'sale'], ['state', '=', 'done']]coincide con cualquiera de los estados - Complejo:
['&', ['state', '=', 'sale'], '|', ['partner_id', '=', 5], ['partner_id', '=', 10]]
Selección de campos: solicite solo los campos que necesita para reducir el tamaño de la carga útil y mejorar el rendimiento. Pase un parámetro fields con una lista de nombres de campos. Si se omite, se devuelven todos los campos.
Paginación: utilice los parámetros offset y limit para paginar los resultados. Ejemplo: offset: 20, limit: 20 devuelve los registros 21-40.
Crear registros
Cree registros llamando al método create con un diccionario de valores de campo. Se deben incluir los campos obligatorios. La respuesta devuelve el ID del registro recién creado (o una serie de ID para la creación por lotes).
Ejemplo: crear un contacto requiere como mínimo el campo name. Los campos opcionales incluyen email, phone, company_id, street, city, state_id, country_id y campos personalizados.
Para registros relacionados (uno2many o many2many), utilice tuplas de comandos especiales:
| Comando | Sintaxis | Descripción |
|---|---|---|
| Crear | CÓDIGO0 | Crear un nuevo registro relacionado |
| Actualización | CÓDIGO0 | Actualizar un registro relacionado existente |
| Eliminar | CÓDIGO0 | Eliminar un registro relacionado |
| Desvincular | CÓDIGO0 | Eliminar el enlace (no eliminar) |
| Enlace | CÓDIGO0 | Agregar un enlace al registro existente |
| Reemplazar | CÓDIGO0 | Reemplace todos los enlaces con los ID proporcionados |
Actualizar registros
Actualice los registros llamando al método write con los ID de registro y un diccionario de campos modificados. Incluya únicamente los campos que deban cambiarse; los campos omitidos conservan sus valores actuales.
Se admiten actualizaciones por lotes: pase una lista de ID para actualizar varios registros con los mismos valores en una sola llamada.
Eliminar registros
Elimine registros llamando al método unlink con los ID de registro. El método devuelve True en caso de éxito.
Tenga cuidado con la eliminación: muchos registros de Odoo están protegidos por reglas comerciales. Intentar eliminar una factura publicada, por ejemplo, generará un error. Utilice en su lugar el método comercial adecuado (por ejemplo, button_cancel antes de la eliminación).
Patrones de integración del mundo real
Sincronización de pedidos de comercio electrónico
Sincronice pedidos desde una plataforma de comercio electrónico externa a Odoo:
- Encuesta para nuevos pedidos: consulte la API de comercio electrónico para conocer los pedidos desde la última marca de tiempo de sincronización.
- Emparejar clientes: busque contactos de Odoo por correo electrónico; crear si no se encuentra
- Crear pedido de ventas: cree el pedido con información del cliente, líneas, envío y pago.
- Confirmar pedido: llame a
action_confirmpara procesar el pedido a través del flujo de trabajo. - Actualizar comercio electrónico: enviar la referencia del pedido de Odoo nuevamente a la plataforma de comercio electrónico
Sincronización de inventario
Mantenga los niveles de inventario sincronizados entre Odoo y un canal externo:
- Leer niveles de existencias: llame a
search_readalstock.quantcon filtros de ubicación - Push updates: Send quantity changes to the external channel
- Manejar reservas: Cuenta de stock reservado (comprometido con pedidos pendientes)
- Programar sincronización: ejecutar cada 15 a 30 minutos para mantener la precisión
Importación de clientes potenciales de CRM
Importe clientes potenciales desde plataformas de marketing a Odoo CRM:
- Obtener clientes potenciales: obtenga nuevos clientes potenciales de la API de la plataforma de marketing.
- Deduplicar: busque en Odoo contactos existentes por correo electrónico o por teléfono
- Crear clientes potenciales: cree registros en
crm.leadcon seguimiento de origen - Asignar: use las reglas de asignación de clientes potenciales de Odoo o asigne según la lógica personalizada
Exportación de datos financieros
Exportar datos financieros a una plataforma de inteligencia empresarial:
- Exportar plan de cuentas: Lea
account.accountpara conocer la estructura de cuentas - Exportar asientos de diario: leer
account.move.linecon filtros de fecha - Exportar saldos: utilice
read_grouppara agregar saldos por cuenta y período. - Programación: se ejecuta diariamente después del período de cierre de contabilidad.
Manejo de errores
Errores comunes de API
| Error | Causa | Resolución |
|---|---|---|
| Acceso denegado | Credenciales o permisos no válidos | Verificar nombre de usuario, contraseña y derechos de acceso |
| Registro no encontrado | ID no válida en lectura/escritura/desvinculación | Verifique que el registro exista con una búsqueda primero |
| Error de validación | Faltan campos obligatorios o valores no válidos | Incluya todos los campos obligatorios con datos válidos |
| Error de usuario | Violación de reglas comerciales | Consulte el mensaje de error para conocer la regla específica |
| Excepción de simultaneidad | Registro modificado por otro usuario | Vuelva a leer el registro y vuelva a intentarlo |
Limitación de velocidad
Odoo no aplica límites de velocidad de API de forma predeterminada, pero las implementaciones de producción deben implementar límites de velocidad en el nivel de proxy inverso. Para Odoo.sh, se aplican límites predeterminados para evitar abusos. Diseñe integraciones con intervalos de sondeo razonables y operaciones por lotes.
Estrategia de reintento
Implemente un retroceso exponencial para errores transitorios:
- Primer reintento después de 1 segundo
- Segundo reintento después de 4 segundos
- Tercer intento después de 16 segundos.
- Registrar y alertar después del máximo de reintentos
Optimización del rendimiento
Operaciones por lotes
Prefiera operaciones por lotes al procesamiento de registros individuales:
createacepta una lista de diccionarios de valores para la creación por loteswriteacepta una lista de ID para actualizaciones por lotessearch_readcon paginación es más eficiente que las llamadasreadindividuales
Selección de campo
Especifique siempre el parámetro fields para evitar cargar datos innecesarios. Cargar todos los campos en un modelo con más de 50 columnas genera una sobrecarga significativa, especialmente para modelos como sale.order o account.move.line.
Almacenamiento en caché
Caché que cambia lentamente los datos localmente:
- Catálogo de productos (actualizado cada hora)
- Lista de clientes (actualizar al recibir notificación de cambio)
- Tasas impositivas y posiciones fiscales (actualización diaria)
Servicios de integración de ECOSIRE
Construir integraciones confiables requiere comprender tanto el sistema externo como el modelo de datos de Odoo. Los [servicios de integración de Odoo] (/services/odoo/integration) de ECOSIRE cubren el diseño de API, el desarrollo de conectores, el mapeo de datos y el monitoreo continuo. Para las organizaciones que conectan plataformas de comercio electrónico, nuestra integración Shopify-Odoo y conectores de mercado especializados manejan los escenarios más comunes.
Lectura relacionada
- Guía de integración de API de Odoo
- Tuberías ETL para datos ERP: Odoo y Shopify
- Guía de implementación de Docker Odoo
- Guía de desarrollo de módulos personalizados de Odoo
- Seguridad API: autenticación y autorización
¿Qué protocolo API debo elegir para una nueva integración?
Para nuevos proyectos en Odoo 19, utilice la API REST. Sigue los estándares HTTP, tiene documentación generada automáticamente y admite claves API para autenticación. Para Odoo 17 o 18, XML-RPC es la opción más confiable y mejor documentada. JSON-RPC es mejor para integraciones basadas en navegador o aplicaciones JavaScript.
¿Existe un límite de velocidad en la API externa de Odoo?
Odoo en sí no impone límites de tarifas. Sin embargo, las implementaciones de Odoo.sh tienen límites a nivel de infraestructura y las implementaciones autohospedadas deben implementar limitaciones de velocidad en el nivel de proxy inverso (Nginx). Diseñe integraciones para utilizar operaciones por lotes e intervalos de sondeo razonables independientemente de los límites.
¿Puedo activar flujos de trabajo (confirmar pedido, registrar factura) a través de la API?
Sí. Utilice el método execute_kw con el nombre del método de flujo de trabajo. Por ejemplo, llame a action_confirm en una venta.orden para confirmarlo, o action_post en una cuenta.move para registrar un asiento de diario. Los métodos de flujo de trabajo aplican las mismas reglas comerciales que la interfaz de usuario.
Escrito por
ECOSIRE Research and Development Team
Construyendo productos digitales de nivel empresarial en ECOSIRE. Compartiendo perspectivas sobre integraciones Odoo, automatización de eCommerce y soluciones empresariales impulsadas por IA.
Artículos relacionados
Estrategia API-First para empresas modernas: arquitectura, integración y crecimiento
Cree una estrategia basada en API que conecte sus sistemas comerciales, permita integraciones de socios y cree nuevas oportunidades de ingresos a través del pensamiento de plataforma.
Creación de flujos de trabajo empresariales impulsados por IA: de procesos manuales a automatización inteligente
Diseñe y cree flujos de trabajo impulsados por IA que automaticen procesos comerciales de varios pasos en los sistemas de ventas, operaciones, finanzas y servicio al cliente.
Patrones de integración de CRM: conectando su ecosistema de ventas
Implemente patrones de integración de CRM para sistemas ERP, marketing, soporte y comercio electrónico con mejores prácticas para sincronización de datos, arquitectura y manejo de errores.