Webhooks

Dapatkan notifikasi real-time saat event terjadi di akun AgentSend Anda — email baru diterima, pengiriman dikonfirmasi, bounce terdeteksi, dan lainnya.

Ikhtisar

Alih-alih polling API untuk memeriksa pesan baru, webhook memungkinkan AgentSend mengirim data event ke server Anda saat sesuatu terjadi. Daftarkan endpoint HTTPS dan AgentSend akan mengirim request POST dengan payload JSON setiap kali event yang dilanggani terpicu.

Webhook adalah cara yang direkomendasikan untuk membangun agen reaktif. Saat balasan tiba di kotak masuk agen Anda, aplikasi Anda menerima payload pesan lengkap dalam hitungan detik dan dapat segera bertindak.

Endpoint webhook harus dapat diakses publik melalui HTTPS. URL localhost tidak diterima. Gunakan alat seperti ngrok atau layanan tunnel saat mengembangkan secara lokal.

Membuat Webhook

Daftarkan webhook baru dengan mengirim request POST ke /webhooks. Anda harus menyediakan field url; semua field lain opsional.

POST /webhooks
Parameter Tipe Deskripsi
url wajib string URL HTTPS yang akan digunakan AgentSend untuk POST event.
description string Label yang dapat dibaca manusia untuk mengidentifikasi webhook di dasbor.
events string[] Daftar tipe event yang akan dilanggani. Hilangkan untuk menerima semua event.
javascript
const res = await fetch("https://api.agentsend.io/webhooks", {
  method: "POST",
  headers: {
    "x-api-key": process.env.AGENTSEND_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    url: "https://myapp.example.com/hooks/agentsend",
    description: "Production inbox events",
    events: ["message.received", "message.bounced"],
  }),
});

const webhook = await res.json();
console.log(webhook.id);     // wh_01j9...
console.log(webhook.secret); // whsec_... store this securely!

secret dikembalikan hanya sekali dalam respons pembuatan. Simpan di variabel lingkungan yang aman segera — tidak dapat diambil lagi, tetapi Anda dapat memutarnya melalui PUT /webhooks/{id}.

Tipe Event

Berlangganan event tertentu dengan meneruskan pengenal mereka di array events. Jika Anda menghilangkan array, AgentSend mengirimkan semua tipe event ke endpoint Anda.

Event Deskripsi
domain.verified Domain kustom telah lulus verifikasi DNS dan siap digunakan.
message.received Email masuk telah tiba di salah satu kotak masuk agen Anda.
message.sent Pesan keluar telah diterima dan diantre untuk pengiriman.
message.delivered Server email penerima mengonfirmasi pengiriman berhasil.
message.bounced Pesan tidak dapat dikirim (hard atau soft bounce).
message.complained Penerima menandai pesan sebagai spam melalui klien email mereka.

Payload Webhook

Setiap pengiriman webhook adalah request POST dengan body Content-Type: application/json. Payload memiliki envelope yang konsisten terlepas dari tipe event.

json — message.received example
{
  "id": "evt_01j9xkq7z8abc",
  "type": "message.received",
  "createdAt": "2026-04-16T10:23:45.000Z",
  "webhookId": "wh_01j9abc123",
  "data": {
    "id": "msg_01j9xkp4n5def",
    "inboxId": "inbox_01j8mq3r2t",
    "threadId": "thr_01j9xkp4m1ghi",
    "fromAddress": "alice@example.com",
    "fromName": "Alice Chen",
    "toAddresses": ["a1b2c3@agentsend.io"],
    "subject": "Re: Your proposal",
    "bodyText": "Looks great, let's move forward.",
    "bodyHtml": "<p>Looks great, let's move forward.</p>",
    "hasAttachments": false,
    "receivedAt": "2026-04-16T10:23:44.812Z"
  }
}

Memverifikasi Tanda Tangan

Setiap request webhook menyertakan header X-AgentSend-Signature. Ini adalah hash HMAC-SHA256 dari body request mentah, ditandatangani dengan secret webhook Anda. Selalu verifikasi tanda tangan ini sebelum memproses pengiriman untuk melindungi dari request palsu.

javascript — Express / Node.js
import crypto from "node:crypto";

