7 menit

Desain API Publik untuk Pembuat SaaS Pemula: Dasar-dasar

Desain API publik yang praktis untuk pembuat SaaS pemula: pilih versioning, pagination, rate limit, dokumentasi, dan SDK kecil yang bisa Anda kirim cepat.

Desain API Publik untuk Pembuat SaaS Pemula: Dasar-dasar

Masalah nyata: mengirim API yang bisa Anda pelihara

API publik bukan hanya endpoint yang diekspos aplikasi Anda. Ini adalah janji kepada pihak di luar tim Anda bahwa kontrak akan terus bekerja, bahkan saat Anda mengubah produk.

Bagian tersulit bukan menulis v1. Melainkan menjaga kestabilannya saat Anda memperbaiki bug, menambah fitur, dan belajar apa yang sebenarnya dibutuhkan pelanggan.

Pilihan awal akan terlihat nanti sebagai tiket support. Jika respons berubah bentuk tanpa peringatan, jika penamaan tidak konsisten, atau jika klien tidak bisa tahu apakah request berhasil, Anda menciptakan friksi. Friksi itu berubah jadi ketidakpercayaan, dan ketidakpercayaan membuat orang berhenti membangun di atas Anda.

Kecepatan juga penting. Sebagian besar pembuat SaaS pemula perlu mengirim sesuatu yang berguna dengan cepat, lalu memperbaikinya. Tradeoff-nya sederhana: semakin cepat Anda mengirim tanpa aturan, semakin banyak waktu yang akan Anda habiskan untuk membatalkan keputusan itu saat pengguna nyata datang.

Cukup baik untuk v1 biasanya berarti sekumpulan endpoint kecil yang memetakan aksi pengguna nyata, penamaan dan bentuk respons yang konsisten, strategi perubahan yang jelas (meskipun hanya v1), pagination yang dapat diprediksi dan limit yang masuk akal, serta dokumentasi yang menunjukkan persis apa yang dikirim dan apa yang akan diterima kembali.

Contoh konkret: bayangkan seorang pelanggan membuat integrasi yang membuat faktur setiap malam. Jika Anda nanti mengganti nama field, mengubah format tanggal, atau diam-diam mulai mengembalikan hasil parsial, pekerjaan mereka gagal jam 2 pagi. Mereka akan menyalahkan API Anda, bukan kode mereka.

Jika Anda membangun dengan alat berbasis chat seperti Koder.ai, menggoda untuk menghasilkan banyak endpoint dengan cepat. Itu sah, tapi jaga surface publik tetap kecil. Anda bisa menyimpan endpoint internal sebagai privat sementara belajar mana yang layak jadi kontrak jangka panjang.

Mulai dengan surface API yang kecil dan jelas

Desain API publik yang baik dimulai dengan memilih sekumpulan noun (resource) kecil yang sesuai dengan cara pelanggan berbicara tentang produk Anda. Pertahankan nama resource stabil walau database internal berubah. Saat menambah fitur, lebih pilih menambah field atau endpoint baru daripada mengganti nama resource inti.

Set awal yang praktis untuk banyak produk SaaS: users, organizations, projects, dan events. Jika Anda tidak bisa menjelaskan sebuah resource dalam satu kalimat, kemungkinan besar belum siap untuk dipublikasikan.

Buat penggunaan HTTP membosankan dan dapat diprediksi:

  • GET membaca data (tanpa efek samping)
  • POST membuat sesuatu (atau memulai aksi)
  • PATCH memperbarui beberapa field
  • DELETE menghapus atau menonaktifkan sesuatu

Auth tidak perlu rumit di hari pertama. Jika API Anda terutama server-ke-server (pelanggan memanggil dari backend mereka), API key seringkali cukup. Jika pelanggan perlu bertindak sebagai pengguna akhir individu, atau Anda mengharapkan integrasi pihak ketiga di mana pengguna memberi akses, OAuth biasanya lebih cocok. Tuliskan keputusan itu dalam bahasa biasa: siapa pemanggil, dan data siapa yang boleh mereka akses?

