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 →
{
"name": "Resume Parser",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "resume-parser",
"responseMode": "responseNode",
"options": {}
},
"id": "11223344-5566-7788-99aa-bbccddeeff00",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
240,
300
]
},
{
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "// Support both direct JSON and webhook body wrapper\nconst raw = $input.first().json;\nconst body = raw.body || raw;\nconst resumeText = (body.resume_text || '').trim();\n\nif (!resumeText) {\n throw new Error('resume_text is required in the request body');\n}\n\n// Trim to ~15 000 chars to stay within model token limits\nconst trimmed = resumeText.slice(0, 15000);\n\nconst schema = {\n contact: { name: 'string', email: 'string', phone: 'string', linkedin: 'string', github: 'string' },\n summary: 'string',\n skills: [{ category: 'string', items: ['string'] }],\n experience: [{ company: 'string', title: 'string', dates: 'string', bullets: ['string'] }],\n projects: [{ name: 'string', tech: ['string'], bullets: ['string'] }],\n education: [{ institution: 'string', degree: 'string', dates: 'string', gpa: 'string' }]\n};\n\nconst prompt = `You are a precise resume data extraction assistant.\n\nExtract all information from the resume below and return a single valid JSON object matching this schema exactly:\n${JSON.stringify(schema, null, 2)}\n\nRules:\n- Return ONLY valid JSON. No markdown fences, no comments.\n- Do NOT invent information absent from the source text.\n- Empty string \"\" for missing string fields; [] for missing arrays.\n- Group skills into logical categories (Languages, Frameworks, Tools, Cloud, etc.).\n- Preserve original bullet phrasing; clean whitespace and broken line-wraps.\n- gpa should be a string like \"3.8/4.0\" or empty string.\n\nRESUME:\n---\n${trimmed}\n---\n\nReturn the JSON object now:`;\n\nreturn [{ json: { prompt } }];\n"
},
"id": "22334455-6677-8899-aabb-ccddeeff0011",
"name": "Build Gemini Prompt",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
460,
300
]
},
{
"parameters": {
"method": "POST",
"url": "=https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key={{ $env.GEMINI_API_KEY }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ { contents: [{ role: 'user', parts: [{ text: $json.prompt }] }], generationConfig: { response_mime_type: 'application/json', temperature: 0.1, maxOutputTokens: 4096 } } }}",
"options": {
"timeout": 60000
}
},
"id": "33445566-7788-99aa-bbcc-ddeeff001122",
"name": "Gemini API",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
700,
300
],
"continueOnFail": true
},
{
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "const response = $input.first().json;\n\n// Handle Gemini API errors\nif (response.error) {\n throw new Error('Gemini API error: ' + JSON.stringify(response.error));\n}\n\nlet rawText;\ntry {\n rawText = response.candidates[0].content.parts[0].text;\n} catch (e) {\n throw new Error('Unexpected Gemini response structure: ' + JSON.stringify(response).slice(0, 300));\n}\n\n// Strip accidental markdown fences\nconst cleaned = rawText\n .replace(/^```json\\s*/i, '')\n .replace(/^```\\s*/i, '')\n .replace(/\\s*```$/i, '')\n .trim();\n\nlet parsed;\ntry {\n parsed = JSON.parse(cleaned);\n} catch (e) {\n throw new Error('JSON parse failed: ' + e.message + ' | Raw: ' + rawText.slice(0, 200));\n}\n\nconst result = {\n contact: parsed.contact || { name: '', email: '', phone: '', linkedin: '', github: '' },\n summary: parsed.summary || '',\n skills: Array.isArray(parsed.skills) ? parsed.skills : [],\n experience: Array.isArray(parsed.experience) ? parsed.experience : [],\n projects: Array.isArray(parsed.projects) ? parsed.projects : [],\n education: Array.isArray(parsed.education) ? parsed.education : []\n};\n\nreturn [{ json: result }];\n"
},
"id": "44556677-8899-aabb-ccdd-eeff00112233",
"name": "Parse Gemini Response",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
940,
300
]
},
{
"parameters": {
"respondWith": "allIncomingItems",
"options": {}
},
"id": "55667788-99aa-bbcc-ddee-ff0011223344",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
1180,
300
]
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "Build Gemini Prompt",
"type": "main",
"index": 0
}
]
]
},
"Build Gemini Prompt": {
"main": [
[
{
"node": "Gemini API",
"type": "main",
"index": 0
}
]
]
},
"Gemini API": {
"main": [
[
{
"node": "Parse Gemini Response",
"type": "main",
"index": 0
}
]
]
},
"Parse Gemini Response": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"staticData": null,
"tags": [],
"id": 2,
"active": true
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Resume Parser. Uses httpRequest. Webhook trigger; 5 nodes.
Source: https://github.com/1Mangesh1/resume-gen/blob/main/workflows/resume-parser.json — 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 n8n template provides enterprise-level version control for your workflows using GitHub integration. Stop losing hours to broken workflows and manual exports – get proper commit history, visual di
This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .
eek-Go v2 (Batch-Then-Review). Uses httpRequest. Webhook trigger; 75 nodes.
This workflow receives webhook requests from a content calendar and uses the X API v2 to publish text posts, threads, image/video posts, and polls, as well as delete existing posts and run a credentia
This workflow acts as a central API gateway for all technical indicator agents in the Binance Spot Market Quant AI system. It listens for incoming webhook requests and dynamically routes them to the c