Lewati ke konten
Postivo

Dokumentasi Teknis

Postivo API & SMTP Relay

Kirim email transaksional lewat satu endpoint REST atau satu login SMTP. Halaman ini mencakup semua yang dibutuhkan developer — dari domain pertama sampai webhook di produksi.

Pengenalan

Postivo adalah layanan email transaksional: OTP, reset password, invoice, notifikasi. Anda mengirim lewat REST API atau SMTP; Postivo memvalidasi, mengantrekan, menandatangani DKIM, mengirim lewat relay, lalu melaporkan setiap perubahan status.

Alur pengiriman
REST / SMTP → validasi (domain, kuota, suppression) → antrean → tanda tangan DKIM → relay (Stalwart; fallback Brevo bila gangguan sementara) → event: queued · sent · delivered · bounced · complained
  • Satu pintu masuk. REST dan SMTP memakai aturan validasi yang sama, sehingga hasilnya konsisten.
  • Satu email, banyak penerima. Setiap penerima punya status sendiri (dispatch) dan timeline sendiri.
  • Aman bagi OTP. Open/click tracking mati secara bawaan agar link verifikasi tidak ditulis ulang.

Base URL

API: https://api.postivo.my.id/v1 · SMTP: smtp.postivo.my.id · Console: https://postivo.my.id/console

Quickstart 5 menit

  1. Buat akun dan verifikasi email Anda.
  2. Buka Domains → tambahkan domain pengirim (disarankan subdomain, mis. mail.contoh.com).
  3. Pasang lima record DNS di penyedia DNS Anda, lalu klik Verifikasi sampai status Active.
  4. Buka API Keys → buat key live dengan scope emails:send. Salin — hanya tampil sekali.
  5. Kirim email pertama:
curl
curl https://api.postivo.my.id/v1/emails \
  -H "Authorization: Bearer $POSTIVO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "Acme <[email protected]>",
    "to": ["[email protected]"],
    "subject": "Kode verifikasi Anda",
    "html": "<p>Kode: <b>123456</b></p>",
    "text": "Kode: 123456"
  }'
Node.js (fetch)
const res = await fetch('https://api.postivo.my.id/v1/emails', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.POSTIVO_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    from: 'Acme <[email protected]>',
    to: ['[email protected]'],
    subject: 'Kode verifikasi Anda',
    html: '<p>Kode: <b>123456</b></p>',
    text: 'Kode: 123456',
  }),
});
console.log(res.status, await res.json()); // 202
PHP (Laravel HTTP client)
$res = Http::withToken(env('POSTIVO_API_KEY'))
    ->post('https://api.postivo.my.id/v1/emails', [
        'from'    => 'Acme <[email protected]>',
        'to'      => ['[email protected]'],
        'subject' => 'Kode verifikasi Anda',
        'html'    => '<p>Kode: <b>123456</b></p>',
        'text'    => 'Kode: 123456',
    ]);
$res->status(); // 202
Python (requests)
import os, requests

r = requests.post(
    "https://api.postivo.my.id/v1/emails",
    headers={"Authorization": f"Bearer {os.environ['POSTIVO_API_KEY']}"},
    json={
        "from": "Acme <[email protected]>",
        "to": ["[email protected]"],
        "subject": "Kode verifikasi Anda",
        "html": "<p>Kode: <b>123456</b></p>",
        "text": "Kode: 123456",
    },
)
print(r.status_code, r.json())  # 202

Respons 202 Accepted berarti email sudah divalidasi dan masuk antrean — bukan berarti sudah terkirim. Pantau statusnya di Emails atau lewat webhook.

Respons 202
{
  "id": "0192f3a0-7c1e-7b3a-9d4e-5a1f0c2b8e11",
  "status": "queued",
  "created_at": "2026-10-27T08:15:30Z",
  "recipients": [
    { "email": "[email protected]", "dispatch_id": "0192f3a0-7c20-7d11-8a2b-1c3d4e5f6a7b", "status": "QUEUED" }
  ]
}

Coba tanpa risiko

Buat API key test (sandbox): permintaan divalidasi dan tercatat, tetapi tidak ada email yang benar-benar dikirim, dan domain tidak perlu terverifikasi.

Autentikasi & API key

