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 →
{
"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": ""
},
"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.
googleSheetsOAuth2ApihttpBearerAuthopenAiApi
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Community nodes can only be installed on self-hosted instances of n8n.
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
Author: CSChin Example Source: https://www.ncl.ac.uk/singapore/staff/profile/chengchin.html#publications
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
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