{
  "info": {
    "name": "Oluye Stock Market Game · Operator API (v1)",
    "description": "Operator API collection for partners (Casino, White-Label, Franchisee). HMAC-SHA256 signed requests over HTTPS. Set the {{baseUrl}}, {{apiKey}}, and {{apiSecret}} collection variables, then run any request — the pre-request script automatically computes X-Timestamp and X-Signature.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "_postman_id": "b2b-oluye-operator-v1"
  },
  "variable": [
    { "key": "baseUrl", "value": "https://api.oluye.example/v1" },
    { "key": "apiKey", "value": "REPLACE_WITH_OPERATOR_KEY" },
    { "key": "apiSecret", "value": "REPLACE_WITH_OPERATOR_SECRET" },
    { "key": "playerRef", "value": "p_8821" },
    { "key": "currency", "value": "USD" },
    { "key": "sessionId", "value": "" },
    { "key": "roundId", "value": "" },
    { "key": "betId", "value": "" }
  ],
  "auth": { "type": "noauth" },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Auto-sign every request with HMAC-SHA256(secret, METHOD\\nPATH\\nTIMESTAMP\\nBODY)",
          "const ts = Date.now().toString();",
          "const req = pm.request;",
          "const method = req.method.toUpperCase();",
          "const url = req.url.toString();",
          "let path = '/';",
          "try { path = new URL(url.replace(/^\\{\\{baseUrl\\}\\}/, pm.variables.get('baseUrl'))).pathname; } catch(e) {}",
          "const body = req.body && req.body.raw ? req.body.raw : '';",
          "const secret = pm.variables.get('apiSecret') || '';",
          "const payload = method + '\\n' + path + '\\n' + ts + '\\n' + body;",
          "const sig = CryptoJS.HmacSHA256(payload, secret).toString(CryptoJS.enc.Hex);",
          "pm.request.headers.upsert({ key: 'X-Operator-Key', value: pm.variables.get('apiKey') });",
          "pm.request.headers.upsert({ key: 'X-Timestamp', value: ts });",
          "pm.request.headers.upsert({ key: 'X-Signature', value: sig });",
          "pm.request.headers.upsert({ key: 'Content-Type', value: 'application/json' });"
        ]
      }
    }
  ],
  "item": [
    {
      "name": "Sessions — Launch",
      "request": {
        "method": "POST",
        "header": [],
        "url": { "raw": "{{baseUrl}}/sessions/launch", "host": ["{{baseUrl}}"], "path": ["sessions", "launch"] },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"player_ref\": \"{{playerRef}}\",\n  \"currency\": \"{{currency}}\",\n  \"return_url\": \"https://casino.example/back\"\n}"
        }
      }
    },
    {
      "name": "Bets — Reserve",
      "request": {
        "method": "POST",
        "url": { "raw": "{{baseUrl}}/bets/reserve", "host": ["{{baseUrl}}"], "path": ["bets", "reserve"] },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"session_id\": \"{{sessionId}}\",\n  \"round_id\": \"{{roundId}}\",\n  \"selected_stocks\": [\"NDL\", \"BER\"],\n  \"stake\": 25.00,\n  \"idempotency_key\": \"bet_{{$guid}}\"\n}"
        }
      }
    },
    {
      "name": "Bets — Settle",
      "request": {
        "method": "POST",
        "url": { "raw": "{{baseUrl}}/bets/settle", "host": ["{{baseUrl}}"], "path": ["bets", "settle"] },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"bet_id\": \"{{betId}}\",\n  \"winner\": \"NDL\",\n  \"pct\": 1.8421,\n  \"payout\": 70.50,\n  \"idempotency_key\": \"stl_{{$guid}}\"\n}"
        }
      }
    },
    {
      "name": "Wallet — Get Balance",
      "request": {
        "method": "GET",
        "url": { "raw": "{{baseUrl}}/wallet/balance?player_ref={{playerRef}}", "host": ["{{baseUrl}}"], "path": ["wallet", "balance"], "query": [{ "key": "player_ref", "value": "{{playerRef}}" }] }
      }
    },
    {
      "name": "Rounds — Start",
      "request": {
        "method": "POST",
        "url": { "raw": "{{baseUrl}}/rounds/start", "host": ["{{baseUrl}}"], "path": ["rounds", "start"] },
        "body": { "mode": "raw", "raw": "{\n  \"mode\": \"A\"\n}" }
      }
    },
    {
      "name": "Audit — List",
      "request": {
        "method": "GET",
        "url": { "raw": "{{baseUrl}}/audit?limit=50", "host": ["{{baseUrl}}"], "path": ["audit"], "query": [{ "key": "limit", "value": "50" }] }
      }
    },
    {
      "name": "Webhook — Test Delivery",
      "request": {
        "method": "POST",
        "url": { "raw": "{{baseUrl}}/webhooks/test", "host": ["{{baseUrl}}"], "path": ["webhooks", "test"] },
        "body": { "mode": "raw", "raw": "{\n  \"event\": \"round.closed\",\n  \"sample\": true\n}" }
      }
    }
  ]
}
