Referensi API
REST API ConvertFly memungkinkan Anda mengonversi, mengoptimalkan, dan mengubah file secara terprogram. Bangun pipeline konversi dengan job dan task: impor file, proses, lalu ekspor hasilnya dalam satu permintaan.
https://convertfly.io/api/v1Semua endpoint relatif terhadap URL dasar ini. Permintaan dan respons menggunakan JSON. Semua stempel waktu dalam UTC ISO 8601.
Autentikasi
Setiap permintaan harus menyertakan kunci API di header Authorization. Kunci diawali dengan cvfly_sk_ dan dapat dibuat di dasbor Anda.
Authorization: Bearer cvfly_sk_live_abc123def456...Tips keamanan: Jangan pernah mengekspos kunci API di kode sisi klien. Simpan kunci di variabel lingkungan dan lakukan panggilan API dari server Anda.
Cakupan kunci
Kunci API dapat dibatasi untuk operasi tertentu. Kunci yang dibuat tanpa daftar cakupan mendapatkan cakupan bawaan.
| Cakupan | Akses |
|---|---|
| job:read | Membaca job(bawaan) |
| job:write | Membuat, membatalkan, mengulang, dan menghapus job beserta task-nya(bawaan) |
| task:read | Membaca task(bawaan) |
| convert | Menjalankan konversi(bawaan) |
| api-key:read | Melihat daftar kunci API |
| api-key:write | Membuat dan mencabut kunci API |
| webhook:read | Melihat daftar webhook |
| webhook:write | Membuat dan menghapus webhook |
Mulai cepat
Konversi PDF ke DOCX dalam tiga langkah: buat job, tunggu hingga selesai, lalu unduh hasilnya.
Buat job konversi
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/report.pdf"
},
"convert": {
"operation": "convert",
"input": ["import-file"],
"output_format": "docx"
},
"export": {
"operation": "export/url",
"input": ["convert"]
}
}
}'const res = await fetch("https://convertfly.io/api/v1/jobs", {
method: "POST",
headers: {
"Authorization": "Bearer cvfly_sk_live_abc123...",
"Content-Type": "application/json",
},
body: JSON.stringify({
tasks: {
"import-file": {
operation: "import/url",
url: "https://example.com/report.pdf",
},
convert: {
operation: "convert",
input: ["import-file"],
output_format: "docx",
},
export: {
operation: "export/url",
input: ["convert"],
},
},
}),
});
const job = await res.json();
console.log(job.id); // "cmxr9k2p0..."
console.log(job.status); // "processing"import requests
resp = requests.post(
"https://convertfly.io/api/v1/jobs",
headers={"Authorization": "Bearer cvfly_sk_live_abc123..."},
json={
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/report.pdf",
},
"convert": {
"operation": "convert",
"input": ["import-file"],
"output_format": "docx",
},
"export": {
"operation": "export/url",
"input": ["convert"],
},
}
},
)
job = resp.json()
print(job["id"]) # "cmxr9k2p0..."
print(job["status"]) # "processing"Tunggu hingga selesai
Periksa status job secara berkala atau gunakan webhook untuk notifikasi waktu nyata.
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_live_abc123..."{
"id": "cmxr9k2p0",
"status": "finished",
"created_at": "2026-04-03T10:30:00Z",
"tasks": [
{
"name": "export",
"operation": "export/url",
"status": "finished",
"result": {
"files": [
{ "url": "https://files.convertfly.io/d/cmv.../result.docx?e=...&s=..." }
]
}
}
]
}Unduh hasilnya
Gunakan URL dari hasil task ekspor. Tautan unduhan berlaku selama 1 jam; file dihapus 24 jam setelah diunggah.
curl -o result.docx "https://files.convertfly.io/d/..."Job
Job adalah wadah untuk satu atau beberapa task yang membentuk pipeline konversi. Task dalam satu job dijalankan sesuai urutan dependensi; setiap task dapat merujuk keluaran task sebelumnya melalui kolom input.
Konsep pipeline
Pipeline umumnya terlihat seperti ini: import/url -> convert -> export/url. Anda juga dapat merangkai beberapa operasi: impor -> konversi -> optimalkan -> tanda air -> ekspor.
Status job
| Status | Deskripsi |
|---|---|
| waiting | Job dibuat dan masuk antrean untuk diproses |
| processing | Setidaknya satu task sedang berjalan |
| finished | Semua task berhasil diselesaikan |
| error | Satu atau beberapa task gagal |
Membuat job
/api/v1/jobstagstringLabel opsional untuk mengelompokkan job (mis. batch-2026-04).
tasksobjectwajibPeta nama task ke definisi task. Nama task harus unik dalam satu job.
webhook_urlstringURL yang menerima event job.finished atau job.failed saat job selesai.
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tag": "invoice-batch",
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/invoice.pdf"
},
"to-png": {
"operation": "convert",
"input": ["import-file"],
"output_format": "png",
"options": { "density": 300 }
},
"export": {
"operation": "export/url",
"input": ["to-png"]
}
}
}'{
"id": "cmxr9k2p0",
"tag": "invoice-batch",
"status": "processing",
"created_at": "2026-04-03T10:30:00Z",
"tasks": [
{ "name": "import-file", "operation": "import/url", "status": "finished" },
{ "name": "to-png", "operation": "convert", "status": "processing" },
{ "name": "export", "operation": "export/url", "status": "waiting" }
]
}Contoh: menggabungkan file menjadi satu PDF
Operasi merge menggabungkan dua masukan atau lebih (PDF dan/atau gambar) menjadi satu PDF. Cantumkan nama task masukan secara berurutan dalam larik input.
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"cover": {
"operation": "import/url",
"url": "https://example.com/cover.png"
},
"report": {
"operation": "import/url",
"url": "https://example.com/report.pdf"
},
"merge-all": {
"operation": "merge",
"input": ["cover", "report"]
},
"export": {
"operation": "export/url",
"input": ["merge-all"]
}
}
}'Contoh: mengambil tangkapan situs web
Operasi capture-website tidak memerlukan task masukan: operasi ini merender URL publik menjadi PDF, PNG, atau JPG.
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"capture": {
"operation": "capture-website",
"url": "https://example.com",
"output_format": "pdf",
"width": 1280
},
"export": {
"operation": "export/url",
"input": ["capture"]
}
}
}'Mengambil job
/api/v1/jobs/:idAmbil detail job dan status semua task-nya.
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."Melihat daftar job
/api/v1/jobspageintegerNomor halaman, dimulai dari 1. Bawaan: 1.
limitintegerHasil per halaman, 1-100. Bawaan: 20.
statusstringSaring berdasarkan status: WAITING, PROCESSING, FINISHED, ERROR.
tagstringSaring berdasarkan tag.
curl "https://convertfly.io/api/v1/jobs?status=finished&per_page=5" \
-H "Authorization: Bearer cvfly_sk_..."{
"data": [ ... ],
"links": { "first": "?page=1&per_page=5", "last": "?page=9&per_page=5", "prev": null, "next": "?page=2&per_page=5" },
"meta": {
"page": 1,
"per_page": 5,
"total": 42
}
}Menghapus job
/api/v1/jobs/:idHapus job beserta semua file terkaitnya. Task yang sedang berjalan akan dibatalkan. Tindakan ini tidak dapat dibatalkan.
curl -X DELETE https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."Menunggu hingga selesai
/api/v1/jobs/:id/waitEndpoint long-poll yang menahan respons hingga job mencapai status akhir (FINISHED atau ERROR). Waktu habis setelah 300 detik dengan respons 202 Accepted jika job masih diproses.
curl "https://convertfly.io/api/v1/jobs/job_7kX9mP2qR/wait?timeout=120" \
-H "Authorization: Bearer cvfly_sk_..."Task
Task adalah langkah-langkah individual dalam sebuah job. Setiap task memiliki nama (kunci dalam objek tasks), sebuah operation, dan secara opsional larik input yang merujuk nama task sebelumnya.
Kolom task
| Kolom | Tipe | Deskripsi |
|---|---|---|
| operation | string | Operasi yang dijalankan (lihat Operasi) |
| input | string[] | Nama task yang keluarannya digunakan sebagai masukan |
| output_format | string | Format tujuan untuk operasi konversi |
| options | object | Pengaturan khusus operasi (kualitas, kepadatan, dll.) |
Melihat daftar task suatu job
/api/v1/jobs/:id/tasks{
"data": [
{
"name": "import-file",
"operation": "import/url",
"status": "finished",
"result": { "file_id": "file_Xk9m..." }
},
{
"name": "convert",
"operation": "convert",
"status": "finished",
"result": { "file_id": "file_Pm3n..." }
}
]
}Mengambil task
/api/v1/jobs/:job_id/tasks/:task_nameMembatalkan task
/api/v1/jobs/:job_id/tasks/:task_name/cancelBatalkan task yang sedang berjalan atau menunggu. Task turunan yang bergantung padanya juga akan dibatalkan.
Mengulang task yang gagal
/api/v1/jobs/:job_id/tasks/:task_name/retryUlangi task yang berstatus ERROR. Tindakan ini memakai kredit lagi jika task tersebut berbayar.
Unggah file
Ada tiga cara untuk memasukkan file ke ConvertFly. Pilih yang paling sesuai dengan kebutuhan Anda.
Impor dari URL
Metode paling sederhana. ConvertFly mengunduh file dari URL yang dapat diakses publik.
{
"import-file": {
"operation": "import/url",
"url": "https://example.com/document.pdf",
"filename": "document.pdf",
"headers": {
"Authorization": "Bearer your-external-token"
}
}
}Unggah langsung (URL presigned)
Untuk file di komputer lokal Anda. Prosesnya dua langkah: pertama buat task untuk mendapatkan URL unggahan presigned, lalu kirim file Anda dengan PUT ke URL tersebut.
{
"upload-file": {
"operation": "import/upload",
"filename": "photo.jpg"
}
}# The task result will contain the presigned URL
curl -X PUT "https://files.convertfly.io/convertfly-files/..." \
-H "Content-Type: image/jpeg" \
--data-binary @photo.jpgImpor dari Base64
Untuk file kecil (di bawah 10 MB). Sematkan isi file langsung di dalam permintaan.
{
"import-file": {
"operation": "import/base64",
"file": "JVBERi0xLjQKJcOkw7zD...",
"filename": "document.pdf"
}
}| Metode | Ukuran maks. | Paling cocok untuk |
|---|---|---|
| import/url | 5 GB | File yang sudah di-hosting online |
| import/upload | 5 GB | File lokal, file besar |
| import/base64 | 10 MB | File kecil, langsung di dalam permintaan |
Opsi konversi
Setiap operasi mendukung opsi tertentu. Berikut semua operasi yang tersedia dan pasangan format untuk konversi.
Operasi yang tersedia
| Operasi | Deskripsi | Kredit |
|---|---|---|
| import/upload | Unggah file melalui URL presigned | 0 |
| import/url | Impor file dari URL | 0 |
| import/base64 | Impor file dari data base64 | 0 |
| convert | Konversi antarformat | 1-4 |
| optimize | Kompres/optimalkan file | 1 |
| thumbnail | Buat gambar mini pratinjau | 1 |
| merge | Gabungkan beberapa PDF dan/atau gambar menjadi satu PDF | 1 |
| watermark | Tambahkan tanda air teks atau gambar ke gambar, video, atau PDF | 1 |
| split | Ekstrak halaman dari PDF, atau pisahkan menjadi satu PDF per halaman (ZIP) | 1 |
| rotate | Putar halaman PDF sebesar 90, 180, atau 270 derajat | 1 |
| resize | Ubah ukuran gambar berdasarkan lebar, tinggi, atau persentase, dengan proporsi tetap | 1 |
| gif | Ubah klip video menjadi GIF animasi (awal, durasi, fps, lebar) | 2 |
| ocr | Kenali teks dalam PDF atau gambar (14 bahasa, sama seperti halaman OCR) | 3 |
| capture-website | Ambil tangkapan situs web publik sebagai PDF, PNG, atau JPG | 1 |
| metadata | Ekstrak metadata file | 1 |
| export/url | Dapatkan URL unduhan bertanda tangan | 0 |
| export/s3 | Ekspor langsung ke bucket S3 Anda | 0 |
Pasangan format yang didukung
Konversi populer. Format terdeteksi otomatis dari file, tetapi Anda juga dapat mengatur input_format secara eksplisit.
| Kategori | Format masukan | Format keluaran |
|---|---|---|
| Dokumen | pdf, docx, doc, odt, rtf, txt, html | pdf, docx, odt, rtf, txt, html |
| Lembar kerja | xlsx, xls, ods, csv | xlsx, ods, csv, pdf |
| Presentasi | pptx, ppt, odp | pptx, odp, pdf |
| Gambar | jpg, png, gif, bmp, tiff, webp, svg, heic | jpg, png, gif, bmp, tiff, webp |
| Video | mp4, avi, mov, mkv, webm | mp4, avi, mov, mkv, webm, gif |
| Audio | mp3, wav, ogg, flac, aac, m4a | mp3, wav, ogg, flac, aac |
Opsi kualitas dan pemrosesan
Kirimkan opsi ini dalam objek options pada task konversi.
qualityintegerKualitas keluaran untuk format lossy (1-100). Bawaan: 85.
densityintegerDPI untuk konversi dokumen ke gambar. Bawaan: 150.
widthintegerUbah ukuran ke lebar ini dalam piksel. Rasio aspek dipertahankan jika height tidak diisi.
heightintegerUbah ukuran ke tinggi ini dalam piksel. Rasio aspek dipertahankan jika width tidak diisi.
pagesstringRentang halaman untuk operasi dokumen. Mis. 1-5, 1,3,5, all.
{
"convert-hq": {
"operation": "convert",
"input": ["import-file"],
"output_format": "png",
"options": {
"density": 300,
"quality": 95
}
}
}Webhook
Daftarkan URL webhook untuk menerima notifikasi waktu nyata saat status job atau task berubah. Semua payload ditandatangani dengan HMAC-SHA256 sehingga Anda dapat memverifikasi bahwa payload tersebut berasal dari ConvertFly.
Membuat webhook
/api/v1/webhooksurlstringwajibURL HTTPS yang menerima event webhook.
eventsstring[]wajibJenis event yang ingin Anda langgani.
curl -X POST https://convertfly.io/api/v1/webhooks \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/webhooks/convertfly",
"events": ["job.finished", "job.failed"]
}'{
"data": {
"id": "wh_Abc123...",
"url": "https://your-app.com/webhooks/convertfly",
"events": ["job.finished", "job.failed"],
"signing_secret": "whsec_9f8e7d6c5b4a...",
"created_at": "2026-04-03T10:30:00Z"
}
}Melihat daftar webhook
/api/v1/webhooksMenghapus webhook
/api/v1/webhooks/:idJenis event
| Event | Pemicu |
|---|---|
| job.finished | Semua task dalam job berhasil diselesaikan |
| job.failed | Satu atau beberapa task gagal, job berstatus ERROR |
| task.finished | Satu task selesai |
| task.failed | Satu task gagal |
Payload webhook
{
"event": "job.finished",
"timestamp": "2026-04-03T10:31:15Z",
"data": {
"id": "job_7kX9mP2qR",
"status": "finished",
"tasks": { ... }
}
}Memverifikasi tanda tangan
Setiap permintaan webhook menyertakan dua header: X-Webhook-Signature dan X-Webhook-Timestamp. Verifikasi keduanya untuk memastikan payload dikirim oleh ConvertFly dan tidak diubah.
import crypto from "crypto";
function verifyWebhook(rawBody, signature, timestamp, secret) {
const signedContent = timestamp + "." + rawBody;
const expected = "v1=" + crypto
.createHmac("sha256", secret)
.update(signedContent)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}import hmac, hashlib
def verify_webhook(raw_body: bytes, signature: str, timestamp: str, secret: str) -> bool:
signed_content = f"{timestamp}.{raw_body.decode()}"
expected = "v1=" + hmac.new(
secret.encode(), signed_content.encode(), hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)Kunci API
Kelola kunci API secara terprogram. Anda juga dapat mengelola kunci dari dasbor.
Membuat kunci API
/api/v1/api-keysnamestringwajibNama deskriptif untuk kunci.
scopesstring[]Izin yang diberikan. Bawaan: ["*"] (akses penuh).
{
"data": {
"id": "key_Xk9m...",
"name": "production-server",
"key": "cvfly_sk_live_abc123def456...",
"scopes": ["*"],
"created_at": "2026-04-03T10:30:00Z"
}
}Penting: Kunci API lengkap hanya ditampilkan sekali saat dibuat. Simpan dengan aman; Anda tidak akan dapat mengambilnya lagi.
Melihat daftar kunci API
/api/v1/api-keysMencabut kunci API
/api/v1/api-keys/:idLangsung membatalkan validitas kunci. Setiap permintaan yang menggunakannya akan mengembalikan 401.
Pembatasan laju
Permintaan API dibatasi lajunya per kunci API untuk memastikan penggunaan yang adil. Jika Anda melampaui batas, permintaan mengembalikan 429 Too Many Requests.
Batas bawaan
Setiap kunci API mengizinkan 100 permintaan per jam. Batas dan jendela waktu saat ini untuk sebuah kunci dikembalikan sebagai rate_limit dan rate_limit_window (detik) saat Anda melihat daftar kunci. Hubungi kami jika integrasi Anda memerlukan batas yang lebih tinggi.
Header respons
Setiap respons atas permintaan yang dibuat dengan kunci API menyertakan header berikut:
X-RateLimit-LimitheaderJumlah maksimum permintaan yang diizinkan dalam jendela waktu saat ini.
X-RateLimit-RemainingheaderSisa permintaan dalam jendela waktu saat ini.
X-RateLimit-ResetheaderStempel waktu Unix saat jendela waktu diatur ulang.
Retry-AfterheaderJumlah detik yang harus ditunggu sebelum mencoba lagi (hanya pada respons 429).
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1743681600
Retry-After: 3600
{
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. 100 requests per 3600s allowed."
}Kesalahan
ConvertFly menggunakan kode status HTTP konvensional. Semua respons kesalahan mengikuti format yang konsisten dengan code yang dapat dibaca mesin dan message yang dapat dibaca manusia.
Format respons kesalahan
{
"code": "INVALID_DATA",
"message": "Missing required field: output_format",
"details": {
"field": "output_format",
"reason": "required"
}
}Kode kesalahan
| Kode | HTTP | Deskripsi |
|---|---|---|
| INVALID_DATA | 400 | Isi permintaan atau parameter tidak valid |
| UNAUTHENTICATED | 401 | Kunci API tidak ada atau tidak valid |
| FORBIDDEN | 403 | Kunci API tidak memiliki cakupan yang diperlukan untuk operasi ini |
| NOT_FOUND | 404 | Sumber daya tidak ada atau telah dihapus |
| CONFLICT | 409 | Sumber daya sudah ada atau operasi bertentangan dengan status saat ini |
| PAYLOAD_TOO_LARGE | 413 | Isi permintaan melebihi ukuran maksimum yang diizinkan |
| UNSUPPORTED_FORMAT | 422 | Konversi yang diminta tidak didukung |
| RATE_LIMIT_EXCEEDED | 429 | Batas laju terlampaui, lihat Pembatasan laju |
| INSUFFICIENT_CREDITS | 402 | Kredit tidak cukup untuk menyelesaikan operasi |
| SERVER_ERROR | 500 | Kesalahan internal server; coba lagi atau hubungi dukungan |
| UNAVAILABLE | 503 | Layanan untuk sementara tidak tersedia; coba lagi sebentar lagi |
Menangani kesalahan
const res = await fetch("https://convertfly.io/api/v1/jobs", {
method: "POST",
headers: {
"Authorization": "Bearer cvfly_sk_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ tasks: { /* ... */ } }),
});
if (!res.ok) {
const error = await res.json();
console.error(`[${error.code}] ${error.message}`);
// "[INVALID_DATA] Missing required field: output_format"
return;
}
const { data: job } = await res.json();Kredit
Setiap operasi memerlukan sejumlah kredit tertentu. Operasi impor dan ekspor gratis. Sisa saldo Anda disertakan di setiap respons API melalui header X-Credits-Remaining.
Biaya kredit per jenis konversi
| Operasi | Biaya | Contoh |
|---|---|---|
| Impor / Ekspor | Gratis | import/url, import/upload, export/url, export/s3 |
| Konversi gambar | 1 kredit | jpg ke png, webp ke gif, heic ke jpg |
| Konversi audio | 1 kredit | mp3 ke wav, flac ke aac |
| Dokumen ke PDF | 1 kredit | txt ke pdf, html ke pdf, md ke pdf |
| Office ke PDF | 2 kredit | docx ke pdf, pptx ke pdf, xlsx ke pdf |
| Konversi video | 2 kredit | mp4 ke webm, mov ke mp4 |
| PDF ke Office | 4 kredit | pdf ke docx, pdf ke pptx |
| Optimalkan | 1 kredit | Kompres gambar, PDF |
| Gambar mini | 1 kredit | Buat gambar pratinjau |
| Gabungkan | 1 kredit | Gabungkan beberapa PDF |
| Tanda air | 1 kredit | Tambahkan lapisan teks/gambar |
| Pisahkan PDF | 1 kredit | Ekstrak halaman 1-3, 7 atau satu file per halaman |
| Putar PDF | 1 kredit | Putar semua halaman atau sebagian saja |
| Ubah ukuran gambar | 1 kredit | Lebar 1200 px, 50 persen |
| Pembuat GIF | 2 kredit | Klip mp4 ke gif, harga sama dengan konversi video |
| Tangkapan situs web | 1 kredit | Render URL menjadi PDF atau gambar |
| OCR | 3 kredit | Jadikan PDF hasil pindaian dapat dicari |
| Metadata | 1 kredit | Ekstrak info file |
Memeriksa saldo Anda
Setiap respons API menyertakan header X-Credits-Remaining dengan saldo Anda saat ini.
HTTP/1.1 201 Created
Content-Type: application/json
X-Credits-Remaining: 9847
X-Credits-Used: 2Jika saldo Anda terlalu rendah untuk menyelesaikan job, API mengembalikan 402 dengan kode kesalahan INSUFFICIENT_CREDITS. Isi ulang kredit di dasbor tagihan Anda.
Lingkungan uji
Kunci sandbox memungkinkan Anda membangun dan menguji integrasi secara menyeluruh tanpa memakai kredit. Buat kunci dengan "sandbox": true; kunci ini diawali cf_test_, bukan cvfly_sk_. Semuanya berfungsi persis seperti di produksi, dengan tiga perbedaan.
| Kredit | Tidak pernah ditagih. Saldo Anda tidak tersentuh. |
| Ukuran file | Masukan dibatasi hingga 5 MB. |
| Hasil | Gambar, video, dan PDF diberi watermark "ConvertFly SANDBOX". |
curl -X POST https://convertfly.io/api/v1/api-keys \
-H "Authorization: Bearer YOUR_LIVE_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Sandbox", "sandbox": true}'
# Response includes: "key": "cf_test_...", "is_sandbox": trueSiap mulai membangun?
Buat akun gratis Anda dan uji API dengan kunci sandbox, tanpa biaya.