{"openapi":"3.1.0","info":{"title":"PWA — PN3KN WhatsApp Gateway API","version":"1.10.3","description":"Kontrak lengkap API PWA — PN3KN WhatsApp Gateway. Gunakan X-API-Key untuk integrasi server-to-server dan cookie sesi untuk dashboard. Terapkan least-privilege scope dan Idempotency-Key pada operasi pengiriman."},"servers":[{"url":"/","description":"Host PWA aktif"}],"tags":[{"name":"Authentication"},{"name":"Account"},{"name":"Billing"},{"name":"Admin"},{"name":"Devices"},{"name":"Media"},{"name":"Messages"},{"name":"Automations"},{"name":"Integrations"},{"name":"Webhooks"},{"name":"API Keys"},{"name":"Developer"},{"name":"Observability"},{"name":"System"}],"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key workspace dengan scope minimal."},"CookieAuth":{"type":"apiKey","in":"cookie","name":"ng_session","description":"Cookie sesi HttpOnly milik dashboard."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string"}}},"RegisterRequest":{"type":"object","required":["name","email","password"],"properties":{"name":{"type":"string","minLength":2},"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":8,"format":"password"}}},"LoginRequest":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","format":"password"}}},"CreateDeviceRequest":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":80}}},"SendMessageRequest":{"type":"object","required":["deviceId","to","type"],"properties":{"deviceId":{"type":"string"},"to":{"type":"string","examples":["6281234567890"]},"type":{"enum":["text","image","video","audio","document","location","reaction"]},"text":{"type":"string"},"mediaUploadId":{"type":"string"},"mediaUrl":{"type":"string","format":"uri"},"caption":{"type":"string"},"fileName":{"type":"string"},"mimetype":{"type":"string"},"ptt":{"type":"boolean"},"latitude":{"type":"number"},"longitude":{"type":"number"},"name":{"type":"string"},"address":{"type":"string"},"emoji":{"type":"string"},"targetMessageId":{"type":"string"},"targetFromMe":{"type":"boolean"},"participant":{"type":"string"},"sendOptions":{"type":"object","description":"Override humanized delivery per pesan. Semua guard aktif secara default; rate limit, quota, idempotency, dan send claim tidak dapat dimatikan.","properties":{"guard":{"type":"boolean","default":true,"description":"Master switch presence dan pacing."},"presence":{"type":"boolean","default":true,"description":"Kirim composing/recording lalu paused."},"pacing":{"type":"boolean","default":true,"description":"Terapkan jeda burst per device."},"presenceDurationMs":{"type":"integer","minimum":0,"maximum":10000,"description":"Durasi presence; jika tidak diisi dihitung otomatis dari panjang pesan."}}}}},"MessageTypeCatalogResponse":{"type":"object","required":["sendEndpoint","sendMethod","supportedSendMethods","recommendedSendMethod","mediaUploadEndpoint","types"],"properties":{"sendEndpoint":{"type":"string","examples":["/v1/messages/send"]},"sendMethod":{"type":"string","const":"POST"},"supportedSendMethods":{"type":"array","items":{"type":"string","enum":["GET","POST"]}},"recommendedSendMethod":{"type":"string","const":"POST"},"getMode":{"type":"object","additionalProperties":true},"mediaUploadEndpoint":{"type":"string","examples":["/v1/media"]},"mediaSources":{"type":"array","items":{"type":"string","enum":["mediaUploadId","mediaUrl"]}},"defaults":{"type":"object","additionalProperties":true},"types":{"type":"array","items":{"type":"object","required":["type","label","description","requiredFields","optionalFields","example"],"properties":{"type":{"type":"string","enum":["text","image","video","audio","document","location","reaction"]},"label":{"type":"string"},"description":{"type":"string"},"requiredFields":{"type":"array","items":{"type":"string"}},"optionalFields":{"type":"array","items":{"type":"string"}},"example":{"type":"object","additionalProperties":true}}}}}}}},"paths":{"/health":{"get":{"tags":["System"],"summary":"Health check proses API","description":"","security":[],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/public/platform-media/{kind}":{"get":{"tags":["System"],"summary":"Media identitas website aktif","description":"","security":[],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/public/payment-channels/{id}/logo":{"get":{"tags":["Billing"],"summary":"Logo kanal pembayaran aktif","description":"","security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/openapi.json":{"get":{"tags":["Developer"],"summary":"Ambil spesifikasi OpenAPI","description":"","security":[],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/auth/register":{"post":{"tags":["Authentication"],"summary":"Buat akun dan workspace","description":"","security":[],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}}}}},"/v1/auth/login":{"post":{"tags":["Authentication"],"summary":"Masuk dan membuat sesi","description":"","security":[],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}}}}},"/v1/auth/logout":{"post":{"tags":["Authentication"],"summary":"Keluar dari sesi aktif","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/auth/me":{"get":{"tags":["Account"],"summary":"Ambil profil pengguna aktif","description":"Scope API key: `profile:read`.","security":[{"CookieAuth":[]},{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/auth/sessions":{"get":{"tags":["Account"],"summary":"Daftar sesi akun","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/auth/sessions/{id}":{"delete":{"tags":["Account"],"summary":"Cabut satu sesi akun","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/auth/sessions/revoke-others":{"post":{"tags":["Account"],"summary":"Cabut seluruh sesi lain","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/auth/profile":{"patch":{"tags":["Account"],"summary":"Perbarui profil akun","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/auth/locale":{"patch":{"tags":["Account"],"summary":"Simpan pilihan bahasa akun","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/auth/email/resend":{"post":{"tags":["Account"],"summary":"Kirim ulang verifikasi email","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/auth/email/verify":{"post":{"tags":["Authentication"],"summary":"Verifikasi email dengan token","description":"","security":[],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/auth/password/forgot":{"post":{"tags":["Authentication"],"summary":"Minta tautan reset password","description":"","security":[],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/auth/password/reset":{"post":{"tags":["Authentication"],"summary":"Reset password dengan token","description":"","security":[],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/auth/password/change":{"post":{"tags":["Account"],"summary":"Ganti password akun aktif","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/auth/email/change-request":{"post":{"tags":["Account"],"summary":"Minta perubahan email","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/billing/plans":{"get":{"tags":["Billing"],"summary":"Daftar paket yang tersedia","description":"","security":[],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/billing/account":{"get":{"tags":["Billing"],"summary":"Paket dan penggunaan workspace","description":"Scope API key: `profile:read`.","security":[{"CookieAuth":[]},{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/billing/change-requests":{"get":{"tags":["Billing"],"summary":"Daftar permintaan perubahan paket","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Billing"],"summary":"Ajukan perubahan paket","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/billing/change-requests/{id}":{"delete":{"tags":["Billing"],"summary":"Batalkan permintaan perubahan paket","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/billing/wallet":{"get":{"tags":["Billing"],"summary":"Saldo, ledger, top-up, dan pembelian wallet","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/billing/payment-channels":{"get":{"tags":["Billing"],"summary":"Daftar kanal pembayaran manual aktif","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/billing/topups":{"post":{"tags":["Billing"],"summary":"Ajukan top-up manual","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/billing/topups/{id}":{"delete":{"tags":["Billing"],"summary":"Batalkan top-up pending","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/billing/purchases":{"post":{"tags":["Billing"],"summary":"Beli atau perpanjang paket dengan saldo wallet","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Kunci unik minimal 8 karakter. Gunakan nilai yang sama ketika request transaksi yang sama perlu diulang.","schema":{"type":"string","minLength":8,"maxLength":128}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/billing/custom-package/pricing":{"get":{"tags":["Billing"],"summary":"Harga kalkulator custom package","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/billing/custom-package/calculate":{"post":{"tags":["Billing"],"summary":"Hitung custom package","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/billing/custom-package/requests":{"get":{"tags":["Billing"],"summary":"Riwayat custom package","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Billing"],"summary":"Ajukan custom package","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/billing/custom-package/requests/{id}":{"delete":{"tags":["Billing"],"summary":"Batalkan custom package","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/overview":{"get":{"tags":["Admin"],"summary":"Ringkasan operasional admin","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/plans":{"get":{"tags":["Admin"],"summary":"Kelola daftar paket","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Admin"],"summary":"Buat paket baru","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/settings":{"get":{"tags":["Admin"],"summary":"Daftar konfigurasi platform runtime","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"patch":{"tags":["Admin"],"summary":"Perbarui konfigurasi platform tanpa restart","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/media":{"post":{"tags":["Admin"],"summary":"Upload gambar lokal untuk konfigurasi admin","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/media/{uploadId}":{"get":{"tags":["Admin"],"summary":"Preview media lokal milik admin","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/settings/{key}":{"delete":{"tags":["Admin"],"summary":"Kembalikan konfigurasi ke nilai environment","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/plans/{id}":{"patch":{"tags":["Admin"],"summary":"Perbarui konfigurasi paket","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/custom-package/pricing":{"get":{"tags":["Admin"],"summary":"Harga satuan custom package","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"patch":{"tags":["Admin"],"summary":"Perbarui harga custom package","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/custom-package/requests":{"get":{"tags":["Admin"],"summary":"Daftar permohonan custom package","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/custom-package/requests/{id}/{decision}":{"post":{"tags":["Admin"],"summary":"Review custom package","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"decision","in":"path","required":true,"schema":{"type":"string","enum":["approve","reject"]}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/custom-package/requests/{id}/proof":{"get":{"tags":["Admin"],"summary":"Bukti pembayaran custom package","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/users":{"get":{"tags":["Admin"],"summary":"Daftar pengguna dan workspace","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/users/{id}":{"patch":{"tags":["Admin"],"summary":"Perbarui status pengguna","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/users/{id}/subscription":{"post":{"tags":["Admin"],"summary":"Atur subscription pengguna","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/change-requests":{"get":{"tags":["Admin"],"summary":"Daftar permintaan perubahan paket","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/change-requests/{id}/{decision}":{"post":{"tags":["Admin"],"summary":"Putuskan permintaan perubahan paket","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"decision","in":"path","required":true,"schema":{"type":"string","enum":["approve","reject"]}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/payment-channels":{"get":{"tags":["Admin"],"summary":"Daftar seluruh kanal pembayaran manual","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Admin"],"summary":"Buat kanal pembayaran manual","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/payment-channels/{id}":{"patch":{"tags":["Admin"],"summary":"Perbarui kanal pembayaran manual","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/topups":{"get":{"tags":["Admin"],"summary":"Daftar permintaan top-up","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/topups/{id}/{decision}":{"post":{"tags":["Admin"],"summary":"Approve atau reject top-up","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"decision","in":"path","required":true,"schema":{"type":"string","enum":["approve","reject"]}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/translations":{"get":{"tags":["Admin"],"summary":"Daftar draf dan versi terjemahan","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/admin/translations/draft":{"patch":{"tags":["Admin"],"summary":"Simpan draf terjemahan","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/translations/publish":{"post":{"tags":["Admin"],"summary":"Terbitkan terjemahan realtime","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/admin/translations/releases/{id}/rollback":{"post":{"tags":["Admin"],"summary":"Kembalikan versi terjemahan","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/i18n/{locale}":{"get":{"tags":["Developer"],"summary":"Ambil kamus bahasa aktif","description":"","security":[],"parameters":[{"name":"locale","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/i18n/events":{"get":{"tags":["Developer"],"summary":"Stream perubahan versi bahasa","description":"","security":[],"parameters":[],"responses":{"200":{"description":"Stream text/event-stream yang hanya membawa nomor versi."},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/devices":{"get":{"tags":["Devices"],"summary":"Daftar device WhatsApp","description":"Scope API key: `devices:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Devices"],"summary":"Buat device WhatsApp","description":"Scope API key: `devices:manage`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDeviceRequest"}}}}}},"/v1/devices/{deviceId}":{"patch":{"tags":["Devices"],"summary":"Ubah nama atau konfigurasi device","description":"Scope API key: `devices:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}},"delete":{"tags":["Devices"],"summary":"Hapus device dan sesi lokal","description":"Scope API key: `devices:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/devices/{deviceId}/connect":{"post":{"tags":["Devices"],"summary":"Hubungkan device dan buat QR","description":"Scope API key: `devices:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/devices/{deviceId}/reconnect":{"post":{"tags":["Devices"],"summary":"Hubungkan ulang sesi tersimpan","description":"Scope API key: `devices:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/devices/{deviceId}/logout":{"post":{"tags":["Devices"],"summary":"Logout sesi WhatsApp device","description":"Scope API key: `devices:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"deviceId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/media":{"get":{"tags":["Media"],"summary":"Daftar upload media sementara","description":"Scope API key: `messages:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Media"],"summary":"Upload media biner","description":"Scope API key: `messages:send`.","security":[{"ApiKey":[]}],"parameters":[{"name":"X-File-Name","in":"header","schema":{"type":"string"}},{"name":"X-Media-Mime-Type","in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"413":{"description":"Ukuran media melampaui batas paket atau server."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}}},"/v1/media/{uploadId}":{"delete":{"tags":["Media"],"summary":"Hapus upload media sementara","description":"Scope API key: `messages:send`.","security":[{"ApiKey":[]}],"parameters":[{"name":"uploadId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/messages/types":{"get":{"tags":["Messages"],"summary":"Daftar tipe pesan dan contoh payload","description":"Katalog discovery untuk seluruh tipe pesan yang didukung. Pengiriman tetap menggunakan POST /v1/messages/send.","security":[],"parameters":[],"responses":{"200":{"description":"Katalog tipe pesan lengkap.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageTypeCatalogResponse"}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/messages/stats":{"get":{"tags":["Messages"],"summary":"Statistik pesan workspace","description":"Scope API key: `messages:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/messages":{"get":{"tags":["Messages"],"summary":"Riwayat pesan dengan cursor pagination","description":"Scope API key: `messages:read`.","security":[{"ApiKey":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":300,"default":60}},{"name":"beforeId","in":"query","schema":{"type":"integer","minimum":1}},{"name":"deviceId","in":"query","schema":{"type":"string"}},{"name":"direction","in":"query","schema":{"enum":["inbound","outbound"]}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"type","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/messages/{id}":{"get":{"tags":["Messages"],"summary":"Detail pesan dan receipt","description":"Scope API key: `messages:read`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/messages/send":{"get":{"tags":["Messages"],"summary":"Kirim pesan melalui query parameter","description":"Mode kompatibilitas untuk seluruh tipe pesan. Hanya menerima X-API-Key dan tidak menerima cookie session. POST tetap direkomendasikan untuk payload sensitif atau panjang. Scope API key: `messages:send`.","security":[{"ApiKey":[]}],"parameters":[{"name":"deviceId","in":"query","required":true,"schema":{"type":"string"}},{"name":"to","in":"query","required":true,"schema":{"type":"string"}},{"name":"type","in":"query","required":true,"schema":{"type":"string","enum":["text","image","video","audio","document","location","reaction"]}},{"name":"text","in":"query","schema":{"type":"string","maxLength":4096}},{"name":"mediaUploadId","in":"query","schema":{"type":"string"}},{"name":"mediaUrl","in":"query","schema":{"type":"string","format":"uri"}},{"name":"caption","in":"query","schema":{"type":"string","maxLength":4096}},{"name":"fileName","in":"query","schema":{"type":"string","maxLength":180}},{"name":"mimetype","in":"query","schema":{"type":"string"}},{"name":"ptt","in":"query","schema":{"type":"boolean"}},{"name":"latitude","in":"query","schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"longitude","in":"query","schema":{"type":"number","minimum":-180,"maximum":180}},{"name":"name","in":"query","schema":{"type":"string"}},{"name":"address","in":"query","schema":{"type":"string"}},{"name":"emoji","in":"query","schema":{"type":"string"}},{"name":"targetMessageId","in":"query","schema":{"type":"string"}},{"name":"targetFromMe","in":"query","schema":{"type":"boolean"}},{"name":"participant","in":"query","schema":{"type":"string"}},{"name":"guard","in":"query","schema":{"type":"boolean","default":true}},{"name":"presence","in":"query","schema":{"type":"boolean","default":true}},{"name":"pacing","in":"query","schema":{"type":"boolean","default":true}},{"name":"presenceDurationMs","in":"query","schema":{"type":"integer","minimum":0,"maximum":10000}},{"name":"idempotencyKey","in":"query","schema":{"type":"string","maxLength":100}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Messages"],"summary":"Kirim pesan WhatsApp","description":"Scope API key: `messages:send`.","security":[{"ApiKey":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Kunci unik minimal 8 karakter. Gunakan nilai yang sama ketika request transaksi yang sama perlu diulang.","schema":{"type":"string","minLength":8,"maxLength":128}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessageRequest"}}}}}},"/v1/messages/{id}/retry":{"post":{"tags":["Messages"],"summary":"Ulangi pesan outbound yang gagal","description":"Scope API key: `messages:send`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Kunci unik minimal 8 karakter. Gunakan nilai yang sama ketika request transaksi yang sama perlu diulang.","schema":{"type":"string","minLength":8,"maxLength":128}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/bulk/import/preview":{"post":{"tags":["Bulk Campaigns"],"summary":"Validasi dan pratinjau file kontak","description":"Scope API key: `messages:send`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/bulk/template.csv":{"get":{"tags":["Bulk Campaigns"],"summary":"Unduh template impor CSV","description":"Scope API key: `messages:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/bulk/campaigns":{"get":{"tags":["Bulk Campaigns"],"summary":"Daftar bulk campaign","description":"Scope API key: `messages:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/bulk/campaigns/import":{"post":{"tags":["Bulk Campaigns"],"summary":"Impor file dan buat draft campaign","description":"Scope API key: `messages:send`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/bulk/campaigns/{campaignId}":{"get":{"tags":["Bulk Campaigns"],"summary":"Detail campaign dan penerima","description":"Scope API key: `messages:read`.","security":[{"ApiKey":[]}],"parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"delete":{"tags":["Bulk Campaigns"],"summary":"Hapus campaign yang tidak aktif","description":"Scope API key: `messages:send`.","security":[{"ApiKey":[]}],"parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/bulk/campaigns/{campaignId}/export.csv":{"get":{"tags":["Bulk Campaigns"],"summary":"Ekspor laporan penerima campaign","description":"Scope API key: `messages:read`.","security":[{"ApiKey":[]}],"parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/bulk/campaigns/{campaignId}/{action}":{"post":{"tags":["Bulk Campaigns"],"summary":"Mulai, jeda, lanjutkan, atau batalkan campaign","description":"Scope API key: `messages:send`.","security":[{"ApiKey":[]}],"parameters":[{"name":"campaignId","in":"path","required":true,"schema":{"type":"string"}},{"name":"action","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/automations":{"get":{"tags":["Automations"],"summary":"Daftar automation","description":"Scope API key: `automations:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Automations"],"summary":"Buat automation","description":"Scope API key: `automations:manage`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/automations/{id}/versions":{"get":{"tags":["Automations"],"summary":"Daftar versi automation","description":"Scope API key: `automations:read`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Automations"],"summary":"Buat draft versi automation","description":"Scope API key: `automations:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/automations/{id}/executions":{"get":{"tags":["Automations"],"summary":"Riwayat eksekusi automation","description":"Scope API key: `automations:read`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/automations/{id}/publish":{"post":{"tags":["Automations"],"summary":"Publikasikan versi automation","description":"Scope API key: `automations:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/automations/{id}":{"patch":{"tags":["Automations"],"summary":"Perbarui metadata automation","description":"Scope API key: `automations:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}},"delete":{"tags":["Automations"],"summary":"Hapus automation","description":"Scope API key: `automations:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/automations/test":{"post":{"tags":["Automations"],"summary":"Uji rule automation tanpa publish","description":"Scope API key: `automations:manage`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/automations/script/validate":{"post":{"tags":["Automations"],"summary":"Validasi statis GatewayScript dan tampilkan capability manifest","description":"Scope API key: `automations:manage`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/automations/runtime/bot-settings":{"get":{"tags":["Automations"],"summary":"Baca default prefix command bot","description":"Scope API key: `automations:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"patch":{"tags":["Automations"],"summary":"Ubah default prefix command bot","description":"Scope API key: `automations:manage`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/automations/runtime/capabilities":{"get":{"tags":["Automations"],"summary":"Daftar capability/plugin automation yang tersedia","description":"Scope API key: `automations:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/automations/runtime/credentials":{"get":{"tags":["Automations"],"summary":"Daftar metadata credential automation milik user","description":"Scope API key: `automations:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Automations"],"summary":"Simpan credential automation milik user secara terenkripsi","description":"Scope API key: `automations:manage`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/automations/runtime/credentials/{id}":{"patch":{"tags":["Automations"],"summary":"Perbarui credential automation milik user","description":"Scope API key: `automations:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}},"delete":{"tags":["Automations"],"summary":"Hapus credential automation milik user","description":"Scope API key: `automations:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/integrations":{"get":{"tags":["Integrations"],"summary":"Daftar integration alias","description":"Scope API key: `integrations:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Integrations"],"summary":"Buat integration alias","description":"Scope API key: `integrations:manage`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/integrations/{id}":{"patch":{"tags":["Integrations"],"summary":"Perbarui integration alias","description":"Scope API key: `integrations:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}},"delete":{"tags":["Integrations"],"summary":"Hapus integration alias","description":"Scope API key: `integrations:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"Daftar endpoint webhook","description":"Scope API key: `webhooks:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["Webhooks"],"summary":"Buat endpoint webhook","description":"Scope API key: `webhooks:manage`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/webhooks/{id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"Riwayat delivery webhook","description":"Scope API key: `webhooks:read`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/webhooks/{id}":{"patch":{"tags":["Webhooks"],"summary":"Perbarui endpoint webhook","description":"Scope API key: `webhooks:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}},"delete":{"tags":["Webhooks"],"summary":"Hapus endpoint webhook","description":"Scope API key: `webhooks:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/webhooks/{id}/rotate-secret":{"post":{"tags":["Webhooks"],"summary":"Rotasi signing secret webhook","description":"Operasi ini sengaja mewajibkan sesi browser karena mengembalikan secret plaintext satu kali.","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/webhooks/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Kirim event test ke webhook","description":"Scope API key: `webhooks:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/webhooks/{id}/deliveries/{deliveryId}/retry":{"post":{"tags":["Webhooks"],"summary":"Retry delivery webhook","description":"Scope API key: `webhooks:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"deliveryId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/webhooks/{id}/deliveries/{deliveryId}/replay":{"post":{"tags":["Webhooks"],"summary":"Replay payload delivery webhook","description":"Scope API key: `webhooks:manage`.","security":[{"ApiKey":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"deliveryId","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/api-keys":{"get":{"tags":["API Keys"],"summary":"Daftar API key workspace","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}},"post":{"tags":["API Keys"],"summary":"Buat API key","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/api-keys/custom":{"post":{"tags":["API Keys"],"summary":"Buat custom API key menggunakan saldo","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Kunci unik minimal 8 karakter. Gunakan nilai yang sama ketika request transaksi yang sama perlu diulang.","schema":{"type":"string","minLength":8,"maxLength":128}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/api-keys/{id}":{"patch":{"tags":["API Keys"],"summary":"Ubah nama atau scope API key","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}},"delete":{"tags":["API Keys"],"summary":"Cabut API key","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/api-keys/{id}/rotate":{"post":{"tags":["API Keys"],"summary":"Rotasi API key","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/api-keys/{id}/customize":{"post":{"tags":["API Keys"],"summary":"Ganti nilai API key menggunakan saldo","description":"","security":[{"CookieAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Kunci unik minimal 8 karakter. Gunakan nilai yang sama ketika request transaksi yang sama perlu diulang.","schema":{"type":"string","minLength":8,"maxLength":128}}],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/developer/capabilities":{"get":{"tags":["Developer"],"summary":"Kapabilitas API dan entitlement","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/developer/requests":{"get":{"tags":["Developer"],"summary":"Log request API workspace","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/workspace/health":{"get":{"tags":["Observability"],"summary":"Health workspace yang tenant-safe","description":"Scope API key: `profile:read`.","security":[{"ApiKey":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/system/runtime":{"get":{"tags":["System"],"summary":"Snapshot runtime gateway","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/system/audit":{"get":{"tags":["System"],"summary":"Log audit sistem","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/system/workers":{"get":{"tags":["System"],"summary":"Status worker dan queue","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/system/health":{"get":{"tags":["System"],"summary":"Health detail sistem","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/system/events":{"get":{"tags":["System"],"summary":"Stream Server-Sent Events sistem","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Stream text/event-stream."},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/system/maintenance/preview":{"get":{"tags":["System"],"summary":"Pratinjau data maintenance","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}}}},"/v1/system/maintenance/cleanup":{"post":{"tags":["System"],"summary":"Jalankan cleanup data","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/system/recovery/run":{"post":{"tags":["System"],"summary":"Jalankan recovery operasional","description":"","security":[{"CookieAuth":[]}],"parameters":[],"responses":{"200":{"description":"Berhasil.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Request tidak valid."},"401":{"description":"Autentikasi diperlukan atau kredensial tidak valid."},"403":{"description":"Akses atau scope tidak mencukupi."},"404":{"description":"Resource tidak ditemukan."},"409":{"description":"Request berbenturan dengan state resource saat ini."},"429":{"description":"Batas rate atau kuota terlampaui."},"500":{"description":"Kesalahan internal. Simpan requestId untuk penelusuran."}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}}}