---
title: PDF API
emoji: 📄
colorFrom: indigo
colorTo: blue
sdk: docker
app_port: 7860
pinned: false
---
# PDF API
API sederhana untuk mengubah **HTML atau URL menjadi PDF**, ditenagai Express + Playwright (Chromium).
Tujuan: dijual sebagai API di RapidAPI dengan biaya infra minimal.
## Endpoint
| Method | Path | Auth | Keterangan |
| ------ | ------------- | ------ | -------------------------------------------- |
| GET | `/health` | publik | Cek status (untuk health check) |
| POST | `/pdf` | ya | PDF dari `html` atau `url` |
| POST | `/screenshot` | ya | Tangkapan layar (PNG/JPEG) dari `html`/`url` |
Auth: kirim header `X-RapidAPI-Proxy-Secret` (lewat RapidAPI) atau `x-api-key`.
Body `POST /pdf` (JSON):
```json
{ "html": "
Halo
", "format": "A4", "landscape": false }
```
Body `POST /screenshot` (JSON):
```json
{ "url": "https://example.com", "fullPage": true, "type": "png" }
```
Pakai **template + data** (Handlebars) untuk dokumen seperti invoice — pembeli cukup kirim data:
```json
{
"template": "Invoice {{number}}
{{#each items}}{{name}}: {{price}}
{{/each}}Total: {{total}}",
"data": { "number": "INV-001", "items": [{ "name": "Design", "price": "$50" }], "total": "$50" }
}
```
Pilih salah satu dari `html`, `url`, atau `template` (+ `data`) — berlaku untuk `/pdf` dan `/screenshot`.
Atau pakai **template bawaan** (`templateName`) — pembeli cukup kirim `data`, tanpa menyusun HTML. Tersedia: `invoice`.
```json
{
"templateName": "invoice",
"data": {
"company": { "name": "Acme Co", "email": "billing@acme.co" },
"client": { "name": "John Doe" },
"invoice": { "number": "INV-001", "date": "2026-06-01", "due": "2026-06-15" },
"items": [{ "description": "Design work", "quantity": 2, "price": "$25", "amount": "$50" }],
"subtotal": "$50", "tax": "$5", "total": "$55",
"notes": "Thank you!"
}
}
```
Response: `application/pdf`, atau `image/png` | `image/jpeg` (binary).
## Jalan lokal
```bash
npm install
npx playwright install chromium # unduh browser sekali saja
npm start # default http://localhost:8080
```
Tes cepat (hasil tersimpan ke out.pdf):
```bash
curl -X POST http://localhost:8080/pdf \
-H "Content-Type: application/json" \
-d "{\"html\":\"Halo PDF
\"}" \
--output out.pdf
```
## Deploy gratis (pilih salah satu)
**Render / Railway / Fly.io / Google Cloud Run** — semuanya membaca `Dockerfile`:
1. Push repo ini ke GitHub.
2. Buat service baru dari repo, pilih environment **Docker**.
3. Set environment variable `API_KEY` dengan nilai rahasia.
Cloud Run cocok karena scale-to-zero (tidak ada tagihan saat sepi) dan free tier besar.
## Integrasi RapidAPI
1. Deploy dulu, catat URL publik backend (mis. `https://xxx.onrender.com`).
2. Di RapidAPI: **Add New API** → arahkan Base URL ke backend Anda.
3. Aktifkan opsi RapidAPI yang mengirim header rahasia `X-RapidAPI-Proxy-Secret`,
lalu ubah autentikasi backend untuk memverifikasi header itu (lihat catatan keamanan).
4. Tetapkan paket harga (mis. freemium + bayar per request).
## Keamanan
Sudah terpasang:
- **Autentikasi:** set `RAPIDAPI_PROXY_SECRET` (diverifikasi dari header
`X-RapidAPI-Proxy-Secret`) agar hanya gateway RapidAPI yang bisa mengakses
backend, dan/atau `API_KEY` (header `x-api-key`) untuk akses langsung.
Perbandingan rahasia memakai constant-time. Jika keduanya kosong, API TERBUKA
(hanya untuk tes lokal) dan server menampilkan peringatan saat start.
- **Proteksi SSRF:** setiap request jaringan yang dibuat halaman (navigasi awal,
redirect, dan sub-resource) divalidasi; alamat privat/loopback/link-local
(termasuk metadata cloud `169.254.169.254`) serta skema non-http(s) seperti
`file:` diblokir.
Disarankan sebelum skala besar:
- **Timeout render** agar tidak mudah di-abuse (body HTML sudah dibatasi 2 MB).
- **DNS rebinding:** validasi saat ini mengecek IP hasil resolve; untuk hardening
penuh, pin IP yang sudah divalidasi saat fetch.
## Langkah berikutnya
- Tambah opsi margin, ukuran halaman kustom, dan header/footer untuk PDF.
- Tambah timeout render dan rate limiting agar tahan abuse.