#API Doc — Integración Odoo Producción
Versión 14 | Base path:/api/v1| Formato: JSON UTF-8 | Autenticación: Bearer Token
#1. Introducción
Esta API conecta un sistema externo con Odoo para soportar procesos del módulo de Producción. Define de forma unificada los endpoints, contratos de datos, validaciones y reglas de sincronización para operar con demanda comercial, órdenes de fabricación y maestros compartidos.
| Dominio | Alcance |
|---|---|
| Ventas | Recepción de demanda comercial |
| Producción | Órdenes de fabricación directas o derivadas |
| Maestros | Productos, BOMs, clientes, almacenes |
#2. Casos de integración
#Caso A — Demanda por venta
El sistema externo informa una demanda comercial. La API registra la venta en Odoo y el ERP genera la fabricación mediante su flujo estándar de abastecimiento y MRP.
- Aplica cuando existe pedido, cliente y compromiso comercial.
- Preserva trazabilidad: venta → producción.
#Caso B — Producción directa
El sistema externo actúa como planificador y la API crea directamente la orden de fabricación en Odoo con los datos de planificación necesarios.
- Aplica cuando el sistema externo es planificador o MES.
- Permite fabricar sin depender de una venta previa.
#3. Autenticación
| Elemento | Valor |
|---|---|
| Header | Authorization: Bearer <token> |
| Sistema origen | X-Source-System: <codigo_sistema> |
| Idempotencia | Idempotency-Key: <uuid> para POST/PUT |
| Trazabilidad | X-Correlation-Id: <uuid> recomendado |
#4. Convenciones
| Regla | Detalle |
|---|---|
| Formato | JSON UTF-8 |
| Fechas | ISO 8601 (2026-06-26T10:00:00Z) |
| Claves externas | external_id obligatorio en toda entidad |
| Idempotencia | Cada POST/PUT debe ser idempotente por Idempotency-Key y por external_id |
| Maestros previos | Los maestros primarios deben existir antes de enviar demanda o producción |
| Referencias cruzadas | Se resuelven siempre por clave externa, no por IDs internos de Odoo |
#Envelope de respuesta
{
"success": true,
"data": {},
"meta": {
"correlation_id": "...",
"timestamp": "2026-06-26T23:30:00Z"
},
"errors": []
}
#5. Sincronización de datos maestros
#Prioridad de maestros
| Maestro | Prioridad | Uso | Obligatorio en | Clave externa |
|---|---|---|---|---|
| Producto | Primario | Fabricación / venta / consumo | Casos A y B | product_external_id |
| Lista de materiales | Primario | Definición de componentes | Casos A y B | bom_external_id |
| Cliente | Secundario | Demanda comercial | Caso A | customer_external_id |
| Proveedor | Secundario | Abastecimiento / trazabilidad | Opcional | vendor_external_id |
| Almacén / Ubicación | Secundario | Stock y reservas | Casos A y B | warehouse_code / location_code |
| Unidad de medida | Secundario | Cantidades | Casos A y B | uom_code |
| Routing / Work Center | Secundario | Planificación operativa | Caso B | routing_external_id |
#Estrategia técnica
- Sincronización incremental por endpoint de upsert.
- Conciliación nocturna opcional para detectar diferencias.
- Versionado recomendado para BOMs mediante
versionoeffective_from. - Bloqueo de integración transaccional si faltan productos o BOMs requeridos.
#6. Endpoints
#Autenticación y headers comunes
Todos los endpoints requieren:
Authorization: Bearer <token>
X-Source-System: <codigo_sistema>
Content-Type: application/json
#6.1 Productos
POST /api/v1/master-data/products/upsert
Crea o actualiza productos necesarios para venta, fabricación y consumo.
#Request
| Campo | Tipo | Req | Descripción | ||
|---|---|---|---|---|---|
external_id | string | ✅ | Identificador único del producto en sistema origen | ||
sku | string | ✅ | Código de producto | ||
name | string | ✅ | Nombre comercial / interno | ||
type | string | ✅ | storable \ | consumable \ | service |
uom_code | string | ✅ | Unidad de medida base | ||
can_be_sold | boolean | Venta habilitada | |||
can_be_purchased | boolean | Compra habilitada | |||
can_be_manufactured | boolean | Fabricación habilitada | |||
tracking | string | none \ | lot \ | serial | |
active | boolean | Estado activo |
{
"external_id": "PROD-1001",
"sku": "PT-1001",
"name": "Producto terminado A",
"type": "storable",
"uom_code": "UN",
"can_be_sold": true,
"can_be_manufactured": true,
"tracking": "lot",
"active": true
}
#Response
{
"success": true,
"data": {
"external_id": "PROD-1001",
"odoo_model": "product.product",
"odoo_id": 2481,
"status": "upserted"
},
"errors": []
}
#6.2 Listas de materiales
POST /api/v1/master-data/boms/upsert
Crea o actualiza listas de materiales y sus componentes.
#Request
| Campo | Tipo | Req | Descripción |
|---|---|---|---|
external_id | string | ✅ | Identificador único de la BOM |
product_external_id | string | ✅ | Producto fabricado |
uom_code | string | ✅ | Unidad de medida de la BOM |
base_quantity | number | ✅ | Cantidad base de fabricación |
version | string | Versión lógica | |
routing_external_id | string | Routing asociado | |
components | array | ✅ | Detalle de materiales |
#components[]
| Campo | Tipo | Req | Descripción |
|---|---|---|---|
component_product_external_id | string | ✅ | Producto componente |
quantity | number | ✅ | Cantidad requerida |
uom_code | string | ✅ | Unidad de medida |
operation_external_id | string | Operación asociada | |
scrap_factor | number | Merma esperada |
{
"external_id": "BOM-PT-1001-V1",
"product_external_id": "PROD-1001",
"uom_code": "UN",
"base_quantity": 1,
"version": "v1",
"routing_external_id": "ROUT-010",
"components": [
{
"component_product_external_id": "MAT-2001",
"quantity": 2,
"uom_code": "UN"
},
{
"component_product_external_id": "MAT-2002",
"quantity": 0.5,
"uom_code": "KG",
"scrap_factor": 0.03
}
]
}
#6.3 Caso A — Demanda por venta
POST /api/v1/case-a/sales-orders
El sistema externo envía una demanda comercial. La API crea una orden de venta y Odoo genera la fabricación mediante su flujo estándar de reaprovisionamiento/MRP.
#Request
| Campo | Tipo | Req | Descripción |
|---|---|---|---|
external_order_id | string | ✅ | Identificador único del pedido externo |
customer_external_id | string | ✅ | Cliente |
order_date | datetime | ✅ | Fecha del pedido |
requested_date | datetime | Fecha deseada | |
warehouse_code | string | ✅ | Almacén de ejecución |
lines | array | ✅ | Detalle de demanda |
notes | string | Observaciones |
#lines[]
| Campo | Tipo | Req | Descripción |
|---|---|---|---|
line_external_id | string | ✅ | Identificador de línea |
product_external_id | string | ✅ | Producto demandado |
quantity | number | ✅ | Cantidad |
uom_code | string | Unidad de medida | |
price_unit | number | Precio unitario | |
bom_external_id | string | BOM a priorizar si aplica |
{
"external_order_id": "SO-EXT-9001",
"customer_external_id": "CUST-5001",
"order_date": "2026-06-26T10:00:00Z",
"warehouse_code": "WH-01",
"lines": [
{
"line_external_id": "SO-EXT-9001-1",
"product_external_id": "PROD-1001",
"quantity": 120,
"uom_code": "UN",
"price_unit": 0
}
]
}
#Response
{
"success": true,
"data": {
"external_order_id": "SO-EXT-9001",
"sale_order": {"odoo_id": 981, "name": "S000981"},
"manufacturing": {"status": "triggered"}
},
"errors": []
}
#6.4 Caso B — Producción directa
POST /api/v1/case-b/manufacturing-orders
El sistema externo decide qué producir y la API crea directamente la orden de fabricación en Odoo.
#Request
| Campo | Tipo | Req | Descripción |
|---|---|---|---|
external_mo_id | string | ✅ | Identificador único de orden externa |
product_external_id | string | ✅ | Producto a fabricar |
bom_external_id | string | ✅ | Lista de materiales |
quantity | number | ✅ | Cantidad a producir |
uom_code | string | Unidad de medida | |
planned_start | datetime | ✅ | Inicio planificado |
planned_finish | datetime | Fin planificado | |
warehouse_code | string | ✅ | Almacén de ejecución |
routing_external_id | string | Routing específico | |
priority | string | Prioridad | |
origin_reference | string | Referencia de planificación |
{
"external_mo_id": "MO-EXT-7001",
"product_external_id": "PROD-1001",
"bom_external_id": "BOM-PT-1001-V1",
"quantity": 250,
"planned_start": "2026-06-27T08:00:00Z",
"warehouse_code": "WH-01",
"routing_external_id": "ROUT-010",
"priority": "high"
}
#Response
{
"success": true,
"data": {
"external_mo_id": "MO-EXT-7001",
"manufacturing_order": {"odoo_id": 4521, "name": "MO/004521"},
"state": "confirmed"
},
"errors": []
}
#6.5 Consulta de estado
GET /api/v1/status/production-orders/{external_id}
Consulta el estado consolidado de una demanda u orden de producción.
#Response
| Campo | Tipo | Descripción |
|---|---|---|
external_id | string | Identificador consultado |
case_type | string | case_a o case_b |
odoo_document | object | ID y nombre interno |
state | string | Estado de fabricación |
reserved_components | boolean | Reserva de insumos |
produced_qty | number | Cantidad producida |
last_sync_at | datetime | Última actualización |
#6.6 Maestros secundarios
| Endpoint | Uso | Carácter | Campos mínimos |
|---|---|---|---|
POST /api/v1/master-data/customers/upsert | Demanda comercial caso A | Condicional | external_id, name, vat/tax_id |
POST /api/v1/master-data/vendors/upsert | Abastecimiento | Opcional | external_id, name, vat/tax_id |
POST /api/v1/master-data/warehouses/upsert | Stock / reservas | Recomendado | warehouse_code, name |
POST /api/v1/master-data/routings/upsert | Operaciones productivas | Condicional | external_id, name, operations[] |
#7. Errores
| HTTP | Código | Causa | Acción |
|---|---|---|---|
| 400 | VALIDATION_ERROR | Contrato inválido | Corregir payload |
| 401 | UNAUTHORIZED | Token inválido | Renovar credenciales |
| 404 | MASTER_NOT_FOUND | Producto/BOM/cliente inexistente | Sincronizar maestro |
| 409 | DUPLICATED_REQUEST | Idempotency-Key o external_id repetido | No reenviar sin revisar |
| 422 | BUSINESS_RULE_ERROR | Regla de negocio no satisfecha | Revisar configuración Odoo |
| 503 | ODOO_UNAVAILABLE | Falla del ERP o adaptador | Retry controlado |
{
"success": false,
"data": null,
"errors": [
{
"code": "MASTER_NOT_FOUND",
"message": "No existe product_external_id=PROD-1001",
"field": "product_external_id"
}
]
}
#8. Mapeo interno con Odoo
| API pública | Modelo Odoo | Operación esperada |
|---|---|---|
/master-data/products/upsert | product.template / product.product | Alta/actualización de producto |
/master-data/boms/upsert | mrp.bom / mrp.bom.line | Alta/actualización de BOM |
/master-data/customers/upsert | res.partner | Alta/actualización de cliente |
/case-a/sales-orders | sale.order / sale.order.line | Creación y confirmación de venta |
/case-b/manufacturing-orders | mrp.production | Creación, confirmación y planificación |
/status/production-orders/{id} | mrp.production / stock.move / mrp.workorder | Lectura de estado consolidado |
Nota de implementación: el adaptador Odoo debe resolver referencias externas en tablas de equivalencia o campos dedicados (x_external_id) y preservar unicidad por modelo.
📄 Fuente: Informe de Integración Odoo Producción v14