OdooWebApps

Odoo API development: the connection layer itself

Every app on this site (the picking app, the sales app, the dashboard, both portals) is really the same underlying capability applied to a different screen: a reliable connection between an external app and Odoo's data. Sometimes that connection is the whole project, without a bespoke front end wrapped around it: syncing an e-commerce platform's orders into Odoo, or letting an internal tool read live stock levels.

Management dashboard

This week

$18,420

Sales (7d)

34%

Margin

1,248

In stock

6

Open POs

Sales by day

Odoo API

Custom workflow

Expense Report #482

Example: Expense approval

Chiang Mai supplier trip

Submitted by N. Somsak · $184.00

Same connection, two directions: reading data out (top) and writing decisions back (bottom).

What Odoo actually exposes

Odoo exposes its entire ORM over two external protocols: XML-RPC and JSON-RPC. Both let an authenticated external client call the same core methods Odoo's own web client calls internally: search_read and read_group to query records, create and write to add or update them, and unlink to delete them, plus the ability to call specific business methods on a model, like confirming a sales order or validating a stock transfer, instead of trying to fake that behavior by writing raw field values.

Authentication runs through a database, a username, and either a password or (on more recent versions) an API key scoped to that user. Every call is then subject to that user's normal Odoo access rights and record rules; the API doesn't bypass Odoo's permission model, it operates inside it.

Two integration patterns: read-only vs. write-back

A read-only integration pulls data out of Odoo to display or export elsewhere (a dashboard, a report, a sync to another system's copy of the catalog). It's inherently lower-risk: there's no way to corrupt Odoo data through a query. A write-back integration creates or updates real records (a new sales order, a confirmed purchase order, an updated stock count) and needs real care: input validation before the write, clear handling of what happens if a call partially fails, and calling the correct workflow method rather than writing raw state fields and hoping Odoo's own business logic doesn't get bypassed in the process. The guide on read-only vs. write-back integrations linked below goes into this in more depth.

Common integration points

The recurring patterns: syncing e-commerce or marketplace orders into sale.order; pushing web form or chat leads into crm.lead; connecting a mobile or field app to stock or purchase workflows; syncing product and stock data with a separate warehouse or point-of-sale system; and using Odoo's own Automated Actions to trigger outbound calls to another service when something changes inside Odoo. Most integration requests are a variation on one of these.

What we actually deliver

Not a generic connector or a one-size-fits-all SDK: the specific integration for the specific workflow, including error handling and clear behavior when something goes wrong (a call fails, a required field is missing, Odoo rejects the write), and a plain description of exactly which Odoo models and fields the integration touches. Pricing depends entirely on which models and workflows are involved; see the general pricing guide below or the pricing section on the homepage for a starting sense of range.

Questions about this use case

No. An integration should run under a dedicated API user with only the access rights it actually needs, the same way you'd scope any other integration. Standard Odoo access rights and record rules apply to API calls exactly as they do to a logged-in user, so scoping that user correctly is part of doing the integration properly.

Have a workflow like this?

Tell us what's slow or manual today. We'll tell you honestly whether a focused app is the right fix.