AutomationFlowsAI & RAG › Unstructured Resume Parser with Thordata Universal API + Openai Gpt-4.1-mini

Unstructured Resume Parser with Thordata Universal API + Openai Gpt-4.1-mini

ByRanjan Dailata @ranjancse on n8n.io

This workflow is designed for: Recruiters, Talent Intelligence Teams, and HR tech builders automating resume ingestion. Developers and data engineers building ATS (Applicant Tracking Systems) or CRM data pipelines. AI and automation enthusiasts looking to extract structured JSON…

Event trigger★★★★☆ complexityAI-powered15 nodesHTTP RequestInformation ExtractorOpenAI ChatGoogle SheetsRead Write File
AI & RAG Trigger: Event Nodes: 15 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Google Sheets → HTTP Request 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
{
  "id": "KZfuTnflUHXV4drQ",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Unstructured Resume Parser with Thordata Universal API + Open AI gpt-4.1-mini",
  "tags": [
    {
      "id": "Kujft2FOjmOVQAmJ",
      "name": "Engineering",
      "createdAt": "2025-04-09T01:31:00.558Z",
      "updatedAt": "2025-04-09T01:31:00.558Z"
    },
    {
      "id": "ZOwtAMLepQaGW76t",
      "name": "Building Blocks",
      "createdAt": "2025-04-13T15:23:40.462Z",
      "updatedAt": "2025-04-13T15:23:40.462Z"
    },
    {
      "id": "ddPkw7Hg5dZhQu2w",
      "name": "AI",
      "createdAt": "2025-04-13T05:38:08.053Z",
      "updatedAt": "2025-04-13T05:38:08.053Z"
    },
    {
      "id": "rKOa98eAi3IETrLu",
      "name": "HR",
      "createdAt": "2025-04-13T04:59:30.580Z",
      "updatedAt": "2025-04-13T04:59:30.580Z"
    }
  ],
  "nodes": [
    {
      "id": "d11672dd-5801-4196-aecd-91463329f1af",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -896,
        -48
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "f4a7fc09-6f0c-4470-a9a6-7021605825de",
      "name": "Set the Input Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        -688,
        -48
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "175a52cb-6b2e-480b-b74f-1cbc319bea78",
              "name": "resume_url",
              "type": "string",
              "value": "https://registry.jsonresume.org/thomasdavis?theme=elegant"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "058c120c-48f3-4c7f-b486-c49b026ea632",
      "name": "Perform Thordata Universal API Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -400,
        -48
      ],
      "parameters": {
        "url": "https://universalapi.thordata.com/request",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "form-urlencoded",
        "sendHeaders": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "url",
              "value": "={{ $json.resume_url }}"
            },
            {
              "name": "type",
              "value": "html"
            },
            {
              "name": "js_render",
              "value": "False"
            },
            {
              "name": "country",
              "value": "in"
            },
            {
              "name": "clean_content",
              "value": "css,js"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth",
        "headerParameters": {
          "parameters": [
            {}
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "17cc1967-f926-4d5e-b2a2-3b832428cfa3",
      "name": "JSON Resume Builder",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        96,
        -48
      ],
      "parameters": {
        "text": "=Analyze and Parse the provided resume in JSON Resume format.\n\n {{ $json.markdown }}",
        "options": {},
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"id\": { \"type\": \"string\" },\n    \"basics\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": { \"type\": \"string\" },\n        \"label\": { \"type\": \"string\" },\n        \"image\": { \"type\": \"string\" },\n        \"email\": { \"type\": \"string\" },\n        \"phone\": { \"type\": \"string\" },\n        \"url\": { \"type\": \"string\" },\n        \"summary\": { \"type\": \"string\" },\n        \"location\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"city\": { \"type\": \"string\" },\n            \"region\": { \"type\": \"string\" },\n            \"country\": { \"type\": \"string\" }\n          }\n        },\n        \"profiles\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"network\": { \"type\": \"string\" },\n              \"username\": { \"type\": \"string\" },\n              \"url\": { \"type\": \"string\" }\n            }\n          }\n        }\n      }\n    },\n    \"work\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": { \"type\": \"string\" },\n          \"position\": { \"type\": \"string\" },\n          \"startDate\": { \"type\": \"string\" },\n          \"endDate\": { \"type\": \"string\" },\n          \"summary\": { \"type\": \"string\" },\n          \"highlights\": {\n            \"type\": \"array\",\n            \"items\": { \"type\": \"string\" }\n          }\n        }\n      }\n    },\n    \"education\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"institution\": { \"type\": \"string\" },\n          \"area\": { \"type\": \"string\" },\n          \"studyType\": { \"type\": \"string\" },\n          \"startDate\": { \"type\": \"string\" },\n          \"endDate\": { \"type\": \"string\" },\n          \"gpa\": { \"type\": \"string\" }\n        }\n      }\n    },\n    \"skills\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": { \"type\": \"string\" },\n          \"level\": { \"type\": \"string\" },\n          \"keywords\": {\n            \"type\": \"array\",\n            \"items\": { \"type\": \"string\" }\n          }\n        }\n      }\n    },\n    \"projects\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": { \"type\": \"string\" },\n          \"description\": { \"type\": \"string\" },\n          \"url\": { \"type\": \"string\" },\n          \"technologies\": {\n            \"type\": \"array\",\n            \"items\": { \"type\": \"string\" }\n          }\n        }\n      }\n    },\n    \"certifications\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": { \"type\": \"string\" },\n          \"issuer\": { \"type\": \"string\" },\n          \"date\": { \"type\": \"string\" },\n          \"url\": { \"type\": \"string\" }\n        }\n      }\n    },\n    \"languages\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"language\": { \"type\": \"string\" },\n          \"fluency\": { \"type\": \"string\" }\n        }\n      }\n    },\n    \"interests\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": { \"type\": \"string\" },\n          \"keywords\": {\n            \"type\": \"array\",\n            \"items\": { \"type\": \"string\" }\n          }\n        }\n      }\n    },\n    \"meta\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"lastModified\": { \"type\": \"string\" },\n        \"version\": { \"type\": \"string\" }\n      }\n    }\n  }\n}\n"
      },
      "typeVersion": 1.2
    },
    {
      "id": "3411f8ee-2cd6-40d9-a7e0-bc78ba07803d",
      "name": "Convert HTML to Markdown format",
      "type": "n8n-nodes-base.markdown",
      "position": [
        -112,
        -48
      ],
      "parameters": {
        "html": "={{ $json.html }}",
        "options": {},
        "destinationKey": "markdown"
      },
      "typeVersion": 1
    },
    {
      "id": "503b332e-72c2-4e6a-8026-32be9ea84aa1",
      "name": "OpenAI Chat Model for Resume Builder",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        96,
        144
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7bb68b59-496a-4d27-abad-98e2f3e7f9b5",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -896,
        -272
      ],
      "parameters": {
        "color": 7,
        "width": 160,
        "content": "![Logo](https://consumersiteimages.trustpilot.net/business-units/67b212598525b99cf90a59cc-198x149-1x.jpg)"
      },
      "typeVersion": 1
    },
    {
      "id": "44d3a647-e9a6-4df5-9323-6c73e213698f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1072,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 192,
        "content": "## Purpose\n\nThis workflow automates the process of parsing unstructured resume data into structured JSON objects compatible with the [JSON Resume Schema](https://jsonresume.org/schema/).\n\nIt leverages **Thordata Universal API** for intelligent document ingestion and **OpenAI GPT-4.1-mini** for contextual field extraction, ensuring high-quality structured resume output for ATS, CRM, or recruitment analytics systems."
      },
      "typeVersion": 1
    },
    {
      "id": "c5699247-25fb-4cd7-a499-448e39a74666",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -528,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 704,
        "content": "## Flow Summary\n\n1. **Set the Input Fields**\n\n   * Hosted resume over the web. An URL where the Resume exist needs to be set to the input field. \n\n2. **Document Processing via Thordata Universal API**\n\n   * The file is sent to Thordata\u2019s Universal API for format normalization and content extraction (text, layout, metadata).\n\n3. **AI-Powered Resume Structuring**\n\n   * The cleaned text is passed to the **OpenAI GPT-4.1-mini** node with a JSON schema prompt.\n   * GPT extracts entities such as:\n\n     * `basics`: name, email, phone, location\n     * `work`: employer, job title, duration, responsibilities\n     * `education`: school, degree, years\n     * `skills`: technical and soft skills\n     * `projects`, `certifications`, and `languages`\n\n4. **Output Delivery**\n\n   * Structured JSON is saved to:\n\n     * Disk on a specified location\n     * Google Sheets for visualization\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b2c386d3-7273-4d4b-9f54-57a37d7a1be1",
      "name": "Create a Binary Response",
      "type": "n8n-nodes-base.function",
      "position": [
        512,
        -208
      ],
      "parameters": {
        "functionCode": "\n\nitems[0].binary = {\n  data: {\n    data: new Buffer(JSON.stringify(items[0].json, null, 2)).toString('base64')\n  }\n};\nreturn items;"
      },
      "typeVersion": 1
    },
    {
      "id": "ba8a6b86-1f67-4e2b-8e0b-d15c472014dd",
      "name": "Append or update row in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        528,
        48
      ],
      "parameters": {
        "columns": {
          "value": {
            "json_resume": "={{ $json.output.toJsonString() }}"
          },
          "schema": [
            {
              "id": "json_resume",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "json_resume",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "json_resume"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CCj7PRT93hmTfkrDXSw6vwmz5UGZED4vA5l7LCNIAhk/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1CCj7PRT93hmTfkrDXSw6vwmz5UGZED4vA5l7LCNIAhk",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CCj7PRT93hmTfkrDXSw6vwmz5UGZED4vA5l7LCNIAhk/edit?usp=drivesdk",
          "cachedResultName": "Resume Parser"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "4e8e9db6-6563-4978-a10b-2aeca99986ee",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        -320
      ],
      "parameters": {
        "color": 3,
        "width": 480,
        "height": 608,
        "content": "## Export Data Handling\n\nExport the JSON Resume to Disk and Google Speadsheet"
      },
      "typeVersion": 1
    },
    {
      "id": "4e763ad5-b280-4775-8f9c-641045e531b0",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        48,
        -240
      ],
      "parameters": {
        "color": 4,
        "width": 336,
        "height": 528,
        "content": "## Structured Resume Parser\n\nUses the OpenAI gtp-4.1.mini for parsing the resume content in Markdown format to JSON resume"
      },
      "typeVersion": 1
    },
    {
      "id": "711338ef-1a0c-4c8b-b3bd-d0d3df5416fb",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -512,
        -224
      ],
      "parameters": {
        "color": 6,
        "width": 336,
        "height": 384,
        "content": "## Thordata Universal API\n\nThordata Universal API is being used for web scraping the URL content"
      },
      "typeVersion": 1
    },
    {
      "id": "f776447a-71e0-453d-82d1-7b5382080847",
      "name": "Write the Structured JSON resume to Disk",
      "type": "n8n-nodes-base.readWriteFile",
      "position": [
        688,
        -208
      ],
      "parameters": {
        "options": {},
        "fileName": "=C:\\\\{{ $json.output.basics.name }}.json",
        "operation": "write"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "33c136a8-b355-4aea-a191-5672a7f37ca0",
  "connections": {
    "JSON Resume Builder": {
      "main": [
        [
          {
            "node": "Create a Binary Response",
            "type": "main",
            "index": 0
          },
          {
            "node": "Append or update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set the Input Fields": {
      "main": [
        [
          {
            "node": "Perform Thordata Universal API Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create a Binary Response": {
      "main": [
        [
          {
            "node": "Write the Structured JSON resume to Disk",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert HTML to Markdown format": {
      "main": [
        [
          {
            "node": "JSON Resume Builder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model for Resume Builder": {
      "ai_languageModel": [
        [
          {
            "node": "JSON Resume Builder",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Set the Input Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Perform Thordata Universal API Request": {
      "main": [
        [
          {
            "node": "Convert HTML to Markdown format",
            "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 designed for: Recruiters, Talent Intelligence Teams, and HR tech builders automating resume ingestion. Developers and data engineers building ATS (Applicant Tracking Systems) or CRM data pipelines. AI and automation enthusiasts looking to extract structured JSON…

Source: https://n8n.io/workflows/10289/ — 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

Community nodes can only be installed on self-hosted instances of n8n.

N8N Nodes Mcp, Information Extractor, HTTP Request +3
AI & RAG

Transform your Gmail sent folder into a comprehensive, enriched contact database automatically. This workflow processes hundreds or thousands of sent emails, extracting and enriching contact informati

HTTP Request, @Brave/N8N Nodes Brave Search, Gmail +3
AI & RAG

Author: CSChin Example Source: https://www.ncl.ac.uk/singapore/staff/profile/chengchin.html#publications

HTTP Request, OpenAI Chat, Form Trigger +3
AI & RAG

This comprehensive workflow automates the entire invoice processing pipeline by monitoring a Google Drive folder for new invoice uploads, intelligently processing both PDF and image formats, extractin

OpenAI Chat, Google Drive Trigger, Google Drive +4
AI & RAG

This workflow automates the discovery and structuring of FAQs from real AI search behavior using SE Ranking and OpenAI. It fetches domain-specific AI search prompts and answers, then extracts relevant

HTTP Request, Information Extractor, OpenAI Chat +1