{
  "id": "yJCeYlxqx7UUotqy",
  "name": "Skill Gap \u2192 Training Recommendation",
  "tags": [],
  "nodes": [
    {
      "id": "be44de54-9c31-45da-aac1-fae1dabef3bb",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        160,
        -112
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "b814bb56-45a5-470b-99c6-d86eee0a9c7b",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2160,
        336
      ],
      "parameters": {
        "width": 352,
        "height": 400,
        "content": "## \ud83d\ude4f Polite Rejection + Learning Plan  \n\n**Action:**  \n- Generates a professional HTML email for candidates who are not shortlisted.  \n\n**Description:**  \n- Politely communicates that the candidate won\u2019t move forward.  \n- Provides constructive value by highlighting skill gaps and linking to high-quality online courses.  \n- Encourages candidates to keep improving and reapply in the future.  \n- Differentiates the company by showing empathy and professionalism in rejection.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "d725ed44-7c21-4d2b-9438-7cdbfc72c4f6",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2720,
        -544
      ],
      "parameters": {
        "width": 304,
        "height": 368,
        "content": "## \ud83d\udce7 Candidate Mailer \u2013 Shortlisted  \n\n**Action:**  \n- Sends the congratulatory onboarding email created by the AI to the candidate\u2019s email address.  \n\n**Description:**  \n- Delivers positive news along with the personalized learning plan.  \n- Ensures shortlisted candidates receive actionable steps for onboarding.  \n- Maintains professionalism by sending emails via the company\u2019s Gmail integration.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "8dce4943-50d5-4e04-a087-3d137c12263b",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2144,
        -768
      ],
      "parameters": {
        "width": 400,
        "height": 352,
        "content": "## \ud83c\udf89 Congrats + Onboarding Plan  \n\n**Action:**  \n- Generates a warm, congratulatory HTML email for shortlisted candidates.  \n\n**Description:**  \n- Uses an encouraging and celebratory tone while providing practical learning recommendations.  \n- Includes identified skill gaps, recommended courses, and onboarding steps.  \n- Frames the plan as part of the candidate\u2019s onboarding journey, showing company investment in growth.  \n- Strengthens employer brand while motivating candidates.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "e7449bde-b1ca-4962-a2b7-c67a82e05342",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2176,
        -176
      ],
      "parameters": {
        "width": 480,
        "height": 272,
        "content": "## \ud83e\udd16 LLM Backend  \n\n**Action:**  \n- Provides access to the GPT-4o-mini model hosted on Azure OpenAI.  \n\n**Description:**  \n- Acts as the foundation for downstream LLM Chains.  \n- Powers both shortlisted and rejected communication flows.  \n- Ensures the AI can analyze resume data, compare it with JD requirements, and generate professional HTML-ready output.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "5570e85e-58b1-464e-a901-17ddb6870441",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        -576
      ],
      "parameters": {
        "width": 272,
        "height": 416,
        "content": "## \ud83d\udcc4 PDF \u2192 Text Extractor  \n\n**Action:**  \n- Extracts raw text content from the candidate\u2019s resume PDF.  \n\n**Description:**  \n- Unlocks crucial details such as education, skills, projects, and work history from the resume.  \n- Converts unstructured resume data into a usable format for AI-driven analysis.  \n- Without this step, the AI would be limited to only metadata from the sheet, reducing accuracy in gap detection.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "13bd06cb-af9f-43cc-b953-c197828c446d",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        320
      ],
      "parameters": {
        "height": 464,
        "content": "## \u26a0\ufe0f Error Logging  \n\n**Action:**  \n- Logs failed or empty resume downloads into a designated \u201cError Log\u201d Google Sheet.  \n\n**Description:**  \n- Provides visibility when resumes cannot be processed.  \n- Ensures HR teams can manually follow up with candidates or fix data entry issues.  \n- Prevents silent drops of candidates due to technical problems.  \n- Strengthens reliability of the overall workflow by documenting failures for audit and review.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "00e5b685-e037-4fe6-88fb-e09ddea4bfa0",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        784,
        48
      ],
      "parameters": {
        "width": 272,
        "height": 432,
        "content": "## \u2705/\u274c Resume File Check  \n\n**Action:**  \n- Validates whether the resume file was downloaded successfully.  \n\n**Description:**  \n- Prevents the workflow from breaking when the resume link is broken or file is empty.  \n- Ensures only valid resumes are passed for text extraction.  \n- If validation fails, the workflow redirects to the error logging branch for tracking.  \n- Adds resilience to the hiring process by catching and managing errors early.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "10876e91-a0bf-4281-9d10-dbf1a71c187d",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        576,
        -544
      ],
      "parameters": {
        "width": 288,
        "height": 400,
        "content": "## \ud83d\udce5 Resume Downloader  \n\n**Action:**  \n- Downloads the candidate\u2019s resume PDF using the link provided in the Google Sheet.  \n\n**Description:**  \n- Makes the candidate\u2019s raw resume accessible to the workflow.  \n- Bridges structured metadata from the sheet with unstructured information inside the PDF.  \n- Without this step, the AI would only have surface-level candidate details, missing critical context about skills and experience.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "054d2b9a-627a-46bc-a7e8-99a6f2080db6",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        64
      ],
      "parameters": {
        "width": 288,
        "height": 432,
        "content": "## \ud83d\udcd1 Candidate Data Fetch  \n\n**Action:**  \n- Retrieves the candidate\u2019s details from the designated Google Sheet.  \n\n**Description:**  \n- Pulls structured information such as name, email, resume link, experience, job title, job requirements, notes, skills, and application status.  \n- This sheet acts as the source of truth for all further processing.  \n- Ensures every decision and communication later in the workflow is based on up-to-date and accurate candidate records.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "56d51999-418d-4df5-bf74-c7395a07aa7e",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2672,
        112
      ],
      "parameters": {
        "width": 272,
        "height": 400,
        "content": "## \ud83d\udce7 Candidate Mailer \u2013 Rejected  \n\n**Action:**  \n- Sends the polite rejection + training recommendation email generated by the AI.  \n\n**Description:**  \n- Ensures rejected candidates leave with a positive impression.  \n- Provides learning resources instead of silence or a generic rejection.  \n- Improves candidate experience and employer branding even when candidates aren\u2019t hired.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "4a8d8604-b798-432c-8df5-f9bcbfe13816",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1552,
        -592
      ],
      "parameters": {
        "width": 304,
        "height": 432,
        "content": "## \ud83c\udfaf Shortlisted vs Rejected  \n\n**Action:**  \n- Compares the candidate\u2019s status field to \u201cShortlisted\u201d and splits the workflow into two paths.  \n\n**Description:**  \n- Creates a personalized communication experience for candidates.  \n- Shortlisted candidates receive onboarding-focused emails.  \n- Rejected candidates still get constructive feedback and growth plans.  \n- This branching logic transforms the workflow into a thoughtful candidate engagement system.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "c66a244d-b7ec-4fcf-a8b6-867f6ea86df5",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1376,
        16
      ],
      "parameters": {
        "width": 272,
        "height": 464,
        "content": "## \ud83e\udde9 Candidate Data Builder  \n\n**Action:**  \n- Combines structured data from Google Sheets with unstructured text extracted from the PDF.  \n\n**Description:**  \n- Produces a single, enriched JSON object containing candidate details, resume text, and application status.  \n- Ensures AI receives complete context: what the sheet says, what the resume shows, and what the JD requires.  \n- By merging all sources, the AI can provide highly personalized and accurate learning recommendations.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "b5e9d9e8-54f7-4068-9be8-6c57f64c5992",
      "name": "\ud83d\udcd1 Candidate Data Fetch",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        416,
        -112
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
          "cachedResultName": "Interviewer Brief Pack "
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "c7437cf6-5813-408f-9c3e-5026ad1d8ef6",
      "name": "\ud83d\udce5 Resume Downloader",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        672,
        -112
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": "={{ $json[\"Resume Link\"] }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "ebf66f0f-2b52-4c19-946d-ffb37ed62476",
      "name": "Resume File Check",
      "type": "n8n-nodes-base.if",
      "position": [
        880,
        -112
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "ccbf3814-369c-4dc8-9a47-8aa496da368a",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "{{ $json.data }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d2097c78-69ea-426f-a325-d6eaea9011ed",
      "name": "Error Logging",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1168,
        160
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1338537721,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=1338537721",
          "cachedResultName": "error log sheet"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
          "cachedResultName": "Interviewer Brief Pack "
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "034504d1-bdcc-49e0-a88f-a3905001eab3",
      "name": "PDF \u2192 Text Extractor",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        1184,
        -128
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1
    },
    {
      "id": "aac37887-0a3e-4d4d-ad84-878833ec4ad9",
      "name": "Candidate Data Builder",
      "type": "n8n-nodes-base.code",
      "position": [
        1424,
        -128
      ],
      "parameters": {
        "jsCode": "// Get PDF extracted data\nconst pdfData = $json;\n\n// Get original Google Sheets row (from earlier node)\nconst sheetData = $item(0).$node[\"\ud83d\udcd1 Candidate Data Fetch\"].json;\n\nreturn [{\n  json: {\n    candidateName: sheetData[\"Candidate Name\"],\n    email: sheetData[\"Email\"],\n    resumeLink: sheetData[\"Resume Link\"],\n    experience: sheetData[\"Experience\"],\n    jdTitle: sheetData[\"JD Title\"],\n    jdKeyRequirements: sheetData[\"JD Key Requirements\"],\n    notes: sheetData[\"Notes\"],\n    skills_sheet: sheetData[\"Skills\"],   // skills column from sheet\n    status: sheetData[\"Status\"],         // \u2705 include status from sheet\n    resumeText: pdfData.text             // raw resume text\n  }\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "643e3a82-f587-494e-a744-9ca92c06e876",
      "name": "Shortlisted vs Rejected",
      "type": "n8n-nodes-base.if",
      "position": [
        1632,
        -128
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "39d3ca19-fe1f-42c4-b0dd-54b2069b5a34",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{$json.status}}",
              "rightValue": "Shortlisted"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "e35e2e2f-ecc0-442e-8731-d4a85caf9129",
      "name": "LLM Backend",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        2064,
        -112
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4d81897f-89cd-4f7f-9c85-17dd8f153675",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1728,
        496
      ],
      "parameters": {
        "width": 368,
        "height": 320,
        "content": "## \ud83e\udd16 LLM Backend  \n\n**Action:**  \n- Provides access to the GPT-4o-mini model hosted on Azure OpenAI.  \n\n**Description:**  \n- Acts as the foundation for downstream LLM Chains.  \n- Powers both shortlisted and rejected communication flows.  \n- Ensures the AI can analyze resume data, compare it with JD requirements, and generate professional HTML-ready output.  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "652033a3-0bb9-4eaa-8126-60d8bfe5c963",
      "name": "LLM Backend1",
      "type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
      "position": [
        1920,
        368
      ],
      "parameters": {
        "model": "gpt-4o-mini",
        "options": {}
      },
      "credentials": {
        "azureOpenAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2596cbb6-bb80-43bc-bce1-477021f2c997",
      "name": "Congrats + Onboarding Plan",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        2176,
        -384
      ],
      "parameters": {
        "text": "=Candidate Details:\n- Name: {{ $json.candidateName }}\n- Email: {{ $json.email }}\n- Experience: {{ $json.experience }}\n- Resume (text extract): {{ $json.resumeText }}\n\nJob Information:\n- Job Title: {{ $json.jdTitle }}\n- Key Requirements: {{ $json.jdKeyRequirements }}\n- Candidate Skills (from Sheet): {{ $json.skills_sheet }}\n- Notes: {{ $json.notes }}\n\nTask:\nGenerate a congratulatory onboarding email titled \u201cLearning Plan for {{ $json.candidateName }}\u201d \nwith Skill Gaps, Recommended Courses, and Next Steps. \nHighlight that this plan will guide their onboarding.\n",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "You are an onboarding assistant.  Write a warm, congratulatory email in HTML.  Congratulate the candidate for being shortlisted and clearly mention that the following learning plan is part of their onboarding journey.  Include sections for Skill Gaps, Recommended Courses (with real Coursera/Udemy/LinkedIn Learning links), and Next Steps.  Use a positive, professional, and encouraging tone.  Return only clean HTML (no explanations)."
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "2212e77e-f9d1-4bd3-9aa5-4f35ab849e27",
      "name": "Polite Rejection + Learning Plan",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        2128,
        176
      ],
      "parameters": {
        "text": "=Candidate Details:\n- Name: {{ $json.candidateName }}\n- Email: {{ $json.email }}\n- Experience: {{ $json.experience }}\n- Resume (text extract): {{ $json.resumeText }}\n\nJob Information:\n- Job Title: {{ $json.jdTitle }}\n- Key Requirements: {{ $json.jdKeyRequirements }}\n- Candidate Skills (from Sheet): {{ $json.skills_sheet }}\n- Notes: {{ $json.notes }}\n\nTask:\n1. Compare the candidate\u2019s skills and resume with the job requirements.\n2. Identify the missing or weaker skills (skill gaps).\n3. For each skill gap, suggest 1\u20132 relevant online courses with real URLs (Coursera, Udemy, LinkedIn Learning).\n4. Write a polished, professional HTML email titled \u201cLearning Plan for {{ $json.candidateName }}\u201d.\n5. The HTML should include sections: **Skill Gaps**, **Recommended Courses**, and **Next Steps**.\n6. Keep tone polite, constructive, and encouraging.\n7. Return only the final HTML (no explanations, no markdown).\n",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "You are a Skill Gap & Learning Plan Generator. Compare a candidate\u2019s resume skills with the job\u2019s required skills. 1. Identify missing or weaker skills (skill gaps). 2. For each gap, recommend 1\u20132 high-quality online courses with real URLs (Coursera, Udemy, LinkedIn Learning). 3. Build a short, encouraging Learning Plan in clean HTML (headings, bullet points, links). 4. Always include at least one free course option if possible. 5. Keep tone polite, constructive, and employer-brand friendly."
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "30e10fc2-8e1c-4cae-ba9d-88d38f364d03",
      "name": "Candidate Mailer \u2013 Shortlisted",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2528,
        -384
      ],
      "parameters": {
        "sendTo": "={{ $('\ud83d\udcd1 Candidate Data Fetch').item.json.Email }}",
        "message": "={{ $json.text }}",
        "options": {},
        "subject": "Your Personalized Learning Plan"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "9d63e1fd-a697-4bf5-aff5-e29588675413",
      "name": "Candidate Mailer \u2013 Rejected",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2480,
        176
      ],
      "parameters": {
        "sendTo": "={{ $('\ud83d\udcd1 Candidate Data Fetch').item.json.Email }}",
        "message": "={{ $json.text }}",
        "options": {},
        "subject": "Your Personalized Learning Plan"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "dc10189d-a8a2-42d5-a9d5-9788a4fc8f3b",
  "connections": {
    "LLM Backend": {
      "ai_languageModel": [
        [
          {
            "node": "Congrats + Onboarding Plan",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "LLM Backend1": {
      "ai_languageModel": [
        [
          {
            "node": "Polite Rejection + Learning Plan",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Resume File Check": {
      "main": [
        [
          {
            "node": "PDF \u2192 Text Extractor",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Error Logging",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Candidate Data Builder": {
      "main": [
        [
          {
            "node": "Shortlisted vs Rejected",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PDF \u2192 Text Extractor": {
      "main": [
        [
          {
            "node": "Candidate Data Builder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce5 Resume Downloader": {
      "main": [
        [
          {
            "node": "Resume File Check",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shortlisted vs Rejected": {
      "main": [
        [
          {
            "node": "Congrats + Onboarding Plan",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Polite Rejection + Learning Plan",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcd1 Candidate Data Fetch": {
      "main": [
        [
          {
            "node": "\ud83d\udce5 Resume Downloader",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Congrats + Onboarding Plan": {
      "main": [
        [
          {
            "node": "Candidate Mailer \u2013 Shortlisted",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Polite Rejection + Learning Plan": {
      "main": [
        [
          {
            "node": "Candidate Mailer \u2013 Rejected",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "\ud83d\udcd1 Candidate Data Fetch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}