Kirim API key di header Authorization: Bearer psv_live_…. Format key: psv_{live|test}_ + 32 karakter. Key disimpan sebagai hash — Postivo tidak bisa menampilkannya lagi, jadi simpan di secret manager, bukan di kode.

ScopeMengizinkan
emails:sendKirim, batch, cancel email; login SMTP
emails:readDaftar email, detail, event
domains:manageTambah, verifikasi, ubah, hapus domain
suppressions:manageKelola suppression list
webhooks:manageKelola endpoint webhook
api_keys:manageBuat/cabut API key

Praktik terbaik

Beri tiap aplikasi key sendiri dengan scope seminimal mungkin (cukup emails:send untuk aplikasi biasa). Cabut key yang bocor dari halaman API Keys — efeknya langsung. Key live hanya bisa dibuat setelah email akun terverifikasi.
401 — key salah / dicabut
{ "error": { "code": "unauthenticated", "message": "Invalid or missing API key.", "request_id": "9b2c…" } }

Menambah domain

Email hanya bisa dikirim dari domain milik organisasi Anda yang berstatus Active. Domain diambil dari alamat pada header From.

  • Lewat console: Domains → Tambah. Lewat API: POST /v1/domains (scope domains:manage).
  • Gunakan subdomain khusus (mis. mail.contoh.com) agar reputasi pengiriman transaksional terpisah dari domain utama.
  • Postivo membuat pasangan kunci DKIM RSA-2048 per domain. Kunci privat disimpan terenkripsi dan tidak pernah ditampilkan.
POST /v1/domains
curl https://api.postivo.my.id/v1/domains \
  -H "Authorization: Bearer $POSTIVO_API_KEY" -H "Content-Type: application/json" \
  -d '{"domain":"mail.contoh.com"}'

Lima record DNS

Pasang record berikut di penyedia DNS domain Anda (Cloudflare, Niagahoster, dsb.). Nilai persisnya tampil di halaman domain — tombol salin tersedia.

RecordTipe · HostFungsiStatus
DKIMTXT · postivo._domainkey.{domain}Bukti email benar-benar ditandatangani domain AndaWajib
SPFTXT · {domain}Mengizinkan server Postivo: v=spf1 include:spf.postivo.my.id ~allWajib
Return-PathCNAME · bounces.{domain} → bounce.postivo.my.idMenerima bounce; membuat SPF/DMARC selarasWajib
DMARCTXT · _dmarc.{domain}Kebijakan autentikasi; mulai dari p=noneDisarankan
TrackingCNAME · trk.{domain} → trk.postivo.my.idLink/piksel tracking di domain Anda sendiriOpsional

Sudah punya SPF?

Satu domain hanya boleh punya satu record SPF. Jika sudah ada, tambahkan include:spf.postivo.my.id ke record yang ada — jangan membuat record kedua.

DMARC bertahap

Mulai dengan p=none dan pantau laporan 2–4 minggu, baru naikkan ke quarantine lalu reject.

Verifikasi & status domain

Klik Verifikasi sekarang di console atau panggil POST /v1/domains/{id}/verify. Postivo juga mengaudit ulang semua domain otomatis setiap 15 menit.

StatusArti
PENDINGMenunggu record wajib. Dicek otomatis; menjadi FAILED bila lewat 7 hari tanpa verifikasi.
ACTIVEDKIM, SPF, dan Return-Path lolos. Boleh mengirim.
FAILEDRecord wajib hilang/berubah. Pengiriman ditolak dengan domain_not_verified. Anda mendapat email peringatan.
SUSPENDEDDihentikan oleh Postivo (pelanggaran kebijakan). Hubungi support.

Gangguan resolver DNS tidak dihitung sebagai record gagal: status record terakhir dipertahankan sampai pengecekan berikutnya berhasil.

