API Papan Kerja
Enam sistem penjejakan pemohon menerbitkan jawatan kosong sesebuah syarikat melalui API yang mereka sendiri dokumenkan untuk kegunaan awam tanpa pengesahan. scrape_template membaca API tersebut secara terus — nilai yang tepat, tiada LLM dalam laluan, dan dibenarkan secara binaan dan bukan melalui hujah.
1. Mengapa API platform itu sendiri mengatasi scraping papan kerja
Halaman kerjaya sesebuah syarikat hanyalah paparan sebuah pangkalan data. Sistem penjejakan pemohon di belakangnya — Greenhouse, Lever, Ashby, Workable, Recruitee, Teamtailor — ialah sistem rekod yang majikan benar-benar terbitkan, dan kesemua enam itu mendokumenkan satu endpoint awam yang menyajikan rekod yang sama sebagai JSON atau RSS.
Membaca endpoint itu bukan cara scraping yang lebih murah. Ia satu operasi berbeza dengan mod kegagalan yang berbeza: tiada markup untuk tersalah huraikan, tiada widget penomboran untuk diklik, dan tiada model bahasa yang menentukan maksud sesuatu medan.
Papan kerja yang sama, dua cara
| Scraping papan yang dipaparkan | Membaca API platform | |
|---|---|---|
| Nilai | Dihurai daripada markup; reka bentuk baharu mengubahnya secara senyap | Tepat, seperti yang dimasukkan oleh majikan |
| Liputan | Apa sahaja yang halaman paparkan pada lukisan pertama | Setiap jawatan yang diterbitkan pada papan itu |
| Permintaan | Satu setiap halaman, ditambah penomboran | Satu permintaan untuk papan itu, dinombor hanya di mana platform menomborkan |
| Tafsiran | Pemilih atau LLM menentukan maksud sesuatu medan | Tiada apa-apa disimpulkan; medan yang tiada dibaca sebagai null |
| Kebenaran | Dihujahkan kes demi kes | Platform mendokumenkan endpoint itu untuk kegunaan awam |
2. Enam penyambung papan kerja
Setiap penyambung ditujukan kepada endpoint yang platform itu sendiri dokumenkan untuk kegunaan awam tanpa pengesahan, pada hos yang robots.txt-nya mengizinkannya. Hantar URL papan kerja dan penyambung akan menyelesaikan endpoint API untuk anda, atau hantar params dengan pengecam syarikat pada papan tersebut.
greenhouse-jobscontent: true.Token papan daripada job-boards.greenhouse.io/<token>
lever-postingsskip dan limit.Syarikat daripada jobs.lever.co/<company>
ashby-jobsNama halaman kerja daripada jobs.ashbyhq.com/<name>
workable-jobsdetails: true.Subdomain akaun daripada apply.workable.com/<subdomain>
recruitee-offersSubdomain daripada <company>.recruitee.com
teamtailor-jobstt:-nya dikekalkan supaya lokasi, jabatan, peranan dan bahagian terus kekal. Memulangkan 100 jawatan melainkan per_page menyatakan sebaliknya.Subdomain daripada <company>.teamtailor.com
content: true menambah penerangan HTML penuh dan membawa sebuah papan besar daripada 349 KB kepada 4.2 MB (papan 571 jawatan milik Stripe, diukur pada 2026-08-28). details: true Workable berkelakuan sama. Minta penerangan apabila anda memerlukannya, bukan kerana kebiasaan.api.lever.co mengisytiharkan Crawl-delay: 1 dalam robots.txt-nya, jadi lever-postings menerbitkan semula nilai itu sebagai crawlDelaySeconds: 1 untuk dipatuhi oleh lapisan yang membuat permintaan. Penyambung tidak pernah membuat permintaan sendiri — ia membina URL dan menghurai respons, yang mengekalkan had masa, dasar SSRF dan pengehadan kadar pada lapisan yang memilikinya.3. Satu bentuk pekerjaan merentas enam platform
Kesemua enam penyambung dinormalkan kepada dua belas medan yang sama, jadi dua papan kerja boleh digabungkan tanpa langkah pemetaan bagi setiap sumber. Medan yang platform tidak bawa akan pulang sebagai null — bukan tekaan yang kelihatan munasabah.
Bentuk pekerjaan yang dikongsi
| Medan | Maksud |
|---|---|
id | Pengecam platform itu sendiri, ditukar kepada teks supaya senarai bergabung mempunyai satu jenis pengecam |
title | Tajuk jawatan |
url | Iklan jawatan awam |
location | Lokasi seperti yang dinyatakan platform |
department | Jabatan, apabila platform mempunyai tahap itu |
team | Pasukan, apabila platform mempunyai tahap itu |
employment_type | Disampaikan dalam perkataan platform itu sendiri, tanpa dileburkan kepada satu perbendaharaan kata |
remote | true, false, atau null apabila perkataan sumber tidak menjawabnya |
published_at | ISO 8601, dinormalkan daripada enam format tarikh berbeza |
updated_at | ISO 8601, apabila platform menerbitkannya |
description | Teks biasa, dengan HTML platform dibuang |
source | Penyambung yang menghasilkan rekod itu |
- Tiada apa-apa disimpulkan. Greenhouse langsung tidak menerbitkan jenis pekerjaan, jadi jawatan Greenhouse melaporkan
nulldi situ dan bukanFull-timeyang kedengaran yakin. - `remote` menjawab satu soalan sahaja: bolehkah kerja ini dilakukan dari mana-mana? Hibrid memang separa jarak jauh, jadi ia dibaca sebagai
nulldan perkataan asal platform dikekalkan di sebelahnya. Membaca jawatan hibrid sebagai jarak jauh sama salahnya dengan membacanya sebagai di pejabat. - `employment_type` mengekalkan ejaan platform. Menentukan apa sebenarnya
Regular Full Time (Salary)Lever ialah hak anda, yang dapat melihat data anda sendiri. - Maklumat hubungan perekrut dibuang, bukan dipetakan. Recruitee meletakkan peti masuk permohonan bagi setiap jawatan pada setiap tawaran; medan itu tidak pernah sampai ke output. Iklan jawatan ialah data syarikat, dan itu sahaja yang penyambung ini pulangkan.
Dua papan kerja, satu senarai
Kerana bentuknya dikongsi, menggabungkan papan Greenhouse dengan papan Lever tidak memerlukan kod pemetaan.
// Every job-board connector returns the same twelve fields, so two boards
// concatenate with no per-source mapping step.
const API = 'https://crawlforge.dev/api/v1/tools/scrape_template';
async function board(template: string, params: Record<string, unknown>) {
const response = await fetch(API, {
method: 'POST',
headers: {
'X-API-Key': process.env.CRAWLFORGE_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({ template, params }),
});
const payload = await response.json();
return payload.data.data.items;
}
const jobs = [
...(await board('greenhouse-jobs', { company: 'stripe' })),
...(await board('lever-postings', { company: 'matterport' })),
];
// One filter over both boards. `remote` is null wherever the platform's own
// word did not answer the question — hybrid is not remote and not on-site.
const remote = jobs.filter((j) => j.remote === true);
// Cost: 1 credit per call — 2 credits for both boards, however many jobs.4. Cara memanggilnya: params dan auto
Penyambung papan kerja memerlukan pengecam syarikat pada platform itu, iaitu satu rentetan pendek dalam URL papan dan bukan keseluruhan URL. Hantarkannya dalam params.
Apabila anda sudah mempunyai URL dan tidak mahu memikirkan templat mana yang mengendalikannya, hantar template: "auto" dan CrawlForge akan memilih templat daripada URL tersebut — secara deterministik, dengan corak yang menamakan hos mengatasi corak yang hanya sepadan dengan bentuk laluan.
Kedua-dua gaya panggilan
Papan kerja yang sama, dicapai dengan dua cara.
# A job-board connector needs the company's identifier on that platform,
# not the whole careers-page URL. That is what `params` carries.
curl -X POST https://crawlforge.dev/api/v1/tools/scrape_template \
-H "X-API-Key: $CRAWLFORGE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"template": "greenhouse-jobs",
"params": {
"company": "stripe"
}
}'
# Add "content": true to the params for full descriptions — it takes a large
# board past 4 MB, so ask for it only when you need the text.{ "template": "list" } tanpa URL untuk mendapatkan setiap templat berserta pengecam, penerangan dan mode-nya — list untuk penyambung yang memulangkan banyak rekod daripada satu panggilan, entity untuk yang memulangkan satu rekod sahaja.5. Idea yang sama, di luar bidang pengambilan pekerja
Papan kerja ialah kes yang paling jelas, tetapi prinsipnya berlaku di mana-mana: apabila sesuatu pengendali menerbitkan datanya sendiri, itulah yang dibaca.
shopify-collectionproducts.json kedai itu sendiri — harga tepat, harga banding dan stok yang sama seperti yang shopify-product pulangkan bagi satu item, jadi koleksi dan halaman produk tidak mungkin bercanggah.nhtsa-vinnpi-provider6. Apa yang kami tidak buat, dan sebabnya
Senarai di bawah bukan pelan hala tuju. Setiap entri ialah laluan yang kami pertimbangkan, yang secara teknikal boleh kami ambil, dan yang kami tolak atas sebab yang dinyatakan.
Sumber awam tanpa pengesahan sahaja
smartrecruiters-postingsapi.smartrecruiters.com/robots.txt melarang segala-galanya bagi setiap ejen, dengan satu pengecualian tunggal untuk LinkedInBot (disahkan 2026-08-28). Mencapai endpoint itu sebagai sesiapa yang lain bermakna membatalkan robots.txt pada setiap panggilan, dan itu bukan keputusan yang boleh dibuat oleh penyambung bagi pihak anda. Dikecualikan sementara menunggu perjanjian dengan SmartRecruiters.robots.txt dipatuhi — kami tidak membatalkannya
wday/cxs Workday ialah endpoint dalaman tapak kerjaya itu sendiri, bukan API yang Workday dokumenkan untuk kegunaan awam. Mana-mana penyambung terhadapnya bergantung pada pengesahan bertulis pelanggan, dan tiada satu pun yang dihantar hari ini.Bukan API awam berdokumentasi
Tidak ditawarkan pada mana-mana pelan
npi-provider ialah carian daftar atas sebab itulah: satu rekod bagi setiap NPI, tanpa apa-apa dicantumkan padanya.Data syarikat, bukan data orang
Peraturan yang mendasari penyambung ini
- Halaman dan endpoint awam tanpa pengesahan sahaja.
- API berdokumentasi diutamakan berbanding scraping di mana sahaja ia wujud.
robots.txtdipatuhi secara lalai pada setiap alat yang membuat permintaan. Pembatalan bersifat eksplisit, setiap permintaan, dan direkodkan terhadap API key anda — dan ia tidak akan sesekali mencapai hos dalam senarai pengecualian kekal CrawlForge.- CrawlForge memperkenalkan dirinya dengan jujur: satu user agent, nama produk yang sebenar, dan satu URL hubungan. Lihat pengesahan perangkak.
- Kadar yang sopan secara lalai, dengan
Crawl-delaydanRetry-Afterdipatuhi. - Permintaan menarik diri dan permintaan penurunan dipatuhi secara kekal, pada lapisan platform.
scrape_template berharga 1 credit setiap panggilan, apa jua penyambung yang anda guna dan seberapa banyak jawatan yang dipulangkan.