{
  "openapi": "3.0.3",
  "info": {
    "title": "WA Gateway API (Baileys)",
    "version": "1.0.0",
    "description": "REST API WhatsApp Gateway multi-device berbasis Baileys. Autentikasi per device menggunakan header X-Device-Key."
  },
  "servers": [{ "url": "http://localhost:8787", "description": "Default" }],
  "components": {
    "securitySchemes": {
      "DeviceKey": { "type": "apiKey", "in": "header", "name": "X-Device-Key" },
      "AdminToken": { "type": "apiKey", "in": "header", "name": "X-Admin-Token" }
    },
    "schemas": {
      "SendTarget": {
        "type": "object",
        "required": ["to"],
        "properties": {
          "to": { "type": "string", "example": "628123456789" },
          "is_group": { "type": "boolean", "default": false },
          "reply_to": { "type": "string", "nullable": true }
        }
      }
    }
  },
  "paths": {
    "/health": { "get": { "summary": "Cek status server", "responses": { "200": { "description": "OK" } } } },
    "/api/v1/device": { "get": { "summary": "Info device", "security": [{ "DeviceKey": [] }], "responses": { "200": { "description": "OK" } } } },
    "/api/v1/device/qr": { "get": { "summary": "QR untuk pairing (scan) + status", "security": [{ "DeviceKey": [] }], "responses": { "200": { "description": "OK" } } } },
    "/api/v1/device/pairing-code": {
      "post": {
        "summary": "Minta pairing code 8 digit",
        "security": [{ "DeviceKey": [] }],
        "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["phone"], "properties": { "phone": { "type": "string" } } } } } },
        "responses": { "200": { "description": "OK" } }
      }
    },
    "/api/v1/device/connect": { "post": { "summary": "Jalankan / sambungkan ulang session", "security": [{ "DeviceKey": [] }], "responses": { "200": { "description": "OK" } } } },
    "/api/v1/device/disconnect": { "post": { "summary": "Putuskan session (opsional logout)", "security": [{ "DeviceKey": [] }], "responses": { "200": { "description": "OK" } } } },
    "/api/v1/device/reset-session": { "post": { "summary": "Hapus session (paksa pairing ulang, butuh confirm:true)", "security": [{ "DeviceKey": [] }], "responses": { "200": { "description": "OK" } } } },
    "/api/v1/device/status": { "get": { "summary": "Status koneksi device", "security": [{ "DeviceKey": [] }], "responses": { "200": { "description": "OK" } } } },
    "/api/v1/device/check-number": {
      "post": {
        "summary": "Cek nomor terdaftar WhatsApp",
        "security": [{ "DeviceKey": [] }],
        "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["phone"], "properties": { "phone": { "type": "string" } } } } } },
        "responses": { "200": { "description": "OK" } }
      }
    },
    "/api/v1/device/presence": {
      "post": {
        "summary": "Kirim status presence (composing/available/paused)",
        "security": [{ "DeviceKey": [] }],
        "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "to": { "type": "string" }, "type": { "type": "string", "enum": ["composing", "available", "paused", "recording"] } } } } } },
        "responses": { "200": { "description": "OK" } }
      }
    },
    "/api/v1/device/read": {
      "post": {
        "summary": "Tandai pesan sudah dibaca",
        "security": [{ "DeviceKey": [] }],
        "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["chat_id"], "properties": { "chat_id": { "type": "string" }, "message_id": { "type": "string" } } } } } },
        "responses": { "200": { "description": "OK" } }
      }
    },
    "/api/v1/send": {
      "post": {
        "summary": "Kirim pesan — satu endpoint untuk semua tipe (default: text)",
        "security": [{ "DeviceKey": [] }],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["to"],
                "properties": {
                  "to": { "type": "string", "example": "628123456789" },
                  "type": { "type": "string", "enum": ["text", "image", "video", "audio", "document", "sticker", "location", "contact", "reaction"], "default": "text" },
                  "message": { "type": "string", "description": "Isi teks; untuk media jadi caption" },
                  "url": { "type": "string", "description": "URL media" },
                  "filename": { "type": "string" },
                  "mimetype": { "type": "string" },
                  "ptt": { "type": "boolean", "description": "voice note (type audio)" },
                  "latitude": { "type": "number" },
                  "longitude": { "type": "number" },
                  "contacts": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "phone": { "type": "string" } } } },
                  "message_id": { "type": "string", "description": "untuk type reaction" },
                  "emoji": { "type": "string", "description": "untuk type reaction" },
                  "reply_to": { "type": "string", "nullable": true },
                  "is_group": { "type": "boolean", "default": false }
                }
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": ["to"],
                "properties": {
                  "to": { "type": "string" },
                  "type": { "type": "string" },
                  "message": { "type": "string" },
                  "file": { "type": "string", "format": "binary" }
                }
              }
            }
          }
        },
        "responses": { "200": { "description": "OK" }, "400": { "description": "Parameter tidak valid" }, "409": { "description": "Device belum terhubung" } }
      }
    },
    "/api/v1/send/text": {
      "post": {
        "summary": "Kirim pesan teks",
        "security": [{ "DeviceKey": [] }],
        "requestBody": { "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SendTarget" }, { "type": "object", "required": ["message"], "properties": { "message": { "type": "string" } } }] } } } },
        "responses": { "200": { "description": "OK" }, "409": { "description": "Device belum terhubung" } }
      }
    },
    "/api/v1/send/image": { "post": { "summary": "Kirim gambar", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SendTarget" }, { "type": "object", "required": ["image"], "properties": { "image": { "type": "string" }, "caption": { "type": "string" } } }] } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/send/video": { "post": { "summary": "Kirim video", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SendTarget" }, { "type": "object", "required": ["video"], "properties": { "video": { "type": "string" }, "caption": { "type": "string" } } }] } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/send/audio": { "post": { "summary": "Kirim audio / voice note", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SendTarget" }, { "type": "object", "required": ["audio"], "properties": { "audio": { "type": "string" }, "ptt": { "type": "boolean" }, "mimetype": { "type": "string" } } }] } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/send/document": { "post": { "summary": "Kirim dokumen", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SendTarget" }, { "type": "object", "required": ["document"], "properties": { "document": { "type": "string" }, "filename": { "type": "string" }, "mimetype": { "type": "string" }, "caption": { "type": "string" } } }] } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/send/sticker": { "post": { "summary": "Kirim sticker", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SendTarget" }, { "type": "object", "required": ["sticker"], "properties": { "sticker": { "type": "string" } } }] } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/send/location": { "post": { "summary": "Kirim lokasi", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SendTarget" }, { "type": "object", "required": ["latitude", "longitude"], "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" }, "name": { "type": "string" }, "address": { "type": "string" } } }] } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/send/contact": { "post": { "summary": "Kirim kontak (vCard)", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "to": { "type": "string" }, "name": { "type": "string" }, "phone": { "type": "string" }, "contacts": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "phone": { "type": "string" } } } } } } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/send/reaction": { "post": { "summary": "Kirim reaksi emoji", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["to", "message_id", "emoji"], "properties": { "to": { "type": "string" }, "message_id": { "type": "string" }, "emoji": { "type": "string" }, "from_me": { "type": "boolean" } } } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/send/media": { "post": { "summary": "Upload dan kirim file (multipart/form-data)", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "multipart/form-data": { "schema": { "type": "object", "required": ["to", "file"], "properties": { "to": { "type": "string" }, "file": { "type": "string", "format": "binary" }, "caption": { "type": "string" }, "kind": { "type": "string", "enum": ["image", "video", "audio", "document", "sticker"] } } } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/send/bulk": { "post": { "summary": "Kirim massal (broadcast)", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["messages"], "properties": { "delay_ms": { "type": "integer", "default": 1500 }, "messages": { "type": "array", "maxItems": 500, "items": { "type": "object", "required": ["to", "message"], "properties": { "to": { "type": "string" }, "message": { "type": "string" }, "is_group": { "type": "boolean" } } } } } } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/message/delete": { "post": { "summary": "Hapus pesan untuk semua orang", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["to", "message_id"], "properties": { "to": { "type": "string" }, "message_id": { "type": "string" }, "from_me": { "type": "boolean" } } } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/groups": {
      "get": { "summary": "Daftar grup", "security": [{ "DeviceKey": [] }], "responses": { "200": { "description": "OK" } } },
      "post": { "summary": "Buat grup", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["subject"], "properties": { "subject": { "type": "string" }, "participants": { "type": "array", "items": { "type": "string" } } } } } } }, "responses": { "200": { "description": "OK" } } }
    },
    "/api/v1/groups/{jid}": { "get": { "summary": "Metadata grup", "security": [{ "DeviceKey": [] }], "parameters": [{ "name": "jid", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/api/v1/groups/{jid}/participants": { "post": { "summary": "Tambah/hapus/promote peserta", "security": [{ "DeviceKey": [] }], "parameters": [{ "name": "jid", "in": "path", "required": true, "schema": { "type": "string" } }], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["participants", "action"], "properties": { "participants": { "type": "array", "items": { "type": "string" } }, "action": { "type": "string", "enum": ["add", "remove", "promote", "demote"] } } } } } }, "responses": { "200": { "description": "OK" } } } },
    "/api/v1/groups/{jid}/leave": { "post": { "summary": "Keluar dari grup", "security": [{ "DeviceKey": [] }], "parameters": [{ "name": "jid", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/api/v1/messages": { "get": { "summary": "Riwayat pesan device", "security": [{ "DeviceKey": [] }], "parameters": [
      { "name": "chat_id", "in": "query", "schema": { "type": "string" } },
      { "name": "direction", "in": "query", "schema": { "type": "string", "enum": ["in", "out"] } },
      { "name": "limit", "in": "query", "schema": { "type": "integer", "default": 50 } },
      { "name": "offset", "in": "query", "schema": { "type": "integer", "default": 0 } }
    ], "responses": { "200": { "description": "OK" } } } },
    "/api/v1/messages/{id}": { "get": { "summary": "Detail pesan", "security": [{ "DeviceKey": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "200": { "description": "OK" } } } },
    "/api/v1/webhook/test": { "post": { "summary": "Test kirim payload ke webhook", "security": [{ "DeviceKey": [] }], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "url": { "type": "string" } } } } } }, "responses": { "200": { "description": "OK" } } } },
    "/admin/api/login": { "post": { "summary": "Login admin", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["password"], "properties": { "password": { "type": "string" } } } } } }, "responses": { "200": { "description": "token admin" }, "401": { "description": "Password salah" } } } },
    "/admin/api/overview": { "get": { "summary": "Statistik + device", "security": [{ "AdminToken": [] }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/devices": {
      "get": { "summary": "Daftar device", "security": [{ "AdminToken": [] }], "responses": { "200": { "description": "OK" } } },
      "post": { "summary": "Buat device", "security": [{ "AdminToken": [] }], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["name"], "properties": { "name": { "type": "string" }, "phone": { "type": "string" }, "webhook_url": { "type": "string" }, "webhook_events": { "type": "array", "items": { "type": "string" } }, "autostart": { "type": "boolean" } } } } } }, "responses": { "200": { "description": "OK" } } }
    },
    "/admin/api/devices/{id}": {
      "get": { "summary": "Detail device", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } },
      "patch": { "summary": "Update device", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } },
      "delete": { "summary": "Hapus device", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } }
    },
    "/admin/api/devices/{id}/qr": { "get": { "summary": "QR + pairing code + status", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/devices/{id}/pairing-code": { "post": { "summary": "Minta pairing code", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["phone"], "properties": { "phone": { "type": "string" } } } } } }, "responses": { "200": { "description": "OK" } } } },
    "/admin/api/devices/{id}/start": { "post": { "summary": "Start device", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/devices/{id}/stop": { "post": { "summary": "Stop device", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/devices/{id}/restart": { "post": { "summary": "Restart device", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/devices/{id}/logout": { "post": { "summary": "Logout device dari WhatsApp", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/devices/{id}/reset-session": { "post": { "summary": "Hapus session (paksa scan QR baru)", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/devices/{id}/rotate-key": { "post": { "summary": "Rotate device key", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/devices/{id}/messages": { "get": { "summary": "Riwayat pesan device", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/devices/{id}/send": { "post": { "summary": "Kirim pesan dari panel (text atau file)", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/messages": { "get": { "summary": "Riwayat semua pesan", "security": [{ "AdminToken": [] }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/webhooks/{id}": { "get": { "summary": "Log delivery webhook", "security": [{ "AdminToken": [] }], "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "OK" } } } },
    "/admin/api/events": { "get": { "summary": "SSE update realtime", "security": [{ "AdminToken": [] }], "responses": { "200": { "description": "text/event-stream" } } } },
    "/admin/api/system": { "get": { "summary": "Info sistem & konfigurasi", "security": [{ "AdminToken": [] }], "responses": { "200": { "description": "OK" } } } }
  }
}
