AutomationFlowsAI & RAG › Ai-powered Candidate Screening and Evaluation Workflow Using Openai and Airtable

Ai-powered Candidate Screening and Evaluation Workflow Using Openai and Airtable

ByBilly Christi @billy on n8n.io

This workflow is ideal for:

Event trigger★★★★☆ complexityAI-powered23 nodesAirtableOpenAI ChatOutput Parser StructuredAgentGoogle DriveGmailForm Trigger
AI & RAG Trigger: Event Nodes: 23 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #4481 — we link there as the canonical source.

This workflow follows the Agent → Airtable 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 →

Download .json
{
  "nodes": [
    {
      "id": "dfe988d2-abd5-4970-b77c-3841ba4ee74a",
      "name": "Search Job Posting",
      "type": "n8n-nodes-base.airtable",
      "position": [
        2120,
        220
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appgVjZcaRP8BsKf0",
          "cachedResultUrl": "https://airtable.com/appgVjZcaRP8BsKf0",
          "cachedResultName": "HR Database"
        },
        "limit": 1,
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblla4rBCW3BhPtRO",
          "cachedResultUrl": "https://airtable.com/appgVjZcaRP8BsKf0/tblla4rBCW3BhPtRO",
          "cachedResultName": "Job Posting"
        },
        "options": {},
        "operation": "search",
        "returnAll": false,
        "filterByFormula": "=FIND(LOWER(\"{{ $('Candidate Application Form').item.json['Position Applied For'] }}\"), LOWER({Job Title})) > 0"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "ecaa86b0-2daf-4428-a39c-91adc9711d5c",
      "name": "Create Candidate",
      "type": "n8n-nodes-base.airtable",
      "position": [
        3080,
        440
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appgVjZcaRP8BsKf0",
          "cachedResultUrl": "https://airtable.com/appgVjZcaRP8BsKf0",
          "cachedResultName": "HR Database"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblQy83erGR5lQj5c",
          "cachedResultUrl": "https://airtable.com/appgVjZcaRP8BsKf0/tblQy83erGR5lQj5c",
          "cachedResultName": "Candidates"
        },
        "columns": {
          "value": {
            "Resume": "={{ $json.file_array }}",
            "Full Name": "={{ $('Candidate Application Form').item.json['Full Name '] }}",
            "Cover Letter": "={{ $('Candidate Application Form').item.json['Cover Letter'] }}",
            "Date Applied": "={{ $now }}",
            "Email Address": "={{ $('Candidate Application Form').item.json['Email Address'] }}",
            "Relevant Skills": "={{ $('Candidate Application Form').item.json['Relevant Skills'] }}",
            "Screening Notes": "={{ $json.output.screening_notes }}",
            "Match Percentage": "={{ $json.output.match_percentage }}",
            "Position Applied": "={{ $('Candidate Application Form').item.json['Position Applied For'] }}",
            "Screening Status": "={{ $json.output.screening_status }}"
          },
          "schema": [
            {
              "id": "Candidate ID",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Candidate ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Full Name",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Full Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email Address",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Email Address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Position Applied",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Position Applied",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Relevant Skills",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Relevant Skills",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Cover Letter",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Cover Letter",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Resume",
              "type": "array",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Resume",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Screening Status",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Screening Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Match Percentage",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Match Percentage",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Screening Notes",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Screening Notes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date Applied",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Date Applied",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "test",
              "type": "options",
              "display": true,
              "options": [
                {
                  "name": "1",
                  "value": "1"
                },
                {
                  "name": "2",
                  "value": "2"
                },
                {
                  "name": "3",
                  "value": "3"
                }
              ],
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "test",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "create"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "700b266c-3c7e-41b2-9f1c-5f28957d6d34",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2400,
        440
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "e465aae6-f67c-49b8-9230-fb655c873f6b",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        2580,
        440
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"screening_status\": \"Suitable\",\n  \"match_percentage\": 88,\n  \"screening_notes\": \"Detailed explanation of the assessment, including relevant skill matches, experience analysis, and justification for the screening status.\"\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "d4f6d899-3de7-4ea2-a5c6-697f3d847da0",
      "name": "Candidate Screener AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2400,
        220
      ],
      "parameters": {
        "text": "=Candidate Screening Information:\n\n///\nUser Side:\n\nPosition Applied:  \n{{ $('Search Job Posting').item.json['Job Title'] }}\n\nRelevant Skills the Candidate Possesses:\n{{ $('Candidate Application Form').item.json['Relevant Skills'] }}\n\n\nCover Letter:  \n{{ $('Candidate Application Form').item.json['Cover Letter'] }}\n\nResume Content:  \n{{ $('Extract Resume PDF').item.json.text }}\n\n///\n\nEmployer Side:\n\nPosition Description:  \n{{ $('Search Job Posting').item.json['Job Description'] }}\n\nSkills Required:  \n{{ $('Search Job Posting').item.json['Required Skills'] }}\n\n///",
        "options": {
          "systemMessage": "=You are a Candidate Screening AI Agent responsible for assessing candidate suitability for specific job positions based on the provided information. \n\nObjective:\nEvaluate the candidate\u2019s fit for the applied position by analyzing their relevant skills, cover letter, and resume content. Compare this information with the job description and required skills provided by the employer to determine suitability, a match percentage, and screening notes.\n\nInput Fields:\n\nUser Side:\n- Position applied: The job position the candidate applied for.\n- Relevant skills: A list of key skills the candidate possesses.\n- Cover letter: Candidate\u2019s introduction, work experience, and key achievements.\n- Resume: Parsed text content extracted from the resume in plain text format.\n\nEmployer Side:\n- Position description: Detailed job description including responsibilities and expectations.\n- Skills required: A list of required skills for the position.\n\nOutput Fields:\n- Screening Status: One of the following options: \"Suitable\", \"Not Suitable\", \"Under Review\".\n- Match Percentage: A numerical score indicating the percentage of relevant skills matching the job requirements.\n- Screening Notes: A summary of the assessment, including strengths, areas for improvement, and justification for the screening status.\n\nInstructions:\n1. Extract and analyze relevant skills mentioned in the cover letter and resume content.\n2. Compare the extracted skills with the job requirements and skills required by the employer.\n3. Assign a Match Percentage based on the alignment of skills and experience.\n4. Determine the Screening Status based on the skill match and relevance of the candidate\u2019s experience to the position.\n5. Provide comprehensive Screening Notes to justify the assigned status and percentage, highlighting strengths and areas for improvement."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.9
    },
    {
      "id": "084de55a-6bb1-451f-8160-c3ad673dc6df",
      "name": "Set File Array for airtable",
      "type": "n8n-nodes-base.set",
      "position": [
        2440,
        880
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={\"file_array\":[\n  {\n    \"url\": \"{{ $('Upload File').item.json.webContentLink }}\",\n    \"filename\": \"{{ $('Upload File').item.json.name }}\"\n  }\n]\n}"
      },
      "typeVersion": 3.4
    },
    {
      "id": "b1fb07a5-97f8-4363-9af0-34ace33f4d17",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        2840,
        440
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3.1
    },
    {
      "id": "5c80e876-7af7-4e65-b3ce-03008b62e22f",
      "name": "Upload File",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1960,
        880
      ],
      "parameters": {
        "name": "={{ $json.Resume.filename }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "13BuRkJofybsBlF77oqoS87A2qq4zD2aP",
          "cachedResultUrl": "https://drive.google.com/drive/folders/13BuRkJofybsBlF77oqoS87A2qq4zD2aP",
          "cachedResultName": "pdf dev"
        },
        "inputDataFieldName": "Resume"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "c87c2dd5-c569-4ab4-9690-a998bfd56acf",
      "name": "Set File Permission",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        2200,
        880
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.id }}"
        },
        "options": {},
        "operation": "share",
        "permissionsUi": {
          "permissionsValues": {
            "role": "reader",
            "type": "anyone"
          }
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "99e0222e-6863-4771-80df-2c649460bd76",
      "name": "Check if candidate is suitable",
      "type": "n8n-nodes-base.if",
      "position": [
        3280,
        440
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "ab5102cf-0952-465e-9340-59ced9f39ce1",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('Merge').item.json.output.screening_status }}",
              "rightValue": "Suitable"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a03600ea-6716-452b-825e-2f4fcd56149e",
      "name": "Send email to HR",
      "type": "n8n-nodes-base.gmail",
      "position": [
        3560,
        440
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "=We have successfully completed the candidate screening process, and {{ $('Candidate Application Form').item.json['Full Name '] }} has been identified as a suitable candidate for the {{ $('Search Job Posting').item.json['Job Title'] }} position.  \n\nCandidate Details:  \n- Position Applied: {{ $('Search Job Posting').item.json['Job Title'] }}  \n- Match Percentage: {{ $('Candidate Screener AI Agent').item.json.output.match_percentage }}%  \n- Screening Notes: {{ $('Candidate Screener AI Agent').item.json.output.screening_notes }}\n\nPlease proceed with the next steps in the interview scheduling process. If you need any further information or clarification, feel free to reach out.  \n\nThank you,  \nSuper Awesome HR AI Agent",
        "options": {
          "appendAttribution": false
        },
        "subject": "=Candidate {{ $('Candidate Application Form').item.json['Full Name '] }} - Suitable for {{ $('Search Job Posting').item.json['Job Title'] }}\n",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "8ad661e1-96ea-4bd3-8693-7c950dcb995c",
      "name": "Candidate Application Form",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        1480,
        220
      ],
      "parameters": {
        "options": {},
        "formTitle": "Smart Candidate Screening Form",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Full Name ",
              "requiredField": true
            },
            {
              "fieldType": "email",
              "fieldLabel": "Email Address",
              "requiredField": true
            },
            {
              "fieldLabel": "Position Applied For",
              "requiredField": true
            },
            {
              "fieldType": "textarea",
              "fieldLabel": "Relevant Skills",
              "requiredField": true
            },
            {
              "fieldType": "textarea",
              "fieldLabel": "Cover Letter",
              "requiredField": true
            },
            {
              "fieldType": "file",
              "fieldLabel": "Resume",
              "multipleFiles": false,
              "acceptFileTypes": ".pdf"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "249757a8-1ffd-4f0a-a601-4c4cecd192de",
      "name": "Extract Resume PDF",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        1800,
        220
      ],
      "parameters": {
        "options": {},
        "operation": "pdf",
        "binaryPropertyName": "Resume"
      },
      "typeVersion": 1
    },
    {
      "id": "54d4a604-4b71-46aa-8e66-70af7eb8fa77",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2360,
        -60
      ],
      "parameters": {
        "color": 4,
        "width": 360,
        "height": 680,
        "content": "\ud83e\udde0 Candidate Screener AI Agent\nUses OpenAI to analyze:\n- Resume content vs job requirements\n- Skills matching\n- Cover letter quality\n\n\ud83d\udcca OUTPUTS:\n- Screening Status (Suitable/Not Suitable/Under Review)\n- Match Percentage (0-100%)\n- Detailed screening notes\n"
      },
      "typeVersion": 1
    },
    {
      "id": "147e45e9-07c2-49d3-aaf2-f8b1166e73a8",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2000,
        80
      ],
      "parameters": {
        "color": 4,
        "width": 340,
        "height": 300,
        "content": "## Search Job Posting (Job Matching)\nFinds the matching job posting for the applied position"
      },
      "typeVersion": 1
    },
    {
      "id": "e0a42f0f-b87b-4b0d-be8b-7b27f49242b0",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1880,
        680
      ],
      "parameters": {
        "color": 4,
        "width": 760,
        "height": 340,
        "content": "## File Preparation for Airtable Upload\n\n- Upload the file to Google Drive  \n- Set the permission to public  \n- Format the data to match the format required by Airtable for file uploads\n"
      },
      "typeVersion": 1
    },
    {
      "id": "3f5c7e35-cb78-4902-9cce-3a0012abba0a",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2800,
        280
      ],
      "parameters": {
        "color": 4,
        "width": 420,
        "height": 380,
        "content": "## Merge & Create Candidate\n\n- Merge data from both flows (Candidate Screener AI Agent and File Flow)  \n- Use the merged data to create a candidate in Airtable\n"
      },
      "typeVersion": 1
    },
    {
      "id": "3e5117fc-2393-4b14-b01a-2de10dc68a07",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3260,
        240
      ],
      "parameters": {
        "color": 4,
        "width": 420,
        "height": 420,
        "content": "## Check Candidate & Send Email to HR\n\n- Check if the candidate is qualified or not  \n- If the candidate is qualified, the system will send an email to HR\n"
      },
      "typeVersion": 1
    },
    {
      "id": "fef018f9-a8bb-4745-8ebc-373bd6a1a072",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1400,
        -80
      ],
      "parameters": {
        "color": 4,
        "width": 560,
        "height": 580,
        "content": "## Candidate Application Form\n\nWeb form for candidates to submit applications\n\nFields:\n- Full Name (required)\n- Email Address (required, email validation)\n- Position Applied For (required)\n- Relevant Skills (textarea, required)\n- Cover Letter (textarea, required)\n- Resume (PDF file upload only)"
      },
      "typeVersion": 1
    },
    {
      "id": "ea391ee8-0f82-459f-89c9-2c8cd6222426",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1080,
        -80
      ],
      "parameters": {
        "color": 4,
        "width": 280,
        "height": 280,
        "content": "## SETUP REQUIRED\n**Author:** [Billy Christi](https://n8n.io/creators/billy/)\n\nAirtable Base Structure:  \n[Copy this Airtable Base](https://airtable.com/appgVjZcaRP8BsKf0/shrQAqQ2JUW50EEyW/tblGIVbpACRwWzzlp/viwWS2Ohh6oXZLvyY?blocks=hide)\n\nRequired Credentials:  \n\u2022 Airtable API Key  \n\u2022 OpenAI API Key (GPT-4)  \n\u2022 Google Drive Credential\n\u2022 Gmail Credential\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d40a5581-16de-47de-a2d5-c1c246e382da",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        760,
        640
      ],
      "parameters": {
        "color": 5,
        "width": 460,
        "height": 460,
        "content": "## \ud83e\udd16 AI-Powered Candidate Screening and Evaluation Workflow using OpenAI and Airtable\n\n**What This Template Does:**\n- Creates a web form for candidates to submit applications with resume uploads\n- Automatically extracts and processes text content from PDF resumes\n- Uses GPT-4 AI to intelligently match candidates against job requirements\n- Calculates compatibility scores and generates detailed screening notes\n- Stores candidate data and resumes in Airtable database and Google Drive\n- Automatically emails HR team when suitable candidates are found\n- Fully automates the entire hiring pipeline from application to notification"
      },
      "typeVersion": 1
    },
    {
      "id": "3f9fa7c4-d451-4983-bbf6-05224b7ec842",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1240,
        640
      ],
      "parameters": {
        "color": 5,
        "width": 500,
        "height": 460,
        "content": "## \ud83d\udccb WORKFLOW PROCESS OVERVIEW\nStep 1: \ud83d\udcdd Candidate Application Form collects candidate details and PDF resume  \nStep 2: \ud83d\udcc4 Extract Resume PDF converts uploaded PDF into readable text  \nStep 3: \ud83d\udcc1 Upload File stores resume in Google Drive and sets permissions  \nStep 4: \ud83d\udd0d Search Job Posting finds matching job in Airtable database  \nStep 5: \ud83e\udd16 AI Agent (OpenAI) evaluates candidate fit and generates screening results  \nStep 6: \ud83d\udcbe Create Candidate stores complete record in Airtable with AI results  \nStep 7: \u2705 Check Suitability determines if candidate meets requirements  \nStep 8: \ud83d\udce7 Send Email to HR notifies team when candidate is suitable"
      },
      "typeVersion": 1
    },
    {
      "id": "f0274c42-d47b-42db-8bf4-371455b7eee1",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3780,
        80
      ],
      "parameters": {
        "color": 4,
        "width": 380,
        "height": 760,
        "content": "# \ud83d\udc4b Hi, I\u2019m Billy\n![My Photo](https://i.ibb.co/Gvn63Bzc/Billy-Christi-AI-Automation.jpg)\nI help businesses build **n8n workflows** & **AI automation projects**.  \nNeed help with n8n or AI Automation projects? \nContact me and let\u2019s build your automation together.\n\n\ud83d\udce9 **Email:** billychartanto@gmail.com  \n\ud83e\udd1d **n8n Creator:** [n8n.io/creators/billy](https://n8n.io/creators/billy/)\n\ud83c\udf10 **My n8n Projects:** [billychristi.com/n8n](https://www.billychristi.com/n8n)  \n\n\n\n---\n\ud83d\udca1 Feel free to get in touch if you\u2019d like help on your next automation project or if you have any feedback or thoughts to share.\n"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "Create Candidate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload File": {
      "main": [
        [
          {
            "node": "Set File Permission",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Candidate": {
      "main": [
        [
          {
            "node": "Check if candidate is suitable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Candidate Screener AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Extract Resume PDF": {
      "main": [
        [
          {
            "node": "Search Job Posting",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Job Posting": {
      "main": [
        [
          {
            "node": "Candidate Screener AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set File Permission": {
      "main": [
        [
          {
            "node": "Set File Array for airtable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Candidate Screener AI Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Candidate Application Form": {
      "main": [
        [
          {
            "node": "Extract Resume PDF",
            "type": "main",
            "index": 0
          },
          {
            "node": "Upload File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Candidate Screener AI Agent": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set File Array for airtable": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Check if candidate is suitable": {
      "main": [
        [
          {
            "node": "Send email to HR",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow is ideal for:

Source: https://n8n.io/workflows/4481/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

HR Job Posting and Evaluation with AI. Uses formTrigger, airtable, googleDrive, stickyNote. Event-driven trigger; 36 nodes.

Form Trigger, Airtable, Google Drive +8
AI & RAG

HR Job Posting and Evaluation with AI. Uses formTrigger, airtable, googleDrive, stickyNote. Event-driven trigger; 36 nodes.

Form Trigger, Airtable, Google Drive +8
AI & RAG

The HR Job Posting and Evaluation with AI workflow is designed to streamline and enhance recruitment for technical roles, such as Automation Specialists. By automating key stages in the hiring process

Form Trigger, Airtable, Google Drive +8
AI & RAG

Transform your manual hiring process into an intelligent evaluation system that saves 15-20 minutes per candidate! This workflow automates the entire candidate assessment pipeline - from CSV/XLSX uplo

Form Trigger, Google Sheets, Google Drive +8
AI & RAG

This n8n workflow is designed for e-commerce businesses, digital marketers, and content creators who want to automatically generate professional 3D product videos from product images. It's perfect for

Form Trigger, Google Drive, HTTP Request +9