471 applications, 219 reviews, 252 unopened ghost postings, and transparent career analytics.
Total Applications
481
471 jobs (coffee & hope)
Reviewed by Human
%65.9
(317)
219 jobs (46.5%)
Unopened Ghost Jobs
%34.1
(164)
252 jobs (53.5%)
Closed & Archived
%100.0
(481)
450 jobs (95.5%)
Clear analysis of 471 applications, 219 HR reviews, and software roles breakdown.
471 applications segmented by tech specialization.
Full Stack Developer
Frontend / React / Next.js
Mobile / React Native
AI Engineer / LLM & Python
Backend / .NET / Node.js
Most targeted tech teams & enterprises.
#1
Loodos
#2
ICterra Bilgi ve İletişim Teknolojileri
#3
Jobgether
#4
Etstur
#5
Sezzle
All
Viewed
Active
Closed
481 applications listed
with Accounting Experience Sezzle
Location Unspecified
Junior Software Engineer
Eylül 2026
View JobSezzle
Location Unspecified
Mobil Platform Mühendisi (iOS & Android Cihaz Altyapısı) EGEMSOFT - Egem Bilgi İletişim Ticaret A.Ş.
Eylül 2026
View JobSezzle
Location Unspecified
Senior AI Engineer
Eylül 2026
View JobProotechfull Labs
Location Unspecified
Full Stack Developer
Eylül 2026
View JobHiredBuddy
Location Unspecified
Web Developer
Eylül 2026
View JobVega Networks
Location Unspecified
Junior Software Engineer
Eylül 2026
View JobSezzle
Location Unspecified
Junior Software Engineer
Eylül 2026
View JobMirsis Bilgi Teknolojileri
Location Unspecified
Mobile Application Developer
Eylül 2026
View JobSezzle
Location Unspecified
Principal Backend Engineer | Node.js, TypeScriptColin's
Eylül 2026
View JobSezzle
Location Unspecified
Yapay Zeka Destekli Platform Mimarı (AI-Augmented Platform Architect)Codease
Eylül 2026
View JobSenkron.ai
Location Unspecified
Artificial Intelligence Engineer
Eylül 2026
View JobPentanom Talent
Location Unspecified
Yapay Zeka Yazılım Mühendisi
Eylül 2026
View JobExtract all your job applications into clean JSON directly from browser DevTools Console without installing any third-party extensions.
Open LinkedIn Applied
In LinkedIn, navigate to saved-jobs (Applied tab).
Open DevTools
F12 or Ctrl+Shift+I and open Console tab.
Paste Script & Run
Paste into Console and hit Enter. It will traverse pages (1, 2, 3...) automatically.
Auto Save or Stop
Auto-saves on completion, or type stopAndSave() in console to save immediately.
extract_linkedin_applications.js
| 1 | (async function masterLinkedInScraper() { |
| 2 | const applications = []; |
| 3 | const seenIds = new Set(); |
| 4 | const sleep = (ms) => new Promise((res) => setTimeout(res, ms)); |
| 5 | |
| 6 | window.stopAndSave = () => { |
| 7 | const blob = new Blob([JSON.stringify(applications, null, 2)], { type: "application/json" }); |
| 8 | const a = document.createElement("a"); |
| 9 | a.href = URL.createObjectURL(blob); |
| 10 | a.download = `linkedin_tum_basvurular_${applications.length}.json`; |
| 11 | a.click(); |
| 12 | console.log(`💾 İndirildi! Toplam ${applications.length} başvuru kaydedildi.`); |
| 13 | }; |
| 14 | |
| 15 | function findNextPageButton(targetPage) { |
| 16 | const directSelectors = [ |
| 17 | `button[aria-label="${targetPage}. sayfa"]`, |
| 18 | `button[aria-label="Sayfa ${targetPage}"]`, |
| 19 | `button[aria-label="Page ${targetPage}"]`, |
| 20 | `button[data-test-pagination-page-btn="${targetPage}"]`, |
| 21 | `button[data-page="${targetPage}"]`, |
| 22 | `a[aria-label="${targetPage}. sayfa"]`, |
| 23 | `a[aria-label="Page ${targetPage}"]` |
| 24 | ]; |
| 25 | for (const sel of directSelectors) { |
| 26 | const btn = document.querySelector(sel); |
| 27 | if (btn && !btn.disabled && btn.getAttribute("aria-disabled") !== "true") return btn; |
| 28 | } |
| 29 | |
| 30 | const allPaginationBtns = Array.from( |
| 31 | document.querySelectorAll(".artdeco-pagination button, .artdeco-pagination a, [data-test-pagination] button, [data-test-pagination] a") |
| 32 | ); |
| 33 | |
| 34 | const textBtn = allPaginationBtns.find(b => b.innerText.trim() === String(targetPage)); |
| 35 | if (textBtn && !textBtn.disabled && textBtn.getAttribute("aria-disabled") !== "true") return textBtn; |
| 36 | |
| 37 | const nextByClass = document.querySelector( |
| 38 | "button.artdeco-pagination__button--next, a.artdeco-pagination__button--next, .artdeco-pagination__button--next button, button[data-testid*='next']" |
| 39 | ); |
| 40 | if (nextByClass && !nextByClass.disabled && !nextByClass.classList.contains("artdeco-button--disabled") && nextByClass.getAttribute("aria-disabled") !== "true") { |
| 41 | return nextByClass; |
| 42 | } |
| 43 | |
| 44 | const ariaBtn = allPaginationBtns.find(b => { |
| 45 | const aria = (b.getAttribute("aria-label") || "").toLowerCase(); |
| 46 | return (aria.includes("sonraki") || aria.includes("next") || aria.includes("ileri")) && !aria.includes("önceki") && !aria.includes("prev"); |
| 47 | }); |
| 48 | if (ariaBtn && !ariaBtn.disabled && ariaBtn.getAttribute("aria-disabled") !== "true") return ariaBtn; |
| 49 | |
| 50 | const activeEl = document.querySelector(".artdeco-pagination li.active, .artdeco-pagination li.selected, .artdeco-pagination [aria-current='true']"); |
| 51 | if (activeEl) { |
| 52 | const nextLi = activeEl.closest("li")?.nextElementSibling; |
| 53 | const nextLiBtn = nextLi?.querySelector("button, a"); |
| 54 | if (nextLiBtn && !nextLiBtn.disabled && nextLiBtn.getAttribute("aria-disabled") !== "true" && nextLiBtn.innerText.trim() !== "…") { |
| 55 | return nextLiBtn; |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | const chevronBtn = allPaginationBtns.find(b => { |
| 60 | const svg = b.querySelector("svg, li-icon"); |
| 61 | const iconName = svg ? (svg.getAttribute("data-test-icon") || svg.getAttribute("type") || "") : ""; |
| 62 | return /right|chevron-right|arrow-right/i.test(iconName); |
| 63 | }); |
| 64 | if (chevronBtn && !chevronBtn.disabled && chevronBtn.getAttribute("aria-disabled") !== "true") return chevronBtn; |
| 65 | |
| 66 | return null; |
| 67 | } |
| 68 | |
| 69 | let page = 1; |
| 70 | let consecutiveErrors = 0; |
| 71 | |
| 72 | while (true) { |
| 73 | console.log(`📄 [Sayfa ${page}] Taranıyor...`); |
| 74 | |
| 75 | window.scrollTo({ top: document.body.scrollHeight / 2, behavior: "smooth" }); |
| 76 | await sleep(400); |
| 77 | window.scrollTo({ top: document.body.scrollHeight, behavior: "smooth" }); |
| 78 | await sleep(700); |
| 79 | |
| 80 | // Eşleşme Yok / Sayfa Sonu Erken Algılama |
| 81 | const pageText = document.body.innerText || ""; |
| 82 | const isNoResults = /eşleşme yok|sonuç bulunamadı|eşleşen sonuç yok|başvuru bulunamadı|no matching|no results found|no jobs found/i.test(pageText); |
| 83 | const links = Array.from(document.querySelectorAll('a[href*="/jobs/view/"]')); |
| 84 | |
| 85 | if (isNoResults || (page > 1 && links.length === 0)) { |
| 86 | console.log("🏁 'Eşleşme yok' / Son sayfaya ulaşıldı! Tarama tamamlandı."); |
| 87 | break; |
| 88 | } |
| 89 | |
| 90 | let addedInPage = 0; |
| 91 | |
| 92 | for (const link of links) { |
| 93 | try { |
| 94 | const jobUrl = link.href.split("?")[0]; |
| 95 | const match = jobUrl.match(/\/jobs\/view\/(\d+)/); |
| 96 | const id = match ? match[1] : jobUrl; |
| 97 | |
| 98 | if (seenIds.has(id)) continue; |
| 99 | |
| 100 | const card = link.closest("li") || link.closest("div[data-chameleon-result-urn]") || link.closest(".entity-result") || link.parentElement?.parentElement?.parentElement; |
| 101 | const rawText = card ? card.innerText : ""; |
| 102 | |
| 103 | let jobTitle = link.querySelector("span[aria-hidden='true']")?.innerText || link.innerText || ""; |
| 104 | jobTitle = jobTitle.split("\n")[0].trim(); |
| 105 | |
| 106 | let companyName = ""; |
| 107 | let location = ""; |
| 108 | const companyLink = card?.querySelector('a[href*="/company/"]'); |
| 109 | if (companyLink) { |
| 110 | companyName = companyLink.innerText.split("\n")[0].trim(); |
| 111 | } else { |
| 112 | const subEl = card?.querySelector(".entity-result__primary-subtitle, .artdeco-entity-lockup__subtitle, p, span.t-14"); |
| 113 | if (subEl) { |
| 114 | const parts = subEl.innerText.split("·"); |
| 115 | companyName = parts[0]?.split("\n")[0]?.trim() || ""; |
| 116 | if (parts[1]) location = parts[1].split("\n")[0]?.trim() || ""; |
| 117 | } |
| 118 | } |
| 119 | |
| 120 | if (jobTitle.includes("·")) { |
| 121 | const parts = jobTitle.split("·"); |
| 122 | jobTitle = parts[0].replace(/\d+\s*(gün|hafta|ay|saat).*$/gi, "").trim(); |
| 123 | } |
| 124 | |
| 125 | const img = card?.querySelector("img"); |
| 126 | const logo = img && !img.src.startsWith("data:") ? img.src : ""; |
| 127 | |
| 128 | const workType = rawText.includes("Uzaktan") || rawText.includes("Remote") ? "Remote" |
| 129 | : rawText.includes("Hybrid") || rawText.includes("Hibrit") ? "Hibrit" |
| 130 | : "Yerinde"; |
| 131 | |
| 132 | const timeMatch = rawText.match(/(\d+\s*(?:saat|gün|hafta|ay|yıl)\s*önce\s*başvurdu)/i); |
| 133 | const appliedTime = timeMatch ? timeMatch[1] : "Geçmiş Başvuru"; |
| 134 | |
| 135 | const isClosed = rawText.includes("Artık başvuru kabul etmiyor") || rawText.includes("kapandı") || rawText.includes("kabul edilmiyor"); |
| 136 | const isReposted = rawText.includes("yeniden yayınladı"); |
| 137 | const applicationViewed = rawText.includes("Görüntülendi") || rawText.includes("görüntülendi") || rawText.includes("CV'niz indirildi"); |
| 138 | const cvDownloaded = rawText.includes("CV'niz indirildi") || rawText.includes("Özgeçmiş indirildi"); |
| 139 | |
| 140 | seenIds.add(id); |
| 141 | applications.push({ |
| 142 | id, |
| 143 | jobTitle: jobTitle || "Yazılım Geliştirici", |
| 144 | companyName: companyName || "Şirket", |
| 145 | location, |
| 146 | jobUrl, |
| 147 | workType, |
| 148 | logo, |
| 149 | appliedTime, |
| 150 | applicationViewed, |
| 151 | cvDownloaded, |
| 152 | isClosed, |
| 153 | isReposted |
| 154 | }); |
| 155 | addedInPage++; |
| 156 | } catch (e) {} |
| 157 | } |
| 158 | |
| 159 | console.log(`✅ Sayfa ${page}: +${addedInPage} yeni ilan eklendi. (Toplam: ${applications.length})`); |
| 160 | |
| 161 | const pagContainer = document.querySelector(".artdeco-pagination, .jobs-search-results-list__pagination"); |
| 162 | if (pagContainer) { |
| 163 | pagContainer.scrollIntoView({ behavior: "smooth", block: "center" }); |
| 164 | await sleep(400); |
| 165 | } |
| 166 | |
| 167 | const nextBtn = findNextPageButton(page + 1); |
| 168 | |
| 169 | if (nextBtn) { |
| 170 | nextBtn.scrollIntoView({ behavior: "smooth", block: "center" }); |
| 171 | nextBtn.click(); |
| 172 | page++; |
| 173 | consecutiveErrors = 0; |
| 174 | await sleep(2200); |
| 175 | } else { |
| 176 | console.log(`⚠️ Sonraki buton bulunamadı (Deneme: ${consecutiveErrors + 1}/3)...`); |
| 177 | consecutiveErrors++; |
| 178 | if (consecutiveErrors >= 3) { |
| 179 | console.log("🏁 Bütün sayfalar başarıyla tarandı!"); |
| 180 | break; |
| 181 | } |
| 182 | await sleep(2000); |
| 183 | } |
| 184 | } |
| 185 | |
| 186 | window.stopAndSave(); |
| 187 | })(); |
🔒
This script runs 100% client-side without collecting any personal credentials or transmitting data.