Dokumentasi API

Dokumentasi Wisepage

Semua yang Anda butuhkan untuk memanggil Wisepage dari kode Anda: autentikasi, setiap endpoint beserta parameternya, penagihan kredit dan kode error.

Mulai cepat

Semua endpoint ada di https://api.wisepage.dev. Kirim JSON lewat POST dengan API key Anda di header. Selama beta privat, API key dikirim lewat email setelah Anda mendaftar.

curl https://api.wisepage.dev/v1/scrape \
  -H "Authorization: Bearer $WISEPAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com"}'

Mau langsung dipakai di Claude Code, Cursor atau VS Code? Lihat panduan MCP. Kredit, batas dan log pemakaiannya sama dengan REST.

Autentikasi

Kirim API key di header Authorization: Bearer wsp_live_..., atau di header x-api-key. Simpan key di variabel lingkungan atau secret manager, jangan di kode yang dibagikan. Kalau key bocor, kirim email ke hello@wisepage.dev dan kami ganti.

Format respons

Respons yang berhasil selalu berbentuk {"success": true, "credits_used": ..., "data": ...}. Respons error memakai status HTTP yang sesuai dan bentuk berikut:

{ "error": { "code": "url_not_allowed", "message": "Private and reserved IP addresses are not allowed" } }

Pakai code di kode Anda; message ditujukan untuk manusia dan bisa berubah. Daftar lengkapnya ada di Kode error.

Kredit dan harga

Sebelum request dijalankan, biaya maksimumnya ditahan dari saldo. Setelah selesai, Anda hanya membayar yang benar-benar terpakai dan sisanya langsung kembali. Request yang gagal tidak ditagih sama sekali.

EndpointBiaya
scrape1 kredit per halaman; PDF 1 kredit per 10 halaman
batch/scrape1 kredit per halaman yang berhasil
crawl1 kredit per halaman yang berhasil
map1 kredit per panggilan
search3 kredit, +1 per hasil yang di-scrape
extract5 kredit + 4 per 1.000 token masuk + 20 per 1.000 token keluar (biasanya 15–30)
usageGratis

Setiap respons mencantumkan credits_used. Kalau saldo tidak cukup, API membalas 402 insufficient_credits tanpa menjalankan request.

Batas pemakaian

Cache

Halaman yang baru diambil disimpan sebentar, jadi request yang sama lebih cepat dan situs tidak diambil ulang. Atur umur salinan yang Anda terima dengan max_age (detik, default 3600, maksimal 86400). Pakai "max_age": 0 untuk selalu mengambil versi terbaru. Respons menyertakan cached dan fetched_at, dan salinan dari cache ditagih sama seperti pengambilan baru.

Endpoint

POST/v1/scrape

Mengambil satu halaman web atau file PDF dan mengembalikannya sebagai markdown bersih beserta metadata. Halaman yang butuh JavaScript dirender otomatis.

ParameterTipeKeterangan
url wajibstringHalaman atau PDF yang diambil (http atau https).
formatsarraymarkdown, html, links. Default ["markdown"].
only_main_contentbooleanBuang menu, header, footer dan iklan. Default true.
renderstringauto (hanya kalau perlu JavaScript), always atau never. Default auto.
wait_for_msnumberTunggu tambahan setelah halaman dimuat saat dirender, 0–10.000.
timeout_msnumber1.000–60.000. Default 20.000.
respect_robotsbooleanTolak URL yang dilarang robots.txt situsnya. Default false.
max_agenumberLihat Cache.
{
  "success": true,
  "credits_used": 1,
  "data": {
    "url": "https://example.com/",
    "status_code": 200,
    "rendered": false,
    "markdown": "# Example Domain\n\nThis domain is for use in ...",
    "metadata": { "title": "Example Domain", "language": "en", "description": null, ... },
    "cached": false,
    "fetched_at": "2026-09-28T04:12:00.000Z"
  }
}

POST/v1/batch/scrape

Mengambil hingga 50 URL dalam satu panggilan dengan opsi yang sama. Hasil kembali sesuai urutan input; URL yang gagal mendapat kode error tanpa menggagalkan yang lain.

ParameterTipeKeterangan
urls wajibarray1–50 URL.
Ditambah semua opsi scrape kecuali url.
"data": {
  "results": [
    { "url": "https://a.example/", "success": true, "data": { "markdown": "...", ... } },
    { "url": "https://b.example/", "success": false, "error": "fetch_timeout" }
  ],
  "stats": { "succeeded": 1, "failed": 1, "stopped_reason": "done" }
}

POST/v1/crawl

Mengikuti tautan dalam satu situs mulai dari satu halaman, dan mengembalikan hingga 50 halaman sebagai markdown.

ParameterTipeKeterangan
url wajibstringHalaman awal.
limitnumberJumlah halaman maksimal, 1–50. Default 10.
max_depthnumberBerapa tautan jauhnya dari halaman awal, 0–5. Default 2.
include_paths, exclude_pathsarrayPola path, misalnya "/docs/*". Maksimal 20.
include_subdomainsbooleanIkut ke subdomain. Default false.
use_sitemapbooleanTambahkan halaman dari sitemap. Default false.
include_pdfsbooleanIkut membaca PDF yang ditautkan. Default false.
respect_robotsbooleanDefault true untuk crawl.
Juga only_main_content, render dan max_age seperti scrape.