Tetapkan ekspektasi sejak awal. Jelaskan apa yang didukung vs usaha terbaik. Misalnya: endpoint list stabil dan kompatibel mundur, tetapi filter pencarian bisa berkembang dan tidak dijamin menyeluruh. Ini mengurangi tiket support dan memberi Anda kebebasan untuk memperbaiki.

Jika Anda membangun di atas platform vibe-coding seperti Koder.ai, perlakukan API sebagai kontrak produk: kecilkan kontrak terlebih dahulu, lalu kembangkan berdasarkan penggunaan nyata, bukan tebakan.

Penentuan versi tanpa mengepung diri sendiri

Versioning terutama soal ekspektasi. Klien ingin tahu: apakah integrasi saya akan rusak minggu depan? Anda ingin ruang untuk memperbaiki tanpa takut.

Versioning di URL vs header

Versioning berbasis header terlihat rapi, tetapi mudah tersembunyi dari log, cache, dan screenshot support. Versioning di URL biasanya pilihan paling sederhana: /v1/.... Saat pelanggan mengirim request yang gagal, Anda bisa melihat versinya segera. Ini juga memudahkan menjalankan v1 dan v2 berdampingan.

Perubahan yang benar-benar breaking itu apa?

Suatu perubahan adalah breaking jika klien yang baik bisa berhenti bekerja tanpa mengubah kode mereka. Contoh umum:

  • Mengganti nama field (misalnya customer_id menjadi customerId)
  • Mengubah tipe field (string ke number) atau maknanya
  • Menghapus endpoint atau field respons yang mungkin diandalkan klien
  • Memperketat aturan validasi (sebelumnya opsional, sekarang wajib)
  • Mengubah persyaratan auth atau izin default

Perubahan aman adalah yang bisa diabaikan klien lama. Menambahkan field opsional baru biasanya aman. Misalnya, menambahkan plan_name ke respons GET /v1/subscriptions tidak akan merusak klien yang hanya membaca status.

Aturan praktis: jangan menghapus atau menggunakan ulang field dalam versi mayor yang sama. Tambah field baru, pertahankan yang lama, dan pensiunkan hanya ketika Anda siap mendeklarasikan versi tersebut deprecated.

Kebijakan deprecation yang bisa Anda jalankan

Sederhanakan: umumkan deprecation lebih awal, kembalikan pesan peringatan yang jelas di respons, dan tetapkan tanggal akhir. Untuk API pertama, jendela 90 hari sering realistis. Selama periode itu, pertahankan v1 bekerja, terbitkan catatan migrasi singkat, dan pastikan support bisa menunjuk satu kalimat: v1 bekerja sampai tanggal ini; berikut yang berubah di v2.

Jika Anda membangun di platform seperti Koder.ai, perlakukan versi API seperti snapshot: kirim perbaikan di versi baru, jaga yang lama stabil, dan hentikan hanya setelah memberi waktu kepada pelanggan untuk pindah.

Pola pagination yang tetap dapat diprediksi

Pagination adalah tempat kepercayaan dimenangkan atau hilang. Jika hasil berubah-ubah antar request, orang berhenti percaya API Anda.

Gunakan page/limit ketika dataset kecil, query sederhana, dan pengguna sering ingin halaman tertentu. Gunakan pagination berbasis cursor ketika daftar bisa besar, item baru sering datang, atau pengguna banyak menyortir dan memfilter. Cursor menjaga urutan stabil meski ada penambahan record baru.

Beberapa aturan membuat pagination dapat diandalkan:

  • Selalu tentukan default sort (misal: created_at desc).
  • Tambahkan tie-breaker (misal: id) agar urutan deterministik.
  • Perlakukan pagination sebagai bagian kontrak: mengubah sort nanti adalah perubahan breaking.
  • Kembalikan minimal yang diperlukan untuk melanjutkan: items plus next cursor (atau halaman berikutnya).

Total_count menyulitkan. total_count bisa mahal di tabel besar, terutama dengan filter. Jika bisa menyediakannya dengan murah, sertakan. Jika tidak, hilangkan atau buat opsional lewat flag query.

Berikut adalah bentuk request/response sederhana.

// Page/limit
GET /v1/invoices?page=2&limit=25&sort=created_at_desc

{
  "items": [{"id":"inv_1"},{"id":"inv_2"}],
  "page": 2,
  "limit": 25,
  "total_count": 142
}

// Cursor-based
GET /v1/invoices?limit=25&cursor=eyJjcmVhdGVkX2F0IjoiMjAyNi0wMS0wOVQxMDozMDowMFoiLCJpZCI6Imludl8xMDAifQ==

{
  "items": [{"id":"inv_101"},{"id":"inv_102"}],
  "next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wMS0wOVQxMDoyNTowMFoiLCJpZCI6Imludl8xMjUifQ=="
}

Rate limit dan retry yang ramah

Rencanakan API v1 Anda Dulu
Gunakan Koder.ai Planning Mode untuk memetakan resource, endpoint, dan contoh sebelum menghasilkan kode.

Rate limit bukan soal ketat semata tapi menjaga layanan tetap online. Mereka melindungi aplikasi Anda dari lonjakan trafik, database dari query mahal yang terlalu sering, dan dompet Anda dari tagihan infrastruktur mengejutkan. Limit juga kontrak: klien tahu seperti apa penggunaan normal.

Mulai sederhana dan sesuaikan nanti. Pilih sesuatu yang menutupi penggunaan tipikal dengan ruang untuk ledakan singkat, lalu pantau trafik nyata. Jika belum ada data, default aman adalah limit per-API-key seperti 60 request per menit plus allowance burst kecil. Jika satu endpoint jauh lebih berat (mis. pencarian atau ekspor), beri limit yang lebih ketat atau aturan biaya terpisah daripada menghukum setiap request.

Saat menerapkan limit, permudah klien melakukan hal yang benar. Kembalikan respons 429 Too Many Requests dan sertakan beberapa header standar:

  • X-RateLimit-Limit: maksimum dalam window
  • X-RateLimit-Remaining: sisa yang tersedia
  • X-RateLimit-Reset: kapan window reset (timestamp atau detik)
  • Retry-After: berapa lama menunggu sebelum retry

Klien harus menganggap 429 sebagai kondisi normal, bukan error yang mesti dilawan. Pola retry yang sopan membuat kedua pihak senang:

  • Tunggu Retry-After bila tersedia
  • Jika tidak, gunakan exponential backoff (mis. 1s, 2s, 4s)
  • Tambahkan sedikit randomness (jitter) supaya banyak klien tidak retry serentak
  • Batasi waktu tunggu (mis. 30–60s)

Contoh: jika pelanggan menjalankan sinkronisasi malam yang menekan API Anda, pekerjaan mereka bisa menyebarkan request selama satu menit dan otomatis melambat saat mendapat 429 daripada gagal seluruh proses.

Error, kode status, dan penulisan aman

Jika error API sulit dibaca, tiket support cepat menumpuk. Pilih satu bentuk error dan gunakan di mana-mana, termasuk 500. Standar sederhana: code, message, details, dan request_id yang bisa ditempelkan pengguna ke chat support.

Berikut format kecil dan dapat diprediksi:

{
  "error": {
    "code": "validation_error",
    "message": "Some fields are invalid.",
    "details": {
      "fields": [
        {"name": "email", "issue": "must be a valid email"},
        {"name": "plan", "issue": "must be one of: free, pro, business"}
      ]
    },
    "request_id": "req_01HT..."
  }
}

Gunakan kode status HTTP dengan cara yang sama setiap waktu: 400 untuk input tidak valid, 401 saat auth hilang atau tidak valid, 403 saat user terautentikasi tapi tidak diizinkan, 404 saat resource tidak ditemukan, 409 untuk konflik (mis. nilai unik duplikat atau state yang salah), 429 untuk rate limit, dan 500 untuk error server. Konsistensi mengalahkan kepintaran.

