Tiga endpoint, JSON masuk dan JSON keluar. Tanpa kunci dan tanpa akun pada domain
publik — tempel permintaan ke terminal dan langsung berfungsi.
Ikhtisar
Kotak masuk tidak pernah dibuat — ia ada begitu sebuah pesan tiba di suatu
alamat, dan hilang 5 hari kemudian. Tidak ada
yang perlu didaftarkan, jadi pada domain publik API tidak mengenal konsep
pengguna, proyek, atau token.
Setiap respons berupa JSON, termasuk setiap error.
Semua waktu dalam UTC dengan format RFC 3339 — 2026-08-04T18:31:07Z.
Id pesan adalah string opak. Jangan diurai.
Hanya terima. Tidak ada endpoint untuk mengirim email, memang disengaja.
URL dasar
https://grabmail.io/api/v1
Hanya HTTPS; HTTP biasa akan dialihkan. Versi berada di path, dan
v1 tidak akan berubah bentuk di bawah Anda — perubahan yang tidak kompatibel akan
mendapat nomor baru.
Autentikasi: Tidak Diperlukan
Tidak ada di domain publik. Siapa pun yang mengetahui suatu alamat dapat
membaca kotak masuknya, melalui API sama seperti melalui situs web. Itulah
konsekuensi dari layanan email sekali pakai bersama, jadi jangan pernah gunakan
hal yang penting bagi Anda di alamat publik.
Domain yang Anda arahkan ke sini akan dijawab lewat endpoint yang sama, tanpa kunci
juga. Arahkan MX-nya ke kami dan pesan pertama akan menghubungkannya; lihat
menghubungkan domain. Kotak masuk di dalamnya dapat dibaca oleh siapa pun yang mengetahui alamatnya,
persis seperti domain publik.
Ada satu kasus yang masih memakai header: domain yang kami tutup atas permintaan
dibaca dengan Authorization: Bearer <key>, dan kunci yang salah atau
hilang akan dijawab dengan 401 dan unauthorized. Kunci
dibandingkan dalam waktu konstan, sehingga kunci yang salah membutuhkan waktu
penolakan yang sama dengan waktu penerimaan kunci yang benar.
Domain premium
Satu-satunya pengecualian dari aturan di atas. Domain publik
ada di daftar blokir surel sekali pakai, dan karena itu formulir pendaftaran
kadang menolak alamat di domain tersebut. Paket berbayar membuka pool berisi
92 domain .com privat, yang dijauhkan dari daftar itu.
Tidak ada yang berubah di API. Jalur, parameter, dan bentuk respons yang sama. Satu-satunya perbedaan adalah satu header: alamat premium dibaca dengan Authorization: Bearer gm_live_…, memakai kunci dari kunci API Anda. Tanpa kunci yang sah, permintaan yang sama menjawab 402 atau 403 — bukan kotak masuk.
# A public domain: no header at all.
curl -sG https://grabmail.io/api/v1/mailbox \
--data-urlencode "address=a7f3k2@grabmail.io"
# A premium domain: the same call, plus a key.
curl -sG https://grabmail.io/api/v1/mailbox \
-H "Authorization: Bearer gm_live_…" \
--data-urlencode "address=a7f3k2@one-of-the-pool.com"
Domain publik dan domain milik Anda tetap gratis, tanpa kunci dan tanpa batas di semua paket, termasuk yang gratis. Kuota hanya menghitung pesan yang masuk ke pool premium. Paket dan harga ada di halaman paket.
Endpoint
GET/api/v1/mailbox
Semua yang menunggu di suatu alamat, terbaru lebih dulu. Ini panggilan yang dipoll oleh test suite Anda.
Parameter
Nama
Masuk
Jenis
Wajib
Deskripsi
address
query
string
ya
Mailbox yang akan dibaca, mis. k7fq2m@grabmail.io.
limit
query
integer
tidak
Jumlah pesan yang dikembalikan dalam panggilan ini, 1–200. Standarnya 50, terbaru dahulu. Ini membatasi satu respons, bukan mailbox — gunakan before untuk membaca lebih lanjut.
before
query
string
tidak
id dari pesan tertua yang sudah Anda miliki; mengembalikan halaman setelahnya. Kirim kembali kolom next dari respons sebelumnya. Saat next bernilai null, Anda sudah memiliki semuanya.
Dihapus. Panggilan ini idempoten: menghapus dua kali tetap menjawab 200.
400
mailbox tidak ada atau tidak valid.
404
Tidak ada pesan seperti itu di mailbox tersebut.
429
Batas laju terlampaui.
Lampiran
Setiap pesan mencantumkan lampirannya dengan URL yang sudah siap pakai. Ambil dengan
otorisasi yang sama seperti pesan itu sendiri.
GET /api/v1/attachment/{id}?mailbox={address}
Selalu menjawab dengan application/octet-stream beserta
Content-Disposition: attachment, apa pun label yang diberikan pengirim.
Itu disengaja: mengembalikan text/html milik orang asing
akan memungkinkan lampiran berjalan sebagai halaman di origin ini. Tipe sebenarnya ada di
JSON pesan, di mana ia berupa data, bukan instruksi.
Error
Setiap kegagalan berupa JSON dengan dua field yang sama, sehingga klien menanganinya
di satu tempat. Status membawa kategorinya, error adalah
slug yang stabil dan dapat dibaca mesin, dan message ditujukan untuk manusia dan
dapat diubah kata-katanya kapan saja.
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"error": "invalid_address",
"message": "address must look like name@domain"
}
Jangan pernah membuat percabangan berdasarkan message. Slug yang digunakan adalah
invalid_address, unknown_domain,
not_found, dan rate_limited.
Batas laju
Satu permintaan per detik, per alamat. Melakukan polling kotak masuk
sekali per detik adalah pola yang dimaksudkan dan tidak pernah dibatasi.
Melebihi batas, Anda akan mendapat 429 dengan Retry-After dalam
detik. Tidak ada kuota harian dan tidak ada kredit burst yang perlu dikelola.
Retensi
Sebuah pesan dihapus 5 hari
setelah tiba, baik sudah dibaca maupun belum. Setiap pesan membawa
expires_at, jadi Anda tidak perlu menghitung tanggal itu sendiri.
Ini batas keras, bukan pengaturan — tidak ada parameter yang memperpanjangnya. Jika sebuah pesan
harus bertahan lebih lama dari jendela waktu ini, ambil dan simpan di sisi Anda.
Domain Anda sendiri
Arahkan MX Anda ke smtp.grabmail.io dan setiap alamat di
domain Anda akan dijawab melalui endpoint yang sama ini — tidak ada API kedua yang perlu dipelajari,
tidak ada pendaftaran, dan tidak ada kunci.