Dokumentasi AnyHook

Relay webhook. Arahkan pengirim ke AnyHook, lalu dapatkan percobaan ulang (retry) otomatis, log event lengkap, verifikasi tanda tangan (signature) terpadu, dan putar ulang (replay) sekali klik. Tidak perlu SDK.

Mulai cepat

AnyHook tidak memerlukan SDK maupun paket: Anda mengganti URL webhook di dashboard pengirim, dan handler Anda tetap menerima permintaan yang sama. Satu hal yang perlu direncanakan: percobaan ulang dan putar ulang membawa stempel waktu (timestamp) asli dari pengirim, jadi jika tanda tangan pengirim dapat kedaluwarsa (Stripe, Slack, dan pengirim lain yang punya toleransi di /providers), periksa AnyHook-Signature agar keduanya tetap diterima.

Jalur tercepat (tanpa akun): jalankan curl -X POST https://anyhook.net/api/v1/quickstart untuk langsung mendapatkan URL masuk (inbound URL) yang aktif dan kunci API, cocok untuk agen AI dan uji cepat. Endpoint ini kedaluwarsa dalam 7 hari kecuali diklaim lewat claim_url yang dikembalikan. Arahkan pengirim ke inbound_url yang dikembalikan, lalu baca event dengan GET /api/v1/events dan GET /api/v1/events/{id}; next_steps di respons berisi setiap perintahnya.

  1. 1
    Buat akun
    Buka anyhook.net/sign-up dan buat akun gratis. Tanpa kartu kredit.
  2. 2
    Buat App
    Satu App mewakili satu sumber webhook. Akun baru langsung terbuka di formulirnya: beri nama (misalnya “Stripe Production”) dan, jika mau, URL server Anda, tempat AnyHook meneruskan setiap event setelah menerimanya. Jika dibiarkan kosong, App mencatat semuanya tanpa meneruskan. Tambahkan tujuan kapan pun, hingga 3 per App di Free.
  3. 3
    Arahkan pengirim ke AnyHook
    Halaman App menampilkan URL masuk Anda dan tempat setiap pengirim umum memintanya (misalnya Stripe → Developers → Webhooks). Tempel di sana sebagai pengganti URL webhook lama:
    https://in.anyhook.net/{user-slug}/{app-slug}
    Halaman itu terus memantau: permintaan pertama muncul di sana dalam hitungan detik. Belum ada yang bisa mengirim? Tekan tombol Send a test event (kirim event uji) di halaman yang sama.

Format URL masuk

Setiap App mendapat URL masuk yang unik:

https://in.anyhook.net/{user-slug}/{app-slug}
  • user-slug: pengenal akun Anda, terlihat di pengaturan dashboard.
  • app-slug: unik per App, dibuat otomatis dari nama App tetapi dapat diubah.

Endpoint masuk menerima permintaan POST apa pun, dan juga menjawab handshake verifikasi saat penyiapan: GET yang membawa hub.mode=subscribe (pemeriksaan hub.challenge dari Meta) otomatis dibalas dengan challenge-nya, bahkan sebelum App dikonfigurasi. Metode lain dijawab 405. Halaman web dan form HTML biasa juga dapat mengirim POST ke sana (lihat handler kode (code handler)). AnyHook mengembalikan HTTP 200 begitu event tersimpan secara persisten di antrean, dalam sekitar satu detik, berapa pun kecepatan endpoint tujuan Anda, sehingga pengirim tidak pernah menunggunya.

Jenis konten. AnyHook menyimpan body teks, seperti application/json, application/x-www-form-urlencoded, XML, atau teks biasa, byte demi byte dan meneruskannya dengan Content-Type aslinya. Body disimpan sebagai teks, jadi payload biner, atau file dalam form multipart, tidak tiba dengan utuh.

Sumber yang didukung

AnyHook mendeteksi pengirim secara otomatis dari header yang masuk dan memvalidasi tanda tangan payload di edge (Cloudflare Worker AnyHook di in.anyhook.net). Untuk mengaktifkan verifikasi, pilih provider webhook Anda saat membuat App dan tempel webhook signing secret dari provider (misalnya whsec_... dari Stripe).

Sangat disarankan. Tanpa signing secret, AnyHook tidak dapat memverifikasi bahwa permintaan yang masuk benar-benar berasal dari provider Anda. Permintaan yang tidak terverifikasi tetap diteruskan; dengan menambahkan secret, AnyHook dapat menolak permintaan palsu di edge sebelum masuk ke pipeline Anda.
SumberHeader tanda tanganAlgoritma
StripeStripe-SignatureHMAC-SHA256 + stempel waktu
GitHubX-Hub-Signature-256HMAC-SHA256
Meta (Instagram / Facebook / Threads)X-Hub-Signature-256HMAC-SHA256
ShopifyX-Shopify-Hmac-Sha256HMAC-SHA256 (Base64)
DiscordX-Signature-Ed25519Ed25519
SlackX-Slack-SignatureHMAC-SHA256 + stempel waktu
LINEx-line-signatureHMAC-SHA256 (Base64)
Xerox-xero-signatureHMAC-SHA256 (Base64)
LinearLinear-SignatureHMAC-SHA256
SentrySentry-Hook-SignatureHMAC-SHA256
Vercelx-vercel-signatureHMAC-SHA1
PaddlePaddle-SignatureHMAC-SHA256 + stempel waktu
SendGridX-Twilio-Email-Event-Webhook-SignatureECDSA P-256
TwilioX-Twilio-SignatureHMAC-SHA1
IntercomX-Hub-SignatureHMAC-SHA1
HubSpotX-HubSpot-Signature-v3HMAC-SHA256 (v3) / SHA-256 (v1/v2)
Standard Webhooks (Svix, OpenAI, Replicate)webhook-signature / Svix-SignatureHMAC-SHA256 + stempel waktu
ClerkSvix-SignatureHMAC-SHA256 (lewat Svix)
ResendSvix-SignatureHMAC-SHA256 (lewat Svix)
Lemon SqueezyX-SignatureHMAC-SHA256
WooCommerceX-WC-Webhook-SignatureHMAC-SHA256 (Base64)
PayPalPAYPAL-TRANSMISSION-SIGRSA-SHA256
Generic / KustomTidak adaTidak diverifikasi

Permintaan yang gagal pemeriksaan ditolak di edge dan tidak pernah sampai ke endpoint Anda. Halaman App menghitungnya, dan 5 yang pertama setiap hari disimpan di log event sebagai rejected, termasuk header dan body-nya, agar Anda dapat melihat penyebabnya.

Meta: Instagram, Facebook, Threads

Ketiganya memakai satu kontrak webhook Graph API, jadi satu App sudah mencakup semuanya. Meta menandatangani dengan X-Hub-Signature-256, header yang juga dipakai GitHub; AnyHook membedakan keduanya lewat X-Github-Event, yang selalu dikirim GitHub dan tidak pernah dikirim Meta.