Buat error validasi mudah diperbaiki. Petunjuk tingkat field harus menunjukkan nama parameter yang dipakai dokumen Anda, bukan kolom database internal. Jika ada aturan format (tanggal, mata uang, enum), sebutkan apa yang diterima dan tunjukkan contoh.

Retry adalah area di mana banyak API tanpa sengaja membuat duplikasi data. Untuk POST penting (pembayaran, pembuatan invoice, pengiriman email), dukung idempotency keys agar klien bisa retry dengan aman.

  • Terima header Idempotency-Key pada endpoint POST tertentu.
  • Simpan key bersama hasil untuk jangka pendek (mis. 24 jam).
  • Pada key yang diulang, kembalikan respons yang sama seperti permintaan pertama.
  • Jika permintaan pertama masih berjalan, kembalikan respons coba lagi yang jelas alih-alih membuat resource kedua.

Header itu mencegah banyak edge case menyakitkan saat jaringan fluktuatif atau klien mengalami timeout.

Skenario contoh: API billing SaaS kecil dalam praktik

Bayangkan Anda menjalankan SaaS sederhana dengan tiga objek utama: projects, users, dan invoices. Satu project punya banyak user, dan tiap project menerima invoice bulanan. Klien ingin menyinkronkan invoice ke alat akuntansi mereka dan menampilkan billing dasar di aplikasi mereka sendiri.

v1 yang bersih bisa seperti ini:

GET  /v1/projects/{project_id}
GET  /v1/projects/{project_id}/invoices
POST /v1/projects/{project_id}/invoices

Sekarang terjadi perubahan breaking. Di v1, Anda menyimpan jumlah invoice sebagai integer dalam sen: amount_cents: 1299. Nanti, Anda butuh multi-mata uang dan desimal, jadi Anda ingin amount: "12.99" dan currency: "USD". Jika Anda menimpa field lama, semua integrasi yang ada akan rusak. Versioning menghindari kepanikan: jaga v1 stabil, kirim /v2/... dengan field baru, dan dukung keduanya sampai klien bermigrasi.

Untuk listing invoice, gunakan bentuk pagination yang dapat diprediksi. Misalnya:

GET /v1/projects/p_123/invoices?limit=50&cursor=eyJpZCI6Imludl85OTkifQ==

200 OK
{
  "data": [ {"id":"inv_1001"}, {"id":"inv_1000"} ],
  "next_cursor": "eyJpZCI6Imludl8xMDAwIn0="
}

Suatu hari pelanggan mengimpor invoice dalam loop dan terkena rate limit. Alih-alih kegagalan acak, mereka mendapat respons jelas:

  • 429 Too Many Requests
  • Retry-After: 20
  • badan error kecil seperti { "error": { "code": "rate_limited" } }

Di sisi mereka, klien bisa jeda selama 20 detik, lalu melanjutkan dari cursor yang sama tanpa mengunduh ulang semuanya atau membuat invoice duplikat.

Langkah demi langkah: rencana rilis sederhana untuk API v1 Anda

Hasilkan API yang Mudah Dipelihara
Buat surface v1 kecil dengan cepat di chat, lalu perbaiki penamaan dan bentuk respons.

Peluncuran v1 berjalan lebih baik jika Anda memperlakukannya seperti rilis produk kecil, bukan tumpukan endpoint. Tujuannya sederhana: orang bisa membangun di atasnya, dan Anda bisa terus memperbaikinya tanpa kejutan.

Rencana praktis 1 minggu (bahkan untuk tim kecil)

Mulai dengan menulis satu halaman yang menjelaskan apa tujuan API Anda dan apa yang bukan. Jaga surface area sekecil mungkin sehingga Anda bisa menjelaskannya dalam satu menit.

