{
  "info": {
    "_postman_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "name": "AI Agent Proxy - All Services",
    "description": "Comprehensive collection for ALL v1/proxy services.\n\nAll requests POST to {{base_url}}/v1/proxy with Content-Type: application/json.\n\nServices: iWallet (24), Softomi (1), YSS (12), Twilio (1), TSoft (14), ikas (7), Vericom (4), Tapu (5)\n\nTotal: 68 endpoints\n\n## Environments\n\nImport and select one of:\n- `postman/environments/local.postman_environment.json` → http://localhost:8080\n- `postman/environments/staging.postman_environment.json` → https://test-integration.aiagenttr.com\n- `postman/environments/production.postman_environment.json` → https://integration.aiagenttr.com\n\nRequired env vars: `base_url`, `hmac_secret`, `organization_id`, `account_id`, `conversation_id`.\niWallet balance_with_tckn also needs: `test_card_number`, `test_tc_no` (optional `merchant_id`).\n\nHMAC: collection-level pre-request script sets X-REQUEST-SIGNATURE automatically.\n\n---\n**Published copy** — credentials in request bodies are Postman variables (`{{service_field}}`); fill them in the environment. HMAC signing uses the environment's `hmac_secret`. Source: `AI_Agent_Proxy_Collection.postman_collection.json` in the integration repo (PLAN-v77).",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "const body = pm.variables.replaceIn(pm.request.body.raw);",
          "const secret = pm.variables.get(\"hmac_secret\");",
          "if (body && secret) {",
          "    const hash = CryptoJS.HmacSHA256(body, secret).toString(CryptoJS.enc.Hex);",
          "    pm.request.headers.upsert({ key: \"X-REQUEST-SIGNATURE\", value: hash });",
          "}"
        ]
      }
    }
  ],
  "variable": [
    {
      "key": "base_url",
      "value": "http://localhost:8080",
      "type": "string"
    },
    {
      "key": "hmac_secret",
      "value": "",
      "type": "string"
    },
    {
      "key": "organization_id",
      "value": "org_123",
      "type": "string"
    },
    {
      "key": "account_id",
      "value": "acc_456",
      "type": "string"
    },
    {
      "key": "conversation_id",
      "value": "conv_789",
      "type": "string"
    },
    {
      "key": "test_card_number",
      "value": "1234567890123456",
      "type": "string"
    },
    {
      "key": "test_tc_no",
      "value": "12345678901",
      "type": "string"
    },
    {
      "key": "merchant_id",
      "value": "12345",
      "type": "string"
    },
    {
      "key": "test_gsm",
      "value": "5551234567",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "iWallet",
      "description": "iWallet service — 14 actions (service: iwallet)",
      "item": [
        {
          "name": "Cards",
          "description": "Card-related operations",
          "item": [
            {
              "name": "Cards List",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.list\",\n  \"payload\": {\n    \"gsm\": \"5551234567\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "List the customer's cards. Two mutually exclusive lookup paths (iWallet AI Call collection 01.10.2026, v74):\n  • path A — gsm only (this request): phone lookup, OTP-gated (otp_required → iwallet.otp.verify → cards).\n  • path B — tc_no present: identity lookup. tc_no WINS over gsm (the platform always sends the caller's number as gsm); gsm is then not sent to iWallet.\nNeither gsm nor tc_no → MISSING_PARAMETER.\n\nNOTE: the collection-level pre-request script signs every request (X-REQUEST-SIGNATURE). Do NOT add a per-request HMAC header."
              }
            },
            {
              "name": "Cards List (tc_no+cc_number)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.list\",\n  \"payload\": {\n    \"tc_no\": \"12345678901\",\n    \"cc_number\": \"1234567812345678\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Path B with a card pin (v74). tc_no + cc_number, no send_otp_to → identity summary for that card (data: gsm_last4, has_mobile_app; NO code sent, NO card list). tc_no must match the card's own identity number (tckn_mismatch / card_or_tckn_not_on_record otherwise).\n\nTTS: \"Kayıtlarımızda sonu … ile biten bir numara görünüyor.\" (or \"Kimlik numaranıza ait kayıt bulundu, ancak kayıtlı bir telefon numarası görünmüyor.\" when gsm_last4 is null).\n\nNOTE: the collection-level pre-request script signs every request (X-REQUEST-SIGNATURE). Do NOT add a per-request HMAC header."
              }
            },
            {
              "name": "Cards List (tc_no only — identity summary)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.list\",\n  \"payload\": {\n    \"gsm\": \"5551234567\",\n    \"tc_no\": \"12345678901\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Path B, tc_no alone (v74) — the call the iWallet agent makes after a phone lookup found no card. gsm (always sent by the platform) is ignored. Returns the identity summary (gsm_last4, has_mobile_app); sends NO code.\n\nTTS: \"Kayıtlarımızda sonu … ile biten bir numara görünüyor.\" / \"Kimlik numaranıza ait kayıt bulundu, ancak kayıtlı bir telefon numarası görünmüyor.\"\nErrors: tckn_not_on_record / card_or_tckn_not_on_record → \"Girdiğiniz bilgilerle eşleşen bir kayıt bulunamadı.\"; tckn_required → TCKN-missing TTS.\n\nNOTE: the collection-level pre-request script signs every request (X-REQUEST-SIGNATURE). Do NOT add a per-request HMAC header."
              }
            },
            {
              "name": "Cards List (tc_no + send_otp_to=registered)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.list\",\n  \"payload\": {\n    \"gsm\": \"5551234567\",\n    \"tc_no\": \"12345678901\",\n    \"send_otp_to\": \"registered\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Path B after the caller confirmed they can reach the registered number (v74). Sends a REAL code to the number registered on the card (otp_required + \"Sonu … olan telefon numarasına gönderdiğim doğrulama kodunu iletin.\"); iwallet.otp.verify then returns the full card list. Only the value \"registered\" is forwarded — any other send_otp_to value is dropped by the integration.\n\nNOTE: the collection-level pre-request script signs every request (X-REQUEST-SIGNATURE). Do NOT add a per-request HMAC header."
              }
            },
            {
              "name": "Cards Balance",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.balance\",\n  \"payload\": {\n    \"cc_number\": \"1234567890123456\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Query card balance by 16-digit card number."
              }
            },
            {
              "name": "Cards Balance (with merchant_id)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.balance\",\n  \"payload\": {\n    \"cc_number\": \"1234567890123456\",\n    \"merchant_id\": \"12345\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Query card balance filtered by merchant. The merchant_id field is optional — when provided, only the balance for that specific merchant is returned."
              }
            },
            {
              "name": "Cards Balance With TCKN",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"{{organization_id}}\",\n  \"account_id\": \"{{account_id}}\",\n  \"conversation_id\": \"{{conversation_id}}\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.balance_with_tckn\",\n  \"payload\": {\n    \"cc_number\": \"{{test_card_number}}\",\n    \"tc_no\": \"{{test_tc_no}}\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "OTP-free card balance via cc_number + 11-digit TCKN (tc_no).\n\nRequired payload:\n- `cc_number` — 16-digit card number (env: test_card_number)\n- `tc_no` — 11-digit Turkish national ID (env: test_tc_no)\n\nOptional:\n- `merchant_id` — wallet filter (env: merchant_id)\n\nError sub_codes (HTTP 422 / IW206):\n- CARD_PARAM_MISSING\n- TCKN_PARAM_MISSING\n- CARD_TCKN_NOT_FOUND (terminal — try OTP path instead)\n- TCKN_MISMATCH (retryable — re-enter TCKN)\n\nSelect Staging or Production environment for base_url + hmac_secret."
              }
            },
            {
              "name": "Cards Balance With TCKN (with merchant_id)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"{{organization_id}}\",\n  \"account_id\": \"{{account_id}}\",\n  \"conversation_id\": \"{{conversation_id}}\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.balance_with_tckn\",\n  \"payload\": {\n    \"cc_number\": \"{{test_card_number}}\",\n    \"tc_no\": \"{{test_tc_no}}\",\n    \"merchant_id\": \"{{merchant_id}}\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "OTP-free balance with optional merchant_id wallet filter.\nUses env vars: test_card_number, test_tc_no, merchant_id."
              }
            },
            {
              "name": "Cards Balance With TCKN (missing tc_no)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"{{organization_id}}\",\n  \"account_id\": \"{{account_id}}\",\n  \"conversation_id\": \"{{conversation_id}}\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.balance_with_tckn\",\n  \"payload\": {\n    \"cc_number\": \"{{test_card_number}}\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Negative test: missing tc_no. Expect success=false with TCKN_PARAM_MISSING (adapter fail-fast) or mapped ERR_TCKN_MISSING TTS."
              }
            },
            {
              "name": "Cards Balance With TCKN (invalid tc_no)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"{{organization_id}}\",\n  \"account_id\": \"{{account_id}}\",\n  \"conversation_id\": \"{{conversation_id}}\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.balance_with_tckn\",\n  \"payload\": {\n    \"cc_number\": \"{{test_card_number}}\",\n    \"tc_no\": \"1234\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Negative test: tc_no not 11 digits. Expect TCKN_PARAM_MISSING / ERR_TCKN_MISSING."
              }
            },
            {
              "name": "Cards Balance With TCKN (TCKN mismatch)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"{{organization_id}}\",\n  \"account_id\": \"{{account_id}}\",\n  \"conversation_id\": \"{{conversation_id}}\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.balance_with_tckn\",\n  \"payload\": {\n    \"cc_number\": \"{{test_card_number}}\",\n    \"tc_no\": \"99999999999\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Negative test: valid format but wrong TCKN. Expect TCKN_MISMATCH or CARD_TCKN_NOT_FOUND depending on card state in the target environment."
              }
            },
            {
              "name": "Physical Status",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.physical_status\",\n  \"payload\": {\n    \"gsm\": \"5551234567\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Check physical card status by GSM number."
              }
            },
            {
              "name": "Coupon Codes",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.coupon_codes\",\n  \"payload\": {\n    \"gsm\": \"5551234567\",\n    \"send_sms\": true\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Lists the digital-code purchases on the caller's GSM (iWallet 03.09 contract): data.coupons[] (merchant_name, sales_date dd-MM-yyyy|null, code_count, expire_date dd-MM-yyyy|null; at most 3, newest first), truncated, and sms_sent only with send_sms=true. The codes themselves are never returned or spoken. v69 TTS: \"Telefon numaranıza ait N dijital kod satın alımı bulunmaktadır. Birincisi …, … tarihli, … adet kod, son kullanma tarihi ….\" (+ \"Daha önceki satın alımlarınız da bulunmaktadır.\" / \"En son satın alımınıza ait kodlar telefon numaranıza SMS ile gönderildi.\" / \"Kodlar şu anda SMS ile gönderilemedi.\"); empty list → \"Telefon numaranıza ait dijital kod bulunmamaktadır.\" Sends a verification code when the number is not yet verified (otp_required → iwallet.otp.verify)."
              }
            },
            {
              "name": "Check Merchant",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.check_merchant\",\n  \"payload\": {\n    \"gsm\": \"5551234567\",\n    \"merchant_name\": \"Migros\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Check if a merchant accepts iWallet cards."
              }
            },
            {
              "name": "Check Merchant (cc_number)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.check_merchant\",\n  \"payload\": {\n    \"cc_number\": \"1234567890123456\",\n    \"merchant_name\": \"Migros\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Check if a merchant accepts iWallet cards using credit card number instead of GSM."
              }
            },
            {
              "name": "Cards Block (lost/stolen)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.cards.block\",\n  \"payload\": {\n    \"cc_number\": \"1234567812345678\",\n    \"user_confirmed\": true\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Tools V2 (v33) lost/stolen card BLOCK — POST /api/v3/ai_call/cards/block. This is the SEPARATE, synchronous block action (v31 routed blocks through create_ticket; that is GONE). The block is IRREVERSIBLE.\n\nprocess_id platform tarafından GÖNDERİLMEZ — integration conversation_id'den türetir.\n\nREQUIRED (validated LOCALLY before any server round-trip): cc_number (the card the user EXPLICITLY selected — never guessed) + user_confirmed:true (Aşama-3 verbal confirmation). Missing/false user_confirmed → IW206 sub_code block_confirmation_required, NO network call, no block.\n\nuser_confirmed is TYPE-TOLERANT (v43): the affirmative forms true (bool), \"true\" (case-insensitive, trimmed), \"1\", or the number 1 ALL count as confirmed — the platform serializes this flag as the JSON STRING \"true\", which the old bool-only gate silently rejected (0/10 prod success). Everything else — false, \"false\", \"0\", 0, \"\", absent/null, Turkish free text (\"evet\"), or any other type — is rejected with block_confirmation_required and NO server call. The canonical request body below uses boolean true.\n\nOTP-GATED: a 200 {data:{otp_required:true}} means the platform must complete iwallet.otp.verify (same process_id); the block outcome then returns from the otp.verify response. A terminal 200 {data:{blocked:true}} is the ONLY certification of a real block — success TTS \"Kartınız güvenlik nedeniyle bloke edilmiştir\" is emitted ONLY on blocked:true, never on is_success alone.\n\nERROR sub-codes (lowercase snake_case on V2; legacy prod UPPERCASE — the mapper is case-insensitive): block_open_circuit_card (iWallet Plus → \"mobil uygulamadan yönetebilirsiniz\"), block_confirmation_required, block_card_not_found, block_failed. PII: cc_number is forwarded to the client but logged only as last-4; never queued.\n\nNOTE: the collection-level pre-request script signs every request (X-REQUEST-SIGNATURE). Do NOT add a per-request HMAC header."
              }
            }
          ]
        },
        {
          "name": "OTP",
          "description": "OTP verification operations",
          "item": [
            {
              "name": "OTP Verify",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.otp.verify\",\n  \"payload\": {\n    \"otp_code\": \"123456\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Verify OTP code for card operations. Returns the parked operation's data (cards, coupons, transactions, pos_users …) and its TTS. v69: when the waiting operation asks for confirmation (cards.block, pos_users.reset_password, coupon_codes with send_sms=true) iWallet answers data.otp_verified=true and the question in message — data.message carries it and text_to_be_read reads it verbatim (fallback \"Doğrulamanız tamamlandı.\").\n\n**v75 — error sentences (IW206/IW207).** \"The code is wrong\" is said only when iWallet says so (message \"hatalı\"/\"geçersiz\" or sub_code `otp_mismatch`/`OTP_INVALID`/`otp_code_required`). Prod's otp_check replays the parked lookup after a correct code, so most errors are about that lookup:\n- \"…üye iş yeri kaydı bulunamadı.\" → \"Bu numaraya kayıtlı bir üye iş yeri kaydı bulunamadı. Lütfen kayıtlı olduğunuz numaradan bizimle iletişime geçin.\"\n- \"…bağlı bulunduğunuz firmadan destek alabilirsiniz.\" → \"Bu konuda size doğrudan yardımcı olamıyorum. Kartınızla ilgili detaylı bilgi için bağlı bulunduğunuz firmadan destek alabilirsiniz.\"\n- \"üç kez hatalı\" / `otp_attempts_exceeded` → \"Doğrulama sağlanamadığı için hesabınıza özel bilgi paylaşamıyorum.\"\n- \"Bu telefon numarasına ait kart bulunamadı.\" → unchanged: \"Bu telefon numarasına kayıtlı bir kart bulunamadı.\"\n- expired / `session_not_found` / `PROCESS_NOT_FOUND` → OTP-expired sentence (unchanged)\n- anything unrecognised → \"Doğrulama işleminiz şu anda tamamlanamadı.\" (never \"kod hatalı\")"
              }
            }
          ]
        },
        {
          "name": "Transactions",
          "description": "Single-day transaction lookup (Tools V2, OTP-gated)",
          "item": [
            {
              "name": "Transactions List",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.transactions.list\",\n  \"payload\": {\n    \"transaction_date\": \"2026-09-01\",\n    \"gsm\": \"5551234567\",\n    \"merchant_name\": \"Migros\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Tools V2 (v33) single-day transaction lookup — GET /api/v3/ai_call/transactions. OTP-gated.\n\nprocess_id platform tarafından GÖNDERİLMEZ — integration conversation_id'den türetir.\n\nREQUIRED: transaction_date (YYYY-MM-DD, a SINGLE day within the last 3 months) + at least one of gsm | cc_number. Optional merchant_name filter. Missing transaction_date → IW206 transaction_date_required; a date outside the last 3 months → transaction_date_out_of_range (\"yalnızca son üç ay\" TTS); neither gsm nor cc_number → gsm_required.\n\nOTP-GATED: a 200 {data:{otp_required:true}} routes the platform through iwallet.otp.verify. SUCCESS data = {process_id, truncated, transactions:[{reference, date, cc_number_last4, merchant_name, product, amount, refund:{amount,complete}, cancelled}]}. truncated:true adds a \"daha fazlası var\" hint to the TTS. cc_number is already masked to last-4 by the server.\n\nThe first GSM-path call sends a REAL SMS — use a high test card / test line only.\n\nNOTE: the collection-level pre-request script signs every request (X-REQUEST-SIGNATURE). Do NOT add a per-request HMAC header."
              }
            }
          ]
        },
        {
          "name": "POS Users",
          "description": "POS account listing + password reset (Tools V2, OTP-gated)",
          "item": [
            {
              "name": "POS Users List",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.pos_users.list\",\n  \"payload\": {\n    \"gsm\": \"5551234567\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Tools V2 (v33) merchant POS accounts — GET /api/v3/ai_call/pos_users. OTP-gated.\n\nprocess_id platform tarafından GÖNDERİLMEZ — integration conversation_id'den türetir.\n\nREQUIRED: gsm. Optional email, branch_name filters. Missing gsm → IW206 gsm_required.\n\nOTP-GATED: a 200 {data:{otp_required:true}} routes through iwallet.otp.verify. SUCCESS data = {process_id, pos_users:[{merchant_name, branch_name, pos_type, gsm_last4, masked_email}]}. v35: the numeric id was REMOVED from the response — records are disambiguated by branch_name + masked_email (read back to the customer to narrow reset_password). Sub-code: pos_user_not_found / pos_user_not_usable.\n\nNOTE: the collection-level pre-request script signs every request (X-REQUEST-SIGNATURE). Do NOT add a per-request HMAC header."
              }
            },
            {
              "name": "POS Users Reset Password",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.pos_users.reset_password\",\n  \"payload\": {\n    \"gsm\": \"5551234567\",\n    \"user_confirmed\": true,\n    \"branch_name\": \"Kadıköy Şubesi\",\n    \"email\": \"muhasebe@ornek.com\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Tools V2 POS password reset — POST /api/v3/ai_call/pos_users/reset_password (v35 id-less selector contract). SYNCHRONOUS mutation, OTP-gated, NEVER queued.\n\nprocess_id platform tarafından GÖNDERİLMEZ — integration conversation_id'den türetir.\n\nv35: the numeric `id` was REMOVED from the path AND the payload — iWallet resolves the record itself from gsm plus the OPTIONAL narrowers branch_name (substring, case-insensitive) and email (exact, case-insensitive), forwarded verbatim. A legacy payload that still carries `id` is SILENTLY IGNORED (warn-only, backward-compat).\n\nREQUIRED (validated LOCALLY before any server call): gsm + user_confirmed:true. Missing gsm → MISSING_PARAMETER; missing/false user_confirmed → IW206 pos_confirmation_required, NO network call.\n\nuser_confirmed is TYPE-TOLERANT (v43): the affirmative forms true (bool), \"true\" (case-insensitive, trimmed), \"1\", or the number 1 ALL count as confirmed — the platform serializes this flag as the JSON STRING \"true\", which the old bool-only gate silently rejected (0/10 prod success). Everything else — false, \"false\", \"0\", 0, \"\", absent/null, Turkish free text (\"evet\"), or any other type — is rejected with pos_confirmation_required and NO server call. The canonical request body below uses boolean true.\n\nAMBIGUOUS FLOW: if more than one record matches, the server returns sub_code pos_user_ambiguous and resets NOTHING (the error envelope carries no matching records — disambiguation data is already in pos_users.list: branch_name + masked_email). The AI flow must ask the customer for a NEW narrower and retry — NEVER repeat the same params. If no narrower separates the records, the flow ends in a live-agent transfer (that decision lives in the platform flow logic, not this layer).\n\nOTP-GATED: a 200 {data:{otp_required:true}} routes through iwallet.otp.verify. SUCCESS data = {process_id, channel} where channel ∈ {email, sms} — the registered channel iWallet delivered the new password on (drives the delivery-channel TTS). The new password itself is NEVER returned and NEVER logged. Sub-codes: pos_user_ambiguous, pos_password_reset_failed.\n\nNOTE: the collection-level pre-request script signs every request (X-REQUEST-SIGNATURE). Do NOT add a per-request HMAC header."
              }
            }
          ]
        },
        {
          "name": "Tickets",
          "description": "Call-completed ticket webhook (Tools V2 — no card blocking here)",
          "item": [
            {
              "name": "Create Ticket",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.create_ticket\",\n  \"payload\": {\n    \"request_type\": \"refund_not_reflected\",\n    \"issue_type\": \"support\",\n    \"customer_type\": \"customer\",\n    \"gsm\": \"+905551234567\",\n    \"meta\": {\n      \"channel\": \"voice\",\n      \"campaign\": \"kamu-ai\"\n    },\n    \"call_data\": {\n      \"category\": \"Kamu AI Aktarım\",\n      \"sub_category\": \"İade Yansımadı\",\n      \"transcript\": \"Musteri: Iademi hala goremiyorum.\\nAsistan: Kaydinizi olusturuyorum.\",\n      \"call\": {\n        \"id\": \"b3f1c2d4-5e6a-47b8-9c0d-1e2f3a4b5c6d\",\n        \"phoneNumber\": \"+905551234567\",\n        \"startedAt\": \"2026-09-07T09:14:02Z\",\n        \"endedAt\": \"2026-09-07T09:15:38Z\",\n        \"durationSeconds\": 96.4,\n        \"endedReason\": \"customer-ended-call\",\n        \"agent\": {\n          \"id\": \"iwallet\",\n          \"name\": \"iWallet Destek\"\n        },\n        \"analysis\": {\n          \"summary\": \"Musteri iadesinin yansimadigini bildirdi.\"\n        },\n        \"internalAnalysis\": {\n          \"analysis\": {\n            \"objectiveAnalysis\": {\n              \"success\": false\n            }\n          }\n        }\n      }\n    }\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "PURE call-completed ticket webhook (Tools V2, mail 2026-09-07). iwallet.create_ticket ALWAYS posts to POST /api/v3/ai_call/tickets on the CARD host (daily 3DES Bearer, NO login, application/json). It NEVER blocks a card — lost/stolen blocking is the SEPARATE, synchronous iwallet.cards.block action (v33 removed the v31 request_type-based block routing).\n\nV2 ENVELOPE: the proxy wraps the payload into {organization_id?, account_id?, conversation_id, process_id?, service:\"iwallet\", action:\"call_completed\", payload:{…}}. process_id platform tarafından GÖNDERİLMEZ — integration conversation_id'den türetir. process_id is DERIVED by the integration from conversation_id and PROMOTED to the ENVELOPE top level (PDF §10 mutabakat); the platform does NOT send it. service is the fixed string \"iwallet\". The server is IDEMPOTENT on conversation_id (same id → no duplicate ticket; the v31 T4 'Couldn't find Admin' bug is FIXED in V2).\n\nrequest_type is now a FREE-FORM CLASSIFICATION LABEL carried VERBATIM (e.g. \"refund_not_reflected\") — it is NOT validated, NOT normalized, and NEVER triggers a block. Any value is accepted; classification is iWallet's concern.\n\nSETTABLE payload fields (all optional): request_type, gsm, customer_type (\"customer\"|\"merchant\"), issue_type (STRING name), priority, status, source, agent, external_ref, description, meta, call_data. call_data is carried VERBATIM (category, sub_category, call incl. recordingUrl, transcript) — NO timestamp conversion. Platform-supplied priority/status/issue_type/customer_type/source/agent take precedence; the transformer only DERIVES them when left blank.\n\nDERIVED by TicketTransformer when the payload leaves them blank — do NOT rely on setting these:\n  status   ← objectiveAnalysis.success: true → \"resolved\", false/missing → \"unresolved\" (lowercase English).\n  priority ← AI urgency → \"high\"|\"medium\"|\"low\" (LOWERCASE).\n  source   ← \"ai\";  agent ← call.agent.id;  external_ref ← call.id;\n  conversation_id ← payload.conversation_id → payload.external_ref → call_data.call.id.\n\nRESPONSE (success): data = {issue_id (numeric), conversation_id, recording_status (\"pending\" when a recordingUrl was supplied, else \"skipped\")}. text_to_be_read is EMPTY (structured data only).\n\nFAILURE-PATH: the proxy still returns HTTP 200 status \"success\" with data reporting the durability state {queued, archived, message}. Retryable failures go to the SQS retry queue (schema-2, full raw payload; consumer re-runs the transformer — safe because the server is idempotent). Deterministic 401/409/422 are NOT retried.\n\nNOTE: the collection-level pre-request script signs every request (X-REQUEST-SIGNATURE). Do NOT add a per-request HMAC header."
              }
            }
          ]
        },
        {
          "name": "Knowledge Base",
          "item": [
            {
              "name": "KB Search",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.kb.search\",\n  \"payload\": {\n    \"query\": \"Benzin kartımı kaybettim, ne yapacağım?\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "PLAN-v76 — answers a general iWallet / iWallet Plus question from the knowledge base the customer maintains in the core panel (replaces the Vapi query tool). No iWallet API call, no OTP, not gated by the iWallet circuit breaker.\n\n**Payload:** `query` (required) — the caller's question as a short Turkish sentence; `kb` (optional) — `iwallet` (default) or `kamu`.\n\n**Success:** `text_to_be_read` = the matching section(s) verbatim (best match first, up to 3 close siblings) plus the brand restriction file of any brand the question names. `data` = `{found, kb, kb_version, sections:[{id,title}], brands:[…], text}`. Nothing matched → `found:false`, text \"Bilgi bankasında bu soruya ait bir kayıt bulunamadı.\" (the prompt must then not invent an answer).\n\n**Errors:** `MISSING_PARAMETER` (no query) → \"Hangi konuda bilgi almak istediğinizi iletir misiniz?\"; `KB_UNAVAILABLE` (not loaded) → \"Şu anda bu bilgiye ulaşamıyorum.\"; `INVALID_PARAMETER` (unknown kb).\n\n`query` is redacted in request logs (caller's own words)."
              }
            },
            {
              "name": "KB Search (brand)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.kb.search\",\n  \"payload\": {\n    \"query\": \"Yemek cüzdanımla Migros'tan alışveriş yapabilir miyim?\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Returns KB-401 (wallet types) and the Migros brand restriction file."
              }
            },
            {
              "name": "KB Search (kamu)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.kb.search\",\n  \"payload\": {\n    \"query\": \"Kartımı nerede kullanabilirim?\",\n    \"kb\": \"kamu\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Searches the Kamu line's knowledge base instead of the iWallet one."
              }
            },
            {
              "name": "KB Search (not found)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"iwallet\",\n  \"action\": \"iwallet.kb.search\",\n  \"payload\": {\n    \"query\": \"Bugün hava nasıl olacak?\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "`found:false` — the not-found sentence."
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Softomi",
      "description": "Softomi service — 1 action (service: softomi)",
      "item": [
        {
          "name": "Order Track",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"softomi\",\n  \"action\": \"softomi.orders.track\",\n  \"payload\": {\n    \"order_id\": \"ORD-12345\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Track a Softomi order by order ID."
          }
        }
      ]
    },
    {
      "name": "ICA",
      "description": "ICA (Cardtek YTS3G XML) instant debt query — 5 debt actions + ica.keypad.readback (v63, no ICA call) (service: ica). Replaces the removed YSS service.\n\nUPSTREAM: the integration talks to the real ICA (Cardtek) host — https://yts.ic-a.com.tr/dcs/webservice/secure/paymentGateway (PLAN-v36; there is no mock — the PLAN-v2 mock was cancelled). Authenticate (userName/password) returns a plain-text UUID session token sent back on every query as the authenticationTokenId header. ICA whitelists our staging/prod NAT egress IPs ONLY — so these requests succeed ONLY through the staging/prod proxy ({{base_url}} = test-integration / integration .aiagenttr.com); a local base_url cannot reach ICA.\n\nSERVER-SIDE CONFIG (not sent in the request body): the query needs bank_client_enum_value (∈ ZIRAATBANK / HALKBANK / CARDTEK — the value ICA assigned us) and instant_query_source (∈ e.g. CALL_CENTER for telephone banking) configured server-side via APP_ICA_* env vars (Terraform/Secrets Manager). The client injects them into the Cardtek XML; they are NOT part of the JSON payload below.\n\nHMAC signing is handled by the collection-level pre-request script; do NOT add per-request signature headers.",
      "item": [
        {
          "name": "Keypad Readback",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"ica\",\n  \"action\": \"ica.keypad.readback\",\n  \"payload\": {\n    \"kind\": \"tckn\",\n    \"digits\": \"10000000146\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "v63 — tuşlanan numaranın teyit cümlesini kurar; ICA'ya gitmez. kind: tckn | vkn | dosya_ref, digits: tuşlanan rakamlar (string, baştaki sıfır korunur). Geçerliyse text_to_be_read = gruplu teyit cümlesi (TC 3-3-2-3, VKN 3-3-2-2, sıfırla başlayan grup rakam rakam; dosya referansı rakam rakam) ve data boş döner. Geçersizse sorgudaki aynı hata cümlesi. v65: eksik tuşlama (TC < 11, VKN < 10 hane) INCOMPLETE_TCKN / INCOMPLETE_VKN → \"Eksik bilgi girdiniz…\"; sıfırla başlayan VKN geçerlidir (v66). Yanıt ve digits loglanmaz."
          }
        },
        {
          "name": "Debt by TCKN",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"ica\",\n  \"action\": \"ica.debt.by_tckn\",\n  \"payload\": {\n    \"tckn\": \"10000000146\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Query instant debt balance by T.C. kimlik numarası (getInstantBalanceByClientCitizenship). v55: `tckn` must pass the official 11-digit check-digit rule (first digit ≠ 0, d10/d11 checksum) — a mistyped number returns business error INVALID_TCKN with the TTS \"Tuşladığınız TC Kimlik numarası geçerli bir numara değil…\" (v67: \"TC\", not \"T.C.\") WITHOUT calling ICA. The example 10000000146 is the published algorithmic test number (not a real person); spaces/dots/dashes are stripped before validation. v65: fewer than 11 digits is INCOMPLETE_TCKN (\"Eksik bilgi girdiniz. TC Kimlik numarası on bir hanedir…\"), also without calling ICA."
          }
        },
        {
          "name": "Debt by VKN",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"ica\",\n  \"action\": \"ica.debt.by_vkn\",\n  \"payload\": {\n    \"vkn\": \"1234567890\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Query instant debt balance by vergi kimlik numarası (getInstantBalanceByClientCitizenship). v55: `vkn` must pass the official 10-digit check-digit rule — a mistyped number returns business error INVALID_VKN with the TTS \"Tuşladığınız Vergi Kimlik numarası geçerli bir numara değil…\" WITHOUT calling ICA. A leading 0 is valid (v66). v65: fewer than 10 digits is INCOMPLETE_VKN (\"Eksik bilgi girdiniz. Vergi Kimlik numarası on hanedir…\"). 1234567890 and the vendor sample 9370662784 are both valid."
          }
        },
        {
          "name": "Debt by Plate",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"ica\",\n  \"action\": \"ica.debt.by_plate\",\n  \"payload\": {\n    \"plate\": \"34ABC123\",\n    \"plate_letter_words\": \"Adana Bolu Ceyhan\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Query instant debt balance by araç plakası (getInstantBalanceBySubscription). Optional `plate_letter_words` (v59): the city words the caller used for the plate letters, one per letter, as a space-separated string or an array (\"Adana Bolu Ceyhan\"). The result sentence repeats the caller's words when each word starts with its plate letter; otherwise the default words are used (M Muğla, P Polatlı, S Sinop, T Trabzon, Y Yozgat)."
          }
        },
        {
          "name": "Debt by Icra Dosya",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"ica\",\n  \"action\": \"ica.debt.by_icra_dosya\",\n  \"payload\": {\n    \"icra_dairesi\": \"İSTANBUL 11.İCRA\",\n    \"dosya_no\": \"2026/37400\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Query instant debt balance by icra dairesi + dosya numarası (getInstantBalanceByLegalFollowUp). v54: `icra_dairesi` is the office AS THE CALLER SAYS IT (e.g. \"İstanbul 11. İcra Dairesi\", \"BAKIRKÖY 1.İCRA\", \"Ankara sekizinci icra\"); the adapter resolves it to ICA's numeric office code from the embedded office list (internal/ica/data/icra_offices.json, source: the public YSS/Cordis widget list) before calling ICA — a numeric code is also accepted and passed through. Unknown office → business error ICRA_OFFICE_UNKNOWN (no ICA call, TTS asks to repeat the office). Ambiguous vendor names (GEBZE, KOCAELİ, …) are tried code by code. `dosya_no` is yıl/numara (e.g. 2026/37400). v68 (customer rule): text_to_be_read for a legal follow-up file carries ONLY the file count and its law office — never the icra dairesi, the dosya numarası or any amount; on every ICA debt action the header total excludes legal files. v70 (customer rules, 01.10): groups in the order Normal borç (EARLY_COLLECTION_FILE, + \"Bu borcun, geçiş tarihinden itibaren on beş gün içinde ödenmesi gerekmektedir.\"), İdari (COLLECTION/BALANCING_PLAN, + \"Dosya tutarları sırasıyla …\" when >1 file), İdari takip süreci sonlanan (LEGAL_FOLLOW_UP_FILE held by \"Yasal Takip Bölümü (ICA Genel Müdürlük)\": count + amount), Yasal (count only); every distinct law office by name (\"Dosyalarınız şu hukuk bürolarında takip edilmektedir: …\"), the website sentence, the phone offer, and the phone list LAST (\"Hukuk bürolarının telefon numaraları: …\") — the agent prompt reads it only on request. v73 (pacing, 01.10): list items are separate sentences (\"sırasıyla: A. B.\", office names \"A. B. C.\", one sentence per office phone) and phones carry comma pauses between the 4-3-2-2 groups (\"sıfır üç yüz on iki, beş yüz elli beş, sıfır bir, kırk iki\"). The data object is unchanged. v64: ICA 4021 \"Anlık bakiye sorgusu bu dosya için yapılamaz.\" (not in the vendor catalog; the file exists, its instant balance cannot be queried) is a business error → \"Bu dosya için anlık borç sorgusu yapılamamaktadır. Dosyanızın güncel borç bilgisini ilgili hukuk bürosundan öğrenebilirsiniz\"."
          }
        },
        {
          "name": "Debt by Service File Ref",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"ica\",\n  \"action\": \"ica.debt.by_service_file_ref\",\n  \"payload\": {\n    \"service_file_ref\": \"3200094\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Query instant debt balance by serviceFileReference (getInstantBalanceByServiceFileReference). v64: 3958 by message — \"Dosya Kapalı\" (closed AND suspended, same message) → \"Sorguladığınız dosya şu anda aktif değildir. …\"; \"Dosya, Yasal Takip sürecinde\" → \"Sorguladığınız dosya yasal takip sürecindedir\"; \"Dosya Bulunamadı\" → \"Dosya bulunamadı\"; \"…birleşme işlemi nedeniyle kapatılmıştır, … NNN ref numaralı dosya…\" → the adapter queries the new reference ONCE and the TTS starts with \"Sorguladığınız dosya başka bir dosya ile birleştirilmiştir. Güncel dosyanıza ait bilgiler şöyledir.\" (data.merged_file = true)."
          }
        }
      ]
    },
    {
      "name": "Twilio",
      "description": "Twilio service — 1 action (service: twilio)",
      "item": [
        {
          "name": "Send SMS",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"twilio\",\n  \"action\": \"twilio.sms.send\",\n  \"payload\": {\n    \"account_sid\": \"{{twilio_account_sid}}\",\n    \"auth_token\": \"{{twilio_auth_token}}\",\n    \"from\": \"+15551234567\",\n    \"to\": \"+905551234567\",\n    \"body\": \"Hello from AI Agent\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Send an SMS message via Twilio."
          }
        }
      ]
    },
    {
      "name": "TSoft",
      "description": "TSoft e-commerce service — 6 actions (service: tsoft)\n\nMulti-tenant: same adapter serves ANY TSoft merchant.\nCredentials: base_url, username, password in payload.\n\nVerified on: mizalle.com (March 2026)",
      "item": [
        {
          "name": "Products",
          "description": "Product search and detail",
          "item": [
            {
              "name": "Product Search — elbise",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.product.search\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"keyword\": \"elbise\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Search products by keyword.\n\nVerified: 'elbise' returns multiple products on mizalle.com with prices in TL.\n\nNote: Fixed in efc1a0a — TSoft API requires form parameter 'q' (not 'keyword'). Our proxy API field remains 'keyword' in the payload."
              }
            },
            {
              "name": "Product Search — kırmızı elbise",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.product.search\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"keyword\": \"kırmızı elbise\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Search for 'kırmızı elbise' (red dress). Verifies keyword filtering works correctly after bug fix efc1a0a — different keywords should return different results."
              }
            },
            {
              "name": "Product Search — kazak",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.product.search\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"keyword\": \"kazak\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Search for 'kazak' (sweater). Another verified working keyword on mizalle.com."
              }
            },
            {
              "name": "Product Detail — by ID",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.product.detail\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"product_id\": \"12725\",\n    \"keyword\": \"bomber ceket\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Get product detail by product ID.\n\nNote: product_id is numeric. keyword is optional but recommended — it provides the original search term for context in the AI response.\nOn mizalle.com, use actual product IDs from search results."
              }
            }
          ]
        },
        {
          "name": "Orders",
          "description": "Order tracking and listing",
          "item": [
            {
              "name": "Order Track — by OrderCode (TS20032)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.order.track.by_code\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"order_code\": \"TS20032\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Track order by full OrderCode.\n\nVerified: TS20032 on test store = 'Kargoya Verildi', 182.76 TL, customer Test Müşteri.\nOn mizalle.com, use real order codes from merchant."
              }
            },
            {
              "name": "Order Track — by OrderCode (TS20033)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.order.track.by_code\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"order_code\": \"TS20033\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Track order by OrderCode.\n\nVerified: TS20033 on test store = 'Ödeme Bekleniyor', 197.39 TL, customer ahmet karaca2."
              }
            },
            {
              "name": "Order Track — by numeric ID / DTMF (3)",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.order.track.by_id\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"order_id\": \"3\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Track order by numeric OrderId (DTMF-friendly).\n\nVerified: OrderId 3 on test store resolves to OrderCode TS20033.\n2-step flow: getOrderDetailsByOrderId/3 → OrderCode → getOrders.\n\nNote: getOrderDetailsByOrderId has SQL bug on test store but works on real merchant stores."
              }
            },
            {
              "name": "Order Track — not found",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.order.track.by_code\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"order_code\": \"XXXXX99999\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Test with invalid order code — should return order not found."
              }
            },
            {
              "name": "Orders by Phone — 5551234567",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.order.by_phone\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"phone\": \"5551234567\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "List all orders for phone number.\n\nVerified: 5551234567 on test store returns 2 orders (TS20032 + TS20033).\nIMPORTANT: Phone WITHOUT leading 0."
              }
            }
          ]
        },
        {
          "name": "Customers",
          "description": "Customer lookup by phone",
          "item": [
            {
              "name": "Customer by Phone — 5551234567",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.customer.by_phone\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"phone\": \"5551234567\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Look up customer by phone.\n\nVerified: 5551234567 on test store returns Test Müşteri (CustomerId=1, Email=musteri@ornek.com, OrderCount=1).\nIMPORTANT: Phone WITHOUT leading 0."
              }
            },
            {
              "name": "Customer by Phone — not found",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.customer.by_phone\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"phone\": \"5551112233\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Test with unknown phone — should return customer not found."
              }
            }
          ]
        },
        {
          "name": "Error Cases",
          "description": "Common error scenarios for testing",
          "item": [
            {
              "name": "Missing Credentials",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.product.search\",\n  \"payload\": {\n    \"base_url\": \"\",\n    \"username\": \"\",\n    \"password\": \"\",\n    \"keyword\": \"elbise\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Test with empty credentials — should return missing credentials error."
              }
            },
            {
              "name": "Wrong Password",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.product.search\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"keyword\": \"elbise\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Test with wrong password — should return auth error.\n\nTSoft returns AUI002: 'Geçersiz kullanıcı adı veya şifre!'"
              }
            },
            {
              "name": "Wrong Username Case",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_mizalle\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_tsoft_test\",\n  \"service\": \"tsoft\",\n  \"action\": \"tsoft.product.search\",\n  \"payload\": {\n    \"base_url\": \"{{tsoft_base_url}}\",\n    \"username\": \"{{tsoft_username}}\",\n    \"password\": \"{{tsoft_password}}\",\n    \"keyword\": \"elbise\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Test with lowercase username — TSoft is CASE-SENSITIVE!\n\n'aiagent' fails, 'Aiagent' works. Returns AUI002."
              }
            }
          ]
        }
      ]
    },
    {
      "name": "ikas",
      "description": "ikas e-commerce service — 6 actions (service: ikas)\n\nCredentials per-request in payload (store_name, client_id, client_secret).\nOAuth2 Client Credentials auth with in-memory token cache (keyed by store_name).\nGraphQL Admin API.\n\nActions: product.search, product.list, order.track, order.list, customer.search, merchant.info\n\nCredentials are hardcoded in each request payload (matching TSoft pattern)",
      "item": [
        {
          "name": "Products",
          "description": "Product search and listing",
          "item": [
            {
              "name": "Product Search — cap",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_ikas_demo\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_ikas_test\",\n  \"service\": \"ikas\",\n  \"action\": \"ikas.product.search\",\n  \"payload\": {\n    \"store_name\": \"dev-aiagenttr\",\n    \"client_id\": \"{{ikas_client_id}}\",\n    \"client_secret\": \"{{ikas_client_secret}}\",\n    \"keyword\": \"cap\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Search products by keyword.\n\nReturns matching products with name, price, stock status, and image."
              }
            },
            {
              "name": "Product List — page 1",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_ikas_demo\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_ikas_test\",\n  \"service\": \"ikas\",\n  \"action\": \"ikas.product.list\",\n  \"payload\": {\n    \"store_name\": \"dev-aiagenttr\",\n    \"client_id\": \"{{ikas_client_id}}\",\n    \"client_secret\": \"{{ikas_client_secret}}\",\n    \"page\": 1,\n    \"limit\": 5\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "List products with pagination.\n\nReturns paginated product list with name, price, stock status, and image."
              }
            }
          ]
        },
        {
          "name": "Orders",
          "description": "Order tracking and listing",
          "item": [
            {
              "name": "Order Track — 1001",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_ikas_demo\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_ikas_test\",\n  \"service\": \"ikas\",\n  \"action\": \"ikas.order.track\",\n  \"payload\": {\n    \"store_name\": \"dev-aiagenttr\",\n    \"client_id\": \"{{ikas_client_id}}\",\n    \"client_secret\": \"{{ikas_client_secret}}\",\n    \"order_number\": \"1001\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Track a specific order by order number.\n\nReturns order status, items, total, and tracking link if available."
              }
            },
            {
              "name": "Order List — recent",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_ikas_demo\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_ikas_test\",\n  \"service\": \"ikas\",\n  \"action\": \"ikas.order.list\",\n  \"payload\": {\n    \"store_name\": \"dev-aiagenttr\",\n    \"client_id\": \"{{ikas_client_id}}\",\n    \"client_secret\": \"{{ikas_client_secret}}\",\n    \"page\": 1,\n    \"limit\": 10,\n    \"sort\": \"-orderedAt\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "List orders with pagination and sorting.\n\nSort by -orderedAt for newest first."
              }
            }
          ]
        },
        {
          "name": "Customers",
          "description": "Customer search by phone or name",
          "item": [
            {
              "name": "Customer Search — by phone",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_ikas_demo\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_ikas_test\",\n  \"service\": \"ikas\",\n  \"action\": \"ikas.customer.search\",\n  \"payload\": {\n    \"store_name\": \"dev-aiagenttr\",\n    \"client_id\": \"{{ikas_client_id}}\",\n    \"client_secret\": \"{{ikas_client_secret}}\",\n    \"search\": \"5555\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Search customers by phone number.\n\nReturns matching customers with name, email, phone, and order count."
              }
            },
            {
              "name": "Customer Search — by name",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_ikas_demo\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_ikas_test\",\n  \"service\": \"ikas\",\n  \"action\": \"ikas.customer.search\",\n  \"payload\": {\n    \"store_name\": \"dev-aiagenttr\",\n    \"client_id\": \"{{ikas_client_id}}\",\n    \"client_secret\": \"{{ikas_client_secret}}\",\n    \"search\": \"Ata\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Search customers by name.\n\nReturns matching customers with name, email, phone, and order count."
              }
            }
          ]
        },
        {
          "name": "Merchant",
          "description": "Merchant information",
          "item": [
            {
              "name": "Merchant Info",
              "request": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json",
                    "type": "text"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"organization_id\": \"org_ikas_demo\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_ikas_test\",\n  \"service\": \"ikas\",\n  \"action\": \"ikas.merchant.info\",\n  \"payload\": {\n    \"store_name\": \"dev-aiagenttr\",\n    \"client_id\": \"{{ikas_client_id}}\",\n    \"client_secret\": \"{{ikas_client_secret}}\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/v1/proxy",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "proxy"
                  ]
                },
                "description": "Get merchant/store information.\n\nReturns store name, contact details, and configuration."
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Vericom",
      "description": "Vericom shipment tracking and reservation — 4 actions (service: vericom)",
      "item": [
        {
          "name": "Shipment Track",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_vericom_demo\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_vericom_track\",\n  \"service\": \"vericom\",\n  \"action\": \"vericom.shipment.track\",\n  \"payload\": {\n    \"tracking_number\": \"2632455482\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Track a shipment by tracking number.\n\nUses the real Vericom public API (no auth required)."
          }
        },
        {
          "name": "Create Reservation",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_vericom_demo\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_vericom_reservation\",\n  \"service\": \"vericom\",\n  \"action\": \"vericom.reservation.create\",\n  \"payload\": {\n    \"from_title\": \"Test Gönderici A.Ş.\",\n    \"from_address\": \"Atatürk Cad. No: 123\",\n    \"from_city\": \"Istanbul\",\n    \"from_country\": \"TR\",\n    \"from_phonenumber\": \"+905551234567\",\n    \"recipient_title\": \"Test Alıcı Ltd.\",\n    \"recipient_vat_no\": \"1234567890\",\n    \"recipient_address\": \"Cumhuriyet Blv. No: 456\",\n    \"recipient_city\": \"Ankara\",\n    \"recipient_country\": \"TR\",\n    \"recipient_postal_code\": \"06100\",\n    \"recipient_phonenumber\": \"+905559876543\",\n    \"incoterm_code\": \"DAP\",\n    \"packages\": [\n      {\n        \"quantity\": 1,\n        \"gross_weight\": 5.0,\n        \"net_weight\": 4.5,\n        \"width\": 30,\n        \"length\": 40,\n        \"height\": 20\n      }\n    ],\n    \"products\": [\n      {\n        \"commercial_definition\": \"Elektronik Ürün\",\n        \"hs_code\": \"8471.30\",\n        \"country_of_origin\": \"TR\",\n        \"quantity\": 1,\n        \"unit_weight\": 4.5,\n        \"total_weight\": 4.5,\n        \"unit_amount\": 150.0,\n        \"total_amount\": 150.0,\n        \"currency_code\": \"TRY\"\n      }\n    ]\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Create a parcel pickup reservation.\n\nRequires auth via mock backend."
          }
        },
        {
          "name": "Get Reservation",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_vericom_demo\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_vericom_reservation\",\n  \"service\": \"vericom\",\n  \"action\": \"vericom.reservation.get\",\n  \"payload\": {\n    \"reservation_id\": \"RES-001\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Get a reservation by ID.\n\nRequires auth via mock backend."
          }
        },
        {
          "name": "List Reservations",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_vericom_demo\",\n  \"account_id\": \"acc_001\",\n  \"conversation_id\": \"conv_vericom_reservation\",\n  \"service\": \"vericom\",\n  \"action\": \"vericom.reservation.list\",\n  \"payload\": {}\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "List all reservations.\n\nRequires auth via mock backend."
          }
        }
      ]
    },
    {
      "name": "Tapu",
      "item": [
        {
          "name": "Call Result Send",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"org_123\",\n  \"account_id\": \"acc_456\",\n  \"conversation_id\": \"conv_789\",\n  \"service\": \"tapu\",\n  \"action\": \"tapu.call_result\",\n  \"payload\": {\n    \"call_data\": {\n      \"category\": \"complaint\",\n      \"sub_category\": \"billing\",\n      \"call\": {\n        \"id\": \"0c07c20a-227b-4488-bd9c-bc61b39bc9a4\",\n        \"analysis\": {\n          \"summary\": \"Test call summary\"\n        },\n        \"durationSeconds\": 26.763,\n        \"endedReason\": \"customer-ended-call\",\n        \"startedAt\": \"2026-02-26T13:16:47.68Z\",\n        \"endedAt\": \"2026-02-26T13:17:14.443Z\"\n      },\n      \"transcript\": \"AI: Merhaba\\nUser: Test\"\n    }\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Send a call summary notification to Tapu.\n\nRequires auth via mock backend (server-stored credentials)."
          }
        },
        {
          "name": "Auction Query (auction_id: 20014)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"{{org_id}}\",\n  \"account_id\": \"{{account_id}}\",\n  \"service\": \"tapu\",\n  \"action\": \"tapu.auction_query\",\n  \"payload\": {\n    \"auction_id\": \"20014\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Query auction information for auction_id 20014 from Tapu."
          }
        },
        {
          "name": "Auction Query (auction_id: 24391)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"{{org_id}}\",\n  \"account_id\": \"{{account_id}}\",\n  \"service\": \"tapu\",\n  \"action\": \"tapu.auction_query\",\n  \"payload\": {\n    \"auction_id\": \"24391\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Query auction information for auction_id 24391 from Tapu."
          }
        },
        {
          "name": "Auction Query (auction_id: 20521)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"{{org_id}}\",\n  \"account_id\": \"{{account_id}}\",\n  \"service\": \"tapu\",\n  \"action\": \"tapu.auction_query\",\n  \"payload\": {\n    \"auction_id\": \"20521\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Query auction information for auction_id 20521 from Tapu."
          }
        },
        {
          "name": "Auction Search (q: kadıköyde 3+1 daire)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"organization_id\": \"{{org_id}}\",\n  \"account_id\": \"{{account_id}}\",\n  \"conversation_id\": \"{{conversation_id}}\",\n  \"service\": \"tapu\",\n  \"action\": \"tapu.auction_search\",\n  \"payload\": {\n    \"q\": \"kadıköyde 3+1 daire\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{base_url}}/v1/proxy",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "proxy"
              ]
            },
            "description": "Free-text auction search from Tapu.\n\nSearches auctions by keyword, location, or description.\nCollection-level HMAC pre-request script handles signing automatically."
          }
        }
      ]
    }
  ]
}
