Moradoo API es un framework REST universal para Odoo. Permite consultar, crear, actualizar y eliminar cualquier registro al que el usuario tenga acceso, con una sintaxis simple, predecible y pensada para desarrolladores que quieren integrar Odoo sin pelearse con su API nativa.
El objetivo de Moradoo es ofrecer una capa REST limpia, coherente y documentada, que pueda usarse tanto en proyectos internos como en integraciones de terceros, manteniendo siempre la seguridad y las reglas de negocio de Odoo.
Moradoo implementa CRUD completo sobre los modelos de Odoo:
Además del CRUD genérico, Moradoo incluye servicios específicos para ciertos módulos, como la creación avanzada de productos en Odoo (plantilla, variantes, atributos, stock inicial, notas y actividades).
https://moradoo.com/{modelo}/{filtros}
La estructura de rutas está pensada para ser legible y fácil de recordar. Los modelos pueden exponerse
con su nombre técnico de Odoo (product.product) o mediante alias configurados.
Moradoo permite definir alias de tablas y campos en la configuración, de forma que las URLs sean más limpias y amigables:
/productos → product.product/clientes → res.partnerprecio → list_pricenombre → display_nameLos alias permiten exponer una API más estable y legible, sin obligar al consumidor a conocer los nombres internos de Odoo. Moradoo resuelve estos alias antes de construir la consulta real.
Moradoo soporta los operadores más habituales de Odoo, expuestos de forma sencilla en la URL:
=, !=, >, <, >=, <=, like, ilike, between
Operadores como startswith, endswith o exact se han eliminado para
simplificar la API y evitar solapamientos. Sus casos de uso se cubren con like e
ilike combinados con patrones adecuados.
Ejemplos de filtros simples y avanzados:
https://moradoo.com/productos/precio/10
https://moradoo.com/productos/precio/between/10/50
https://moradoo.com/productos/nombre/agua
Los filtros se aplican en orden, y Moradoo se encarga de traducirlos a dominios de Odoo, resolviendo alias de campos y normalizando valores según el tipo de cada campo.
https://moradoo.com/productos/nombre/mesa/precio/between/10/50
Es posible combinar varios filtros en una misma URL. Moradoo construye el dominio final respetando el orden y aplicando las condiciones de forma coherente. Esto permite construir consultas complejas sin necesidad de enviar JSON en el body.
Moradoo permite ordenar resultados de dos formas:
https://moradoo.com/productos/precio/asc
https://moradoo.com/productos/precio/desc
https://moradoo.com/productos?order=name desc
La primera forma usa la propia ruta para indicar el campo y la dirección. La segunda usa el parámetro
order, compatible con la sintaxis nativa de Odoo, incluyendo ordenación múltiple:
?order=name asc, list_price desc
Moradoo es capaz de aplicar ordenación incluso en campos que Odoo no considera directamente ordenables, siempre que tenga suficiente información para reconstruir el criterio de orden. Esto permite resultados más útiles en listados complejos.
https://moradoo.com/productos/limit/20
https://moradoo.com/productos?limit=20&offset=3
limit controla el número máximo de registros devueltos y offset permite paginar
resultados. Ambos parámetros pueden combinarse con filtros, ordenación y selección de campos.
GETFIELDS es una instrucción especial de Moradoo API que permite consultar la estructura
completa y real de cualquier modelo de Odoo. Es una herramienta fundamental para desarrolladores que
necesitan conocer los campos disponibles, sus tipos y sus restricciones sin depender de documentación
externa.
GET /{modelo}/getFields
Ejemplo real:
GET https://moradoo.com/product.product/getFields
La respuesta incluye información detallada de cada campo del modelo:
name).char, float, many2one, one2many, etc.).required).readonly).relation).string).help).
GETFIELDS alimenta a FieldRegistry, que cachea la estructura del modelo para acelerar validaciones y normalizaciones en POST/PUT.
FieldRegistry es un componente interno fundamental de Moradoo API. Su función es
cachear la estructura completa de los modelos de Odoo para acelerar validaciones,
normalizar valores y evitar errores humanos antes de que la petición llegue al servidor.
Cada usuario tiene su propio registro de campos, basado en su sesión activa de Odoo. Esto garantiza que las validaciones se ajusten exactamente a los permisos y modelos disponibles para ese usuario.
Por cada modelo, FieldRegistry almacena:
char, float, many2one, etc.).required).readonly).relation en many2one, one2many, many2many).string).help).Sin FieldRegistry, cada operación POST/PUT tendría que consultar Odoo para validar campos, lo cual sería lento e ineficiente. Con FieldRegistry, Moradoo puede validar y normalizar datos en memoria, ofreciendo una experiencia mucho más robusta.
Gracias a FieldRegistry, Moradoo puede:
ignored_fields.15.0 o "true" en 1).(Aquí irá la captura /images/manual/fieldregistry-cache.png.)
FieldRegistry es clave en operaciones como:
ignored_fields.
Gracias a este componente, Moradoo puede ofrecer un CRUD genérico seguro y, al mismo tiempo,
servicios específicos más inteligentes como OdooProductService.
Además del CRUD genérico disponible para cualquier modelo de Odoo, Moradoo incluye un servicio
especializado para la gestión avanzada de productos: OdooProductService.
Este servicio permite crear productos de forma inteligente, manejando plantillas, variantes, atributos, validaciones y acciones adicionales, todo ello respetando la sesión del usuario y sin exponer credenciales ni datos sensibles.
Crea un producto completo a partir de una plantilla (product.template) y su variante
inicial (product.product). Es la forma más rápida de registrar un nuevo producto.
POST /producto/base
{
"name": "Basic blue T-shirt",
"barcode": "1234567890123",
"default_code": "SKU-001",
"list_price": 12.50,
"standard_price": 7.00,
"stock_inicial": 50,
"nota": "Initial stock loaded",
"actividad": {
"summary": "Review product",
"user_id": 5,
"date_deadline": "2026-06-01"
}
}
(Aquí irá la captura /images/manual/crud-product-base.png.)
Moradoo devuelve:
Crea una variante adicional para un producto que no tiene atributos. Si el producto tiene atributos definidos, Moradoo bloquea esta operación para evitar inconsistencias.
POST /producto/variante/simple
{
"template_id": 120,
"default_code": "SKU-001-B",
"barcode": "1234567890999"
}
(Aquí irá la captura /images/manual/crud-product-variant.png.)
Si el template tiene atributos, Moradoo devuelve un error claro:
VARIANTE_SIMPLE_NO_PERMITIDA
Permite crear variantes basadas en atributos como talla, color o presentación. Moradoo gestiona automáticamente:
POST /producto/variante/atributos
{
"template_id": 120,
"attribute_value": "500ml"
}
(Aquí irá la captura /images/manual/crud-product-attribute.png.)
Moradoo indica si la variante ya existía o si ha sido creada:
VARIANTE_CREADA_OK
VARIANTE_EXISTENTE
Moradoo incluye un sistema de atributo automático para el atributo estándar “Presentación”. Si el valor no existe, se crea. Si el atributo no existe, también se crea.
Esto permite crear variantes como:
…sin necesidad de configurar nada en Odoo previamente.
Moradoo permite ejecutar acciones adicionales automáticamente tras crear un producto o variante:
stock_inicial).nota).actividad).Estas acciones son opcionales y no afectan a la creación del producto si fallan.
Todas las operaciones del servicio de productos:
session_id).Moradoo devuelve warnings cuando:
Y devuelve errores claros cuando:
name en la creación base.template_id en variantes.PUT https://moradoo.com/product.product/1949
{
"lst_price": 15.0,
"campo_inventado": "xxx"
}
{
"status": "OK",
"data": {
"updated_fields": ["lst_price"],
"ignored_fields": ["campo_inventado"]
}
}
Moradoo actualiza solo los campos válidos y mueve los campos desconocidos a ignored_fields,
evitando errores y dejando claro qué se ha aplicado y qué no.
DELETE https://moradoo.com/product.product/1173
ERROR_DELETE. DELETE_NO_EXISTE → No existe el registro ID 1916 en product.product
Los mensajes de error están pensados para ser claros y orientados al desarrollador, indicando exactamente qué ha fallado y en qué modelo.
Todas las operaciones usan una respuesta unificada que incluye:
statustimestampresults (cuando aplica)messagedatawarningserrorshttps://moradoo.com/productos/nombre/agua
https://moradoo.com/productos/precio/between/1/10/precio/asc
Estos ejemplos pueden acompañarse de capturas del Playground, mostrando la petición y la
respuesta JSON formateada (por ejemplo, /images/manual/playground-overview.png,
/images/manual/filter-basic.png, /images/manual/order-asc-desc.png).
between con valores no numéricos.(Aquí puede ir una captura /images/manual/errors-example.png con un ejemplo real de error.)
Los warnings indican que algo no es crítico pero se ha ignorado o ajustado. Por ejemplo, campos inventados, valores normalizados o variantes ya existentes. Moradoo informa sin romper la operación.
(Aquí puede ir una captura /images/manual/warnings-example.png.)
Moradoo API no almacena datos de negocio. Actúa como pasarela técnica hacia Odoo, respetando siempre los permisos del usuario autenticado. No expone contraseñas ni escribe logs sensibles.
Los servicios avanzados, como OdooProductService, validan la sesión de Odoo, usan la sesión
existente y evitan cualquier exposición de credenciales.
Jose Miguel Mora
Email personal: jmmora1974@gmail.com
Email API: api.moradoo@gmail.com
LinkedIn: https://www.linkedin.com/in/jose-miguel-mora-perez
Moradoo API ha sido desarrollada sobre una base tecnológica sólida, con el objetivo de ofrecer un framework REST moderno, eficiente y orientado a la integración profesional con Odoo.
Queremos expresar un agradecimiento especial a Robert Sallent por la creación del framework FastLight, una herramienta ligera, estable y sorprendentemente versátil que ha permitido construir este proyecto con claridad, rapidez y una arquitectura limpia.
Asimismo, reconocemos el valor del trabajo colaborativo realizado junto a Copilot, cuya asistencia técnica, análisis arquitectónico y soporte continuo han contribuido de forma decisiva a la evolución y refinamiento de Moradoo API.
A todos los que han aportado ideas, soluciones y mejoras: gracias por hacer posible un proyecto robusto, escalable y preparado para crecer.
Moradoo API, versión 2.10.0