Gunakan urutan ini dan jangan lanjutkan sampai setiap langkah cukup baik:

  1. Draf spesifikasi satu halaman yang memberi nama resource inti dan puluhan endpoint awal yang akan Anda dukung (pikirkan 5–10). Sertakan pola base URL, metode auth, dan header yang diperlukan.
  2. Untuk setiap endpoint, tulis satu request realistis dan satu response realistis. Gunakan nama field nyata yang akan Anda kirim. Contoh-contoh ini menjadi dokumentasi pertama dan tes pertama Anda.
  3. Tambahkan bagian aturan singkat: bentuk error, bagaimana pagination bekerja (jika ada endpoint list), apa rate limitnya, dan field mana yang stabil vs yang mungkin berubah.
  4. Lakukan tes internal dengan klien palsu. Berpura-puralah Anda pelanggan yang membangun integrasi di repo baru. Catat waktu sampai panggilan pertama berhasil, dan catat bagian yang membingungkan.
  5. Terbitkan kontrak v1 Anda: perubahan apa yang aman (field tambahan), perubahan apa yang memerlukan versi baru, dan berapa lama pemberitahuan untuk perubahan breaking.

Jika Anda membangun dengan alur kerja pembuatan kode (mis. menggunakan Koder.ai untuk menskafold endpoint dan respons), tetap lakukan tes klien-palsu. Kode yang digenerasi bisa terlihat benar namun masih canggung dipakai.

Keuntungannya: lebih sedikit email support, lebih sedikit hotfix, dan v1 yang benar-benar bisa Anda pelihara.

Mengirim SDK kecil tanpa over-engineering

SDK pertama bukanlah produk kedua. Anggaplah sebagai pembungkus tipis yang ramah di atas HTTP API Anda. Ia harus mempermudah panggilan umum, tetapi tidak menyembunyikan cara kerja API. Jika seseorang butuh fitur yang belum Anda bungkus, mereka tetap harus bisa turun ke request mentah.

Pilih satu bahasa untuk memulai, berdasarkan apa yang nyata dipakai pelanggan Anda. Untuk banyak API B2B SaaS itu sering JavaScript/TypeScript atau Python. Mengirim satu SDK solid mengalahkan mengirim tiga SDK setengah jadi.

Apa yang harus ada di SDK kecil

Set awal yang baik:

  • Penanganan auth (API key atau token OAuth) terpusat
  • Timeout masuk akal dan retry otomatis untuk request aman (GET), dengan backoff
  • Helper pagination yang mengembalikan iterator atau fungsi next page
  • Model request/response yang jelas (meskipun tipe dasar)
  • Jalur pelolosan untuk header custom dan panggilan HTTP mentah

Anda bisa membuat ini manual atau menghasilkan dari spec OpenAPI. Generasi bagus saat spec akurat dan Anda ingin typing konsisten, tapi sering menghasilkan banyak kode. Di awal, client minimal ditulis tangan plus file OpenAPI untuk docs biasanya cukup. Anda bisa beralih ke client yang dihasilkan nanti tanpa memecah pengguna, selama antarmuka publik SDK tetap stabil.

Versi SDK terpisah dari API

Versi API mengikuti aturan kompatibilitas Anda. Versi SDK mengikuti aturan packaging.

Jika Anda menambah parameter opsional atau endpoint baru, itu biasanya kena bump minor pada SDK. Simpan rilis mayor SDK untuk breaking change pada SDK itu sendiri (metode yang diganti nama, default yang berubah), meskipun API tetap sama. Pemisahan ini menjaga upgrade tetap tenang dan tiket support rendah.

Kesalahan umum yang menyebabkan headache support

Prototipe API Anda di Koder.ai
Gunakan tier gratis untuk membuat prototipe kontrak API publik Anda sebelum berkomitmen.

Sebagian besar tiket support bukan soal bug. Mereka soal kejutan. Desain API publik lebih banyak soal jadi membosankan dan dapat diprediksi sehingga kode klien terus bekerja bulan demi bulan.

Cara tercepat kehilangan kepercayaan adalah mengubah respons tanpa memberi tahu siapa pun. Jika Anda mengganti nama field, mengubah tipe, atau mulai mengembalikan null di tempat biasanya ada nilai, Anda akan merusak klien dengan cara yang sulit didiagnosis. Jika harus mengubah perilaku, versi-kan, atau tambahkan field baru dan pertahankan yang lama untuk sementara dengan rencana sunset yang jelas.

