🚀 API REST Moderna

Nueva API de Odoo Online

Guía completa para desarrolladores: integra Odoo con cualquier sistema, automatiza procesos y desarrolla aplicaciones potentes.

Protocolo
REST + XML-RPC
Formato
JSON
Versión Actual
v17+

Conceptos Fundamentales de la API

🔑

Autenticación

API Keys únicas por usuario. Autenticación segura sin exponer contraseñas. Tokens revocables en cualquier momento.

📋

Endpoints

URLs base: /web/dataset/call_kw para llamadas, /web/session/authenticate para login. Cada modelo tiene sus métodos.

🗂️

Modelos

res.partner (contactos), product.product (productos), sale.order (ventas). Cada modelo con campos específicos.

Métodos CRUD

search_read (consultar), create (crear), write (actualizar), unlink (eliminar). Operaciones estándar en todos los modelos.

🚀 Quick Start: Primera Integración

1

Obtener API Key

Ruta: Preferencias → Seguridad de la cuenta → Claves API

  1. Inicia sesión en tu instancia de Odoo Online
  2. Click en tu nombre (esquina superior derecha) → Preferencias
  3. Pestaña "Seguridad de la cuenta"
  4. Sección "Claves API" → Click "Nueva clave API"
  5. Ingresa descripción (ej: "Integración con Shopify")
  6. ¡IMPORTANTE! Copia el token generado (solo se muestra una vez)

⚠️ Seguridad: Guarda la API Key en un gestor de contraseñas o variable de entorno. NUNCA la incluyas directamente en código que subes a repositorios públicos.

2

Ejemplo Básico en Python

Conexión y consulta de clientes:

import xmlrpc.client

# Configuración
url = "https://tu-empresa.odoo.com"
db = "tu-base-datos"
username = "tu-email@empresa.com"
api_key = "tu-api-key-aqui"

# Autenticación
common = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/common')
uid = common.authenticate(db, username, api_key, {})

# Cliente de modelos
models = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/object')

# Consultar clientes
clientes = models.execute_kw(
    db, uid, api_key,
    'res.partner',  # modelo
    'search_read',  # método
    [[['customer_rank', '>', 0]]],  # dominio (filtros)
    {'fields': ['name', 'email', 'phone'], 'limit': 10}
)

print(f"Encontrados {len(clientes)} clientes:")
for cliente in clientes:
    print(f"- {cliente['name']} ({cliente['email']})")
3

Ejemplo en JavaScript/Node.js

Usando fetch para crear un producto:

const axios = require('axios');

const config = {
  url: 'https://tu-empresa.odoo.com',
  db: 'tu-base-datos',
  username: 'tu-email@empresa.com',
  api_key: 'tu-api-key-aqui'
};

async function crearProducto() {
  // Autenticación
  const authResponse = await axios.post(
    `${config.url}/web/session/authenticate`,
    {
      jsonrpc: '2.0',
      params: {
        db: config.db,
        login: config.username,
        password: config.api_key
      }
    }
  );

  const sessionId = authResponse.data.result.session_id;

  // Crear producto
  const productoResponse = await axios.post(
    `${config.url}/web/dataset/call_kw`,
    {
      jsonrpc: '2.0',
      method: 'call',
      params: {
        model: 'product.product',
        method: 'create',
        args: [{
          name: 'Nuevo Producto API',
          list_price: 99.99,
          type: 'consu',
          description: 'Creado via API'
        }],
        kwargs: {}
      }
    },
    {
      headers: {
        'Cookie': `session_id=${sessionId}`
      }
    }
  );

  console.log('Producto creado con ID:', productoResponse.data.result);
}

crearProducto();

Operaciones CRUD Principales

🔍 Search / Search_read

search: Devuelve solo IDs de registros que cumplen condiciones
search_read: Devuelve IDs + campos especificados

# Búsqueda con filtros models.execute_kw( db, uid, api_key, 'sale.order', 'search_read', [[ ['state', 'in', ['sale', 'done']], ['date_order', '>=', '2024-01-01'] ]], {'fields': ['name', 'amount_total']} )
Operadores:
• = (igual)
• != (diferente)
• > < >= <=
• in, not in
• like, ilike
• =? (igual o null)

➕ Create

Crea uno o varios registros. Retorna ID(s) del registro creado.

