This workflow corresponds to n8n.io template #5615 — we link there as the canonical source.
This workflow follows the Agent → Emailsend recipe pattern — see all workflows that pair these two integrations.
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 →
{
"id": "QRbFHzWOiN6ee7D9",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "AI-Driven Book Recommendation Engine",
"tags": [],
"nodes": [
{
"id": "9840af8c-b582-4659-ae3b-869500193074",
"name": "Ollama Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOllama",
"position": [
-132,
280
],
"parameters": {
"model": "llama3.2-16000:latest",
"options": {}
},
"credentials": {
"ollamaApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "61b127d3-bb32-4eee-a239-c259430e9139",
"name": "Email Trigger \u2013 Book Request",
"type": "n8n-nodes-base.emailReadImap",
"position": [
-440,
60
],
"parameters": {
"options": {}
},
"credentials": {
"imap": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "cc2e4acc-e8dc-4789-9142-1bc08977add5",
"name": "Analyze Email with Ollama",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-220,
60
],
"parameters": {
"text": "={{ $json.textPlain }}",
"options": {
"systemMessage": "=You are a helper that identifies and lists only the types of books mentioned in the message.\n\nWhich types of books are being asked for in this message?\n\nReply with the types in lowercase, one on each line. Don\u2019t include anything else \u2014 no headers, labels, or symbols.\n\nInput:\n{{ $json.textPlain }}"
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "37386ba5-319e-40da-bf42-c8d2fbb0a48a",
"name": "Create Book Search Query",
"type": "n8n-nodes-base.set",
"position": [
156,
60
],
"parameters": {
"values": {
"string": [
{
"name": "subject-name",
"value": "={{ $json.output }}"
}
]
},
"options": {},
"keepOnlySet": true
},
"typeVersion": 1
},
{
"id": "0c9dc4d4-c775-4ae6-bd5c-dddb0ca175ab",
"name": "Call Book Search API",
"type": "n8n-nodes-base.httpRequest",
"position": [
376,
60
],
"parameters": {
"url": "=https://openlibrary.org/subjects/{{ $json.subject-name}}",
"options": {},
"queryParametersUi": {
"parameter": [
{
"name": "limit",
"value": "0"
}
]
}
},
"typeVersion": 1
},
{
"id": "39dc690f-f68b-4f5d-87e0-44eb12cbb5f4",
"name": "Check API Response",
"type": "n8n-nodes-base.if",
"position": [
596,
60
],
"parameters": {
"conditions": {
"number": [
{
"value1": "={{$node[\"Call Book Search API\"].json[\"work_count\"]}}",
"operation": "larger"
}
]
}
},
"typeVersion": 1
},
{
"id": "727a94bd-9c95-44b6-85f7-86ee36fcda7f",
"name": "Handle No Book Found",
"type": "n8n-nodes-base.emailSend",
"position": [
816,
160
],
"parameters": {
"html": "=<p>We're sorry, but no books were found for the subject <em>{{$node[\"Check API Response\"].json[\"name\"]}}</em>. </p>\n\n<p>Please try a different subject or update your n8n workflow accordingly.</p>\n\n<p>You can explore a list of available subjects at <a href=\"https://openlibrary.org/subjects\" target=\"_blank\">Open Library Subjects</a>.</p>\n",
"options": {},
"subject": "=Book not found in {{$node[\"Check API Response\"].json[\"name\"]}}",
"toEmail": "user@example.com",
"fromEmail": "user@example.com"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "d164e6f0-b684-4467-a4e8-0aae75878663",
"name": "Check Book Name",
"type": "n8n-nodes-base.code",
"position": [
816,
-40
],
"parameters": {
"jsCode": "var retrieve_book = 0;\nvar book_count = items[0].json.work_count;\n\nretrieve_book = Math.floor(Math.random() * book_count) + 1\n\nitems[0].json.retrieve_book = retrieve_book;\nreturn items;"
},
"typeVersion": 2
},
{
"id": "efa8a98b-cd03-41ac-93f0-c1f856cff17f",
"name": "Extract Book Summary",
"type": "n8n-nodes-base.httpRequest",
"position": [
1036,
-40
],
"parameters": {
"url": "=http://openlibrary.org/subjects/{{$json[\"name\"]}}.json",
"options": {},
"queryParametersUi": {
"parameter": [
{
"name": "limit",
"value": "1"
},
{
"name": "offset",
"value": "={{$json[\"retrieve_book\"]}}"
},
{
"name": "detail",
"value": "true"
}
]
}
},
"typeVersion": 1
},
{
"id": "96c40040-623c-45df-ae94-b2813ffd5668",
"name": "Wait for Summary Response",
"type": "n8n-nodes-base.wait",
"position": [
1256,
-40
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "786470f7-9056-46c3-83d0-48bbf98133a5",
"name": "Retrieve Book Details",
"type": "n8n-nodes-base.httpRequest",
"position": [
1476,
-40
],
"parameters": {
"url": "=http://openlibrary.org.{{$node[\"Extract Book Summary\"].json[\"works\"][0][\"key\"]}}.json",
"options": {},
"queryParametersUi": {
"parameter": [
{
"name": "limit",
"value": "1"
}
]
}
},
"typeVersion": 1
},
{
"id": "641c0ba1-ccad-4462-9499-b4a28dfd0975",
"name": "Format Book Data",
"type": "n8n-nodes-base.set",
"position": [
1696,
-40
],
"parameters": {
"values": {
"string": [
{
"name": "authors",
"value": "={{$node[\"Extract Book Summary\"].json[\"works\"][0][\"authors\"]}}"
},
{
"name": "title",
"value": "={{$node[\"Extract Book Summary\"].json[\"works\"][0][\"title\"]}}"
},
{
"name": "description",
"value": "={{$node[\"Retrieve Book Details\"].json[\"description\"][\"value\"]}}"
},
{
"name": "URL",
"value": "=https://openlibrary.org{{$node[\"Extract Book Summary\"].json[\"works\"][0][\"key\"]}}"
}
]
},
"options": {},
"keepOnlySet": true
},
"typeVersion": 1
},
{
"id": "79d33736-4931-4f7e-8ac0-07980cc8fcb9",
"name": "Enhance Data with Code",
"type": "n8n-nodes-base.code",
"position": [
1916,
-40
],
"parameters": {
"jsCode": "var arrAuthors = items[0].json.authors;\n\nvar arrNames = arrAuthors.map(function(author) {\n return \"<a href=\\\"https://openlibrary.org\" + author['key'] + \"\\\">\" + author['name'] + \"</a>\";\n});\n\nvar names = arrNames.join(\", \");\n\nitems[0].json.authors = names;\n\nreturn items;"
},
"typeVersion": 2
},
{
"id": "e19dbc55-a1c5-4070-b2ae-2f4582fe14c8",
"name": "Generate Email Content",
"type": "n8n-nodes-base.set",
"position": [
2136,
-40
],
"parameters": {
"values": {
"string": [
{
"name": "msgSubject",
"value": "=Book Recommendation: {{$node[\"Generate Author Info\t\"].json[\"title\"]}}"
},
{
"name": "msgBody",
"value": "=<H2><a href=\"{{$node[\"Generate Author Info\t\"].json[\"URL\"]}}\">{{$node[\"Generate Author Info\t\"].json[\"title\"]}}</a></H2>\n<p><em>By {{$node[\"Generate Author Info\t\"].json[\"authors\"]}}</em><br>\n{{$node[\"Generate Author Info\t\"].json[\"description\"]}}</p>"
}
]
},
"options": {},
"keepOnlySet": true
},
"typeVersion": 1
},
{
"id": "c178bfca-5ee9-40d5-a0da-1b3fb0f7e5b8",
"name": "Send Recommendation Email",
"type": "n8n-nodes-base.emailSend",
"position": [
2356,
-40
],
"parameters": {
"html": "={{$node[\"Generate Email Content\"].json[\"msgBody\"]}}",
"options": {},
"subject": "={{$node[\"Generate Email Content\"].json[\"msgSubject\"]}}",
"toEmail": "user@example.com",
"fromEmail": "user@example.com"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "fe5af873-7969-436c-8eaf-efed81c83665",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-340,
-900
],
"parameters": {
"color": 5,
"width": 600,
"height": 360,
"content": "## Overview: \n\nThis workflow triggers on book request emails, uses Ollama LLM to extract intent, queries a Book Search API for data (title, summary, details), handles no-book cases, formats and enhances the data, generates a personalized email, and sends it to the user.\n\n\u2705 Ideal for automated book suggestions using LLMs and structured APIs.\n\u2705 Great for newsletter, reading clubs, and educational bots.\n"
},
"typeVersion": 1
},
{
"id": "afa604fa-0086-4327-998b-7b720694fc42",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
-880
],
"parameters": {
"width": 660,
"height": 320,
"content": "## How to Run:\n\n1. Ensure the email trigger is connected to a valid inbox (IMAP/Gmail).\n2. Verify the Ollama node is running with the correct model.\n3. Set valid credentials for the book search API.\n4. Click **\u201cExecute Workflow\u201d** or activate the workflow to listen in real-time.\n5. Send a test email with a book request (e.g., \u201cRecommend me a sci-fi novel.\u201d).\n6. Check the sent mailbox for the recommendation email.\n\n## Tip: \nCustomize the book genre parser or API call to match your use case.\n"
},
"typeVersion": 1
},
{
"id": "afdc2813-f8ef-4311-bb5b-dbdd2784dfca",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-480,
-340
],
"parameters": {
"color": 4,
"width": 540,
"height": 860,
"content": "## Email Input Processing\n\nTriggers on new book request emails and uses Ollama LLM to extract user intent."
},
"typeVersion": 1
},
{
"id": "c0a2dc78-18a6-48f8-9599-74e4d5e7c27e",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1680,
-380
],
"parameters": {
"color": 2,
"width": 880,
"height": 860,
"content": "## Output Generation\n\nFormats data, refines it with code, creates a personalized email, and sends it to the user."
},
"typeVersion": 1
},
{
"id": "7a49c987-d940-4e65-ab52-b024d838a55c",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
140,
-340
],
"parameters": {
"color": 3,
"width": 580,
"height": 860,
"content": "## Book Data Retrieval\n\nGenerates a search query, fetches book data (title, summary, details) via API, and validates the response."
},
"typeVersion": 1
},
{
"id": "86d479fa-002c-4e2f-8239-e3ba21d3989b",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1000,
-380
],
"parameters": {
"color": 6,
"width": 620,
"height": 860,
"content": "## Data Preparation\n\nExtracts summary, ensures data readiness, and gathers additional book details."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "675f1b3c-84ee-47b1-bbc4-c2c1a79a7b55",
"connections": {
"Ollama Model": {
"ai_languageModel": [
[
{
"node": "Analyze Email with Ollama",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Check Book Name": {
"main": [
[
{
"node": "Extract Book Summary",
"type": "main",
"index": 0
}
]
]
},
"Format Book Data": {
"main": [
[
{
"node": "Enhance Data with Code",
"type": "main",
"index": 0
}
]
]
},
"Check API Response": {
"main": [
[
{
"node": "Check Book Name",
"type": "main",
"index": 0
}
],
[
{
"node": "Handle No Book Found",
"type": "main",
"index": 0
}
]
]
},
"Call Book Search API": {
"main": [
[
{
"node": "Check API Response",
"type": "main",
"index": 0
}
]
]
},
"Extract Book Summary": {
"main": [
[
{
"node": "Wait for Summary Response",
"type": "main",
"index": 0
}
]
]
},
"Retrieve Book Details": {
"main": [
[
{
"node": "Format Book Data",
"type": "main",
"index": 0
}
]
]
},
"Enhance Data with Code": {
"main": [
[
{
"node": "Generate Email Content",
"type": "main",
"index": 0
}
]
]
},
"Generate Email Content": {
"main": [
[
{
"node": "Send Recommendation Email",
"type": "main",
"index": 0
}
]
]
},
"Create Book Search Query": {
"main": [
[
{
"node": "Call Book Search API",
"type": "main",
"index": 0
}
]
]
},
"Analyze Email with Ollama": {
"main": [
[
{
"node": "Create Book Search Query",
"type": "main",
"index": 0
}
]
]
},
"Wait for Summary Response": {
"main": [
[
{
"node": "Retrieve Book Details",
"type": "main",
"index": 0
}
]
]
},
"Email Trigger \u2013 Book Request": {
"main": [
[
{
"node": "Analyze Email with Ollama",
"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.
imapollamaApismtp
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow listens for incoming book request emails, extracts the user's intent using the Ollama LLM, queries book data (title, summary, details) via an API, and sends a personalized recommendation email. Ideal for automated book suggestions using LLMs and structured APIs,…
Source: https://n8n.io/workflows/5615/ — 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.
This automated n8n workflow streamlines the process of receiving, processing, and delivering patient-friendly lab reports with precautionary advice. 📧 Email Trigger → Monitors inbox for lab reports 📄
K&S-Media Downloadliste SQL. Uses httpRequest, agent, googleSheets, lmChatOpenAi. Event-driven trigger; 97 nodes.
This template is built for solo attorneys, small law firms, and legal billing coordinators who receive timesheet documents by email and need to produce LEDES-compliant e-billing files for client billi
This n8n workflow automates communication with meeting invitees to decrease no-show rates by sending timely email and WhatsApp reminders, and a clarification request if more information is needed to p
This is an elite-tier HealthTech solution designed for the secure processing of high-volume medical records. Monolithic EMR exports (often 200+ pages) are atomized into individual pages, allowing for