Troubleshooting DNS

  • Record sudah dipasang tapi belum terdeteksi — propagasi bisa sampai beberapa jam. Kolom “Terdeteksi” di halaman domain menampilkan apa yang benar-benar terbaca.
  • Penyedia DNS menambahkan domain otomatis — banyak panel menambahkan .{domain} sendiri. Jika host Anda menjadi postivo._domainkey.mail.contoh.com.mail.contoh.com, isi hanya bagian depan (postivo._domainkey).
  • Nilai DKIM terpotong — kunci publik panjang; sebagian panel meminta nilai dipecah dalam tanda kutip. Hasil akhirnya harus tetap satu string utuh.
  • CNAME tidak bisa di apex — itulah alasan disarankan memakai subdomain.
  • Cloudflare — set record CNAME ke DNS only (awan abu-abu), bukan proxied.

POST /v1/emails

Mengirim satu email ke satu atau beberapa penerima. Scope: emails:send.

FieldTipeKeterangan
fromstring, wajib"Nama <alamat@domain>" atau alamat saja. Domain harus Active.
toarray, wajibAlamat penerima. Maks 50 penerima gabungan to+cc+bcc.
cc, bccarrayOpsional. Penerima duplikat digabung.
subjectstring, wajibMaks 255 karakter.
html, textstringMinimal salah satu wajib. Kirim keduanya untuk kompatibilitas terbaik.
reply_tostringAlamat balasan.
headersobjectHeader kustom. Header sistem (From, To, Subject, Message-ID, DKIM-Signature, dst.) diabaikan.
attachmentsarrayLihat Lampiran.
tags, metadataarray / objectLihat Jadwal, tag, metadata.
track_opens, track_clicksbooleanBawaan false (atau bawaan domain).
scheduled_atISO-8601Waktu kirim di masa depan.

Setiap penerima menjadi satu dispatch terpisah dan menerima email sendiri (alamat penerima lain tidak terlihat). Penerima yang ada di suppression list ditandai SUPPRESSED dan tidak dikirimi; bila semua penerima suppressed, permintaan ditolak 422 recipient_suppressed.

Respons error validasi — 422
{
  "error": {
    "code": "validation_failed",
    "message": "The given data was invalid.",
    "request_id": "9b2c…",
    "details": { "to.0": ["The to.0 field must be a valid email address."] }
  }
}

Pengiriman batch

POST /v1/emails/batch menerima {"emails": [ … ]} berisi 1–100 objek dengan skema yang sama seperti POST /v1/emails. Respons 207 Multi-Status memuat hasil per item sehingga satu item gagal tidak membatalkan yang lain. Satu Idempotency-Key berlaku untuk seluruh batch (diturunkan per indeks).

Respons 207
{ "results": [
  { "index": 0, "status": 202, "data": { "id": "0192…", "status": "queued" } },
  { "index": 1, "status": 422, "error": { "code": "validation_failed", "details": { "to.0": ["…"] } } }
] }

Lampiran

attachments
"attachments": [
  { "filename": "invoice.pdf", "content": "<base64>", "content_type": "application/pdf" }
]
  • Maks 10 lampiran; total payload maks 25 MB. Konten harus base64 valid.
  • Tipe berbahaya (.exe .bat .cmd .scr .js .vbs .jar .msi .dll) ditolak pada jalur SMTP.

Idempotency

Kirim header Idempotency-Key: <nilai unik> agar retry jaringan tidak menghasilkan email ganda.

  • Key sama + body sama → 200 dengan respons email yang sudah dibuat (tidak dikirim lagi).
  • Key sama + body berbeda → 409 conflict.
  • Key berlaku per organisasi. Gunakan identitas kejadian, mis. otp-{user_id}-{timestamp}.

Jadwal, tag, metadata

  • scheduled_at — kirim nanti. Email terjadwal masih bisa dibatalkan dengan POST /v1/emails/{id}/cancel selama berstatus QUEUED.
  • tags — hingga 10 label (mis. ["otp"]) untuk memfilter: GET /v1/emails?tag=otp.
  • metadata — pasangan kunci-nilai bebas (mis. {"user_id":"8812"}) yang dikembalikan di respons dan di setiap payload webhook. Jangan menaruh data sensitif.

Open & click tracking

Tracking bersifat opt-in. Aktifkan per email (track_opens, track_clicks) atau sebagai bawaan per domain di console.

  • Click — link http(s) ditulis ulang ke /c/<token> lalu dialihkan (302). Link berhenti berlangganan milik sistem tidak ikut ditulis ulang.
  • Open — piksel GIF 1×1 di /o/<token>.gif.
  • Pembuka otomatis (proxy privasi, scanner keamanan, crawler) terdeteksi dan diberi tanda is_bot — jangan menganggapnya pembacaan manusia.
  • Pasang CNAME trk.{domain} agar link memakai domain Anda.