Respons berisi pages (url, markdown, metadata), failed (url dan kode error) dan stats. Kredit untuk limit halaman ditahan di awal; halaman yang gagal atau tidak sempat diambil dikembalikan.

POST/v1/map

Mendaftar URL sebuah situs dari sitemap dan tautan di halamannya, tanpa membuka setiap halaman. Cocok untuk memilih halaman sebelum batch/scrape.

ParameterTipeKeterangan
url wajibstringHalaman mana pun di situs itu.
limitnumber1–5.000. Default 500.
searchstringHanya URL yang mengandung teks ini.
sitemapstringinclude, skip atau only. Default include.
Juga include_subdomains, include_paths, exclude_paths dan include_pdfs seperti crawl.

Mencari di web (hasil Google) dan mengembalikan judul, URL dan cuplikan. Aktifkan scrape_results untuk sekalian mendapat isi setiap halaman sebagai markdown.

ParameterTipeKeterangan
query wajibstringKata kunci, maksimal 400 karakter.
limitnumber1–10. Default 5.
countrystringKode negara dua huruf, misalnya id.
languagestringBahasa hasil, misalnya id.
scrape_resultsbooleanAmbil juga isi setiap hasil. Default false.

POST/v1/extract

Mengambil data terstruktur dari satu halaman atau PDF sesuai JSON Schema Anda. Responsnya selalu cocok dengan skema.

ParameterTipeKeterangan
url wajibstringHalaman atau PDF sumber data.
schema wajibobjectJSON Schema dengan akar "type": "object", maksimal 20.000 karakter.
promptstringInstruksi tambahan, maksimal 4.000 karakter.
Juga render, timeout_ms dan max_age seperti scrape.
curl https://api.wisepage.dev/v1/extract \
  -H "Authorization: Bearer $WISEPAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://toko.example/produk/123",
    "schema": {
      "type": "object",
      "properties": {
        "nama": { "type": "string" },
        "harga": { "type": "number" },
        "tersedia": { "type": "boolean" }
      },
      "required": ["nama", "harga"]
    }
  }'

Respons berisi data (hasil sesuai skema), source (url, judul, dan truncated kalau halaman lebih dari 60.000 karakter dipotong) dan usage (token yang dipakai). Anda perlu minimal 5 kredit untuk memulai; setelah halaman diambil, biaya maksimum untuk halaman itu ditahan lalu sisanya dikembalikan.

GET/v1/usage

Sisa kredit dan daftar panggilan terakhir beserta biaya dan statusnya. Parameter query limit 1–200, default 50. Gratis.

"data": {
  "credits_remaining": 4812,
  "recent": [ { "operation": "scrape", "credits": 1, "success": true, "duration_ms": 412, ... } ]
}

PDF

Semua endpoint yang mengambil halaman juga bisa membaca PDF, termasuk file yang dikirim server sebagai unduhan biasa. Isinya dikembalikan sebagai markdown yang rapi: judul, paragraf, daftar dan tabel disusun ulang dari tata letaknya, sedangkan header, footer dan nomor halaman yang berulang dibuang. Penanda <!-- page N --> memisahkan halaman, dan respons menyertakan pdf: { pages, pages_parsed, truncated }.

Hingga 100 halaman dan 20 MB dibaca per file, dengan biaya 1 kredit per 10 halaman. PDF hasil scan tanpa lapisan teks dibalas 422 pdf_no_text, dan PDF berpassword 422 pdf_encrypted.

Spesifikasi OpenAPI

Semua endpoint di halaman ini juga tersedia sebagai file OpenAPI (YAML). File itu ditujukan untuk program, bukan untuk dibaca langsung: impor ke Postman atau Insomnia untuk mencoba setiap endpoint, buka di Swagger UI atau Redoc untuk dokumentasi interaktif, atau pakai generator kode untuk membuat library di bahasa Anda.

https://wisepage.dev/openapi.yaml

Kode error

StatusKodeArtinya
400invalid_requestBody tidak valid. details menunjukkan field mana yang salah.
400url_not_allowedURL bukan http(s) publik, misalnya alamat jaringan privat.
400invalid_schemaJSON Schema untuk extract tidak valid atau tidak didukung.
401missing_api_key, invalid_api_keyAPI key tidak dikirim, salah, atau sudah dicabut.
402insufficient_creditsSaldo tidak cukup untuk request ini.
403blocked_by_robotsrobots.txt situs melarang URL ini.
403domain_blockedPemilik situs meminta situsnya tidak diambil.
413response_too_largeHalaman lebih dari 5 MB atau PDF lebih dari 20 MB.
415unsupported_content_typeTipe file belum didukung, misalnya gambar atau ZIP.
422pdf_no_text, pdf_encrypted, pdf_invalidPDF hasil scan, berpassword, atau rusak.
422extract_refusedModel menolak mengambil data dari halaman ini.
429rate_limited, domain_rate_limitedTerlalu banyak request; lihat Batas pemakaian.
502fetch_failed, dns_failed, too_many_redirects, render_failedSitus tujuan tidak bisa diambil.
502extract_failed, extract_truncated, search_failedPenyedia AI atau pencarian bermasalah, atau hasil extract terlalu besar.
503browser_busy, pdf_busy, extract_busy, search_busyKapasitas sedang penuh; coba lagi sebentar.
504fetch_timeoutSitus tidak merespons dalam batas waktu.

Semua error di atas tidak ditagih. Masih ada pertanyaan? Tulis ke hello@wisepage.dev.