O Indeed não tem API de busca de vagas, e uma requisição simples recebe uma verificação de segurança, não vagas. O Web Unlocker abre a busca em um navegador real e devolve a página com 50 cartões de vagas, com salário e avaliação, cobrada como uma página: 1.000 vagas por 2 centavos.
1.000 requisições grátis · Pague só se der certo · Mais de 195 países · Pronto para o Claude
As páginas do Indeed levam de 10 a 30 segundos para carregar. Ainda está em andamento, não precisa clicar de novo.
Pronto para suas próprias buscas? Obtenha uma chave de API ou agende uma demo.
Conte um pouco sobre sua equipe e receba:
Uma página de busca do Indeed traz 50 cartões de vagas com salário, avaliação da empresa e data de publicação, e o Web Unlocker a cobra como uma página. Os scrapers de Indeed na Apify e na Bright Data cobram cada vaga como um registro próprio.
Uma página, 50 vagas.
Vinte páginas, 1.000 vagas.
Precisa da descrição completa? A página própria de cada vaga é mais uma requisição, então 1.000 vagas com descrições saem por $1.00. Divida um mercado por data, raio, salário ou trabalho remoto, e cada divisão é mais uma página de 50.
Quanto custam 1.000 vagas do Indeed com descrição completa
20 páginas de busca e 1.000 páginas de vagas, a preços publicados
A Bright Data, o Indeed Scraper da própria Apify e o Indeed Job Scraper na Apify cobram cada vaga como um registro: 1.000 registros nos preços do pagamento por uso e do plano Free.
Cem páginas do Indeed pedidas uma após a outra, sem novas tentativas: buscas de vagas em 40 cidades, páginas de vagas, de empresas, de avaliações e quatro sites de países. Veja o que volta e com que rapidez.
Uma página que não volta custa $0.
Você paga por páginas, não por tentativas.
Ordene a busca por data ou limite às últimas 24 horas, e as vagas mais novas ficam no topo. Seu script pede essa página quantas vezes quiser: uma verificação por hora são 24 páginas por dia, $0.71 por mês.
As bases de dados de vagas são atualizadas todo mês.
Sua página é a de hoje.
Scraping do Indeed sem parse de HTML: o próprio JSON do Indeed está dentro de cada página de busca, com 50 vagas com título, empresa, salário, avaliação e data de publicação. A página de uma vaga traz a descrição completa do mesmo jeito.
Preencha o formulário acima. A chave chega por e-mail em até um dia útil.
Uma busca com limit=50 para 50 vagas, a página de uma vaga para a descrição, ou a aba de vagas de uma empresa, página após página.
Extraia o array de resultados da página e você terá todos os campos que o Indeed mostra, do salário à data de publicação.
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python indeed_jobs.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport json
import os
import time
from urllib.parse import urlencode
import requests
query = "marketing manager"
where = "Austin, TX"
def scrape(url):
for attempt in range(3):
response = requests.get(
"https://parsing.webunlocker.gologin.com/v1/scrape",
params={"url": url, "geo": "us", "format": "json"},
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
timeout=90,
)
page = response.json().get("data", {}).get("html", "") if response.ok else ""
if '"results":[{' in page:
return page
time.sleep(5)
raise RuntimeError("No jobs came back, try again later")
def embedded(page, marker):
start = page.index(marker) + len(marker) - 1
value, _ = json.JSONDecoder().raw_decode(page[start:])
return value
search = "https://www.indeed.com/jobs?" + urlencode({"q": query, "l": where, "limit": 50})
page = scrape(search)
jobs = [
{
"title": job["title"],
"company": job["company"],
"location": job["formattedLocation"],
"salary": (job.get("salarySnippet") or {}).get("text"),
"rating": job.get("companyRating") or None,
"posted": job.get("formattedRelativeTime"),
"sponsored": job.get("sponsored", False),
"url": "https://www.indeed.com/viewjob?jk=" + job["jobkey"],
}
for job in embedded(page, '"results":[')
]
print(json.dumps({"query": query, "where": where, "jobs_on_page": len(jobs), "jobs": jobs}, indent=2, ensure_ascii=False))GOLOGIN_SCRAPING_API_KEY=your_key node indeed-descriptions.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst search = 'https://www.indeed.com/jobs?q=registered+nurse&l=Remote&limit=50';
const wanted = 5;
async function scrape(url, marker) {
for (let attempt = 1; attempt <= 3; attempt++) {
const params = new URLSearchParams({ url, geo: 'us', format: 'json' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const page = response.ok ? (await response.json()).data?.html : '';
if (page?.includes(marker)) return page;
await new Promise((resolve) => setTimeout(resolve, 5000));
}
throw new Error(`Nothing came back for ${url}, try again later`);
}
const field = (page, name) => JSON.parse(page.match(new RegExp(`"${name}":("(?:[^"\\\\]|\\\\.)*")`))?.[1] ?? '""');
const text = (markup) => markup.replace(/<[^>]+>/g, ' ').replace(/&/g, '&').replace(/ /g, ' ').replace(/\s+/g, ' ').trim();
const listing = await scrape(search, '"results":[{');
const keys = [...new Set([...listing.matchAll(/"jobkey":"([0-9a-f]{16})"/g)].map((match) => match[1]))];
console.log(`${keys.length} jobs on the search page, reading the first ${wanted} in full`);
for (const key of keys.slice(0, wanted)) {
const job = await scrape(`https://www.indeed.com/m/viewjob?jk=${key}`, '"sanitizedJobDescription"');
const description = text(field(job, 'sanitizedJobDescription'));
console.log(`\n${field(job, 'jobTitle')} at ${field(job, 'companyName')}, ${field(job, 'formattedLocation')} (${description.length} characters)`);
console.log(`${description.slice(0, 280)}...`);
}GOLOGIN_SCRAPING_API_KEY=your_key node indeed-company.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst company = 'Amazon.com';
const pages = 5;
async function scrape(url) {
for (let attempt = 1; attempt <= 3; attempt++) {
const params = new URLSearchParams({ url, geo: 'us', format: 'json' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const page = response.ok ? (await response.json()).data?.html : '';
if (page?.includes('"results":[{')) return page;
await new Promise((resolve) => setTimeout(resolve, 5000));
}
throw new Error(`No jobs came back for ${url}, try again later`);
}
function embedded(page, marker) {
const start = page.indexOf(marker) + marker.length - 1;
const token = /"(?:[^"\\]|\\.)*"|[[\]{}]/g;
token.lastIndex = start;
let depth = 0;
for (let match = token.exec(page); match; match = token.exec(page)) {
depth += '[{'.includes(match[0]) ? 1 : ']}'.includes(match[0]) ? -1 : 0;
if (depth === 0) return JSON.parse(page.slice(start, match.index + 1));
}
return [];
}
const jobs = new Map();
for (let start = 0; start < pages * 20; start += 20) {
const page = await scrape(`https://www.indeed.com/cmp/${company}/jobs?start=${start}`);
const fresh = embedded(page, '"results":[').filter((job) => !jobs.has(job.jobkey));
if (fresh.length === 0) break;
for (const job of fresh) {
jobs.set(job.jobkey, { title: job.title, location: job.formattedLocation, salary: job.salarySnippet?.text ?? null, posted: job.formattedRelativeTime });
}
console.log(`page ${start / 20 + 1}: ${fresh.length} new jobs, ${jobs.size} so far`);
}
console.table([...jobs.values()].slice(0, 10));Pronto para rodar nas suas próprias buscas? Obtenha sua chave de API e requisições grátis.
O Indeed não tem API de busca de vagas para o seu app, e todo scraper de vagas do Indeed pronto cobra cada vaga. Veja o que cada caminho para os dados de vagas do Indeed exige para as mesmas 1.000 vagas.
| O que é preciso | API do Indeed | Apify | Bright Data | |
|---|---|---|---|---|
| Dados de busca de vagas para o seu app | Sim | Não | Sim | Sim |
| Você paga por | Uma página | Sem API | Cada vaga | Cada registro |
| 1.000 vagas com descrições | $1.00 | Nenhum | $0.10 a $6 | $1.50 |
| Vagas em uma requisição | 50 | Nenhuma | Até 1.000 por execução | Um registro |
| Página 2 em diante | Da sua conta | Nenhuma | Sim | Sim |
| Avaliações e salários de empresas | Sim | Não | Não | Sim |
| A página inteira em HTML ou Markdown | Sim | Não | Não | Não |
| Início grátis para empresas | Sim | Não | Sim | Sim |
Vai fazer scraping de outros sites além do Indeed? O Web Unlocker devolve qualquer página do mesmo jeito, pelo mesmo preço.
O Web Unlocker devolve uma página por requisição, e o Indeed mostra a um visitante uma página de vagas antes de pedir um login. Adicione o Cloud Browser para o resto: ele faz login na sua conta do Indeed uma vez e mantém essa sessão ativa, então a página 2, a página 20 e a página 50 abrem como a página 1, no mesmo dispositivo e no mesmo IP residencial.
Sua sessão é um navegador que continua rodando, não um arquivo restaurado. Feche o script hoje à noite, abra amanhã, e o Indeed vê o mesmo visitante logado.
O perfil mantém seus cookies e seu IP residencial de uma execução para outra, então o Indeed vê uma pessoa em um notebook, não um visitante novo a cada página.
Controle pelo Playwright, Puppeteer ou Claude: abra a busca, clique em próxima, leia os cartões, repita. IPs residenciais incluídos.
Rode a partir do Playwright, Puppeteer ou do Claude. Conheça o Cloud Browser.
Uma conta, uma rede de proxies, um ecossistema. Escolha o produto de que a tarefa precisa.
Vai extrair dados de outros sites também? Veja os scrapers do Google Maps, do Reddit e do YouTube, ou todas as ferramentas de web scraping.
Envie o endereço da busca do Indeed ao Web Unlocker com limit=50. Ele abre a página em um navegador real, a partir de um endereço dos EUA, e a devolve com o próprio JSON do Indeed dentro: 50 vagas com título, empresa, local, salário, avaliação da empresa, data de publicação e link. O código acima faz exatamente isso.
Não para busca de vagas. A antiga Publisher API, que devolvia listas de vagas, foi encerrada, e as APIs atuais do Indeed são para parceiros que enviam vagas ao Indeed, como sistemas de recrutamento. Nenhuma devolve resultados de busca a terceiros, então um scraper lê as páginas públicas.
Não existe uma API do Indeed, paga ou grátis, para ler vagas. O Web Unlocker começa com 1.000 requisições grátis, o suficiente para 1.000 páginas de busca com 50 vagas cada.
Os termos do Indeed são escritos para quem procura emprego, e as páginas de busca de vagas são públicas e carregam sem login. O Web Unlocker as carrega como o navegador de um visitante e devolve a página. O que você coleta e como usa é decisão sua, então confira com as regras que valem para o seu projeto.
As vagas são publicadas para serem lidas, e os scrapers leem as páginas públicas que um visitante vê. As regras variam por país e pelo que você faz com os dados, então confira seu uso com elas. O Web Unlocker devolve a página; o resto é com você.
Um programa que carrega as páginas de um site de vagas e extrai as vagas como dados: título, empresa, local, salário, data, descrição e link. No Indeed, o Web Unlocker faz a parte de carregar, e os campos saem do JSON que o Indeed embute em cada página.
Envie o endereço da busca à API de scraper do Indeed com a biblioteca requests, ache o array de resultados na página e carregue-o com o módulo json. A aba Python acima é um script completo, testado na API real: 50 vagas em uma requisição.
A página de cada vaga a traz. Abra indeed.com/m/viewjob?jk= seguido da chave da vaga pelo Web Unlocker: ele devolve a descrição como texto e HTML, com título, empresa, local e tipo de vaga. Uma página por vaga, 1.000 descrições por $0.98.
O Indeed mostra a um visitante uma página da busca e pede uma conta na seguinte. Há dois caminhos: divida a busca por data, raio, salário ou trabalho remoto, e cada divisão é uma página nova de 50 vagas; ou abra o Indeed no Cloud Browser, faça login uma vez na sua própria conta e percorra as páginas a partir dessa sessão.
Tão recentes quanto o próprio Indeed. Ordene a busca por data ou filtre pelas últimas 24 horas, e a página mostra as vagas recém-publicadas. As bases de dados de vagas vendidas por registro atualizam toda semana ou todo mês; uma página é a de hoje.
Sim. A página de uma empresa traz sua nota, o número de avaliações e as vagas abertas; as páginas de avaliações trazem 20 avaliações cada, com pontos positivos e negativos, página após página; a página de salários lista a remuneração por cargo. As páginas de salários por cargo e cidade também funcionam, com a média e a faixa.
Sim. Os sites do Indeed do Reino Unido, do Canadá, da Alemanha e da França devolveram suas páginas de busca do mesmo jeito, com o país de saída ajustado para combinar. Envie o endereço do site do país e escolha o país na requisição.
O Web Unlocker devolve a página, não uma tabela, então nada é cortado antes de você ver. Transformar as vagas em CSV leva poucas linhas de código, ou um prompt: entregue a página ao Claude com a skill de scraping do Gologin e peça um CSV.
Menos de $1 por 1.000 páginas na API de scraper do Indeed, e o mesmo preço para toda página. Uma página de busca tem 50 vagas, então 1.000 vagas de páginas de busca custam 2 centavos, e 1.000 vagas com suas descrições completas cerca de $1. Uma página que não carrega não custa nada. Os planos começam em $49 por mês para 50.000 requisições.
Sim, para começar: o Web Unlocker vem com 1.000 requisições grátis, o suficiente para 50.000 vagas de páginas de busca ou 1.000 descrições completas de vagas.
Depende do que você precisa. Os scrapers de Indeed da Apify e a Bright Data vendem linhas prontas e cobram cada vaga como um registro, e seus usuários relatam execuções que voltam com menos vagas do que o Indeed mostra. O Web Unlocker é um web scraper de Indeed que devolve a página inteira por um preço único, com o próprio JSON do Indeed dentro, então você decide quais campos guardar.
Conte um pouco sobre sua equipe e receba: