Pipory
Node reference

Odoo

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.

Model access rights

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.

Operations (77)

Records (any model)

OperationWhat it doesModel access right
searchReadSearch & read recordsperm_read on the target model
searchSearch records (IDs only)perm_read on the target model
searchCountCount recordsperm_read on the target model
readRead records by IDperm_read on the target model
createCreate record(s)perm_create on the target model
writeUpdate recordsperm_write on the target model
unlinkDelete recordsperm_unlink on the target model
copyDuplicate recordperm_read + perm_create on the target model
existsCheck which IDs still existperm_read on the target model
readGroupGroup & aggregate recordsperm_read on the target model
getMetadataGet record metadataperm_read on the target model
callMethodCall 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)

Discovery & access

OperationWhat it doesModel access right
nameSearchSearch by display nameperm_read on the target model
nameCreateQuick-create from a nameperm_create on the target model
fieldsGetDescribe 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)
defaultGetGet default field values(no access right of its own — default_get computes defaults rather than reading rows)
checkAccessCheck access rights(no access right of its own — this operation IS the access check, and answers true or false rather than refusing)
listModelsList installed modelsperm_read on ir.model
listModelFieldsList a model's fieldsperm_read on ir.model.fields

Contacts (res.partner)

OperationWhat it doesModel access right
createContactCreate contactperm_create on res.partner
updateContactUpdate contactperm_write on res.partner
getContactGet contact by IDperm_read on res.partner
searchContactsSearch contactsperm_read on res.partner
findContactByEmailFind contact by emailperm_read on res.partner
deleteContactDelete contactperm_unlink on res.partner

CRM (crm.lead)

OperationWhat it doesModel access right
createLeadCreate lead / opportunityperm_create on crm.lead
updateLeadUpdate leadperm_write on crm.lead
getLeadGet lead by IDperm_read on crm.lead
searchLeadsSearch leadsperm_read on crm.lead
deleteLeadDelete leadperm_unlink on crm.lead
markLeadWonMark lead wonperm_write on crm.lead
markLeadLostMark lead lostperm_write on crm.lead

Sales (sale.order)

OperationWhat it doesModel access right
createSaleOrderCreate quotation / sales orderperm_create on sale.order
getSaleOrderGet sales order by IDperm_read on sale.order
searchSaleOrdersSearch sales ordersperm_read on sale.order
confirmSaleOrderConfirm sales orderperm_write on sale.order
cancelSaleOrderCancel sales orderperm_write on sale.order
searchSaleOrderLinesSearch sales order linesperm_read on sale.order.line

Invoicing (account.move)

OperationWhat it doesModel access right
createInvoiceCreate invoice / billperm_create on account.move
getInvoiceGet invoice by IDperm_read on account.move
searchInvoicesSearch invoicesperm_read on account.move
postInvoicePost (validate) invoiceperm_write on account.move
resetInvoiceToDraftReset invoice to draftperm_write on account.move
searchInvoiceLinesSearch invoice linesperm_read on account.move.line
searchPaymentsSearch paymentsperm_read on account.payment

Products

OperationWhat it doesModel access right
createProductCreate productperm_create on product.template
updateProductUpdate productperm_write on product.template
getProductGet product by IDperm_read on product.template
searchProductsSearch productsperm_read on product.template
searchProductVariantsSearch product variantsperm_read on product.product

Inventory (stock)

OperationWhat it doesModel access right
getPickingGet transfer by IDperm_read on stock.picking
searchPickingsSearch transfersperm_read on stock.picking
validatePickingValidate transferperm_write on stock.picking
searchStockQuantsSearch on-hand quantitiesperm_read on stock.quant

Purchasing (purchase.order)

OperationWhat it doesModel access right
createPurchaseOrderCreate purchase orderperm_create on purchase.order
getPurchaseOrderGet purchase order by IDperm_read on purchase.order
searchPurchaseOrdersSearch purchase ordersperm_read on purchase.order
confirmPurchaseOrderConfirm purchase orderperm_write on purchase.order

Projects (project.task)

OperationWhat it doesModel access right
createTaskCreate taskperm_create on project.task
updateTaskUpdate taskperm_write on project.task
getTaskGet task by IDperm_read on project.task
searchTasksSearch tasksperm_read on project.task
searchProjectsSearch projectsperm_read on project.project

HR (hr.employee)

OperationWhat it doesModel access right
getEmployeeGet employee by IDperm_read on hr.employee
searchEmployeesSearch employeesperm_read on hr.employee
createTimeOffCreate time-off requestperm_create on hr.leave
searchTimeOffSearch time-off requestsperm_read on hr.leave

Calendar (calendar.event)

OperationWhat it doesModel access right
createCalendarEventCreate calendar eventperm_create on calendar.event
getCalendarEventGet calendar event by IDperm_read on calendar.event
searchCalendarEventsSearch calendar eventsperm_read on calendar.event

Messaging & activities

OperationWhat it doesModel access right
postMessageLog a note / send a message on a recordperm_write on the target model (and perm_create on mail.message)
searchMessagesSearch messagesperm_read on mail.message
scheduleActivitySchedule an activityperm_create on mail.activity
searchActivitiesSearch activitiesperm_read on mail.activity
completeActivityMark activity doneperm_write on mail.activity

Users (res.users)

OperationWhat it doesModel access right
getUserGet user by IDperm_read on res.users
searchUsersSearch usersperm_read on res.users

Example

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:

FieldValueNotes
modelres.partnerThe 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
fieldsname, email, phoneComma-separated; omit to get everything, which is usually far more than you want
limit100

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.