{
  "info": {
    "name": "Zoltopay API",
    "_postman_id": "6b1f3c2e-8d4a-4f0e-9c1b-2a7e5d3f9a10",
    "description": "REST API Zoltopay: инвойсы, выплаты, баланс, монеты.\n\n1. Откройте коллекцию → вкладка Variables → укажите `api_key` (ваш ключ gw_…).\n2. Для симуляции вебхука укажите `callback_url` и `webhook_secret`.\n\nДокументация: https://zoltopay.com/docs",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_key}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://zoltopay.com/gw"
    },
    {
      "key": "api_key",
      "value": "gw_your_key"
    },
    {
      "key": "currency",
      "value": "USDT.Tron"
    },
    {
      "key": "invoice_id",
      "value": ""
    },
    {
      "key": "payout_id",
      "value": ""
    },
    {
      "key": "callback_url",
      "value": "https://shop.example/zoltopay/callback"
    },
    {
      "key": "webhook_secret",
      "value": ""
    }
  ],
  "item": [
    {
      "name": "Монеты",
      "item": [
        {
          "name": "Список монет и сетей",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/currencies",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "currencies"
              ]
            },
            "description": "Доступные currency_id, минимальный платёж и сбор за вывод."
          }
        }
      ]
    },
    {
      "name": "Инвойсы",
      "item": [
        {
          "name": "Создать инвойс",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.collectionVariables.set('order_id', 'ORDER-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('201 Created', () => pm.response.to.have.status(201));",
                  "const j = pm.response.json();",
                  "if (j.id) pm.collectionVariables.set('invoice_id', j.id);",
                  "if (j.pay_url) console.log('pay_url:', j.pay_url);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"order_id\": \"{{order_id}}\",\n  \"amount\": \"25\",\n  \"currency\": \"{{currency}}\",\n  \"ttl_minutes\": 60,\n  \"return_url\": \"https://shop.example/order/1001\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/v1/invoices",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "invoices"
              ]
            },
            "description": "order_id генерируется автоматически. id созданного инвойса сохраняется в переменную invoice_id. Клиента перенаправьте на pay_url или покажите pay_address + amount_to_pay в своей форме."
          }
        },
        {
          "name": "Создать счёт в фиате (EUR)",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.collectionVariables.set('order_id', 'ORDER-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('201 Created', () => pm.response.to.have.status(201));",
                  "const j = pm.response.json();",
                  "if (j.id) pm.collectionVariables.set('invoice_id', j.id);",
                  "if (j.pay_url) console.log('pay_url:', j.pay_url);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"order_id\": \"{{order_id}}\",\n  \"amount\": \"50\",\n  \"currency\": \"EUR\",\n  \"return_url\": \"https://shop.example/order/1001\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/v1/invoices",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "invoices"
              ]
            },
            "description": "Счёт в фиате (USD, EUR, RUB, UAH, KZT, TRY, GBP, AED, CNY, INR). Монету покупатель выбирает на pay_url. id сохраняется в invoice_id."
          }
        },
        {
          "name": "Получить инвойс",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/invoices/{{invoice_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "invoices",
                "{{invoice_id}}"
              ]
            },
            "description": "Статусы: NEW, PAID, OVERPAID, UNDERPAID, EXPIRED."
          }
        },
        {
          "name": "Список инвойсов",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/invoices?limit=50",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "invoices"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "50"
                }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "Выплаты",
      "item": [
        {
          "name": "Баланс",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/balance",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "balance"
              ]
            }
          }
        },
        {
          "name": "Создать выплату",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.collectionVariables.set('request_id', 'payout-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('202 Accepted или 200 (повтор)', () => pm.expect(pm.response.code).to.be.oneOf([200, 202]));",
                  "const j = pm.response.json();",
                  "if (j.id) pm.collectionVariables.set('payout_id', j.id);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"request_id\": \"{{request_id}}\",\n  \"address\": \"TYourRecipientAddress\",\n  \"amount\": \"25\",\n  \"currency\": \"{{currency}}\"\n}"
            },
            "url": {
              "raw": "{{base_url}}/v1/payouts",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "payouts"
              ]
            },
            "description": "ВНИМАНИЕ: отправляет реальные средства. Замените address. request_id — ключ идемпотентности (генерируется автоматически)."
          }
        },
        {
          "name": "Получить выплату",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{base_url}}/v1/payouts/{{payout_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "payouts",
                "{{payout_id}}"
              ]
            },
            "description": "Статусы: QUEUED → SENT → CONFIRMED или FAILED."
          }
        }
      ]
    },
    {
      "name": "Вебхуки (тест своего обработчика)",
      "item": [
        {
          "name": "Симуляция invoice.paid",
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.variables.replaceIn(pm.request.body.raw);",
                  "const sig = CryptoJS.HmacSHA256(body, pm.collectionVariables.get('webhook_secret')).toString(CryptoJS.enc.Hex);",
                  "pm.request.body.raw = body;",
                  "pm.request.headers.upsert({ key: 'X-Signature', value: sig });"
                ]
              }
            }
          ],
          "request": {
            "auth": {
              "type": "noauth"
            },
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "X-Event",
                "value": "invoice.paid"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\"invoice_id\":42,\"order_id\":\"ORDER-1001\",\"status\":\"PAID\",\"paid_usd\":\"25.01\",\"amount_usd\":\"25.01\"}"
            },
            "url": {
              "raw": "{{callback_url}}",
              "host": [
                "{{callback_url}}"
              ]
            },
            "description": "Отправляет на ВАШ callback_url событие, подписанное webhook_secret (HMAC-SHA256 тела, заголовок X-Signature) — так же, как это делает Zoltopay. Запрос идёт не в Zoltopay, а на ваш сервер."
          }
        }
      ]
    }
  ]
}