Overview
Odoo is an open-source ERP with CRM, accounting, inventory, HR, and 100+ other modules. The Automize Odoo connector exposes Odoo's generic model interface – search, read, create, update, delete on any model (res.partner, account.move, crm.lead, etc.) plus convenience endpoints for common modules.
- Regions: Odoo Cloud (yourcompany.odoo.com) and self-hosted Community/Enterprise are both supported. Configure the base URL per connection.
- Plans: Community is free + self-hosted. Enterprise has a SaaS + on-prem option. API access is the same on both.
Setting up the connection
Auth type: Bearer Token.
- In Odoo, ensure the connecting user has 'Settings → Users → Access Rights' enabled for the modules you'll automate.
- Generate an API key via Odoo user preferences (newer versions) – or use database + username + password.
- In Automize, open Settings → Connectors → Odoo → Add connection. Enter Odoo URL + database name + API key (or username + password).
Find your credentials at https://yourcompany.odoo.com/web/database/manager.
Rate limits
Self-hosted Odoo: no built-in rate limits. Cloud: rate limits per account, typically generous. Performance is bound by the database tier.
Data model
Odoo's data model is generic – every entity is a 'model' with records.
Cross-cutting fields exist on most models (create_date, write_date,
state, company_id).
Standard models:
res.partner – contacts (customers, suppliers, employees)
res.users – Odoo user accounts
account.move – invoices + bills + journal entries
sale.order – sales orders
purchase.order – purchase orders
product.product – products
crm.lead – leads + opportunities
hr.employee – employees
Domain filters are nested lists: [['field', '=', value], ['field2', '!=', other]].Available operations
14 operations available. Click any row to jump to its detail.
| Operation | Category | What it does |
|---|---|---|
| Create Record | General | Create a new record in any model |
| Get Fields | General | Get field definitions for a model (introspection) |
| List Employees | General | List employees (hr.employee) |
| List Invoices | General | List invoices (account.move) |
| List CRM Leads | General | List CRM leads/opportunities (crm.lead) |
| List Partners/Contacts | General | List contacts/customers/suppliers (res.partner) |
| List Products | General | List products (product.product) |
| List Purchase Orders | General | List purchase orders (purchase.order) |
| List Sale Orders | General | List sale orders (sale.order) |
| Read Records | General | Read specific records by IDs |
| Count Records | General | Count records matching a domain filter |
| Search & Read | General | Search records by domain filter and return fields (works on any model) |
| Delete Record | General | Delete records by IDs |
| Update Record | General | Update existing records by IDs |
Operations
Create Record
Create a new record in any model
| Parameter | Required | Type | Description |
|---|---|---|---|
Model model | Yes | text | |
Values values | Yes | textarea |
Tips
- model + values dict. Returns the new record's ID.
- Many-to-many fields: [[6, 0, [list_of_ids]]] (special replace command).
Get Fields
Get field definitions for a model (introspection)
| Parameter | Required | Type | Description |
|---|---|---|---|
Model model | Yes | text | |
Attributes attributes | Yes | text |
Tips
- Introspection – returns field definitions for a model. Use to discover what fields exist + their types.
- attributes: ['type', 'string', 'required', 'help'] to control what's returned.
List Employees
List employees (hr.employee)
| Parameter | Required | Type | Description |
|---|---|---|---|
Domain domain | Yes | text | |
Fields fields | Yes | textarea | |
Limit limit | Yes | number |
Tips
- hr.employee. Filter by department_id, parent_id (manager), active.
List Invoices
List invoices (account.move)
| Parameter | Required | Type | Description |
|---|---|---|---|
Domain domain | Yes | text | |
Fields fields | Yes | textarea | |
Limit limit | Yes | number |
Tips
- account.move model. Filter by move_type ('out_invoice' = customer invoice, 'in_invoice' = vendor bill).
- state: 'draft', 'posted', 'cancel'.
List CRM Leads
List CRM leads/opportunities (crm.lead)
| Parameter | Required | Type | Description |
|---|---|---|---|
Domain domain | Yes | text | |
Fields fields | Yes | textarea | |
Limit limit | Yes | number |
Tips
- crm.lead model. Filter by type ('lead' or 'opportunity'), stage_id, user_id (salesperson).
List Partners/Contacts
List contacts/customers/suppliers (res.partner)
| Parameter | Required | Type | Description |
|---|---|---|---|
Domain domain | Yes | text | |
Fields fields | Yes | textarea | |
Limit limit | Yes | number |
Tips
- Shortcut for search-read on res.partner.
- Common domains: [['customer_rank', '>', 0]] (customers only), [['supplier_rank', '>', 0]] (suppliers only).
List Products
List products (product.product)
| Parameter | Required | Type | Description |
|---|---|---|---|
Domain domain | Yes | text | |
Fields fields | Yes | textarea | |
Limit limit | Yes | number |
Tips
- product.product is the variant. product.template is the parent. Use product.product for SKU-level.
List Purchase Orders
List purchase orders (purchase.order)
| Parameter | Required | Type | Description |
|---|---|---|---|
Domain domain | Yes | text | |
Fields fields | Yes | textarea | |
Limit limit | Yes | number |
Tips
- purchase.order model. state: 'draft', 'sent', 'purchase' (confirmed), 'done', 'cancel'.
List Sale Orders
List sale orders (sale.order)
| Parameter | Required | Type | Description |
|---|---|---|---|
Domain domain | Yes | text | |
Fields fields | Yes | textarea | |
Limit limit | Yes | number |
Tips
- sale.order model. state: 'draft', 'sent', 'sale' (confirmed), 'done', 'cancel'.
Read Records
Read specific records by IDs
| Parameter | Required | Type | Description |
|---|---|---|---|
Model model | Yes | text | |
Ids ids | Yes | text | |
Fields fields | Yes | textarea |
Tips
- Read specific records by IDs. Cheaper than search-read when you have the IDs.
Count Records
Count records matching a domain filter
| Parameter | Required | Type | Description |
|---|---|---|---|
Model model | Yes | text | |
Domain domain | Yes | text |
Tips
- Count records matching a domain. Faster than search-read when you only need a count.
Search & Read
Search records by domain filter and return fields (works on any model)
| Parameter | Required | Type | Description |
|---|---|---|---|
Model model | Yes | text | |
Domain domain | Yes | text | |
Fields fields | Yes | textarea | |
Limit limit | Yes | number | |
Offset offset | Yes | text | |
Order order | Yes | text |
Tips
- The workhorse – search records by domain + project fields in one call.
- domain: e.g. [['state', '=', 'sale'], ['amount_total', '>', 1000]].
- fields: ['id', 'name', 'partner_id', 'amount_total'].
- limit + offset for paging. order: 'create_date desc'.
Delete Record
Delete records by IDs
| Parameter | Required | Type | Description |
|---|---|---|---|
Model model | Yes | text | |
Ids ids | Yes | text |
Tips
- Delete records by IDs. Most Odoo records can't be deleted if referenced – cancel them instead.
Update Record
Update existing records by IDs
| Parameter | Required | Type | Description |
|---|---|---|---|
Model model | Yes | text | |
Ids ids | Yes | text | |
Values values | Yes | textarea |
Tips
- Update records by IDs. ids array + values dict.
- Returns true on success – no record data back.
FAQ
- Domain syntax – why is it nested arrays?
- Odoo uses Polish-notation logical operators: '|' (OR) and '&' (AND) prefix the operands. Default is AND between conditions. Example: ['|', ['name', '=', 'Acme'], ['email', '=', 'foo@bar.com']] = name OR email match.
- Why does write succeed but the record doesn't change?
- Odoo's compute fields are read-only – writing to them is silently ignored. Also access rights – your user might not have write on that model/field. Check Get Fields with attributes=['readonly'].
- Many2many / One2many fields – how do I update?
- Use Odoo's command tuples: (6, 0, [ids]) to replace, (4, id, 0) to add, (3, id, 0) to remove. (5, 0, 0) clears all.
- Cloud vs self-hosted – same connector?
- Yes. Pass the URL + database name. Cloud customers use yourcompany.odoo.com, self-hosted use your own URL.