Jangan untuk OTP & reset password

Menulis ulang link verifikasi menambah satu hop pihak ketiga dan bisa memicu filter spam. Biarkan track_clicks mati untuk email sensitif.

Kredensial & port SMTP

Pakai Postivo sebagai relay untuk aplikasi/CMS yang hanya mendukung SMTP (WordPress, Laravel Mail, Nodemailer, dst.).

Hostsmtp.postivo.my.id
Port587 STARTTLS (disarankan) · 465 TLS implisit · 2525 STARTTLS (alternatif bila 587 diblokir)
TLSWajib TLS 1.2+. AUTH hanya diterima setelah koneksi terenkripsi.
UsernameBebas (disarankan postivo)
PasswordAPI key aktif dengan scope emails:send
Batas25 MB per pesan · 50 penerima per transaksi
  • Domain pengirim ditentukan oleh header From; MAIL FROM amplop diabaikan (Postivo memakai Return-Path sendiri untuk menangkap bounce).
  • Penerima di amplop yang tidak tercantum di header To/Cc diperlakukan sebagai Bcc.
  • 10 kegagalan autentikasi dalam 10 menit dari satu IP memblokir sementara IP tersebut.

Kode balasan SMTP

Pesan dianggap diterima (250) hanya setelah tersimpan dan masuk antrean. Karena validasi berjalan sebelum balasan dikirim, penolakan datang dengan kode yang tepat.

KodeArtiTindakan klien
235Autentikasi berhasil—
250 2.0.0 Ok: queued as <id>Diterima & diantrekan—
535 5.7.8API key salah / dicabut / scope kurangPeriksa key
550 5.7.1Domain From tidak Active atau bukan milik organisasiVerifikasi domain
550 5.1.1Semua penerima ada di suppression listJangan retry
552 5.3.4Pesan melebihi 25 MBPerkecil lampiran
554 5.6.0Isi tidak valid (tanpa From/body, lampiran terlarang)Perbaiki pesan
452 4.5.3Kuota/batas harian habis atau terlalu banyak penerimaRetry nanti / upgrade paket
451 4.3.0Gangguan sementara di sisi PostivoKlien akan retry otomatis
421 4.7.0Terlalu banyak gagal autentikasiTunggu ±10 menit

Contoh koneksi

Nodemailer
const transporter = nodemailer.createTransport({
  host: 'smtp.postivo.my.id',
  port: 587,
  secure: false,          // STARTTLS
  requireTLS: true,
  auth: { user: 'postivo', pass: process.env.POSTIVO_API_KEY },
});
Laravel .env
MAIL_MAILER=smtp
MAIL_HOST=smtp.postivo.my.id
MAIL_PORT=587
MAIL_USERNAME=postivo
MAIL_PASSWORD=psv_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[email protected]
Python (smtplib)
import smtplib, ssl
from email.message import EmailMessage

msg = EmailMessage()
msg["From"], msg["To"], msg["Subject"] = "Acme <[email protected]>", "[email protected]", "Halo"
msg.set_content("Tes SMTP")

with smtplib.SMTP("smtp.postivo.my.id", 587) as s:
    s.starttls(context=ssl.create_default_context())
    s.login("postivo", "psv_live_…")
    s.send_message(msg)

Siklus status

Setiap penerima punya satu status. Status hanya maju: event yang datang terlambat tidak bisa memundurkannya (mis. delivered setelah bounced diabaikan).

StatusArti
QUEUEDDiterima, menunggu giliran kirim (atau waktu scheduled_at).
SENDINGSedang diserahkan ke relay.
DEFERREDGangguan sementara; akan dicoba ulang dengan jeda 1m, 5m, 15m, 1j, 3j, 6j, 12j.
SENTRelay menerima pesan.
DELIVEREDServer penerima menerima pesan (balasan 250).
BOUNCEDDitolak permanen oleh server penerima.
COMPLAINEDPenerima menandai sebagai spam.
FAILEDGagal setelah semua retry, dibatalkan, atau kesalahan internal.
SUPPRESSEDDilewati karena ada di suppression list.