app.post("/hooks/agentsend", express.raw({ type: "application/json" }), (req, res) => {
  const sig       = req.headers["x-agentsend-signature"];
  const secret    = process.env.AGENTSEND_WEBHOOK_SECRET;
  const expected  = crypto
    .createHmac("sha256", secret)
    .update(req.body) // raw Buffer — do NOT parse JSON first
    .digest("hex");

  if (!crypto.timingSafeEqual(
    Buffer.from(sig),
    Buffer.from(expected)
  )) {
    return res.status(401).send("Invalid signature");
  }

  const event = JSON.parse(req.body);
  // handle event.type …
  res.sendStatus(200);
});
python — Flask
import hmac, hashlib, os
from flask import Flask, request, abort

app = Flask(__name__)

@app.route("/hooks/agentsend", methods=["POST"])
def webhook():
    sig      = request.headers.get("X-AgentSend-Signature", "")
    secret   = os.environ["AGENTSEND_WEBHOOK_SECRET"].encode()
    expected = hmac.new(secret, request.data, hashlib.sha256).hexdigest()

    if not hmac.compare_digest(sig, expected):
        abort(401)

    event = request.get_json()
    # handle event["type"] …
    return "", 200
💡

Selalu gunakan perbandingan waktu-konstan (misalnya crypto.timingSafeEqual atau hmac.compare_digest) saat memeriksa tanda tangan untuk mencegah serangan timing.

Kebijakan Retry

AgentSend menganggap pengiriman berhasil saat endpoint Anda merespons dengan kode status HTTP 2xx dalam 10 detik. Jika request timeout atau mengembalikan respons non-2xx, pengiriman dicoba ulang dengan back-off eksponensial:

Percobaan Jeda setelah percobaan sebelumnya
Retry ke-1 5 detik
Retry ke-2 30 detik
Retry ke-3 5 menit
Retry ke-4 30 menit
Retry ke-5 2 jam

Setelah 5 retry gagal (6 total percobaan), pengiriman ditandai sebagai failed dan tidak ada percobaan lebih lanjut. Anda dapat memeriksa pengiriman yang gagal di log pengiriman dan memutarnya ulang secara manual dari dasbor.

Respons dengan 200 OK secepat mungkin. Jika logika pemrosesan Anda memakan waktu, terima payload segera dan tangani secara asinkron dengan antrian atau pekerjaan latar belakang.

Mengelola Webhook

API webhook memungkinkan Anda menampilkan, memperbarui, dan menghapus endpoint terdaftar Anda.

Daftar webhook

Mengembalikan semua webhook yang terdaftar di akun Anda.

bash
# GET /webhooks
curl https://api.agentsend.io/webhooks \
  -H "x-api-key: $AGENTSEND_API_KEY"

Memperbarui webhook

Ubah URL, deskripsi, atau tipe event yang dilanggani. Anda juga dapat memutar secret penandatanganan dengan meneruskan "rotateSecret": true — respons akan menyertakan secret baru.

bash
# PUT /webhooks/{id}
curl -X PUT https://api.agentsend.io/webhooks/wh_01j9abc123 \
  -H "x-api-key: $AGENTSEND_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"events": ["message.received", "message.delivered", "message.bounced"]}'

Menghapus webhook

Menghapus webhook secara permanen. Pengiriman dalam proses masih dicoba sebelum penghapusan berlaku.

bash
# DELETE /webhooks/{id}
curl -X DELETE https://api.agentsend.io/webhooks/wh_01j9abc123 \
  -H "x-api-key: $AGENTSEND_API_KEY"

Pemantauan aktivitas

Dapatkan ringkasan volume event baru-baru ini dan tingkat error untuk webhook tertentu.

bash
# GET /webhooks/activity
curl "https://api.agentsend.io/webhooks/activity?webhookId=wh_01j9abc123" \
  -H "x-api-key: $AGENTSEND_API_KEY"

Log Pengiriman

Setiap percobaan pengiriman dicatat. Query endpoint log untuk memeriksa riwayat lengkap webhook, termasuk kode respons HTTP, body respons, dan waktu.

GET /webhooks/logs
Parameter Query Tipe Deskripsi
webhookId string Filter log ke webhook tertentu.
status string success, failed, atau pending.
limit number Jumlah catatan yang dikembalikan (default 50, maks 200).
before string Cursor untuk paginasi; teruskan id catatan terakhir yang dilihat.
bash
# Fetch failed deliveries for a webhook
curl "https://api.agentsend.io/webhooks/logs?webhookId=wh_01j9abc123&status=failed" \
  -H "x-api-key: $AGENTSEND_API_KEY"

Setiap entri log meliputi: