POST/v1/webhooks
Buat webhook
create_webhook
URL harus memakai https, dan host-nya harus mengarah ke alamat publik. Jaringan privat (RFC 1918), loopback, link-local, metadata cloud, dan jaringan khusus lainnya ditolak, baik saat pendaftaran maupun pada setiap koneksi. Rahasia penandatanganan ditampilkan sekali di respons (secret); setelah itu rahasia hanya dapat dirotasi. Satu organisasi dapat memiliki paling banyak 20 webhook.
Langganan mencantumkan jenis peristiwa dan mask domain (card.*, *). Akses ditetapkan dengan cara yang sama seperti untuk kunci API: role, data_profile_id, dan collection_ids. Peristiwa tentang objek yang tidak dapat dilihat oleh peran, profil data, atau koleksi tersebut tidak dikirim. tags membatasi peristiwa kartu pada kartu yang memiliki salah satu tag tersebut. payload: thin mengirim peristiwa tanpa data. Header kustom (headers) dan otorisasi keluar (auth) disimpan dalam bentuk terenkripsi; respons hanya berisi nama header serta flag value_set dan auth_set.
Autentikasi
Kirim kunci API di header Authorization: Authorization: Bearer <kunci>.
Parameter header
Idempotency-KeystringKunci untuk percobaan ulang penulisan yang aman: 1 hingga 255 karakter ASCII yang dapat dicetak; disarankan satu UUID v4 per operasi logis. Percobaan ulang dengan kunci yang sama dalam 24 jam tidak menjalankan operasi lagi: yang dikembalikan adalah respons tersimpan (status, header, dan isi) dengan header
Idempotency-Replayed: true. Kunci yang sama dengan metode, path,Content-Type, atau isi yang berbeda mengembalikan409 api.idempotency_mismatch; selama permintaan pertama masih berjalan,409 api.idempotency_in_progressdenganRetry-After: 1. Setelah respons 5xx atau 429, kunci dilepaskan, dan percobaan ulang menjalankan operasi lagi. Kunci berlaku dalam lingkup organisasi dan pemanggil (kunci API, pengguna, atau kunci sumber kustom).length ≥ 1, length ≤ 255
Isi permintaan
application/json
urlstringwajibURL penerima, hanya
https://, hingga 2048 karakter.length ≤ 2048
descriptionstringlength ≤ 200
items ≥ 1
roleWebhookRoledata_profile_idinteger | nullcollection_idsarray of integerKoleksi yang peristiwanya diterima webhook. Tanpa nilai atau daftar kosong berarti semua koleksi yang tersedia bagi peran dan profil data. Kunci yang sendiri dibatasi pada koleksi hanya dapat membuat webhook dengan daftar tidak kosong dari koleksinya sendiri. Tanpa field ini, dengan daftar kosong, atau dengan koleksi di luar daftarnya, permintaan mengembalikan
403 webhooks.collections_outside_key.items ≤ 200
tagsarray of stringitems ≤ 50
payloadWebhookPayloadModeheadersarray of WebhookHeaderInputitems ≤ 10
authWebhookAuthInput
Respons
201Berhasil dibuat. Hanya kali ini `secret` ditampilkan.
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
Idempotency-Replayedtrueberarti respons ini dikirim ulang dari respons tersimpan untukIdempotency-Keyini: operasi tidak dijalankan lagi.
application/json
idintegerwajiburlstringwajibdescriptionstringwajibactivebooleanwajibpaused_atstring (date-time) | nullpaused_reasonstring | nullfailures: 10 upaya gagal berturut-turut;feature_disabled: paket tidak mencakup webhook.disabled_reasonstring | nullgone: penerima menjawab 410;manual: dinonaktifkan oleh administrator.Nilai yang diizinkan:
gonemanualnulldisabled_atstring (date-time) | nulldata_profile_idinteger | nullProfil data webhook (
nullberarti tanpa profil, seperti kunci API dengan peran yang sama).collection_idsarray of integerwajibKoleksi yang peristiwanya diterima webhook; kosong berarti semua koleksi yang tersedia bagi peran dan profil data.
tagsarray of stringwajibPeristiwa kartu hanya untuk kartu dengan salah satu tag ini; kosong berarti tanpa filter.
auth_typestring | nullJenis otorisasi keluar (
nullberarti tidak ada).Nilai yang diizinkan:
bearerbasicnullauth_setbooleanwajibApakah otorisasi keluar ditetapkan (nilainya tidak pernah dikembalikan).
previous_secret_valid_untilstring (date-time) | nullSampai kapan pengiriman juga ditandatangani dengan rahasia sebelumnya (
nullberarti tidak ada masa tumpang tindih).healthWebhookHealthconsecutive_failuresintegerwajiblast_delivery_atstring (date-time) | nulllast_success_atstring (date-time) | nulllast_errorstring | nullcreated_byinteger | nullcreated_by_namestring | nullcreated_atstring (date-time)wajibupdated_atstring (date-time)wajibsecretstringwajibwhsec_diikuti 32 byte dalam base64 (rahasia baru memakai alfabet standar dengan padding, yang lama memakai base64url). Simpan di sisi penerima; rahasia ini tidak pernah muncul lagi di respons API. Kunci penandatanganan Standard Webhooks adalah hasil dekode base64 dari bagian setelahwhsec_.previous_valid_untilstring (date-time) | nullSampai kapan rahasia sebelumnya masih diterima (setelah rotasi).
nullsaat pembuatan.
400Permintaan tidak valid: nilai parameter atau status objek tidak memungkinkan tindakan ini (`detail` berisi pesan).
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
401Kredensial tidak dikirim (baik cookie sesi maupun kunci API), atau kunci tidak ditemukan.
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
403Tindakan tidak diizinkan: peran tidak memadai, tidak ada akses ke koleksi atau kartu, permintaan berjalan dalam mode “View as”, atau organisasi ditangguhkan atau dihapus (`detail` adalah objek dengan `code: org_suspended | org_deleted`).
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
409Status objek tidak memungkinkan tindakan ini, misalnya duplikat, pengindeksan yang sedang berlangsung, atau job yang sudah diproses.
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
422Error validasi: isi atau parameter tidak sesuai dengan skema (`detail` berisi daftar error validasi), atau nilai parameter berada di luar rentang (`detail` berisi pesan).
Header respons
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
429Terlalu banyak permintaan (`api.rate_limited`), kuota organisasi untuk menit, hari, atau bulan sudah habis (`api.quota_exceeded`; `error.details` berisi `quota`, `limit`, dan `reset_at`), batas organisasi tercapai, atau layanan jawaban sedang sibuk (`answers.engine_busy`). Tunggu selama waktu di header `Retry-After`.
Header respons
Retry-AfterJumlah detik yang perlu ditunggu sebelum Anda mencoba ulang permintaan.
RateLimit-PolicyBatas yang berlaku, dalam format draf IETF
draft-ietf-httpapi-ratelimit-headers: item yang dipisahkan koma"<name>";q=<quota>;w=<window in seconds>.keyadalah laju permintaan kunci API (kuotanya adalah lonjakan, jendela waktunya adalah waktu untuk mengisinya kembali sepenuhnya; untuk sesi nilainyauser, tanpa kredensialip);minute,day, danmonthadalah kuota organisasi untuk menit, hari, dan bulan kalender dalam UTC.RateLimitSisa setiap batas di
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitBatas dari entri paling ketat di
RateLimit-Policy(entri dengan sisa permintaan paling sedikit).X-RateLimit-RemainingSisa permintaan dalam batas paling ketat.
X-RateLimit-ResetDetik hingga batas paling ketat direset.
application/json
Kode error
Kode yang dapat dikembalikan endpoint ini di error.code, selain kode umum yang berlaku untuk setiap permintaan.
- 409api.idempotency_in_progress
- 400api.idempotency_key_invalid
- 409api.idempotency_mismatch
- 403webhooks.feature_disabled
- 401auth.not_authenticated
- 403authz.forbidden
- 400webhooks.invalid_url
- 400webhooks.private_address
- 400webhooks.unresolvable
- 400webhooks.unknown_event
- 400webhooks.events_required
- 400webhooks.description_too_long
- 409webhooks.too_many
- 400webhooks.headers_invalid
- 400webhooks.auth_invalid
- 400webhooks.access_invalid
- 403webhooks.collections_outside_key
Percobaan ulang yang aman
Kirim header Idempotency-Key (misalnya UUID) bersama setiap POST dan PATCH. Percobaan ulang dengan kunci yang sama dalam 24 jam mengembalikan respons yang tersimpan alih-alih menjalankan permintaan lagi.
Batas laju
Respons berisi header RateLimit dan RateLimit-Policy serta header lama X-RateLimit-Limit, X-RateLimit-Remaining, dan X-RateLimit-Reset. Respons 429 berisi Retry-After dalam detik: tunggu, lalu coba lagi.