opened, clicked, dan unsubscribed adalah event, bukan status — satu email bisa berstatus DELIVERED dan tetap menerima event opened berkali-kali.

Bounce & komplain

JenisPenyebabPerlakuan
HARDAlamat tidak ada / domain tidak valid (5xx)Status BOUNCED; alamat masuk suppression.
SOFTKotak penuh, gangguan sementara (4xx)Dicoba ulang; tidak di-suppress.
BLOCKDitolak karena reputasi/kebijakan pengirimStatus BOUNCED namun alamat tidak di-suppress (bukan salah alamat).
KomplainPenerima menekan “spam”Status COMPLAINED; alamat di-suppress.

Jaga reputasi

Bounce > 2% atau komplain > 0,1% merusak reputasi domain. Jangan mengirim ke daftar yang dibeli atau tidak berizin.

Suppression list

Daftar alamat yang tidak akan dikirimi email dari organisasi Anda. Terisi otomatis oleh HARD_BOUNCE, COMPLAINT, dan UNSUBSCRIBE; Anda juga bisa menambah manual (MANUAL) atau menghapus entri bila perlu (console atau /v1/suppressions).

Pencocokan memakai alamat huruf kecil; titik dan +tag pada Gmail tidak dinormalisasi.

Berhenti berlangganan: sertakan header List-Unsubscribe Anda sendiri lewat field headers. Tautan /u/<token> milik Postivo mendukung one-click (RFC 8058) dan langsung men-suppress penerima.

Event & payload

Buat endpoint di Webhooks (HTTPS publik) dan pilih event. Postivo mengirim POST JSON setiap ada perubahan.

Tipe event: email.queued email.sent email.delivered email.deferred email.bounced email.complained email.failed email.suppressed email.opened email.clicked email.unsubscribed, atau * untuk semuanya.

Payload
{
  "id": "evt_0192…",
  "type": "email.delivered",
  "created_at": "2026-10-27T08:15:32Z",
  "data": {
    "email_id": "0192…", "dispatch_id": "0192…",
    "recipient": "[email protected]", "domain": "mail.contoh.com",
    "tags": ["otp"], "metadata": { "user_id": "8812" },
    "smtp_response": "250 2.0.0 OK", "bounce": null
  }
}

Header: Postivo-Signature, Postivo-Event-Id, User-Agent: Postivo-Webhook/1.0. Endpoint harus membalas 2xx dalam 10 detik. Pengiriman bersifat at-least-once — jadikan handler idempoten pada Postivo-Event-Id.

Keamanan URL

Target harus mengarah ke alamat publik. localhost, jaringan privat, dan redirect ditolak (proteksi SSRF). Untuk uji lokal, gunakan tunnel HTTPS.

Verifikasi tanda tangan

Header Postivo-Signature: t=<unix>,v1=<hex>, dengan v1 = HMAC_SHA256(secret, "{t}.{raw_body}"). Secret berformat whsec_… dan hanya tampil sekali saat endpoint dibuat. Gunakan body mentah (sebelum di-parse), bandingkan dengan waktu konstan, dan tolak bila |sekarang − t| > 5 menit (anti-replay).

Node.js (Express)
import crypto from 'node:crypto';

app.post('/webhooks/postivo', express.raw({ type: 'application/json' }), (req, res) => {
  const [t, v1] = req.get('Postivo-Signature').split(',').map((p) => p.split('=')[1]);
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return res.sendStatus(400);

  const expected = crypto.createHmac('sha256', process.env.POSTIVO_WEBHOOK_SECRET)
    .update(`${t}.${req.body.toString('utf8')}`).digest('hex');
  const ok = expected.length === v1.length &&
    crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
  if (!ok) return res.sendStatus(401);

  const event = JSON.parse(req.body);   // proses idempoten berdasarkan event.id
  res.sendStatus(200);
});
PHP
$header = $request->header('Postivo-Signature');           // "t=…,v1=…"
parse_str(str_replace(',', '&', $header), $p);
$raw = $request->getContent();

