🔍 AI Tool

Keywords Extractor

Paste any job description and instantly extract the most important keywords, categorised by type. Use these to tailor your resume and pass ATS filters.

📋 Job Description
0 words
🏷️ Extracted Keywords
✦ Sample output preview — paste a job description and click Extract
Must-have
Preferred
Nice-to-have
💻 Technical Skills 8
Python Django REST PostgreSQL Redis Celery FastAPI GraphQL gRPC
🛠️ Tools & Platforms 6
AWS EC2/S3 Docker Kubernetes GitHub Actions Terraform Datadog
🤝 Soft Skills 4
Problem Solving Team Collaboration Communication Ownership
📊 18 keywords extracted Copy All
const TOOL = 'keywords'; renderLimitBadge(TOOL, 'rl-badge'); let allKeywords = []; function kwCharCount() { const val = document.getElementById('kw-jd').value; const words = val.trim() ? val.trim().split(/\s+/).length : 0; document.getElementById('kw-chars').textContent = words + ' words'; } async function extractKeywords() { const jd = document.getElementById('kw-jd').value.trim(); const title = document.getElementById('kw-jobtitle').value.trim(); if (!jd) { document.getElementById('kw-jd').style.borderColor = 'var(--danger)'; return; } document.getElementById('kw-jd').style.borderColor = ''; const { allowed } = checkLimit(TOOL); if (!allowed) { document.getElementById('kw-output').innerHTML = `
⛔ Daily limit reached — ${AI_LIMITS[TOOL]} extractions per day. Resets at IST midnight.
`; return; } const btn = document.getElementById('kw-btn'); btn.disabled = true; document.getElementById('kw-btn-text').textContent = 'Extracting...'; document.getElementById('kw-spinner').style.display = 'inline-block'; const system = `You are an expert ATS resume consultant who extracts and categorises keywords from job descriptions. For each keyword assign an importance level: "must" (critical/required), "good" (preferred/beneficial), "nice" (bonus/optional). Respond ONLY in this JSON format (no markdown): { "categories": [ { "name": "Technical Skills", "icon": "💻", "keywords": [{"text":"...","importance":"must|good|nice"}] }, { "name": "Soft Skills", "icon": "🤝", "keywords": [...] }, { "name": "Tools & Platforms", "icon": "🛠️", "keywords": [...] }, { "name": "Qualifications & Certifications", "icon": "🎓", "keywords": [...] }, { "name": "Industry & Domain Terms", "icon": "🏭", "keywords": [...] } ], "total": 42 } Only include categories that actually have keywords. Skip empty categories.`; const prompt = `Extract all important keywords from this job description${title ? ` for a ${title} role` : ''}:\n\n${jd.slice(0, 4000)}`; try { const raw = await callAI(prompt, system, 1500); const json = JSON.parse(raw.replace(/```json|```/g, '').trim()); allKeywords = []; json.categories.forEach(c => c.keywords.forEach(k => allKeywords.push(k.text))); let html = `
Must-have
Preferred
Nice-to-have
`; json.categories.forEach(cat => { const pills = cat.keywords.map(k => `${escHtml(k.text)}` ).join(''); html += `
${cat.icon} ${escHtml(cat.name)} ${cat.keywords.length}
${pills}
`; }); html += `
📊 ${json.total || allKeywords.length} keywords extracted
`; document.getElementById('kw-output').innerHTML = html; document.getElementById('kw-ghost').style.display = 'none'; consumeLimit(TOOL); renderLimitBadge(TOOL, 'rl-badge'); } catch(err) { renderAIError(err, 'kw-output', 'worker-notice'); } finally { btn.disabled = false; document.getElementById('kw-btn-text').textContent = '🔍 Extract Keywords'; document.getElementById('kw-spinner').style.display = 'none'; } } function copySingleKw(el, text) { navigator.clipboard.writeText(text).then(() => { el.classList.add('copied-kw'); setTimeout(() => el.classList.remove('copied-kw'), 1500); }); } function copyAllKeywords() { if (!allKeywords.length) return; navigator.clipboard.writeText(allKeywords.join(', ')).then(() => { document.querySelectorAll('.ai-copy-btn').forEach(b => { b.textContent = '✅ Copied!'; setTimeout(() => b.textContent = '📋 Copy All', 2000); }); }); } function escHtml(s) { return String(s).replace(/&/g,'&').replace(//g,'>').replace(/'/g,'''); }