Meta tidak akan menyimpan callback URL sampai URL tersebut menjawab GET yang membawa hub.mode=subscribe dengan mengembalikan hub.challenge sebagai seluruh body respons. AnyHook menjawabnya untuk Anda, jadi URL masuk tersimpan pada percobaan pertama.

Di AnyHookDi Meta App Dashboard
Source: MetaApp settings → Basic
App SecretSalin dari sana ke AnyHook
Verify Token (opsional)Webhooks → Verify token: ketik string yang sama
URL masuk AndaWebhooks → Callback URL: tempel URL-nya
Verify Token berjalan ke arah sebaliknya. Setiap secret lain di sini disalin dari provider. Yang satu ini Anda buat sendiri, lalu Anda ketik di Meta. Token ini bukan App Secret dan sebaiknya bukan string yang sama: token ini tiba di query string handshake penyiapan, dan kunci penandatanganan tidak semestinya ada di URL. Jika dibiarkan kosong, langganan tetap selesai; jika diisi, AnyHook memeriksanya sebelum menjawab.

Meta mencoba ulang pengiriman yang gagal dengan frekuensi yang makin jarang selama 36 jam, lalu membuangnya. Karena AnyHook menyimpan event sebelum mencoba endpoint Anda, deploy atau gangguan di sisi Anda tidak menghabiskan rentang waktu itu.

Cara kerja pengiriman

AnyHook memakai arsitektur asinkron berbasis antrean untuk memisahkan pengirim webhook dari backend Anda:

  1. Diterima di edge: Cloudflare Workers menerima POST, memvalidasi tanda tangan, dan mengembalikan 200 setelah event tersimpan secara persisten, dalam sekitar satu detik.
  2. Antrean: event dipublikasikan ke antrean pesan yang persisten (Upstash QStash). Koneksi HTTP pengirim sudah ditutup.
  3. Penerusan: QStash mengirim event ke forwarder AnyHook, yang mengirim POST berisi payload asli ke endpoint tujuan Anda.
  4. Log: setiap langkah dicatat, yaitu header/body masuk, status pengiriman, kode respons dan body dari endpoint Anda, serta latensi.
Mengapa ini penting. Pengirim Anda (Stripe, GitHub, dll.) mendapat respons 200 dalam sekitar satu detik. Setelah itu, backend Anda boleh memakai waktu hingga batas waktu pengiriman paket Anda untuk merespons (60 detik di Free, 120 detik di Pro, 5 menit di Scale), dan pengirim tidak mencoba ulang, karena sudah mendapat respons 200. Menunggu setelah detik pertama memakai jatah komputasi (compute allowance) Anda.
Batas ukuran payload. Payload maksimum per event: 512 KB (Free), 2 MB (Pro), 4 MB (Scale), kustom (Enterprise). Permintaan yang terlalu besar ditolak di edge dengan 413 Payload Too Large, tidak pernah dibuang diam-diam, tidak pernah ditagih. Halaman App menghitungnya.
Model pengiriman. Secara default, AnyHook meneruskan event begitu tiba, tanpa penundaan dan tanpa batas konkurensi. Di Pro ke atas, sebuah tujuan dapat menetapkan rate limit per detik dan penundaan upaya pertama. Jika endpoint Anda mengembalikan 429, AnyHook melakukan backoff dan mencoba ulang.

Jaminan pengiriman

Kontraknya, dinyatakan dengan jelas, karena relay yang samar tentang jaminannya memindahkan kesamaran itu ke kode Anda:

  1. Setidaknya sekali (at-least-once), bukan tepat satu kali (exactly-once). Percobaan ulang adalah inti produk ini, dan percobaan ulang setelah respons yang hilang tidak dapat dibedakan dari pengiriman baru. Sesekali Anda akan menerima event yang sama dua kali; tidak ada relay yang dapat menjanjikan sebaliknya, dan relay yang menjanjikannya hanya menggambarkan skenario idealnya. Handler Anda harus idempoten, dan id event yang kami teruskan di X-AnyHook-Delivery adalah kunci untuk deduplikasi.
  2. Tidak ada jaminan urutan. Karena percobaan ulang dan pengiriman yang berjalan bersamaan, event yang lebih baru bisa tiba sebelum event lebih lama yang masih dicoba ulang. Sebagian besar pengirim di upstream kami pun tidak menjanjikan urutan. Urutkan berdasarkan field di dalam payload (versi, updated_at), jangan berdasarkan waktu kedatangan.
  3. Jangan melakukan deduplikasi berdasarkan tanda tangan. AnyHook-Signature ditandatangani ulang dengan stempel waktu baru di setiap upaya, dengan sengaja, agar percobaan ulang tidak pernah gagal di rentang toleransi Anda. Dua pengiriman dari event yang sama membawa tanda tangan yang berbeda; yang tetap sama adalah id event.
  4. Diterima berarti tersimpan secara persisten. Edge mengembalikan 200 hanya setelah event tersimpan, dan ada dua penyimpanan cadangan di belakang antrean sebelum edge menjawab 503. Respons 503 dari URL masuk berarti tidak ada yang tersimpan, dan percobaan ulang dari pengirim Anda sendiri menjadi jaring pengamannya; itulah alasan kami menjawab 503 alih-alih berpura-pura.
Versi praktisnya. Tulis handler sehingga memproses event yang sama dua kali tidak menimbulkan masalah, dan anggap urutan kedatangan sebagai noise. Kami menuliskan polanya, diurutkan menurut seberapa besar perlindungannya, di Anda Menerima Webhook yang Sama Dua Kali. Itu Memang Kontraknya, Bukan Bug.

Jadwal percobaan ulang

Saat tujuan Anda mengembalikan error sementara atau mengalami timeout, AnyHook otomatis mencoba ulang dengan backoff eksponensial:

UpayaJedaPaket
1SegeraSemua
25 menit kemudianSemua
330 menit kemudianSemua
43 jam kemudianPro, Scale, Enterprise
518 jam kemudianPro, Scale, Enterprise
6-10masing-masing 24 jam kemudianScale, Enterprise
Batas waktu pengiriman. AnyHook menunggu hingga 60 detik (Free), 120 detik (Pro), atau 5 menit (Scale+) sampai endpoint Anda merespons. Jika handler Anda butuh waktu lebih lama lagi, misalnya agen AI multi-langkah, segera kembalikan HTTP 202 Accepted dan proses secara asinkron. AnyHook menandai pengiriman sebagai berhasil pada 202.

Respons mana yang memicu percobaan ulang?

Tidak semua error layak dicoba ulang. AnyHook mengklasifikasikan respons endpoint Anda agar tidak menghabiskan upaya, atau jatah komputasi Anda, untuk error yang tidak akan teratasi dengan mencoba lagi:

