scrape
Pengekstrakan berbilang format bersatu daripada satu ambilan. Minta markdown, HTML, HTML mentah, teks, pautan, metadata, tangkapan skrin atau JSON daripada satu muatan halaman — setiap format yang diminta disajikan daripada ambilan yang sama, dan format yang gagal dikembalikan sebagai amaran dan bukannya menggagalkan keseluruhan panggilan.
Kes Penggunaan
Satu Panggilan Ganti Empat
Dapatkan markdown, pautan dan metadata daripada satu halaman dalam satu permintaan tanpa merantai fetch_url, extract_links dan extract_metadata.
Markdown Sedia untuk LLM
Minta markdown dengan onlyMainContent dihidupkan untuk menyalurkan teks halaman yang bersih dan bebas bingkai terus ke saluran RAG atau prompt.
Petikan Arkib
Minta rawHtml dan screenshot serentak untuk merakam kedua-dua keadaan halaman yang boleh dibaca mesin dan keadaan visualnya.
Saluran yang Berdaya Tahan
warnings bagi setiap format membenarkan hasil separa lalu — tangkapan skrin yang gagal tidak pernah membuang markdown yang sudah anda bayar.
Endpoint
/api/v1/tools/scrapeParameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
url | string | Required | - | URL yang hendak dikikis (mesti termasuk protokol: http:// atau https://) Example: https://example.com |
formats | array | Optional | ["markdown"] | Format output yang hendak dikembalikan. Satu atau lebih daripada `markdown`, `html`, `rawHtml`, `text`, `links`, `metadata`, `screenshot`, `json-schema`. Example: ["markdown", "links", "metadata"] |
onlyMainContent | boolean | Optional | true | Buang navigasi, pengepala dan pengaki supaya hanya kandungan utama artikel dikembalikan. Example: true |
Contoh Permintaan
cURL
curl -X POST https://crawlforge.dev/api/v1/tools/scrape \
-H "X-API-Key: cf_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"formats": ["markdown", "links", "metadata"],
"onlyMainContent": true
}'TypeScript
const response = await fetch('https://crawlforge.dev/api/v1/tools/scrape', {
method: 'POST',
headers: {
'X-API-Key': process.env.CRAWLFORGE_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
url: 'https://example.com',
formats: ['markdown', 'links', 'metadata'],
onlyMainContent: true,
}),
});
const data = await response.json();
if (data.success) {
console.log('Markdown:', data.data.markdown);
console.log('Links found:', data.data.links.length);
console.log('Title:', data.data.metadata.title);
// A 200 with warnings is a PARTIAL success — some formats came back, others didn't.
if (data.data.warnings.length > 0) {
console.warn('Partial result:', data.data.warnings);
}
console.log('Credits used:', data.credits_used);
console.log('Credits remaining:', data.credits_remaining);
} else {
console.error('Error:', data.error);
}Python
import requests
import os
response = requests.post(
'https://crawlforge.dev/api/v1/tools/scrape',
headers={
'X-API-Key': os.environ['CRAWLFORGE_API_KEY'],
'Content-Type': 'application/json',
},
json={
'url': 'https://example.com',
'formats': ['markdown', 'links', 'metadata'],
'onlyMainContent': True
}
)
data = response.json()
if data['success']:
print(f"Markdown: {data['data']['markdown']}")
print(f"Links found: {len(data['data']['links'])}")
print(f"Title: {data['data']['metadata']['title']}")
# A 200 with warnings is a PARTIAL success — some formats came back, others didn't.
if data['data']['warnings']:
print(f"Partial result: {data['data']['warnings']}")
print(f"Credits used: {data['credits_used']}")
print(f"Credits remaining: {data['credits_remaining']}")
else:
print(f"Error: {data['error']}")Contoh Respons
{ "success": true, "data": { "url": "https://example.com", "onlyMainContent": true, "formats": [ "markdown", "links", "metadata" ], "markdown": "# Example\n\nMain content scraped from https://example.com.", "links": [ "https://example.com/about", "https://example.com/pricing" ], "metadata": { "title": "Example", "description": "Page at https://example.com" }, "warnings": [] }, "credits_used": 2, "credits_remaining": 998, "processing_time": 412}data.formatsMengulang semula format yang dimintadata.markdownKandungan utama yang ditukar kepada markdown (hadir apabila `markdown` diminta)data.linksSetiap pautan yang ditemui pada halaman (hadir apabila `links` diminta)data.metadataTajuk, penerangan dan tag meta (hadir apabila `metadata` diminta)data.warningsSatu entri bagi setiap format yang tidak dapat dihasilkan. Array kosong bermakna setiap format yang diminta berjaya.credits_usedCredits yang ditolak bagi permintaan ini (2 setiap kikisan, tidak kira bilangan format)credits_remainingBaki credits andaPengendalian Ralat
Input Tidak Sah (400 Bad Request)
Format URL tidak sah, atau formats mengandungi nilai di luar senarai yang disokong. Sekurang-kurangnya satu format diperlukan apabila medan itu dihantar.
URL Disekat (403 Forbidden)
Sasaran diselesaikan kepada alamat peribadi, dalaman atau link-local dan ditolak oleh perlindungan SSRF. Hanya URL yang boleh dicapai secara awam boleh dikikis.
Credits Tidak Mencukupi (402 Payment Required)
Akaun anda tidak mempunyai credits yang mencukupi. Beli lebih banyak credits atau naik taraf pelan anda.
Had Kadar Dilampaui (429 Too Many Requests)
Anda telah melampaui had kadar pelan anda. Tunggu sebentar atau naik taraf pelan anda untuk had yang lebih tinggi.
data.warnings pada setiap respons. Status 200 dengan array warnings yang tidak kosong bermakna sesetengah format berjaya dan sesetengahnya tidak — anggapnya kejayaan separa, bukan kegagalan.Kos Credits
Pelan Free: 1,000 credits sekali sahaja = 500 permintaan
Pelan Hobby: 5,000 credits/bulan = 2,500 permintaan (USD 19/bulan)
Pelan Professional: 50,000 credits/bulan = 25,000 permintaan (USD 99/bulan)
Pelan Business: 250,000 credits/bulan = 125,000 permintaan (USD 399/bulan)