abort_if(abs(time() - (int) $p['t']) > 300, 400);
$expected = hash_hmac('sha256', $p['t'].'.'.$raw, config('services.postivo.webhook_secret'));
abort_unless(hash_equals($expected, $p['v1']), 401);
Python (Flask)
import hmac, hashlib, time
from flask import request, abort

parts = dict(x.split("=", 1) for x in request.headers["Postivo-Signature"].split(","))
raw = request.get_data()
if abs(time.time() - int(parts["t"])) > 300: abort(400)
expected = hmac.new(SECRET.encode(), f"{parts['t']}.".encode() + raw, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, parts["v1"]): abort(401)

Retry & auto-disable

  • Respons non-2xx atau timeout dicoba ulang dengan jeda 30 dtk, 2 mnt, 10 mnt, 1 jam, 6 jam, 24 jam.
  • Setelah 50 kegagalan beruntun, endpoint dinonaktifkan otomatis dan Anda diberi tahu lewat email. Aktifkan kembali di halaman Webhooks setelah memperbaiki endpoint.
  • Riwayat pengiriman terakhir (status HTTP, durasi) tampil di console.

Daftar endpoint

Base URL https://api.postivo.my.id/v1 · JSON UTF-8 · waktu ISO-8601 UTC. Setiap respons membawa X-Request-Id — sertakan saat melapor masalah.

Method & pathScopeFungsi
POST /emailsemails:sendKirim email (header opsional Idempotency-Key)
POST /emails/batchemails:sendKirim hingga 100 email, respons 207
GET /emailsemails:readDaftar; filter status, tag, to, from_date, to_date, limit (1–100), cursor
GET /emails/{id}emails:readDetail + penerima + event
GET /emails/{id}/eventsemails:readTimeline event
POST /emails/{id}/cancelemails:sendBatalkan yang masih QUEUED
GET /domains · POST /domainsdomains:manageDaftar / tambah domain
GET /domains/{id} · PATCH · DELETEdomains:manageDetail / ubah default tracking / hapus
POST /domains/{id}/verifydomains:manageJalankan audit DNS sekarang
GET /suppressions · POST · DELETE /{id}suppressions:manageKelola suppression
GET /webhooks · POST · PATCH /{id} · DELETE /{id}webhooks:manageKelola webhook
GET /api-keys · POST · DELETE /{id}api_keys:manageKelola API key
GET /ping—Cek ketersediaan API

Pagination memakai cursor: respons daftar berisi {"data": […], "next_cursor": "…"}; kirim nilainya sebagai ?cursor= untuk halaman berikutnya.

Format & kode error

Format seragam
{ "error": { "code": "validation_failed", "message": "…", "request_id": "9b2c…", "details": { "field": ["…"] } } }
HTTPcodePenyebab
400bad_requestJSON rusak
401unauthenticatedKey hilang, salah, atau dicabut
403forbidden · scope_missingIzin kurang; organisasi ditangguhkan; key tak boleh memakai domain itu
404not_foundResource tidak ada / bukan milik organisasi
409conflictDomain sudah terdaftar; Idempotency-Key bentrok; email tak bisa dibatalkan
413payload_too_largeLebih dari 25 MB
422validation_failed · domain_not_verified · recipient_suppressedData tidak valid; domain From belum Active; semua penerima suppressed
429rate_limited · quota_exceededTerlalu cepat / kuota habis. Ada header Retry-After
5xxinternal_errorGangguan di sisi Postivo — aman di-retry dengan Idempotency-Key

Rate limit & kuota

  • Rate limit: POST /emails 20 permintaan/detik per API key; endpoint lain 10/detik. Header X-RateLimit-Limit, -Remaining, -Reset ada di setiap respons.
  • Kuota bulanan & batas harian mengikuti paket. Hanya penerima yang benar-benar diproses yang dihitung (yang SUPPRESSED dan sandbox tidak).
  • Saat 429, tunggu sesuai Retry-After lalu ulangi dengan Idempotency-Key yang sama.
  • Anda mendapat email peringatan saat kuota mencapai 80% dan 100%.

Paket & batas

PaketHarga / bulanKuota email / bulanBatas harian
FreeGratis3,000100
StarterRp 99.00025,000Tanpa batas
GrowthRp 299.000100,000Tanpa batas
ScaleRp 899.000500,000Tanpa batas