Kode statusTindakanAlasan
2xxBerhasil: pengiriman selesaiEndpoint Anda menerima event tersebut.
3xxPermanen: langsung ditandai gagalRedirect tidak diikuti; isi URL tujuan dengan URL akhirnya.
408 Request TimeoutCoba ulang dengan backoffTimeout sementara, mungkin berhasil pada upaya berikutnya.
429 Too Many RequestsCoba ulang dengan backoffEndpoint Anda sedang menerapkan rate limit, beri waktu.
4xx (lainnya: 400, 401, 403, 404, 422…)Permanen: langsung ditandai gagalError klien: permintaan salah format atau tidak diotorisasi. Mencoba ulang payload yang sama tidak akan membantu.
5xxCoba ulang dengan backoffError server, kemungkinan sementara.
Error jaringan / timeoutCoba ulang dengan backoffEndpoint Anda tidak dapat dijangkau.
Mengapa 4xx bersifat permanen. 400 Bad Request atau 422 Unprocessable Entity berarti handler Anda menolak payload tersebut, dan mencoba ulang tidak akan mengubah hasilnya. Dengan langsung menandainya gagal, Anda diberi tahu lebih cepat, tidak ada jatah komputasi yang terpakai untuk percobaan ulang, dan Anda dapat memutar ulang event tersebut setelah handler diperbaiki.

Setiap upaya dicatat beserta body respons lengkap dan kode statusnya. Kegagalan 4xx permanen maupun kegagalan yang dapat dicoba ulang sama-sama dihitung untuk circuit breaker: 20 kegagalan berturut-turut dari jenis apa pun akan memicunya.

Notifikasi kegagalan

AnyHook mengirim peringatan email pada ambang tertentu, bukan per event, agar kotak masuk Anda tetap terkendali:

  • Kegagalan ke-1: peringatan segera beserta kode status dan tujuannya.
  • Kegagalan ke-5 berturut-turut: peringatan eskalasi beserta saran.
  • Kegagalan ke-20 berturut-turut: circuit breaker terpicu (lihat di bawah), peringatan CB dikirim.

Satu email di setiap ambang di atas, lalu satu email di setiap langkah circuit breaker (setiap jeda dan penonaktifan), tidak pernah satu per event. Satu pengiriman yang berhasil sudah cukup untuk mengatur ulang penghitungnya.

Circuit breaker

Jika AnyHook mendeteksi 20 kegagalan pengiriman berturut-turut ke tujuan yang sama (termasuk error 4xx permanen), circuit breaker terpicu dan memulai eskalasi bertahap:

PemicuanLama jedaYang terjadi
110 menitTujuan dijeda, email dikirim
230 menitTujuan dijeda, email dikirim
32 jamTujuan dijeda, email dikirim
424 jamTujuan dijeda, email dikirim
5PermanenTujuan dinonaktifkan, email dikirim

Cara kerjanya

  • Penerimaan tetap berjalan. URL masuk Anda selalu aktif, dan event dari Stripe, GitHub, dan lainnya tetap diterima dan disimpan. Hanya pengiriman keluar ke tujuan Anda yang dijeda.
  • Setiap kali jeda berakhir, AnyHook mengirim probe half-open: event berikutnya menguji tujuan Anda. Jika berhasil, circuit kembali tertutup dan semuanya diatur ulang.
  • Satu keberhasilan saja mengatur ulang semuanya: jumlah kegagalan berturut-turut dan jumlah pemicuan sama-sama kembali ke nol.
  • Event yang diterima selama jeda disimpan dengan status circuit_open dan dapat diputar ulang setelah tujuan Anda pulih.
  • Anda menerima notifikasi email di setiap tahap eskalasi, berisi URL tujuan, jumlah kegagalan, dan lama jeda.
  • Jika tujuan dinonaktifkan (pemicuan ke-5), Anda harus mengaktifkannya kembali secara manual dari dashboard.

Pendekatan bertahap ini memberi server Anda waktu untuk pulih sekaligus mencegah jatah komputasi Anda terkuras oleh percobaan ulang ke endpoint yang mati.

Log event

Setiap event yang sampai di URL masuk Anda dicatat, apa pun yang terjadi pada pengirimannya. Log dimulai saat Anda mengarahkan provider ke AnyHook: event yang gagal sebelum itu hanya ada di provider (untuk Stripe, lihat cara memutar ulang webhook). Setiap entri log berisi:

  • Header dan body masuk secara lengkap (seperti yang diterima dari pengirim)
  • Status pengiriman: queued → success / retrying / failed / rejected / circuit_open / quota_exceeded. rejected berarti AnyHook menolak event tersebut (verifikasi tanda tangan gagal, atau URL tujuan diblokir); event itu tidak pernah dicoba dikirim dan tidak dapat diputar ulang.
  • Kode respons HTTP dan body dari tujuan Anda (per upaya)
  • Latensi dalam milidetik
  • Jumlah upaya dan waktu percobaan ulang berikutnya
  • Apakah event tersebut hasil putar ulang (is_replay: true)

Lama event disimpan bergantung pada paket. Free: 3 hari, dapat diputar ulang sepanjang waktu itu, lalu dihapus. Pro: 1 tahun: dapat diputar ulang selama 30 hari, lalu menjadi arsip terenkripsi hanya-baca. Scale: 7 tahun: dapat diputar ulang selama 90 hari, lalu menjadi arsip terenkripsi hanya-baca. Enterprise: fleksibel.

App yang dijeda tidak menyimpan apa pun. Selama App dijeda (is_active: false), URL masuknya menjawab 202 dan tidak menyimpan apa pun, sehingga provider tidak menonaktifkan endpoint, tetapi event-nya hilang. Aktifkan kembali App sebelum trafik yang Anda perlukan tiba.

Putar ulang dari dashboard

Event apa pun di log dapat diputar ulang dari dashboard dengan sekali klik. Putar ulang mengirimkan lagi payload yang tersimpan, byte demi byte, ke tujuan event tersebut, atau ke URL baru tujuan itu jika Anda telah mengubahnya.

  • Buka menu Dashboard → Events
  • Cari event-nya, lalu klik tombol Replay (putar ulang)
  • Event baru dibuat dengan is_replay: true, tertaut ke event aslinya
Kuota. Putar ulang tidak mengurangi kuota event bulanan Anda, kecuali putar ulang event yang ditahan (quota_exceeded), yang dihitung sekali seperti event baru. Putar ulang ke kode sebuah App dihitung sebagai satu eksekusi kode.

Putar ulang lewat API (satu event)

POST/api/v1/events/{id}/replayPutar ulang satu event berdasarkan ID

Memublikasikan payload event asli ke QStash untuk dikirim lagi. Event baru tertaut ke event aslinya melalui replay_of.

curl -X POST https://anyhook.net/api/v1/events/{event_id}/replay \
  -H "Authorization: Bearer {api_key}"

Mengembalikan 200 beserta ID event baru jika berhasil. Mengembalikan 410 Gone jika event sudah melewati masa putar ulangnya.