Pagination adalah masalah berulang lain. Masalah muncul ketika satu endpoint pakai page/pageSize, yang lain offset/limit, dan yang ketiga cursor, semua dengan default berbeda. Pilih satu pola untuk v1 dan pakai di mana-mana. Jaga sorting stabil juga, supaya halaman berikutnya tidak melewatkan atau menggandakan item saat record baru tiba.

Error juga menghasilkan banyak bolak-balik bila tidak konsisten. Mode kegagalan umum: satu service mengembalikan { "error":"..." } dan service lain { "message":"..." }, dengan kode status berbeda untuk isu yang sama. Klien kemudian membuat handler berantakan per-endpoint.

Berikut lima kesalahan yang menghasilkan thread email terpanjang:

  • Perubahan field diam-diam (nama, tipe, makna) tanpa bump versi atau jendela deprecation
  • Aturan pagination yang berbeda per endpoint atau mengubah default seiring waktu
  • Format error, kode status, atau pesan validasi yang berbeda antara endpoint
  • Tidak ada request ID, jadi kedua pihak sulit menemukan panggilan yang gagal di log
  • Rate limit yang memicu tiba-tiba, tanpa header, tanpa panduan retry yang jelas, dan tanpa contoh backoff

Kebiasaan sederhana membantu: setiap respons harus menyertakan request_id, dan setiap 429 harus menjelaskan kapan untuk retry.

Daftar periksa cepat dan langkah selanjutnya

Sebelum Anda mempublikasikan apa pun, lakukan pengecekan akhir fokus pada konsistensi. Sebagian besar tiket support terjadi karena detail kecil tidak cocok antara endpoint, docs, dan contoh.

Pemeriksaan cepat yang menangkap masalah terbanyak:

  • Penamaan: noun konsisten, resource jamak, dan casing field (pilih satu dan patuhi).
  • Contoh: setiap endpoint punya satu request dan response realistis, termasuk pagination.
  • Error: bentuk error jelas, kode error stabil, dan pesan yang membantu untuk kegagalan umum.
  • Limit: perilaku rate limit terdokumentasi dan respons menyertakan header yang Anda prediksi.
  • Keamanan: idempotensi untuk retry pada pembuatan, dan penanganan timeout yang dapat diprediksi.

Setelah peluncuran, pantau apa yang benar-benar dipakai orang, bukan yang Anda harapkan. Dashboard kecil dan review mingguan sudah cukup di awal.

Pantau sinyal ini terlebih dahulu:

  • Lonjakan 429 (siapa yang dibatasi dan kenapa).
  • p95 latency per endpoint (endpoint lambat sering sembunyi N+1 query).
  • Endpoint dan parameter teratas (surface API nyata Anda).
  • Tingkat error per kode status (400 vs 401 vs 500).
  • Timeout dan retry (klien mungkin looping tanpa sadar).

Kumpulkan umpan balik tanpa menulis ulang semuanya. Tambahkan jalur laporan masalah singkat di docs Anda, dan beri tag setiap laporan dengan endpoint, request id, dan versi klien. Saat Anda memperbaiki sesuatu, utamakan perubahan additif: field baru, parameter opsional baru, atau endpoint baru, daripada mengubah perilaku yang ada.

Langkah berikutnya: tulis spesifikasi API satu halaman dengan resource, rencana versioning, aturan pagination, dan format error Anda. Lalu buat docs dan SDK starter kecil yang mencakup autentikasi plus 2–3 endpoint inti. Jika ingin bergerak lebih cepat, Anda bisa mendraf spesifikasi, docs, dan SDK starter dari rencana berbasis chat menggunakan alat seperti Koder.ai (mode perencanannya membantu memetakan endpoint dan contoh sebelum Anda menghasilkan kode).

Pertanyaan umum

How many endpoints should I expose in my first public API?

Mulailah dengan 5–10 endpoint yang sesuai dengan aksi nyata pelanggan.