Kuota direset setiap awal bulan kalender. Batas per pesan: 25 MB, 50 penerima. Bila paket berbayar berakhir tanpa perpanjangan, akun otomatis kembali ke Free — data, domain, dan API key tetap aman.

Checkout & pembayaran

  1. Buka Billing di console, pilih paket, tentukan durasi (1/3/6/12 bulan).
  2. Klik Buat tagihan & bayar — Anda diarahkan ke halaman pembayaran aman Xendit.
  3. Pilih metode: QRIS, virtual account (BCA, BNI, BRI, Mandiri, Permata, CIMB), Indomaret/Alfamart, atau e-wallet.
  4. Setelah dibayar, paket aktif otomatis (lewat webhook; halaman tagihan juga memeriksa status langsung ke Xendit saat Anda kembali).
  • Tagihan berlaku 24 jam. Yang kedaluwarsa bisa dibuat ulang tanpa biaya.
  • Perpanjangan paket yang sama menyambung dari tanggal berakhir; ganti paket berlaku dari saat pembayaran.
  • Hanya owner dan admin organisasi yang dapat membeli.
  • Anda menerima email saat tagihan dibuat, saat pembayaran diterima, dan sebelum paket berakhir (7 dan 1 hari).

Email dari Postivo

Email sistem dikirim dari [email protected]; balasan diarahkan ke [email protected]. Pastikan keduanya tidak masuk filter spam Anda.

EmailKapan dikirimPenerima
Selamat datangSetelah pendaftaranPendaftar
Verifikasi emailPendaftaran / kirim ulangPendaftar
Atur ulang kata sandiLupa kata sandiPemilik akun
Undangan timAdmin mengundang anggotaOrang yang diundang
API key baruKey dibuat (peringatan keamanan)Pembuat key
Domain terverifikasi / bermasalahStatus domain berubahOwner & admin
Kuota 80% / 100%Pemakaian bulanan mencapai ambangOwner & admin
Webhook dinonaktifkan50 kegagalan beruntunOwner & admin
Tagihan dibuat / pembayaran diterimaCheckout dan konfirmasi XenditOwner & admin / pembayar
Paket akan berakhir / berakhir7 hari, 1 hari, dan saat berakhirOwner & admin

Keamanan & kepatuhan

  • Transport: TLS 1.2+ untuk API dan SMTP. API key disimpan sebagai hash; kunci DKIM privat dan secret webhook dienkripsi.
  • Isolasi: setiap organisasi hanya melihat data miliknya; key bisa dibatasi per domain.
  • Retensi: isi email (HTML/teks) dihapus setelah 30 hari; event setelah 90 hari. Metadata ringkas tetap ada untuk audit.
  • Penggunaan yang diizinkan: hanya email transaksional/berizin. Spam, daftar yang dibeli, phishing, dan konten ilegal berujung penangguhan akun.
  • Melapor celah keamanan: [email protected] (jangan sertakan data pelanggan).

FAQ

Respons 202 tapi email tidak sampai?

202 hanya berarti diterima & diantrekan. Buka detail email di console: timeline menunjukkan sent, delivered, atau bounced lengkap dengan respons SMTP server penerima. Cek juga folder spam dan pastikan SPF/DKIM/DMARC hijau.

Berapa lama email sampai?

Umumnya hitungan detik. Angka “< 50 ms” pada materi kami hanya merujuk ke waktu API menerima & mengantrekan, bukan ke waktu sampai di inbox.

Bisa mengirim dari domain tanpa subdomain?

Bisa, tetapi subdomain khusus disarankan: reputasi terpisah dan CNAME Return-Path/Tracking tidak berbenturan dengan record utama.

Email ke satu penerima ditolak recipient_suppressed?

Alamat itu pernah bounce keras, komplain, atau berhenti berlangganan. Hapus dari Suppressions hanya bila Anda yakin masalahnya sudah selesai.

Bagaimana menguji tanpa mengirim email sungguhan?

Gunakan API key test (sandbox): validasi penuh dan event tercatat, tetapi tidak ada email yang keluar dan kuota tidak terpakai.

Kontak

Email [email protected] dengan menyertakan X-Request-Id atau ID email terkait.

↑ Kembali ke atas