This workflow corresponds to n8n.io template #9653 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"nodes": [
{
"id": "2b167f16-af65-4d8f-9a83-3dff9c06f99c",
"name": "Receive Company Request",
"type": "n8n-nodes-base.webhook",
"position": [
-624,
1424
],
"parameters": {
"path": "/api/v1/get-companies",
"options": {},
"responseMode": "responseNode"
},
"typeVersion": 2.1
},
{
"id": "b73f4dcc-6335-4458-a5d5-b6fa578dfed2",
"name": "Prepare Dynamic Filter",
"type": "n8n-nodes-base.function",
"position": [
-384,
1424
],
"parameters": {
"functionCode": "// const query = $json[\"query\"] || {}\n// const filters = []\n// if (query.name) filters.push([\"name\", \"ilike\", query.name])\n// if (query.country) filters.push([\"country_code\", \"=\", query.country])\n// const limit = query.limit ? parseInt(query.limit) : 25\n// const response_format = query.response_format || 'json'\n// return [{ json: { filters, limit, response_format } }]\n\nconst query = $json[\"query\"] || {};\n\n// Validate required 'name' parameter\nif (!query.name || query.name.trim() === \"\") {\n return [\n {\n json: {\n success: false,\n message: \"Missing required parameter: name\",\n },\n },\n ];\n}\n\nconst filters = [];\nfilters.push([\"name\", \"ilike\", query.name]); // name is mandatory\n\nconst response_format = query.response_format || \"json\";\n\nreturn [\n {\n json: { filters, response_format },\n },\n];"
},
"typeVersion": 1
},
{
"id": "5676cb5c-2ddd-46fa-88d3-3902a183f227",
"name": "Fetch Companies from Odoo",
"type": "n8n-nodes-base.odoo",
"position": [
-128,
1424
],
"parameters": {
"options": {
"fieldsList": [
"display_name",
"name",
"email",
"phone",
"mobile",
"parent_id",
"partner_id",
"country_code",
"country_id"
]
},
"resource": "custom",
"operation": "getAll",
"returnAll": true,
"filterRequest": {
"filter": [
{
"value": "={{ $json.filters[0][2] && $json.filters[0][2].toString().trim() !== '' ? $json.filters[0][2] : \"False\" }}",
"operator": "like",
"fieldName": "name"
}
]
},
"customResource": "res.company"
},
"credentials": {
"odooApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "288b5309-6f46-484f-9ab6-06e94bd7b74f",
"name": "Prepare Output Data",
"type": "n8n-nodes-base.function",
"position": [
176,
1424
],
"parameters": {
"functionCode": "if (items.length === 0 || Object.keys(items[0].json).length === 0) {\n return [{ json: { success: false, message: 'No matching company records found' } }]\n}\nconst data = items.map(item => ({ ...item.json, report_generated_on: new Date().toISOString() }))\nreturn data.map(d => ({ json: d }))"
},
"typeVersion": 1
},
{
"id": "cd151c5b-55ec-454a-b43d-b78a39b74441",
"name": "Check If Excel Required",
"type": "n8n-nodes-base.if",
"position": [
480,
1424
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $('Prepare Dynamic Filter').item.json.response_format }}",
"value2": "excel"
}
]
}
},
"typeVersion": 1
},
{
"id": "6b9e1c86-81c3-475a-bdda-1a44bc9aed4e",
"name": "Convert to Excel",
"type": "n8n-nodes-base.convertToFile",
"position": [
1104,
1376
],
"parameters": {
"options": {},
"operation": "xlsx"
},
"typeVersion": 1.1
},
{
"id": "38164711-9c8c-4f7c-8e3b-3f19b1c12360",
"name": "Respond with File",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1392,
1376
],
"parameters": {
"options": {},
"respondWith": "binary"
},
"typeVersion": 1.4
},
{
"id": "cba096d5-0e19-4bec-930e-eefe587e996e",
"name": "Respond with JSON",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
784,
1776
],
"parameters": {
"options": {},
"respondWith": "allIncomingItems"
},
"typeVersion": 1.4
},
{
"id": "5f3f46b8-330a-4594-8170-6b2e8d68b685",
"name": "Overview Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1600,
592
],
"parameters": {
"width": 900,
"height": 572,
"content": "## How it works\nThis workflow provides an API endpoint `/api/v1/get-companies` that retrieves company records directly from your Odoo database. It\u2019s built for teams who need to query or export company data \u2014 either as structured JSON for integrations or as Excel (.xlsx) for business reporting.\n\nWhen a request is made, the workflow:\n1. Accepts query parameters (`name`, `response_format`).\n2. Validates the name input (required for company search).\n3. Fetches all matching companies from Odoo using a partial `Like` filter.\n4. Returns results as a JSON response or Excel download depending on the `response_format` parameter.\n\nThis makes it ideal for quick data exports or syncing company information across systems.\n\n\n\n## Setup steps\n1. Open the Webhook node and note the endpoint `/api/v1/get-companies`.\n2. Connect your Odoo API credentials in the Odoo node.\n3. Optionally update the `fieldsList` in the Odoo node to include more company details (VAT, address, etc.).\n4. Test using a browser or Postman: \n - `/api/v1/get-companies?name=Tech&response_format=json` \n - `/api/v1/get-companies?name=Tech&response_format=excel`"
},
"typeVersion": 1
},
{
"id": "c495e6f3-9186-41ec-8994-28ba95bde11b",
"name": "Code",
"type": "n8n-nodes-base.code",
"position": [
784,
1392
],
"parameters": {
"jsCode": "return $input.all()"
},
"typeVersion": 2
},
{
"id": "d29068b1-e243-420b-b00c-24f9ecaa0512",
"name": "Overview Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
-688,
1184
],
"parameters": {
"color": 7,
"width": 452,
"height": 428,
"content": "## Request & Validation\nReceives the API request and checks for the required \u201cname\u201d parameter.\nReturns a validation message if missing."
},
"typeVersion": 1
},
{
"id": "285429ca-c751-4970-85ce-27289180f9c8",
"name": "Overview Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
-208,
1184
],
"parameters": {
"color": 7,
"width": 276,
"height": 428,
"content": "## Search Records from Odoo\n- Queries `res.company` \n**Company Table** records in Odoo using \u201cLike\u201d for partial matches.\n- Customize the fields in the node options if needed.\n- **Note: Name search is case-sensitive.**"
},
"typeVersion": 1
},
{
"id": "5f9b217d-9cf1-4a7d-b99a-c6640d38399b",
"name": "Overview Note12",
"type": "n8n-nodes-base.stickyNote",
"position": [
96,
1184
],
"parameters": {
"color": 7,
"width": 276,
"height": 428,
"content": "## Prepare data and manage response json object."
},
"typeVersion": 1
},
{
"id": "e7a97e7d-928b-4ec3-88c7-d6a2ecee9ea9",
"name": "Overview Note13",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
1184
],
"parameters": {
"color": 7,
"width": 276,
"height": 428,
"content": "## Check response_format\nIf response_format=excel \u2192 returns a downloadable Excel file.\nOtherwise, returns JSON with company data."
},
"typeVersion": 1
},
{
"id": "2d754c32-7a53-4a43-a49e-8ccf8839f6f8",
"name": "Overview Note14",
"type": "n8n-nodes-base.stickyNote",
"position": [
704,
1184
],
"parameters": {
"color": 7,
"width": 276,
"height": 428,
"content": "## Prepare Data for Binary file."
},
"typeVersion": 1
},
{
"id": "0edb17ef-3bac-42fc-835d-d67e26ad82b0",
"name": "Overview Note15",
"type": "n8n-nodes-base.stickyNote",
"position": [
1008,
1184
],
"parameters": {
"color": 7,
"width": 276,
"height": 428,
"content": "## Create excel file"
},
"typeVersion": 1
},
{
"id": "6ab323ca-5cc5-4d86-b32d-17f7340a4ab2",
"name": "Overview Note16",
"type": "n8n-nodes-base.stickyNote",
"position": [
1312,
1184
],
"parameters": {
"color": 7,
"width": 276,
"height": 428,
"content": "## Response to web-hook with excel file."
},
"typeVersion": 1
},
{
"id": "9d469fdf-7eaa-452f-874a-552299170c51",
"name": "Overview Note17",
"type": "n8n-nodes-base.stickyNote",
"position": [
704,
1632
],
"parameters": {
"color": 7,
"width": 276,
"height": 380,
"content": "## Response to web-hook with json object."
},
"typeVersion": 1
}
],
"connections": {
"Code": {
"main": [
[
{
"node": "Convert to Excel",
"type": "main",
"index": 0
}
]
]
},
"Convert to Excel": {
"main": [
[
{
"node": "Respond with File",
"type": "main",
"index": 0
}
]
]
},
"Prepare Output Data": {
"main": [
[
{
"node": "Check If Excel Required",
"type": "main",
"index": 0
}
]
]
},
"Prepare Dynamic Filter": {
"main": [
[
{
"node": "Fetch Companies from Odoo",
"type": "main",
"index": 0
}
]
]
},
"Check If Excel Required": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond with JSON",
"type": "main",
"index": 0
}
]
]
},
"Receive Company Request": {
"main": [
[
{
"node": "Prepare Dynamic Filter",
"type": "main",
"index": 0
}
]
]
},
"Fetch Companies from Odoo": {
"main": [
[
{
"node": "Prepare Output Data",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
odooApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow provides an API endpoint that retrieves company records directly from your Odoo database. It’s built for teams who need to query or export company data — either as structured JSON for integrations or as Excel (.xlsx) for reporting.
Source: https://n8n.io/workflows/9653/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
A production-ready authentication workflow implementing secure user registration, login, token verification, and refresh token mechanisms. Perfect for adding authentication to any application without
Portfolio Orchestrator. Uses httpRequest. Webhook trigger; 59 nodes.
This n8n template demonstrates how a simple Multi-Layer Perceptron (MLP) neural network can predict housing prices. The prediction is based on four key features, processed through a three-layer model.
github code Try yourself
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.