Odoo node reference - all 77 operations, the credential it needs, and a worked example.
Odoo external API over JSON-RPC (ERP/CRM). 77 operations: the full ORM surface against any model (search & read, count, create, update, delete, duplicate, group & aggregate, metadata, call any business method, name search, field introspection, access checks), plus pinned-model shortcuts for contacts, CRM leads, sales orders, invoices and payments, products, inventory transfers, purchase orders, projects and tasks, employees and time off, calendar events, chatter messages and activities, and users.
Credential: Odoo url|db|username|apiKey - see Credentials.
Each operation below lists the model access right it needs. Model access rights are granted to one of the RPC user's GROUPS, per model, in Settings -> Technical -> Security -> Access Rights. Odoo has NO OAuth and no scopes: an API key is a password substitute (Preferences -> Account Security -> New API Key) and carries exactly the authority of the user who minted it, so there is no consent screen and no narrower key to issue. What Odoo has instead is ir.model.access - one row per (group, model) carrying four booleans, perm_read, perm_write, perm_create and perm_unlink - and every ORM verb below maps to exactly one of the four, which is what makes a per-operation table meaningful here. Two things this catches people out on. First, a granted right can still be narrowed per ROW by a record rule (ir.rule, e.g. 'own documents only' or 'this company only'), so AccessError on one record and success on the next is normal and is not a missing right. Second, a model belongs to an app: crm.lead only exists once CRM is installed, and a preset for an app the instance does not have answers Object <model> doesn't exist rather than an access error. Limit the blast radius by minting the key under a dedicated integration user placed only in the groups the workflow needs. If a run fails with a permission error, the node names the missing model access right in the error - grant it and re-run; you do not need to rebuild the workflow.
| Operation | What it does | Model access right |
|---|
searchRead | Search & read records | perm_read on the target model |
search | Search records (IDs only) | perm_read on the target model |
searchCount | Count records | perm_read on the target model |
read | Read records by ID | perm_read on the target model |
create | Create record(s) | perm_create on the target model |
write | Update records | perm_write on the target model |
unlink | Delete records | perm_unlink on the target model |
copy | Duplicate record | perm_read + perm_create on the target model |
exists | Check which IDs still exist | perm_read on the target model |
readGroup | Group & aggregate records | perm_read on the target model |
getMetadata | Get record metadata | perm_read on the target model |
callMethod | Call a model method | (the rights the called method itself needs — a business action such as action_confirm or action_post generally needs perm_write on the target model, and the ORM re-checks every model it touches internally) |
| Operation | What it does | Model access right |
|---|
nameSearch | Search by display name | perm_read on the target model |
nameCreate | Quick-create from a name | perm_create on the target model |
fieldsGet | Describe a model's fields | (no access right of its own — fields_get describes the model rather than reading rows, and answers for any model the user can reach) |
defaultGet | Get default field values | (no access right of its own — default_get computes defaults rather than reading rows) |
checkAccess | Check access rights | (no access right of its own — this operation IS the access check, and answers true or false rather than refusing) |
listModels | List installed models | perm_read on ir.model |
listModelFields | List a model's fields | perm_read on ir.model.fields |
| Operation | What it does | Model access right |
|---|
createContact | Create contact | perm_create on res.partner |
updateContact | Update contact | perm_write on res.partner |
getContact | Get contact by ID | perm_read on res.partner |
searchContacts | Search contacts | perm_read on res.partner |
findContactByEmail | Find contact by email | perm_read on res.partner |
deleteContact | Delete contact | perm_unlink on res.partner |
| Operation | What it does | Model access right |
|---|
createLead | Create lead / opportunity | perm_create on crm.lead |
updateLead | Update lead | perm_write on crm.lead |
getLead | Get lead by ID | perm_read on crm.lead |
searchLeads | Search leads | perm_read on crm.lead |
deleteLead | Delete lead | perm_unlink on crm.lead |
markLeadWon | Mark lead won | perm_write on crm.lead |
markLeadLost | Mark lead lost | perm_write on crm.lead |
| Operation | What it does | Model access right |
|---|
createSaleOrder | Create quotation / sales order | perm_create on sale.order |
getSaleOrder | Get sales order by ID | perm_read on sale.order |
searchSaleOrders | Search sales orders | perm_read on sale.order |
confirmSaleOrder | Confirm sales order | perm_write on sale.order |
cancelSaleOrder | Cancel sales order | perm_write on sale.order |
searchSaleOrderLines | Search sales order lines | perm_read on sale.order.line |
| Operation | What it does | Model access right |
|---|
createInvoice | Create invoice / bill | perm_create on account.move |
getInvoice | Get invoice by ID | perm_read on account.move |
searchInvoices | Search invoices | perm_read on account.move |
postInvoice | Post (validate) invoice | perm_write on account.move |
resetInvoiceToDraft | Reset invoice to draft | perm_write on account.move |
searchInvoiceLines | Search invoice lines | perm_read on account.move.line |
searchPayments | Search payments | perm_read on account.payment |
| Operation | What it does | Model access right |
|---|
createProduct | Create product | perm_create on product.template |
updateProduct | Update product | perm_write on product.template |
getProduct | Get product by ID | perm_read on product.template |
searchProducts | Search products | perm_read on product.template |
searchProductVariants | Search product variants | perm_read on product.product |
| Operation | What it does | Model access right |
|---|
getPicking | Get transfer by ID | perm_read on stock.picking |
searchPickings | Search transfers | perm_read on stock.picking |
validatePicking | Validate transfer | perm_write on stock.picking |
searchStockQuants | Search on-hand quantities | perm_read on stock.quant |
| Operation | What it does | Model access right |
|---|
createPurchaseOrder | Create purchase order | perm_create on purchase.order |
getPurchaseOrder | Get purchase order by ID | perm_read on purchase.order |
searchPurchaseOrders | Search purchase orders | perm_read on purchase.order |
confirmPurchaseOrder | Confirm purchase order | perm_write on purchase.order |
| Operation | What it does | Model access right |
|---|
createTask | Create task | perm_create on project.task |
updateTask | Update task | perm_write on project.task |
getTask | Get task by ID | perm_read on project.task |
searchTasks | Search tasks | perm_read on project.task |
searchProjects | Search projects | perm_read on project.project |
| Operation | What it does | Model access right |
|---|
getEmployee | Get employee by ID | perm_read on hr.employee |
searchEmployees | Search employees | perm_read on hr.employee |
createTimeOff | Create time-off request | perm_create on hr.leave |
searchTimeOff | Search time-off requests | perm_read on hr.leave |
| Operation | What it does | Model access right |
|---|
createCalendarEvent | Create calendar event | perm_create on calendar.event |
getCalendarEvent | Get calendar event by ID | perm_read on calendar.event |
searchCalendarEvents | Search calendar events | perm_read on calendar.event |
| Operation | What it does | Model access right |
|---|
postMessage | Log a note / send a message on a record | perm_write on the target model (and perm_create on mail.message) |
searchMessages | Search messages | perm_read on mail.message |
scheduleActivity | Schedule an activity | perm_create on mail.activity |
searchActivities | Search activities | perm_read on mail.activity |
completeActivity | Mark activity done | perm_write on mail.activity |
| Operation | What it does | Model access right |
|---|
getUser | Get user by ID | perm_read on res.users |
searchUsers | Search users | perm_read on res.users |
Read records out of any Odoo model, including a custom one
Odoo is not a REST API — it is one RPC entry point over the ORM, so there is no endpoint list to enumerate and no /contacts route. searchRead is the engine: it takes the model as a FIELD, so the same operation reaches res.partner, crm.lead, and a custom model an admin added this morning.
Set Operation to searchRead, then fill in:
| Field | Value | Notes |
|---|
model | res.partner | The dotted model name — res.partner, not res_partner. This is exactly what the per-model presets exist to save you guessing |
domain | [["customer_rank", ">", 0], ["email", "!=", false]] | Odoo's domain syntax, a list of triples |
fields | name, email, phone | Comma-separated; omit to get everything, which is usually far more than you want |
limit | 100 | |
Sets {{partners.records}} and {{partners.count}}. Access is gated by the token owner's model ACLs and record rules — check them with checkAccess before a write if a run might not be permitted.