{
  "info": {
    "_postman_id": "7e91a4c8-9b12-4d3a-8e7f-whatsmod-api-v1",
    "name": "WhatsMod Public API",
    "description": "WhatsMod WhatsApp API — OTP gönderimi, mesajlaşma, hesap listesi. Detaylı referans: https://whatsmod.io/docs/api\n\n## Kullanım\n\n1. `whatsmod` environment'ını aktive edin.\n2. `apiToken` değişkenine `wsk_...` token'ınızı yapıştırın.\n3. **OTP — Gönder** endpoint'inden test isteği atın.\n\nToken üretme: https://app.whatsmod.io/settings/api-tokens",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "_exporter_id": "whatsmod"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      { "key": "token", "value": "{{apiToken}}", "type": "string" }
    ]
  },
  "event": [
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Global test — her response 200/202/400/401/402/403/404/429 arasında olmalı",
          "pm.test('Status code 2xx veya beklenen hata', () => {",
          "  pm.expect([200, 201, 202, 400, 401, 402, 403, 404, 429, 503]).to.include(pm.response.code);",
          "});",
          "",
          "// Rate limit headerlarını logla",
          "const rl = pm.response.headers.get('X-RateLimit-Remaining');",
          "if (rl) console.log('Rate limit remaining:', rl);"
        ]
      }
    }
  ],
  "item": [
    {
      "name": "OTP",
      "description": "3. parti siteler için OTP gönderimi. Token scope=otp veya * olmalı.",
      "item": [
        {
          "name": "OTP — Gönder",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"+905XXXXXXXXX\",\n  \"code\": \"123456\",\n  \"site\": \"Siteniz\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/public/v1/otp/send",
              "host": ["{{baseUrl}}"],
              "path": ["api", "public", "v1", "otp", "send"]
            },
            "description": "WhatsApp üzerinden OTP kodu gönderir.\n\n**Rate limits:**\n- Aynı telefona dakikada 1\n- Token başına saatlik 500\n\n**Body:**\n- `phone`: E.164 formatı (+905XXXXXXXXX)\n- `code`: 4-8 rakam\n- `site` (opsiyonel): mesajda gösterilecek site adı\n\n**Response (202):**\n```json\n{\n  \"sent\": true,\n  \"messageId\": \"ck...\",\n  \"wamid\": \"3EB0...\",\n  \"creditsRemaining\": 498,\n  \"expiresAt\": \"2026-04-24T14:40:12Z\"\n}\n```"
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('OTP gönderildi', () => {",
                  "  pm.response.to.have.status(202);",
                  "  const j = pm.response.json();",
                  "  pm.expect(j.sent).to.be.true;",
                  "  pm.expect(j.creditsRemaining).to.be.a('number');",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Hesap & Kredi",
      "item": [
        {
          "name": "Balance — Kredi Bakiyesi",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/public/v1/balance",
              "host": ["{{baseUrl}}"],
              "path": ["api", "public", "v1", "balance"]
            },
            "description": "Mevcut kredi bakiyesi, plan ve hesap limiti.\n\n**Response (200):**\n```json\n{\n  \"creditBalance\": 12450,\n  \"plan\": \"pro\",\n  \"accountLimit\": 5\n}\n```"
          }
        },
        {
          "name": "Accounts — WhatsApp Hesapları",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/public/v1/accounts",
              "host": ["{{baseUrl}}"],
              "path": ["api", "public", "v1", "accounts"]
            },
            "description": "Tenant'a bağlı tüm WhatsApp numaralarını listeler.\n\n**Response (200):**\n```json\n{\n  \"data\": [\n    {\n      \"id\": \"ck...\",\n      \"phoneNumber\": \"905XXXXXXXXX\",\n      \"displayName\": \"Satış\",\n      \"status\": \"connected\"\n    }\n  ]\n}\n```"
          }
        }
      ]
    },
    {
      "name": "Mesaj",
      "description": "Metin ve medya mesaj gönderimi. Token scope=* gerekli.",
      "item": [
        {
          "name": "Message — Metin Gönder",
          "request": {
            "method": "POST",
            "header": [
              { "key": "Content-Type", "value": "application/json" }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"accountId\": \"{{accountId}}\",\n  \"to\": \"+905XXXXXXXXX\",\n  \"text\": \"Merhaba! Siparişiniz hazır.\"\n}"
            },
            "url": {
              "raw": "{{baseUrl}}/api/public/v1/messages",
              "host": ["{{baseUrl}}"],
              "path": ["api", "public", "v1", "messages"]
            },
            "description": "WhatsApp metin mesajı gönderir.\n\n**Body:**\n- `accountId`: GET /accounts sonucu\n- `to`: alıcı telefon\n- `text`: mesaj (max 4096 char)\n\n**Response (202):**\n```json\n{\n  \"message\": {\n    \"id\": \"ck...\",\n    \"status\": \"pending\",\n    \"creditsUsed\": 1\n  }\n}\n```"
          }
        },
        {
          "name": "Message — Durum Sorgula",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/public/v1/messages/{{messageId}}",
              "host": ["{{baseUrl}}"],
              "path": ["api", "public", "v1", "messages", "{{messageId}}"]
            },
            "description": "Mesaj durumunu (pending/sent/delivered/read/failed) ve zaman damgalarını döndürür."
          }
        },
        {
          "name": "Message — Medya Gönder (multipart)",
          "request": {
            "method": "POST",
            "header": [],
            "body": {
              "mode": "formdata",
              "formdata": [
                { "key": "accountId", "value": "{{accountId}}", "type": "text" },
                { "key": "to", "value": "+905XXXXXXXXX", "type": "text" },
                { "key": "type", "value": "image", "type": "text", "description": "image | video | document | audio" },
                { "key": "caption", "value": "Ürün görseli", "type": "text" },
                { "key": "file", "type": "file", "src": [] }
              ]
            },
            "url": {
              "raw": "{{baseUrl}}/api/public/v1/messages/media",
              "host": ["{{baseUrl}}"],
              "path": ["api", "public", "v1", "messages", "media"]
            },
            "description": "Multipart form-data ile medya gönderir.\n\n**Fields:**\n- `accountId`, `to`, `type`, `caption?`, `file` (binary)\n\n**İzin verilen tipler:** image (jpg/png/webp), video (mp4), document (pdf/docx), audio (mp3/ogg/mpeg)"
          }
        }
      ]
    },
    {
      "name": "Konuşma",
      "item": [
        {
          "name": "Conversation — Mesajları Listele",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/public/v1/conversations/{{conversationId}}/messages?limit=50",
              "host": ["{{baseUrl}}"],
              "path": ["api", "public", "v1", "conversations", "{{conversationId}}", "messages"],
              "query": [
                { "key": "limit", "value": "50" },
                { "key": "cursor", "value": "", "disabled": true }
              ]
            },
            "description": "Belirli bir konuşmanın son N mesajını döner. Cursor-based pagination."
          }
        }
      ]
    }
  ],
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://gw.whatsmod.io",
      "type": "string"
    },
    {
      "key": "apiToken",
      "value": "wsk_YOUR_TOKEN_HERE",
      "type": "string",
      "description": "app.whatsmod.io > Ayarlar > API Tokens > Yeni Token"
    },
    {
      "key": "accountId",
      "value": "",
      "type": "string",
      "description": "Accounts endpoint'inden alınan WhatsApp hesap ID'si"
    },
    {
      "key": "messageId",
      "value": "",
      "type": "string"
    },
    {
      "key": "conversationId",
      "value": "",
      "type": "string"
    }
  ]
}
