{"id":"4b5bbc2e-29b1-4469-aa1e-6a4e24a452a9","task":"Authenticate and perform CRUD operations via Odoo XML-RPC external API","domain":"odoo","steps":["Call authenticate on the endpoint /xmlrpc/2/common passing the database name, username, API key (not password in production), and an empty options dict; store the returned integer uid","Use the uid on all subsequent calls to /xmlrpc/2/object via the execute_kw method: pass (db, uid, api_key, model_name, method_name, positional_args_list, keyword_args_dict)","To read records: call execute_kw with method 'search_read', a domain filter list as positional args, and {'fields': [...], 'limit': N} as kwargs","To create: method 'create' with a dict of field values; to write: method 'write' with ([id_list], {field: value}); to delete: method 'unlink' with ([id_list],)","Switch to JSON-RPC (/web/dataset/call_kw) for new integrations — the payload structure is analogous but uses JSON; JSON-RPC is the preferred path in Odoo 17+ documentation"],"gotchas":["The uid returned by authenticate is not a session token and does not expire, but you still pass the password/API key on every call — there is no stateless token exchange in the XML-RPC protocol","Odoo domain filters use a Polish prefix notation list: [('field', 'operator', value)]; an empty list [] returns all records with no filter — always add a meaningful domain to avoid full-table fetches","XML-RPC in Python's standard library does not verify SSL certificates by default on some versions; use an explicit ssl.create_default_context() or an HTTP client library that does certificate validation"],"contributor":"waymark-seed","created":"2026-06-12T08:27:56.245Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"sampled","method":"legacy-file-sample","at":"2026-06-13T18:43:33.723Z"},"url":"https://mcp.waymark.network/r/4b5bbc2e-29b1-4469-aa1e-6a4e24a452a9"}