Event tidak terkirim

GET/api/v1/apps/{slug}/events/undeliveredDaftar event yang gagal dikirim

Mengembalikan event dengan status failed, circuit_open, atau quota_exceeded.

ParameterTipeDefaultDeskripsi
sinceISO 860124 jam laluHanya event yang dibuat setelah stempel waktu ini
limitinteger100Jumlah event maksimum yang dikembalikan (1–200)
curl "https://anyhook.net/api/v1/apps/stripe-prod/events/undelivered?since=2026-04-11T00:00:00Z&limit=50" \
  -H "Authorization: Bearer {api_key}"
{
  "count": 3,
  "events": [
    { "id": "evt_abc", "status": "failed", "created_at": "..." },
    ...
  ]
}

Putar ulang massal

POST/api/v1/apps/{slug}/replay-failedPutar ulang event yang gagal untuk sebuah App

Memutar ulang event gagal yang cocok, dimulai dari yang terlama, hingga batas per panggilan. Event yang sudah pernah diputar ulang, atau sudah melewati masa putar ulang, dilewati.

Parameter bodyTipeDefaultDeskripsi
sinceISO 860124 jam laluHanya putar ulang event yang dibuat setelah stempel waktu ini
limitinteger50Jumlah event maksimum yang diputar ulang (1–100)
curl -X POST https://anyhook.net/api/v1/apps/stripe-prod/replay-failed \
  -H "Authorization: Bearer {api_key}" \
  -H "Content-Type: application/json" \
  -d '{"since": "2026-04-11T00:00:00Z", "limit": 100}'
{
  "replayed": 3,
  "events": [
    { "original_id": "evt_abc", "new_id": "evt_xyz" },
    ...
  ]
}
Batas putar ulang harian. Free: 100/hari, Pro: 500/hari, Scale: 1.000/hari, Enterprise: tanpa batas.

Pengembangan lokal

AnyHook bisa langsung dipakai untuk pengembangan lokal, tanpa mode khusus atau CLI. Ada dua pendekatan:

1. Penerusan live lewat tunnel

Atur tujuan App Anda ke URL tunnel yang mengarah ke mesin lokal Anda. Provider tunnel apa pun bisa dipakai:

# ngrok
ngrok http 3000
# → https://abc123.ngrok.io

# cloudflared
cloudflared tunnel --url http://localhost:3000

# localhost.run
ssh -R 80:localhost:3000 nokey@localhost.run

Salin URL tunnel ke tujuan App Anda di dashboard. AnyHook meneruskan webhook ke sana persis seperti ke endpoint lain: percobaan ulang, log, dan header tanda tangan semuanya bekerja dengan cara yang sama.