# Crear un contacto id = models.execute_kw( db, uid, api_key, 'res.partner', 'create', [{ 'name': 'Juan Pérez', 'email': 'juan@empresa.com', 'phone': '+34 600 123 456', 'customer_rank': 1 }] ) # Crear múltiples registros ids = models.execute_kw(..., 'create', [ [{'name': 'Cliente 1'}, {'name': 'Cliente 2'}] ])
Tip: Valida campos obligatorios antes de crear para evitar errores.

✏️ Write

Actualiza registros existentes. Requiere ID(s) y campos a modificar.

# Actualizar un registro models.execute_kw( db, uid, api_key, 'res.partner', 'write', [[partner_id], { 'phone': '+34 600 999 888', 'street': 'Calle Nueva 123' }] ) # Actualizar múltiples registros models.execute_kw(..., 'write', [ [id1, id2, id3], {'customer_rank': 5} ])
Cuidado: Write afecta TODOS los IDs en la lista. Verifica los IDs antes.

🗑️ Unlink (Delete)

Elimina registros permanentemente. Operación irreversible.

# Eliminar un registro models.execute_kw( db, uid, api_key, 'res.partner', 'unlink', [[partner_id]] ) # Eliminar múltiples models.execute_kw(..., 'unlink', [ [id1, id2, id3] ])
⚠️ Importante: Algunos registros no pueden eliminarse si tienen dependencias (facturas con pagos, etc.). Usa active=False para archivar en su lugar.

Modelos Más Utilizados

res.partner

Contactos

Clientes, proveedores y contactos

Campos comunes:
name, email, phone, vat, street, city, country_id
product.product

Productos

Catálogo de productos/servicios

Campos comunes:
name, default_code, list_price, standard_price, type, categ_id
sale.order

Órdenes de Venta

Presupuestos y pedidos de venta

Campos comunes:
name, partner_id, date_order, amount_total, state, order_line
purchase.order

Órdenes de Compra

Solicitudes y órdenes de compra

Campos comunes:
name, partner_id, date_order, amount_total, state
account.move

Facturas

Facturas de cliente y proveedor

Campos comunes:
name, partner_id, invoice_date, amount_total, state, move_type
stock.picking

Albaranes

Movimientos de inventario

Campos comunes:
name, partner_id, location_id, scheduled_date, state
crm.lead

Oportunidades CRM

Leads y oportunidades de venta

Campos comunes:
name, partner_id, expected_revenue, probability, stage_id
project.project

Proyectos

Gestión de proyectos

Campos comunes:
name, partner_id, date_start, user_id, task_count
hr.employee

Empleados

Recursos humanos

Campos comunes:
name, work_email, mobile_phone, department_id, job_id

✅ Mejores Prácticas

Manejo de Errores

Implementa try/catch robusto. La API puede retornar errores por permisos, campos inválidos, registros no encontrados. Loguea errores con contexto suficiente para debugging.

Paginación

Para consultas grandes, usa limit y offset. Ejemplo: limit=100, offset=0 (primera página), luego offset=100, offset=200, etc. No intentes cargar miles de registros en una sola llamada.

Caché Local

Datos que cambian poco (catálogo de productos, lista de países) guárdalos en caché local con TTL. Reduce drásticamente llamadas API y mejora rendimiento.

Transacciones Atómicas

Si creas orden de venta con líneas, usa transacciones para garantizar consistencia. Si falla creación de línea, reversa la orden.

Campos Calculados

Algunos campos son computed (calculados dinámicamente). No puedes escribir directamente en ellos. Lee documentación del modelo para saber cuáles.

Relaciones Many2one/One2many

Many2one: Envía ID del registro relacionado. One2many/Many2many: Usa comandos especiales [(0,0,vals)], [(4,id)], [(5,0,0)], etc. para crear, vincular o desvincular.

Testing en Sandbox

SIEMPRE prueba integraciones en base de datos de test antes de producción. Un bug puede corromper datos críticos.

Versionado de API

La estructura de modelos puede cambiar entre versiones de Odoo. Documenta qué versión soporta tu integración y prueba antes de actualizar Odoo.

💡 Casos de Uso Comunes

🛒

E-commerce → Odoo

Sincronizar pedidos de tienda online (Shopify, WooCommerce, Magento) a Odoo automáticamente.

  • • Webhook recibe pedido nuevo en tienda
  • • Script crea cliente en Odoo (si no existe)
  • • Crea orden de venta con líneas de productos
  • • Confirma pedido y genera factura
  • • Actualiza inventario automáticamente
📊

Dashboard Externo

Construir dashboards personalizados con métricas de Odoo en tiempo real.

  • • Consultar ventas del mes por API
  • • Obtener top 10 productos más vendidos
  • • Calcular KPIs (tasa conversión, ticket medio)
  • • Visualizar en Power BI, Tableau o app custom
  • • Actualización cada hora con caché
📱

App Móvil

Desarrollar aplicación móvil (iOS/Android) que conecta con Odoo.

  • • App de fuerza de ventas en campo
  • • Consultar catálogo de productos offline
  • • Crear presupuestos desde tablet
  • • Sincronizar cuando haya conexión
  • • Notificaciones push de pedidos nuevos
🔄

Sincronización ERP Legacy

Migración gradual desde sistema antiguo a Odoo con sincronización temporal.

  • • Script cron cada hora sincroniza cambios
  • • Comparar timestamps de última modificación
  • • Actualizar solo registros modificados
  • • Evitar duplicados con external_id
  • • Log detallado de sincronizaciones

Preguntas Frecuentes

¿Qué es la API de Odoo Online y para qué sirve?

La API de Odoo Online es una interfaz REST que permite a aplicaciones externas interactuar con tu instancia de Odoo sin necesidad de acceder directamente a la interfaz web. Sirve para: crear integraciones con otros sistemas (CRM, e-commerce, ERP externos), automatizar procesos empresariales, desarrollar aplicaciones móviles o web personalizadas que consuman datos de Odoo, sincronizar información en tiempo real entre sistemas, y crear dashboards o reportes externos con datos de Odoo.

¿Necesito Odoo Enterprise para usar la API o funciona en Community?

La API XML-RPC funciona tanto en Odoo Community como Enterprise. Sin embargo, la API REST moderna y optimizada (introducida en versiones recientes) está disponible principalmente en Odoo Enterprise y Odoo Online. Para proyectos comerciales serios, se recomienda Odoo Enterprise por mejor rendimiento, seguridad y soporte oficial de la API.

¿Cómo autenticarme en la API de Odoo Online de forma segura?

Odoo Online utiliza autenticación por API Keys (tokens) en lugar de contraseñas. Para crear una API Key: 1) Accede a Odoo como usuario, 2) Ve a Preferencias → Seguridad de la cuenta, 3) Genera una nueva API Key con descripción, 4) Copia el token (se muestra solo una vez), 5) Usa este token en lugar de contraseña en las llamadas API. NUNCA compartas API Keys ni las incluyas en código público. Rota las keys periódicamente.

¿Qué lenguajes de programación puedo usar con la API de Odoo?

La API de Odoo es agnóstica al lenguaje. Los más utilizados son: Python (con biblioteca odoorpc o requests), JavaScript/Node.js (con axios o fetch), PHP (con cURL o Guzzle), Java (con HttpClient), C# (.NET con HttpClient), Ruby (con Faraday). Cualquier lenguaje que pueda hacer peticiones HTTP POST/GET puede interactuar con la API de Odoo.

¿Hay límites de llamadas (rate limits) en la API de Odoo Online?

Sí, Odoo Online implementa rate limits para proteger el rendimiento: límite de ~600 llamadas por hora por usuario/IP (puede variar según plan), timeout de 60 segundos por petición, límite de tamaño de respuesta de ~10MB. Para aplicaciones intensivas, considera implementar caché local, batch processing (procesar múltiples registros en una llamada), y optimizar consultas para reducir número de llamadas.

¿Necesito ayuda profesional para integrar la API de Odoo?

Depende de la complejidad. Integraciones simples (consultar productos, crear clientes) son factibles con conocimientos básicos de programación. Integraciones complejas (sincronización bidireccional en tiempo real, manejo de transacciones, transformación de datos complejos) requieren experiencia tanto en desarrollo API como conocimiento profundo de la estructura de datos de Odoo. Un error en integración puede causar duplicados, pérdida de datos o inconsistencias. Se recomienda consultoría experta para integraciones críticas.

¿Necesitas Ayuda con Integraciones de Odoo API?

Nuestro equipo de desarrolladores expertos puede crear integraciones robustas, automatizaciones complejas y aplicaciones personalizadas con Odoo API.

Desarrollo profesional
Código limpio y documentado
Soporte continuo