Aturan praktis: jika Anda tidak bisa menjelaskan sebuah resource dalam satu kalimat (apa itu, siapa yang memilikinya, bagaimana dipakai), biarkan resource itu privat sampai Anda mendapat bukti penggunaan.

What resources should I start with for a SaaS API?

Pilih seperangkat kecil noun stabil (resource) yang sudah dipakai pelanggan dalam percakapan, dan pertahankan nama tersebut meskipun struktur database internal berubah.

Starter umum untuk SaaS adalah users, organizations, projects, dan events—tambahkan lainnya hanya jika ada permintaan yang jelas.

Which HTTP methods should I use, and why does it matter?

Gunakan makna standar HTTP dan konsisten:

  • GET = baca (tanpa efek samping)
  • POST = buat atau mulai aksi
  • PATCH = pembaruan sebagian
  • DELETE = hapus atau nonaktifkan

Keuntungannya: prediktabilitas—klien tidak perlu menebak apa yang dilakukan sebuah metode.

Should I version my API in the URL or in headers?

Default ke penversian pada URL seperti /v1/....

Ini lebih mudah terlihat di log dan screenshot, lebih sederhana untuk debugging dengan pelanggan, dan memudahkan menjalankan v1 dan v2 berdampingan saat Anda butuh perubahan breaking.

What counts as a breaking change in an API?

Perubahan itu breaking jika klien yang benar bisa berhenti bekerja tanpa mengubah kode mereka. Contoh umum:

  • Mengganti nama field
  • Mengubah tipe atau makna field
  • Menghapus field atau endpoint
  • Menjadikan input yang sebelumnya opsional menjadi wajib
  • Mengubah aturan auth atau izin default

Menambahkan field baru yang opsional biasanya aman.

What’s a realistic deprecation policy for a v1 API?

Sederhanakan:

  • Umumkan lebih awal
  • Sertakan peringatan yang jelas di respons (dan/atau docs)
  • Tetapkan tanggal akhir yang tegas

Default praktis untuk API pertama adalah jendela 90 hari, cukup waktu bagi pelanggan untuk migrasi tanpa panik.

Should I use page-based or cursor-based pagination?

Pilih satu pola dan pertahankan di semua endpoint list.

  • Gunakan page/limit ketika dataset kecil dan orang sering membuka page tertentu.
  • Gunakan cursor ketika daftar bisa besar atau sering berubah.

Selalu tentukan default sort dan tie-breaker (mis. created_at + id) agar hasil tidak berubah-ubah antar request.

What rate limit should I set, and what should I return on 429?

Mulai dengan batas per-key yang jelas (mis. 60 request/menit plus allowance burst kecil), lalu sesuaikan berdasarkan trafik nyata.

Saat membatasi, kembalikan 429 dan sertakan header:

  • X-RateLimit-Limit
  • X-RateLimit-Remaining
  • X-RateLimit-Reset
  • Retry-After

Ini membuat retry dapat diprediksi dan mengurangi tiket support.

What should a good API error response look like?

Gunakan satu format error di mana-mana (termasuk 500). Bentuk praktisnya:

  • code (identifier stabil)
  • message (bisa dibaca manusia)
  • details (masalah per-field)
  • request_id (untuk support)

Pertahankan kode status yang konsisten (400/401/403/404/409/429/500) agar klien dapat menangani error dengan bersih.

How do I ship docs and a small SDK without over-engineering it?

Jika Anda menghasilkan banyak endpoint dengan cepat (mis. menggunakan Koder.ai), jaga surface publik tetap kecil dan perlakukan sebagai kontrak jangka panjang.

Lakukan sebelum peluncuran:

  • Tulis satu contoh request + response nyata per endpoint
  • Kunci bentuk pagination dan error
  • Tambahkan idempotency key untuk POST penting
  • Bangun “fake client” internal untuk menemukan kebingungan

Kemudian terbitkan SDK kecil yang membantu auth, timeout, retry untuk request aman, dan pagination—tanpa menyembunyikan cara kerja HTTP API.

Related posts