Tips. Biarkan provider Anda tetap mengarah ke URL masuk production Anda (https://in.anyhook.net/you/app) selama pengembangan. Event sungguhan tertangkap di log Anda, dan Anda dapat memindahkan tujuan antara tunnel dan production tanpa menyentuh Stripe.

2. Tangkap & putar ulang ke localhost

Biarkan event production sungguhan terkumpul di AnyHook, lalu putar ulang event mana pun ke lingkungan lokal Anda kapan pun diperlukan. Tidak perlu memicu event uji secara manual: uji dengan payload sungguhan, sesering yang diizinkan batas putar ulang harian Anda.

  • Ganti tujuan Anda ke URL tunnel
  • Buka menu Dashboard → Events dan klik tombol Replay pada event mana pun
  • Atau gunakan API: POST /api/v1/events/{id}/replay
  • Payload asli dikirim byte demi byte ke tujuan Anda saat ini

Ini sangat berguna untuk men-debug edge case: temukan event bermasalah di log production, putar ulang secara lokal, dan ulangi sampai handler Anda bekerja dengan benar.

Putar ulang tidak memakai kuota. Putar ulang tidak mengurangi kuota event bulanan Anda. Putar ulang memakai jatah komputasi dan batas putar ulang harian (100 di Free, 500 di Pro, 1.000 di Scale).

Enkripsi saat disimpan

Semua data payload webhook dienkripsi saat disimpan (at rest) dengan AES-256-GCM sebelum mencapai database. Ini mencakup header masuk, body permintaan, dan signing secret per tujuan.

Enkripsi memakai kunci khusus (AES_SECRET_KEY) yang disimpan terpisah dari kredensial database. Kebocoran database tanpa kunci enkripsi hanya menghasilkan ciphertext: tidak ada data webhook dalam bentuk plaintext, tidak ada signing secret, tidak ada informasi pelanggan.

Apa yang dienkripsi

  • Header & body permintaan webhook (setiap event)
  • Signing secret provider (webhook secret Stripe, dll.)
  • Signing secret AnyHook per tujuan
Tidak ada secret dalam bentuk plaintext di database. Setiap secret dan setiap payload webhook dienkripsi dengan AES-256-GCM sebelum disimpan. Bahkan dengan akses penuh ke database, penyerang hanya melihat ciphertext.

Verifikasi di edge

AnyHook memvalidasi tanda tangan webhook di edge Cloudflare, sebelum event masuk antrean. Setelah sebuah App memiliki signing secret, permintaan tanpa tanda tangan atau dengan tanda tangan yang tidak valid ditolak dengan 401 dan tidak pernah memakai kuota Anda; tanpa secret, permintaan diteruskan tanpa diverifikasi.

Deteksi tanda tangan berjalan otomatis berdasarkan header. Saat Anda membuat App dan memilih jenis sumber, AnyHook menyimpan signing secret (terenkripsi saat disimpan) dan memakai algoritma yang tepat untuk provider tersebut.

Permintaan tidak valid. Permintaan yang gagal validasi tanda tangan ditolak dengan HTTP 401 dan tidak pernah sampai ke tujuan Anda. Halaman App menghitungnya, dan 5 yang pertama setiap hari disimpan di log event, termasuk header dan body-nya.

Sumber kustom atau yang belum didukung

Jika sumber webhook Anda tidak ada di daftar yang didukung, pilih Generic saat membuat App. AnyHook akan:

  • Menerima setiap POST masuk dan memasukkannya ke antrean, tanpa pemeriksaan tanda tangan masuk.
  • Meneruskan body byte demi byte beserta header asli dari provider ke tujuan Anda, ditambah AnyHook-Signature baru di setiap upaya. Header infrastruktur yang ditambahkan di depan edge kami (cf-* dan sejenisnya) dihapus.
  • Melampirkan header AnyHook-Signature agar endpoint Anda tetap dapat memverifikasi bahwa permintaan datang melalui AnyHook.

App Generic tidak memeriksa tanda tangan masuk, apa pun secret yang diatur. AnyHook-Signature membuktikan bahwa permintaan datang melalui AnyHook, bukan siapa yang mengirimnya ke AnyHook, jadi pertahankan pemeriksaan Anda sendiri atas header asli dari pengirim (diteruskan tanpa diubah) jika Anda memerlukannya. Jika pengirim menandatangani dengan Standard Webhooks (webhook-id, webhook-timestamp, webhook-signature, seperti OpenAI dan Replicate), pilih sumber itu sebagai gantinya: tanda tangannya diverifikasi di edge.

AnyHook-Signature

Setiap permintaan yang diteruskan menyertakan header AnyHook-Signature, yaitu tanda tangan HMAC-SHA256 berstempel waktu yang dibuat dengan signing secret tujuan Anda.

AnyHook-Signature: t=1712934567,v1=5257a869...

Untuk memverifikasi di server Anda:

// Node.js / TypeScript
import crypto from "crypto";

function verifyAnyHook(header: string, body: string, secret: string): boolean {
  const [tPart, vPart] = header.split(",");
  const timestamp = Number(tPart?.replace("t=", ""));
  // Re-signed on every attempt, so a genuine signature is never older than this.
  if (!timestamp || Math.abs(Date.now() / 1000 - timestamp) > 300) return false;
  const signature = Buffer.from(vPart?.replace("v1=", "") ?? "", "hex");

  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${timestamp}.${body}`)
    .digest();

  // timingSafeEqual throws on a length mismatch, so check that first.
  return signature.length === expected.length && crypto.timingSafeEqual(signature, expected);
}

Signing secret dibuat per tujuan dan tersedia di dashboard Anda, di menu App → Destinations → Signing secret. Anda dapat merotasinya kapan pun lewat API.

Header kustom

Anda dapat melampirkan header kustom ke permintaan keluar, per tujuan. Kegunaan umum:

  • Authorization: Bearer ...: autentikasi ke API Anda
  • x-api-key: ...: autentikasi dengan kunci API
  • Header apa pun yang diperlukan endpoint Anda

Nilai header kustom dienkripsi saat disimpan dan tidak pernah ditampilkan di log event. Atur di menu App → Destinations → Custom headers.

Header asli dipertahankan. Header asli dari provider (Stripe-Signature, dll.) diteruskan byte demi byte bersama header kustom Anda dan AnyHook-Signature, sehingga pemeriksaan SDK yang sudah Anda pakai lolos pada pengiriman pertama. Percobaan ulang dan putar ulang membawa stempel waktu asli dari provider, yang secara default ditolak SDK Stripe setelah 5 menit: periksa AnyHook-Signature sebagai gantinya, yang ditandatangani ulang di setiap upaya.

Kontrol pengiriman

Tiga pengaturan opsional di setiap tujuan, semuanya di Pro ke atas. Atur di menu App → Destinations → Delivery controls, atau dengan PATCH /api/v1/apps/{slug} pada objek tujuan. Akun Free tetap memiliki kontrol yang diaturnya saat masih berbayar, tetapi tidak dapat mengubahnya.

{
  "destinations": [{
    "url": "https://api.example.com/hooks/stripe",
    "event_types": ["invoice.*", "checkout.session.completed"],
    "rate_limit": 20,
    "delay_seconds": 5
  }]
}

Filter jenis event

event_types adalah daftar pola; tujuan hanya menerima event yang jenisnya cocok dengan salah satunya. * cocok dengan rangkaian karakter apa pun, jadi invoice.* berarti setiap event invoice, sedangkan checkout.session.completed tepat satu jenis. Pencocokan tidak membedakan huruf besar-kecil dan berlaku untuk seluruh nama jenis. Dengan dua tujuan, Anda dapat membagi event berdasarkan jenisnya: event penagihan ke satu layanan, sisanya ke layanan lain.

  • Diputuskan di edge, setelah verifikasi tanda tangan dan sebelum penghitung kuota: event yang tersaring tidak disimpan, tidak dikirim, dan tidak dihitung.
  • Pengirim mendapat 200 {"filtered":true,"event_type":"…"}, yang ditampilkan Stripe dan Shopify di log webhook mereka sendiri.
  • Asal jenis event berbeda per provider: header untuk GitHub, Shopify, WooCommerce, dan Lemon Squeezy; type di body untuk Stripe, Clerk, Resend, Vercel, dan pengirim bergaya Svix; event_type untuk Paddle dan PayPal. Nilainya sama dengan yang ditampilkan log event di kolom Type.
Jenis yang tidak dikenal selalu dikirim. Event yang jenisnya tidak dapat dibaca AnyHook (body generik tanpa field type, ping dari provider) dikirim ke setiap tujuan, apa pun filternya. Janji relay ini adalah tidak ada yang hilang; filter yang menelan event yang tidak dikenal akan melanggar janji itu.

Rate limit

rate_limit membatasi pengiriman ke sebuah tujuan sebanyak angka itu per detik (1 sampai 1.000). Event yang melewati batas menunggu di antrean dan keluar sesuai urutan begitu kapasitas tersedia; tidak ada yang dibuang, dan percobaan ulang dihitung terhadap batas yang sama. Gunakan saat pengirim dapat mengirim lonjakan lebih cepat daripada yang sanggup ditampung server Anda: pembaruan produk massal di Shopify, gelombang perpanjangan langganan Stripe di awal bulan, push ke monorepo GitHub yang memicu banyak event CI.

Putar ulang massal juga mematuhi batas ini, dan justru saat itulah batas ini paling penting: memutar ulang 500 event gagal dengan 20 per detik berarti 25 detik trafik yang stabil, bukan satu lonjakan yang gagal lagi.

Penundaan pengiriman

delay_seconds menunda upaya pengiriman pertama (1 detik sampai 1 hari). Alasan yang umum adalah pengirim yang webhook-nya berpacu dengan API-nya sendiri: checkout.session.completed dari Stripe bisa tiba sebelum halaman sukses Anda selesai menulis pesanan, dan penundaan lima detik membuat balapan itu tidak lagi menjadi masalah. Putar ulang tidak pernah ditunda; jadwal percobaan ulang setelah upaya pertama tidak berubah.

Peringatan Slack / Discord

Di Pro ke atas, setiap peringatan yang dikirim AnyHook lewat email juga dikirim ke incoming webhook yang Anda atur sekali di menu Settings → Notifications (pengaturan notifikasi): kegagalan pengiriman (ke-1 dan ke-5 berturut-turut), circuit breaker yang terpicu dan tujuan yang dinonaktifkan, lonjakan penolakan beserta penyelesaiannya, serta pemberitahuan kuota 50% / 90% / 100%. Saat URL disimpan, AnyHook mengirim pesan uji agar Anda tahu pesannya sampai. Slack, Discord, Mattermost, Rocket.Chat, dan konektor incoming webhook Teams semuanya bisa dipakai; payload-nya {"text": …} (atau content untuk Discord). Menonaktifkan "Email on failure" (email saat gagal) hanya membungkam email; channel tetap menerima peringatan.

Handler kode

Di Pro dan Scale, sebuah App dapat menjalankan kode Anda sendiri pada setiap event yang diterimanya, di dalam sandbox, tanpa server milik Anda. Menyimpan kode memberi App sebuah tujuan yang menjalankannya, sehingga percobaan ulang, putar ulang, circuit breaker, dan log event bekerja seperti pada tujuan lain, dan output konsol serta nilai kembalian setiap eksekusi menjadi respons pengiriman tersebut. Tulis kodenya di bagian Code (kode) pada App atau dengan endpoint di bawah. Template untuk tindakan umum ada di /code-templates.md, dan pindah dari Pipedream punya panduan tersendiri.

export default async function (event, { env, store }) {
  // event: { method, headers, body, raw_body, delivery_id, attempt }
  console.log(event.body);
}
  • Event. body berisi JSON yang sudah di-parse, field form (urlencoded, atau field teks dari form multipart), atau teks mentah, dan raw_body adalah teks seperti yang diterima. method selalu POST; query string, path, dan IP pemanggil tidak disimpan. delivery_id adalah id X-AnyHook-Delivery milik event, dan attempt dihitung mulai dari 1, dengan 0 pada eksekusi uji.
  • Kegagalan. Melempar error menggagalkan pengiriman, yang lalu dicoba ulang sesuai jumlah upaya paket (Jadwal percobaan ulang). Percobaan ulang untuk event yang eksekusinya sudah berhasil tidak menjalankannya lagi, tetapi eksekusi yang gagal setelah sebuah panggilan berhasil terkirim akan dijalankan lagi, jadi pakai delivery_id sebagai kunci untuk panggilan semacam itu jika API-nya mengizinkan.
  • Step Pipedream. export default defineComponent({ async run({ steps, $ }) {} }) juga berjalan: steps.trigger.event adalah event di atas, $.export dan $.flow.exit berfungsi, setiap prop data_store adalah store milik App, $auth.field dari prop app membaca secret APP_FIELD, dan prop lain membaca secret yang dinamai sesuai prop tersebut (channelId membaca CHANNEL_ID). Panduan Pipedream mencantumkan apa saja yang tidak ikut terbawa.
  • Paket npm. Apa yang diimpor kode diinstal saat Anda menyimpan, dengan versi yang dikunci ala Pipedream (import axios from "axios@1.7.9"), hingga 20 paket. Penyimpanan yang menginstal paket baru bisa memakan waktu beberapa menit; instalasi yang gagal tidak menyimpan apa pun.
  • Secret. Dibaca sebagai env.NAME atau process.env.NAME, hingga 20, dinamai dengan huruf, angka, dan garis bawah, tidak diawali angka. PATH, HOME, NODE_OPTIONS, NODE_PATH, PWD dan nama yang diawali ANYHOOK_ milik runtime, dan sebuah nilai paling panjang 4.000 karakter. Nilai tidak pernah keluar dari server.
  • Store. store.get, set (dengan { ttl } dalam detik), has, delete, keys, entries, dan clear menyimpan state di antara event, satu store per App: hingga 1.000 key dengan panjang hingga 256 karakter, setiap nilai paling besar 64.000 byte sebagai JSON. Impor menerima {"entries": {key: value}}, menimpa key yang sudah ada, dan mengaturnya tanpa TTL.
  • Jadwal. schedule berisi lima field cron, dalam UTC kecuali diawali CRON_TZ=Area/City. Setiap kali jadwal berjalan, event anyhook.schedule dikirim ke URL App itu sendiri, sehingga dihitung sebagai satu eksekusi dan satu event, dan jadwal hanya berjalan selama kode aktif. Sumber App harus generic atau auto, tanpa signing secret: beri kode terjadwal App tersendiri.
  • Email. Setiap App juga menerima email di {user-slug}.{app-slug}@anyhook.net, sebagai event email.received yang body-nya berisi from, to, subject, message_id, date, size, dan pesan MIME sebagai raw. Seperti jadwal, fitur ini memerlukan App dengan sumber generic atau auto tanpa signing secret, dan email yang melebihi batas payload paket akan di-bounce.
  • Halaman web dan form. Sebuah halaman dapat memanggil fetch() ke URL masuk: edge menjawab preflight CORS, dan setiap jawaban membawa Access-Control-Allow-Origin: *. Form HTML biasa memerlukan method="post". Tambahkan ?redirect=https://your-site.com/thanks ke action form, dan event yang tersimpan akan mengarahkan pengunjung ke sana dengan 303, selama alamat itu berada di situs tempat form dikirim; jika tidak, pengunjung melihat halaman singkat "Received" (diterima). Field teks tiba di event.body; file yang diunggah tidak ikut tersimpan.
  • Batas. Kode paling besar 64.000 byte, dan satu eksekusi boleh berjalan 105 detik di Pro dan 285 detik di Scale. Sebuah eksekusi menyimpan 16.000 karakter terakhir dari output konsolnya. Jumlah eksekusi per bulan ada di tabel paket, dan setiap eksekusi dihitung, termasuk percobaan ulang, eksekusi uji, putar ulang, dan jadwal yang berjalan. Tidak ada kelebihan pemakaian: setelah jatah eksekusi bulan itu habis, pengiriman ke kode menjawab 429 dan ditahan (circuit_open), tidak dicoba ulang, siap diputar ulang begitu bulan berganti atau paket ditingkatkan.
  • Pengujian, aktif dan nonaktif. POST .../code/test menjalankan kode yang tersimpan pada event terbaru App yang tersimpan, sebuah event_id, atau body yang Anda kirim, lalu menjawab dengan log, nilai kembalian, dan durasinya. Pengujian dihitung sebagai satu eksekusi dan tidak mengirim apa pun, tetapi apa pun yang dikirim kode itu sendiri tetap terjadi. Event hanya menjalankan kode selama kode aktif. Dashboard menyimpan kode baru dalam keadaan nonaktif, sedangkan PUT .../code menyimpan versi pertama dalam keadaan aktif kecuali Anda mengirim "enabled": false; penyimpanan berikutnya mempertahankan keadaan saat itu. Selama tujuan lain masih menangani event yang sama, seperti saat migrasi, simpan dengan "enabled": false dan aktifkan kode setelah Anda menghapus tujuan itu. Kedua perubahan ini butuh waktu hingga satu menit untuk mencapai setiap lokasi edge.
GET/api/v1/apps/{slug}/codeKode, nama secret, jadwal, dan paketnya, apakah event sampai ke kode, dan eksekusi yang terpakai bulan ini
PUT/api/v1/apps/{slug}/codeSimpan kode, secret (digabung; null menghapus satu), jadwal (null menghapusnya), dan enabled
DELETE/api/v1/apps/{slug}/codeHapus kode, secret, dan jadwalnya
POST/api/v1/apps/{slug}/code/testJalankan kode yang tersimpan sekarang, pada event yang tersimpan atau body yang Anda kirim
GET/api/v1/apps/{slug}/storeSetiap key aktif di store App
POST/api/v1/apps/{slug}/storeImpor key: {"entries": {key: value}}
DELETE/api/v1/apps/{slug}/storeHapus satu key dengan ?key=, atau semua key

Autentikasi

Semua permintaan API memerlukan token Bearer di header Authorization:

Authorization: Bearer ahk_live_xxxxxxxxxxxxxxxx

Buat kunci API dari menu Dashboard → Settings → API Keys (kunci API). Kunci berlaku untuk akun Anda, memberi akses penuh atau akses hanya-baca (Anda memilihnya saat membuat kunci), dan dapat dicabut kapan pun. Aplikasi yang terhubung lewat sign-in MCP (anyhook.net/mcp) dapat memanggil endpoint yang sama dengan access token OAuth-nya, dalam batas akses yang Anda setujui.

Rate limit. Panggilan API dan MCP dibatasi per akun per hari UTC: 300 di Free, 1.000 di Pro, 3.000 di Scale. Jika batas terlampaui, Anda akan menerima 429 Too Many Requests dengan header Retry-After sampai pukul 00.00 UTC.

Agen AI (MCP)

AnyHook adalah server MCP di https://anyhook.net/mcp, sehingga agen dapat membuat App, membaca log event, dan memutar ulang kegagalan untuk Anda, serta, di Pro dan Scale, men-deploy dan menguji kode App (anyhook_code_deploy, anyhook_code_test, anyhook_code_get). Claude Code, claude.ai, Codex, dan VS Code terhubung dengan URL tersebut dan sign-in lewat browser, tanpa kunci yang perlu disalin: langkah untuk masing-masing.

Cursor, Windsurf, dan Claude Desktop memakai kunci. Buat kunci di menu Dashboard → Settings → API Keys, yang menampilkan konfigurasi ini dengan kunci Anda sudah terisi:

{
  "mcpServers": {
    "anyhook": {
      "command": "npx",
      "args": [
        "-y",
        "anyhook-mcp"
      ],
      "env": {
        "ANYHOOK_API_KEY": "ahk_live_xxxxxxxxxxxxxxxx"
      }
    }
  }
}

Cursor: Settings → MCP → Add new MCP server, atau ~/.cursor/mcp.json. Windsurf: ~/.codeium/windsurf/mcp_config.json. Claude Desktop: Settings → Developer → Edit Config. Tool kode memerlukan anyhook-mcp 0.4.0 atau yang lebih baru, yang diambil oleh npx -y, atau server di https://anyhook.net/mcp.

Lalu minta agen: “Buat App AnyHook untuk webhook Stripe saya dan berikan URL-nya.” Agen dapat membaca semua ini di /llms.txt.

App

GET/api/v1/appsDaftar semua App
POST/api/v1/appsBuat App baru
GET/api/v1/apps/{slug}Ambil detail App
PATCH/api/v1/apps/{slug}Perbarui App
DELETE/api/v1/apps/{slug}Hapus App

Membuat App:

curl -X POST https://anyhook.net/api/v1/apps \
  -H "Authorization: Bearer {api_key}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Stripe Production",
    "source": "stripe",
    "destination_url": "https://api.example.com/webhooks"
  }'
{
  "id": "app_xxxxx",
  "name": "Stripe Production",
  "slug": "stripe-production",
  "inbound_url": "https://in.anyhook.net/you/stripe-production",
  "destinations": [
    { "url": "https://api.example.com/webhooks", "enabled": true }
  ]
}

Hubungkan Stripe atau GitHub

POST/api/v1/connectDaftarkan URL App di provider dengan kunci milik provider itu

Berikan kunci Stripe atau token GitHub, dan AnyHook menambahkan URL masuk App sebagai webhook di provider, menyimpan signing secret yang dihasilkan, dan memeriksa tanda tangan sejak event pertama. Provider dikenali dari kuncinya. Kunci dipakai untuk panggilan ini dan tidak disimpan. Tanpa app, App baru dibuat; menjalankannya lagi akan mengganti pendaftaran, bukan menambahkan pendaftaran kedua.

Hak akses minimum sudah cukup: restricted key Stripe dengan Webhook Endpoints: Write, atau token GitHub fine-grained dengan Webhooks: Read and write pada repositori.

# Stripe: a restricted key, connecting an existing app
curl -X POST https://anyhook.net/api/v1/connect \
  -H "Authorization: Bearer {api_key}" \
  -H "Content-Type: application/json" \
  -d '{ "key": "rk_live_...", "app": "payments" }'

# GitHub: name the repository (or an organization); no app, so one is created
curl -X POST https://anyhook.net/api/v1/connect \
  -H "Authorization: Bearer {api_key}" \
  -H "Content-Type: application/json" \
  -d '{ "key": "github_pat_...", "target": "acme/api" }'

GitHub mengirim ping bertanda tangan begitu hook dibuat, sehingga event pertama muncul dalam hitungan detik. Provider lain: buat App dengan POST /api/v1/apps dan tempel URL masuknya di pengaturan webhook provider tersebut.

Event

GET/api/v1/eventsDaftar ringkasan event, terbaru lebih dulu (tanpa payload)
GET/api/v1/events/{id}Ambil detail event termasuk payload lengkap

Parameter query untuk daftar:

ParameterTipeDeskripsi
app_slugstringFilter berdasarkan slug App
statusstringFilter berdasarkan status (queued, success, retrying, failed, rejected, circuit_open, quota_exceeded)
limitintegerJumlah hasil maksimum (default 50, maks. 200)

Putar ulang (API)

POST/api/v1/events/{id}/replayPutar ulang satu event

Lihat Putar ulang lewat API di atas untuk detail lengkap dan contoh.

Tidak terkirim (API)

GET/api/v1/apps/{slug}/events/undeliveredDaftar event yang gagal/tidak terkirim

Lihat Event tidak terkirim di atas untuk detail lengkap dan contoh.

Putar ulang massal (API)

POST/api/v1/apps/{slug}/replay-failedPutar ulang semua event yang gagal untuk sebuah App

Lihat Putar ulang massal di atas untuk detail lengkap dan contoh.

Batas paket

FreePro ($20/bulan)Scale ($90/bulan)Enterprise
Event/bulan10.00050.000250.000Fleksibel
Batas harian1.000Tidak adaTidak adaTidak ada
App11050Fleksibel
Tujuan per App32050Fleksibel
Upaya pengiriman3510Fleksibel
Masa simpan3 hari1 tahun7 tahunFleksibel
Dapat diputar ulang selama3 hari30 hari90 hariHingga 365 hari
Batas waktu pengiriman60 detik120 detik5 menitFleksibel
Payload maksimum512 KB2 MB4 MBKustom
Kelebihan pemakaianTidak ada$0.15/1k$0.17/1kKontrak
Batas putar ulang harian1005001.000Tanpa batas
Eksekusi kode/bulanTidak ada3.00012.000Fleksibel
Durasi eksekusi kodeTidak ada105 detik285 detikFleksibel
Jatah komputasi$0.15 per bulan$3.00 per bulan$11.00 per bulanFleksibel
Panggilan API dan MCP300 per hari1.000 per hari3.000 per hariFleksibel

Lihat detail harga lengkap →

Pemakaian & kuota

AnyHook mencatat pemakaian per bulan kalender (misalnya “2026-04”). Penghitung diatur ulang di awal setiap bulan kalender.

  • Satu per pengiriman: event yang dikirim ke dua tujuan dihitung dua, dan event besar dihitung satu untuk setiap 64 KB body dan header, dibulatkan ke atas. Event pada App tanpa tujuan dihitung sekali. Event yang dibuang filter dan event yang gagal verifikasi tanda tangan tidak dihitung. Batas harian Free lebih sederhana: setiap permintaan yang diterima edge dihitung sekali, berapa pun jumlah tujuannya.
  • Hanya upaya pertama: percobaan ulang tidak mengurangi kuota Anda.
  • Putar ulang tidak dihitung: event dengan is_replay: true dikecualikan dari penagihan, kecuali putar ulang event yang ditahan (held) karena melewati kuota, yang dihitung sekali seperti event baru. Putar ulang memakai jatah komputasi dan batas putar ulang harian paket Anda.
  • Jatah komputasi: biaya yang dikeluarkan AnyHook untuk akun Anda di luar upaya pertama setiap event, sesuai biaya aslinya: percobaan ulang, putar ulang, eksekusi kode, instalasi paket, jadwal yang berjalan, latihan gangguan, dan waktu menunggu tujuan setelah detik pertamanya (percobaan ulang untuk event 1 KB memakai sekitar $0.00002, eksekusi kode beberapa detik sekitar $0.0008). Setelah jatah habis, semua itu berhenti sampai tanggal 1 (UTC): pengiriman yang gagal tidak dicoba ulang, putar ulang dan eksekusi kode ditolak, jadwal dijeda, dan tujuan hanya mendapat satu detik untuk menjawab. Event tetap masuk dan mendapat upaya pertamanya.
  • Panggilan API dan MCP: setiap panggilan dengan kunci API atau klien MCP dihitung satu, dan jawaban di atas 32 KB dihitung satu untuk setiap 32 KB, dibulatkan ke atas; dashboard tidak dihitung. Setelah batas hari itu terlampaui, API menjawab 429 dengan Retry-After sampai pukul 00.00 UTC. GET /api/v1/usage (atau anyhook_usage lewat MCP) menampilkan setiap batas dan apa yang telah memakainya.
  • Ditahan, bukan dibuang: setelah event yang termasuk dalam paket Anda habis, dan setelah batas pengeluaran (spending cap) terlampaui jika Anda menetapkannya, setiap event dicatat dengan status quota_exceeded dan tidak dikirim. Tingkatkan paket atau tetapkan batas pengeluaran, lalu putar ulang semuanya dengan sekali klik dari dashboard. Event yang ditahan dapat mencapai 20% kuota di luar yang dibeli batas pengeluaran; lewat dari itu, edge menolak dengan 429 dan tidak menyimpan apa pun, sebagai pembatas bagi sumber yang lepas kendali.
Batas paket Free. Event di atas batas harian (1.000) ditolak di edge. Event di atas batas bulanan (10.000) ditahan, hingga 20% lagi dari batas itu: event itu muncul di log event Anda dengan status quota_exceeded dan dapat diputar ulang setelah Anda meningkatkan paket. Lewat dari itu, event ditolak seperti pada batas harian. Tingkatkan ke Pro untuk kelebihan pemakaian terukur.
Kelebihan pemakaian di paket berbayar. Pro menagih kelebihan pemakaian sebesar $0.15/1k event, Scale $0.17/1k, dibulatkan ke atas ke sen terdekat. Kami tidak pernah diam-diam membuang trafik berbayar.

Penagihan kelebihan pemakaian

Saat kuota bulanan Anda habis, penagihan kelebihan pemakaian membuat event tetap mengalir alih-alih ditahan. Hanya tersedia di paket Pro dan Scale.

Cara kerjanya

  1. Tetapkan batas pengeluaran bulanan di menu Settings ($5 / $10 / $20 / $50, atau Off).
  2. Setelah kuota event paket Anda tercapai, AnyHook memeriksa apakah kelebihan pemakaian diaktifkan dan batas pengeluaran Anda belum habis.
  3. Jika diizinkan, event dikirim seperti biasa dan ditandai sebagai kelebihan pemakaian.
  4. Di awal bulan berikutnya, kelebihan pemakaian ditagihkan sebagai satu baris item di invoice Stripe Anda: $0.15 per 1.000 event di Pro, $0.17 per 1.000 event di Scale (per event, dibulatkan ke atas ke sen), paling banyak sebesar batas pengeluaran Anda.

Sakelar per App

Setiap App punya pengaturan kelebihan pemakaian: Inherit default (ikuti default), Enabled (aktif), atau Disabled (nonaktif). Secara default, App mengikuti pengaturan tingkat akun Anda. Ubah per App di menu App Settings → Overage Billing.

Default akun

Di menu Settings → Overage Billing, batas pengeluaran di atas Off mengaktifkan kelebihan pemakaian untuk setiap App yang diatur ke Inherit default, termasuk App yang sudah ada; App yang diatur ke Disabled tetap nonaktif.

Batas pengeluaran adalah batas mutlak. Begitu biaya kelebihan pemakaian Anda mencapai batas, event berikutnya tidak dikirim: setiap event disimpan sebagai quota_exceeded dan dapat diputar ulang setelah Anda menaikkan batas atau bulan berganti. Tidak ada yang ditagih di atas batas. Setelah batas terlampaui, event ditahan hingga 20% kuota lagi; sisanya ditolak edge dengan 429 dan tidak disimpan.

Kunci API

Kunci API mengautentikasi permintaan Anda ke REST API AnyHook. Kelola dari menu Dashboard → Settings → API Keys.

  • Kunci diawali ahk_live_ untuk production.
  • Anda dapat membuat beberapa kunci dan memberinya label (misalnya “CI/CD”, “Agent”).
  • Cabut kunci seketika; kunci yang dicabut mengembalikan 401 pada pemakaian berikutnya.
  • Kunci hanya ditampilkan sekali saat dibuat. Simpan dengan aman.
GET/api/v1/api-keysDaftar semua kunci API (secret disamarkan)
POST/api/v1/api-keysBuat kunci API baru
PATCH/api/v1/api-keys/{id}/revokeCabut kunci API

Butuh bantuan?

Kirim email ke hello@anyhook.net: kami membalas setiap pesan. Cek status.anyhook.net untuk status layanan terkini.