{
  "info": {
    "name": "JoinPoint API",
    "description": "API кабинета инфлюенсера JoinPoint. Документация: https://joinpoint.uz/developers/\n\nВпишите phone и password в Variables и выполните запрос «Вход» — токен сохранится в переменную token сам. Не сохраняйте пароль в коллекции, которой делитесь.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://prod-api.joinpoint.uz/api"
    },
    {
      "key": "token",
      "value": ""
    },
    {
      "key": "phone",
      "value": ""
    },
    {
      "key": "password",
      "value": ""
    }
  ],
  "item": [
    {
      "name": "Вход",
      "item": [
        {
          "name": "Вход, получение токена — POST /auth/admin-login",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/auth/admin-login",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "auth",
                "admin-login"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"{{phone}}\",\n  \"password\": \"{{password}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "auth": {
              "type": "noauth"
            },
            "description": "Выдаёт токен по номеру телефона и паролю от кабинета JoinPoint. Токен действует 24 часа; после этого запросы возвращают 401 — войдите снова."
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const r = pm.response.json();",
                  "if (r.meta && r.meta.token) { pm.collectionVariables.set('token', r.meta.token); }"
                ]
              }
            }
          ],
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/auth/admin-login",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "auth",
                    "admin-login"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"{{phone}}\",\n  \"password\": \"{{password}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "auth": {
                  "type": "noauth"
                },
                "description": "Выдаёт токен по номеру телефона и паролю от кабинета JoinPoint. Токен действует 24 часа; после этого запросы возвращают 401 — войдите снова."
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": 42,\n    \"phone\": \"+998901234567\",\n    \"name\": \"Premium kanal\",\n    \"channelId\": \"-1001234567890\",\n    \"channelName\": \"Premium kanal\",\n    \"freeTrial\": 0,\n    \"isActive\": true,\n    \"note\": null,\n    \"isNavigation\": false,\n    \"status\": \"active\",\n    \"isSuspended\": false,\n    \"role\": \"admin\",\n    \"trialNotifyEnabled\": false\n  },\n  \"meta\": {\n    \"message\": \"success\",\n    \"statusCode\": 200,\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.…\",\n    \"hasTelegramUsers\": true\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Подписчики",
      "item": [
        {
          "name": "Подписчики — GET /user-bot",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/user-bot?page=1&count=50&filter=subscribed",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "user-bot"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "count",
                  "value": "50"
                },
                {
                  "key": "filter",
                  "value": "subscribed"
                }
              ]
            },
            "description": "Все, кто запускал вашего бота, с фильтром по сегменту и поиском."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/user-bot?page=1&count=50&filter=subscribed",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-bot"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1"
                    },
                    {
                      "key": "count",
                      "value": "50"
                    },
                    {
                      "key": "filter",
                      "value": "subscribed"
                    }
                  ]
                },
                "description": "Все, кто запускал вашего бота, с фильтром по сегменту и поиском."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 100501,\n      \"createdAt\": \"2026-06-08T12:31:40.512Z\",\n      \"lastUpdatedAt\": \"2026-09-28T07:17:02.114Z\",\n      \"firstname\": \"Aziz\",\n      \"lastname\": null,\n      \"status\": \"created\",\n      \"inChannel\": true,\n      \"isUnlimited\": false,\n      \"lang\": \"uz\",\n      \"role\": \"user\",\n      \"useFreeTrial\": false,\n      \"bot\": {\n        \"id\": 42,\n        \"name\": \"Premium kanal\"\n      },\n      \"user\": {\n        \"id\": 900001,\n        \"tgUsername\": \"aziz_example\",\n        \"tgId\": \"1234567890\",\n        \"tgPhone\": \"998901234567\",\n        \"createdAt\": \"2026-06-08T12:31:40.500Z\",\n        \"lastUpdatedAt\": \"2026-06-08T12:31:40.500Z\",\n        \"userDetail\": null\n      },\n      \"startingPoint\": null\n    }\n  ],\n  \"meta\": {\n    \"message\": \"found\",\n    \"statusCode\": 200,\n    \"currentPage\": 1,\n    \"totalPages\": 25,\n    \"total\": 1238,\n    \"count\": 50,\n    \"hasPrev\": false,\n    \"hasNext\": true\n  }\n}"
            }
          ]
        },
        {
          "name": "Размер сегмента — GET /user-bot/get-count",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/user-bot/get-count?page=1&count=5&filter=subscribed",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "user-bot",
                "get-count"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "count",
                  "value": "5"
                },
                {
                  "key": "filter",
                  "value": "subscribed"
                }
              ]
            },
            "description": "Сколько подписчиков в сегменте. Параметры `page` и `count` обязательны, но на результат не влияют."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/user-bot/get-count?page=1&count=5&filter=subscribed",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-bot",
                    "get-count"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1"
                    },
                    {
                      "key": "count",
                      "value": "5"
                    },
                    {
                      "key": "filter",
                      "value": "subscribed"
                    }
                  ]
                },
                "description": "Сколько подписчиков в сегменте. Параметры `page` и `count` обязательны, но на результат не влияют."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"count\": 1238\n  },\n  \"meta\": {\n    \"message\": \"success\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        },
        {
          "name": "Карточка подписчика — GET /user-bot/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/user-bot/100501",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "user-bot",
                "100501"
              ]
            },
            "description": "Один подписчик вашего бота. Чужой ID — ответ 404."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/user-bot/100501",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-bot",
                    "100501"
                  ]
                },
                "description": "Один подписчик вашего бота. Чужой ID — ответ 404."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": 100501,\n    \"createdAt\": \"2026-06-08T12:31:40.512Z\",\n    \"lastUpdatedAt\": \"2026-09-28T07:17:02.114Z\",\n    \"firstname\": \"Aziz\",\n    \"lastname\": null,\n    \"status\": \"created\",\n    \"inChannel\": true,\n    \"isUnlimited\": false,\n    \"lang\": \"uz\",\n    \"role\": \"user\",\n    \"useFreeTrial\": false,\n    \"bot\": {\n      \"id\": 42,\n      \"name\": \"Premium kanal\"\n    },\n    \"user\": {\n      \"id\": 900001,\n      \"tgUsername\": \"aziz_example\",\n      \"tgId\": \"1234567890\",\n      \"tgPhone\": \"998901234567\",\n      \"createdAt\": \"2026-06-08T12:31:40.500Z\",\n      \"lastUpdatedAt\": \"2026-06-08T12:31:40.500Z\"\n    },\n    \"startingPoint\": null\n  },\n  \"meta\": {\n    \"message\": \"found\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        },
        {
          "name": "Реестр клиентов — GET /clients",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/clients?page=1&count=100&status=active",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "clients"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "count",
                  "value": "100"
                },
                {
                  "key": "status",
                  "value": "active"
                }
              ]
            },
            "description": "Плоский список подписчиков для CRM: статус подписки и ссылка, по которой человек пришёл. Телефоны приходят с маской. У метода своя обёртка ответа — без `meta`."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/clients?page=1&count=100&status=active",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "clients"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1"
                    },
                    {
                      "key": "count",
                      "value": "100"
                    },
                    {
                      "key": "status",
                      "value": "active"
                    }
                  ]
                },
                "description": "Плоский список подписчиков для CRM: статус подписки и ссылка, по которой человек пришёл. Телефоны приходят с маской. У метода своя обёртка ответа — без `meta`."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"user_bot_id\": 100501,\n      \"tg_id\": \"1234567890\",\n      \"full_name\": \"Aziz\",\n      \"phone\": \"+99890***4567\",\n      \"tg_username\": \"aziz_example\",\n      \"lang\": \"uz\",\n      \"registered_at\": \"2026-06-08T12:31:40.512Z\",\n      \"bot_id\": 42,\n      \"bot_name\": \"Premium kanal\",\n      \"source_id\": 12,\n      \"source_name\": \"Instagram stories\",\n      \"source_raw\": \"1759000000001\",\n      \"attributed_at\": \"2026-06-08T12:31:41.000Z\",\n      \"in_channel\": true,\n      \"subscription_status\": \"active\"\n    }\n  ],\n  \"total\": 1238,\n  \"page\": 1,\n  \"count\": 100,\n  \"phonesMasked\": true\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Подписки",
      "item": [
        {
          "name": "Подписки — GET /user-bot-plan",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/user-bot-plan?page=1&count=50&userBotId=100501",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "user-bot-plan"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "count",
                  "value": "50"
                },
                {
                  "key": "userBotId",
                  "value": "100501"
                }
              ]
            },
            "description": "История подписок ваших подписчиков. У одного человека может быть несколько записей."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/user-bot-plan?page=1&count=50&userBotId=100501",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-bot-plan"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1"
                    },
                    {
                      "key": "count",
                      "value": "50"
                    },
                    {
                      "key": "userBotId",
                      "value": "100501"
                    }
                  ]
                },
                "description": "История подписок ваших подписчиков. У одного человека может быть несколько записей."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 70001,\n      \"createdAt\": \"2026-09-28T07:16:55.231Z\",\n      \"lastUpdatedAt\": \"2026-09-28T07:17:01.903Z\",\n      \"deletedAt\": null,\n      \"note\": null,\n      \"isActive\": true,\n      \"isDeleted\": false,\n      \"createdBy\": null,\n      \"lastUpdatedBy\": null,\n      \"deletedBy\": null,\n      \"status\": \"active\",\n      \"paymentType\": \"atmos-uzcard-humo\",\n      \"nextDate\": \"2026-10-28T07:16:55.000Z\",\n      \"retryDate\": \"2026-10-28T07:16:55.000Z\",\n      \"repeatTimes\": 0,\n      \"userBot\": {\n        \"id\": 100501,\n        \"firstname\": \"Aziz\",\n        \"status\": \"created\",\n        \"inChannel\": true,\n        \"isUnlimited\": false,\n        \"lang\": \"uz\",\n        \"role\": \"user\"\n      },\n      \"plan\": {\n        \"id\": 7,\n        \"name\": \"1 oy\",\n        \"type\": \"1\",\n        \"price\": \"50000000\",\n        \"status\": \"accepted\",\n        \"freeTrial\": 0,\n        \"cardRequired\": true,\n        \"freeDays\": 0\n      }\n    }\n  ],\n  \"meta\": {\n    \"message\": \"found\",\n    \"statusCode\": 200,\n    \"currentPage\": 1,\n    \"totalPages\": 1,\n    \"total\": 3,\n    \"count\": 50,\n    \"hasPrev\": false,\n    \"hasNext\": false\n  }\n}"
            }
          ]
        },
        {
          "name": "Выдать доступ вручную — POST /user-bot-plan",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/user-bot-plan",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "user-bot-plan"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"userBotId\": 100501,\n  \"type\": \"free\",\n  \"day\": 30\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Открывает подписчику доступ без списания с карты: бесплатно на N дней или по тарифу, оплаченному наличными или переводом."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/user-bot-plan",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-bot-plan"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"userBotId\": 100501,\n  \"type\": \"free\",\n  \"day\": 30\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Открывает подписчику доступ без списания с карты: бесплатно на N дней или по тарифу, оплаченному наличными или переводом."
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": 70002,\n    \"createdAt\": \"2026-09-29T09:00:00.000Z\",\n    \"lastUpdatedAt\": \"2026-09-29T09:00:00.000Z\",\n    \"status\": \"manual-active\",\n    \"paymentType\": \"atmos-uzcard-humo\",\n    \"nextDate\": \"2026-10-29T09:00:00.000Z\",\n    \"retryDate\": \"2026-10-29T09:00:00.000Z\",\n    \"repeatTimes\": 0,\n    \"isActive\": false,\n    \"note\": \"Manual created\"\n  },\n  \"meta\": {\n    \"message\": \"created\",\n    \"statusCode\": 201\n  }\n}"
            }
          ]
        },
        {
          "name": "Отключить автопродление — PATCH /user-bot-plan/{id}",
          "request": {
            "method": "PATCH",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/user-bot-plan/70001",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "user-bot-plan",
                "70001"
              ]
            },
            "description": "Выключает автопродление подписки. Доступ сохраняется до `nextDate`, дальше списаний не будет. Тело запроса не нужно."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "PATCH",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/user-bot-plan/70001",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-bot-plan",
                    "70001"
                  ]
                },
                "description": "Выключает автопродление подписки. Доступ сохраняется до `nextDate`, дальше списаний не будет. Тело запроса не нужно."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": 70001,\n    \"status\": \"manual-canceled\",\n    \"isActive\": false,\n    \"repeatTimes\": 0,\n    \"nextDate\": \"2026-10-28T07:16:55.000Z\"\n  },\n  \"meta\": {\n    \"message\": \"update\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        },
        {
          "name": "Удалить ручной доступ — DELETE /user-bot-plan/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/user-bot-plan/70002",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "user-bot-plan",
                "70002"
              ]
            },
            "description": "Удаляет запись о ручном доступе (статус `manual-active` или `manual-canceled`). Другие подписки так удалить нельзя — ответ 400."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/user-bot-plan/70002",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-bot-plan",
                    "70002"
                  ]
                },
                "description": "Удаляет запись о ручном доступе (статус `manual-active` или `manual-canceled`). Другие подписки так удалить нельзя — ответ 400."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"status\": \"manual-active\",\n    \"isActive\": false\n  },\n  \"meta\": {\n    \"message\": \"removed\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Платежи",
      "item": [
        {
          "name": "Платежи — GET /transaction-meta/transactions/{botId}",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/transaction-meta/transactions/0?page=1&count=100&status=success&fromDate=2026-09-01T00:00:00Z&toDate=2026-09-30T23:59:59Z",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "transaction-meta",
                "transactions",
                "0"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "count",
                  "value": "100"
                },
                {
                  "key": "status",
                  "value": "success"
                },
                {
                  "key": "fromDate",
                  "value": "2026-09-01T00:00:00Z"
                },
                {
                  "key": "toDate",
                  "value": "2026-09-30T23:59:59Z"
                }
              ]
            },
            "description": "Все платежи и попытки списания по вашему боту, включая неудачные. Выручка — записи со статусом `success`."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/transaction-meta/transactions/0?page=1&count=100&status=success&fromDate=2026-09-01T00:00:00Z&toDate=2026-09-30T23:59:59Z",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "transaction-meta",
                    "transactions",
                    "0"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1"
                    },
                    {
                      "key": "count",
                      "value": "100"
                    },
                    {
                      "key": "status",
                      "value": "success"
                    },
                    {
                      "key": "fromDate",
                      "value": "2026-09-01T00:00:00Z"
                    },
                    {
                      "key": "toDate",
                      "value": "2026-09-30T23:59:59Z"
                    }
                  ]
                },
                "description": "Все платежи и попытки списания по вашему боту, включая неудачные. Выручка — записи со статусом `success`."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 500001,\n      \"createdat\": \"2026-09-28T07:16:55.231Z\",\n      \"lastUpdatedAt\": \"2026-09-28T07:17:01.903Z\",\n      \"status\": \"success\",\n      \"price\": \"500000\",\n      \"type\": \"atmos-uzcard-humo\",\n      \"extId\": \"5f1c2a9e-3b7d-4e61-9a0c-2d84b6e1f3a7\",\n      \"refundedat\": null,\n      \"refundamount\": null,\n      \"plan\": {\n        \"id\": 7,\n        \"name\": \"1 oy\",\n        \"type\": \"1\",\n        \"price\": 500000\n      },\n      \"user\": {\n        \"id\": 900001,\n        \"tgUsername\": \"aziz_example\",\n        \"tgId\": \"1234567890\",\n        \"tgPhone\": \"998901234567\",\n        \"username\": null\n      },\n      \"userbot\": {\n        \"id\": 100501,\n        \"firstname\": \"Aziz\",\n        \"lastname\": null,\n        \"status\": \"created\",\n        \"inChannel\": true,\n        \"isUnlimited\": false,\n        \"lang\": \"uz\",\n        \"role\": \"user\",\n        \"useFreeTrial\": false\n      },\n      \"basket\": {\n        \"message\": null,\n        \"code\": null\n      },\n      \"transactionId\": null\n    }\n  ],\n  \"meta\": {\n    \"message\": \"found\",\n    \"statusCode\": 200,\n    \"currentPage\": 1,\n    \"totalPages\": 4,\n    \"total\": 312,\n    \"count\": 100,\n    \"hasPrev\": false,\n    \"hasNext\": true\n  }\n}"
            }
          ]
        },
        {
          "name": "Карточка платежа — GET /transaction-meta/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/transaction-meta/500001",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "transaction-meta",
                "500001"
              ]
            },
            "description": "Один платёж вашего бота. Сумма здесь в тийинах, номер карты замаскирован."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/transaction-meta/500001",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "transaction-meta",
                    "500001"
                  ]
                },
                "description": "Один платёж вашего бота. Сумма здесь в тийинах, номер карты замаскирован."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": 500001,\n    \"createdAt\": \"2026-09-28T07:16:55.231Z\",\n    \"lastUpdatedAt\": \"2026-09-28T07:17:01.903Z\",\n    \"deletedAt\": null,\n    \"note\": null,\n    \"isActive\": true,\n    \"isDeleted\": false,\n    \"createdBy\": null,\n    \"lastUpdatedBy\": null,\n    \"deletedBy\": null,\n    \"extId\": \"5f1c2a9e-3b7d-4e61-9a0c-2d84b6e1f3a7\",\n    \"type\": \"atmos-uzcard-humo\",\n    \"price\": \"50000000\",\n    \"cardNumber\": \"860012******3456\",\n    \"userId\": 900001,\n    \"botId\": 42,\n    \"planId\": 7,\n    \"status\": \"success\",\n    \"userBotPlanId\": null,\n    \"transactionId\": null\n  },\n  \"meta\": {\n    \"message\": \"found\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        },
        {
          "name": "Платежи подписчика — GET /transaction-meta/userbot/{userBotId}",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/transaction-meta/userbot/100501?page=1&count=50",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "transaction-meta",
                "userbot",
                "100501"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "count",
                  "value": "50"
                }
              ]
            },
            "description": "История оплат одного подписчика. Суммы в сумах."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/transaction-meta/userbot/100501?page=1&count=50",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "transaction-meta",
                    "userbot",
                    "100501"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1"
                    },
                    {
                      "key": "count",
                      "value": "50"
                    }
                  ]
                },
                "description": "История оплат одного подписчика. Суммы в сумах."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 500001,\n      \"createdat\": \"2026-09-28T07:16:55.231Z\",\n      \"lastupdatedat\": \"2026-09-28T07:17:01.903Z\",\n      \"status\": \"success\",\n      \"price\": \"500000\",\n      \"type\": \"atmos-uzcard-humo\",\n      \"plan\": {\n        \"id\": 7,\n        \"name\": \"1 oy\",\n        \"type\": \"1\",\n        \"price\": 500000\n      }\n    }\n  ],\n  \"meta\": {\n    \"message\": \"found\",\n    \"statusCode\": 200,\n    \"currentPage\": 1,\n    \"totalPages\": 1,\n    \"total\": 4,\n    \"count\": 50,\n    \"hasPrev\": false,\n    \"hasNext\": false\n  }\n}"
            }
          ]
        },
        {
          "name": "Итоги подписчика — GET /transaction-meta/statistics/{userBotId}",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/transaction-meta/statistics/100501",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "transaction-meta",
                "statistics",
                "100501"
              ]
            },
            "description": "Сколько подписчик заплатил за всё время."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/transaction-meta/statistics/100501",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "transaction-meta",
                    "statistics",
                    "100501"
                  ]
                },
                "description": "Сколько подписчик заплатил за всё время."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"yearlyPlans\": 0,\n    \"totalPlans\": 4,\n    \"totalAmount\": 2000000\n  },\n  \"meta\": {\n    \"message\": \"found\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        },
        {
          "name": "Выручка по тарифам — GET /transaction-meta/plan-summary",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/transaction-meta/plan-summary?fromDate=2026-09-01T00:00:00Z&toDate=2026-09-30T23:59:59Z",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "transaction-meta",
                "plan-summary"
              ],
              "query": [
                {
                  "key": "fromDate",
                  "value": "2026-09-01T00:00:00Z"
                },
                {
                  "key": "toDate",
                  "value": "2026-09-30T23:59:59Z"
                }
              ]
            },
            "description": "Успешные оплаты, сгруппированные по тарифам. Суммы в сумах."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/transaction-meta/plan-summary?fromDate=2026-09-01T00:00:00Z&toDate=2026-09-30T23:59:59Z",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "transaction-meta",
                    "plan-summary"
                  ],
                  "query": [
                    {
                      "key": "fromDate",
                      "value": "2026-09-01T00:00:00Z"
                    },
                    {
                      "key": "toDate",
                      "value": "2026-09-30T23:59:59Z"
                    }
                  ]
                },
                "description": "Успешные оплаты, сгруппированные по тарифам. Суммы в сумах."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"plan_id\": 7,\n      \"plan_name\": \"1 oy\",\n      \"plan_months\": \"1\",\n      \"plan_price\": \"500000\",\n      \"payments\": 118,\n      \"amount\": \"59000000\",\n      \"subscribers\": 113\n    }\n  ],\n  \"meta\": {\n    \"message\": \"found\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Тарифы",
      "item": [
        {
          "name": "Тарифы — GET /plan",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/plan",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "plan"
              ]
            },
            "description": "Тарифы вашего бота. Удалённые не показываются, если не передать `status=deleted`. Цена здесь в сумах."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/plan",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "plan"
                  ]
                },
                "description": "Тарифы вашего бота. Удалённые не показываются, если не передать `status=deleted`. Цена здесь в сумах."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 7,\n      \"createdAt\": \"2025-06-02T07:14:03.120Z\",\n      \"isActive\": true,\n      \"name\": \"1 oy\",\n      \"type\": \"1\",\n      \"price\": 500000,\n      \"status\": \"accepted\",\n      \"freeTrial\": 0,\n      \"cardRequired\": true,\n      \"freeDays\": 0,\n      \"startingPoint\": null,\n      \"bot\": {\n        \"id\": 42,\n        \"name\": \"Premium kanal\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"message\": \"found\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        },
        {
          "name": "Карточка тарифа — GET /plan/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/plan/7",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "plan",
                "7"
              ]
            },
            "description": "Один тариф вашего бота. Цена здесь в тийинах. Чужой тариф — ответ 403."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/plan/7",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "plan",
                    "7"
                  ]
                },
                "description": "Один тариф вашего бота. Цена здесь в тийинах. Чужой тариф — ответ 403."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": 7,\n    \"createdAt\": \"2025-06-02T07:14:03.120Z\",\n    \"name\": \"1 oy\",\n    \"type\": \"1\",\n    \"price\": \"50000000\",\n    \"status\": \"accepted\",\n    \"freeTrial\": 0,\n    \"cardRequired\": true,\n    \"freeDays\": 0,\n    \"bot\": {\n      \"id\": 42,\n      \"name\": \"Premium kanal\"\n    },\n    \"userBotPlans\": [\n      {\n        \"id\": 70001\n      }\n    ],\n    \"startingPoint\": null\n  },\n  \"meta\": {\n    \"message\": \"found\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Ссылки-источники",
      "item": [
        {
          "name": "Ссылки-источники — GET /starting-point",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/starting-point?page=1&count=50",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "starting-point"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1"
                },
                {
                  "key": "count",
                  "value": "50"
                }
              ]
            },
            "description": "Ссылки, по которым люди приходят в бота, со счётчиками."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/starting-point?page=1&count=50",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "starting-point"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1"
                    },
                    {
                      "key": "count",
                      "value": "50"
                    }
                  ]
                },
                "description": "Ссылки, по которым люди приходят в бота, со счётчиками."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 12,\n      \"createdAt\": \"2026-03-10T09:00:00.000Z\",\n      \"lastUpdatedAt\": \"2026-03-10T09:00:00.000Z\",\n      \"deletedAt\": null,\n      \"note\": null,\n      \"isActive\": true,\n      \"isDeleted\": false,\n      \"createdBy\": null,\n      \"lastUpdatedBy\": null,\n      \"deletedBy\": null,\n      \"name\": \"Instagram stories\",\n      \"extId\": \"1759000000001\",\n      \"redirectUrl\": null,\n      \"clickCount\": 1520,\n      \"userCount\": 845,\n      \"subscribersCount\": 61,\n      \"allowedTelegramIds\": null,\n      \"expireDate\": \"2030-12-31T19:00:00.000Z\",\n      \"deepLink\": \"https://t.me/my_channel_bot?start=1759000000001\",\n      \"redirectDropsPayload\": false,\n      \"attributionDisabledReason\": null\n    }\n  ],\n  \"meta\": {\n    \"message\": \"found\",\n    \"statusCode\": 200,\n    \"currentPage\": 1,\n    \"totalPages\": 1,\n    \"total\": 21,\n    \"count\": 50,\n    \"hasPrev\": false,\n    \"hasNext\": false\n  }\n}"
            }
          ]
        },
        {
          "name": "Создать ссылку-источник — POST /starting-point",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/starting-point",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "starting-point"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Instagram stories\",\n  \"expireDate\": \"2030-12-31T19:00:00.000Z\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Создаёт новую отслеживаемую ссылку. Метка `extId` генерируется автоматически."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/starting-point",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "starting-point"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"name\": \"Instagram stories\",\n  \"expireDate\": \"2030-12-31T19:00:00.000Z\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Создаёт новую отслеживаемую ссылку. Метка `extId` генерируется автоматически."
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": 13,\n    \"name\": \"Instagram stories\",\n    \"extId\": \"1759200000077\",\n    \"redirectUrl\": null,\n    \"clickCount\": 0,\n    \"userCount\": 0,\n    \"subscribersCount\": 0,\n    \"expireDate\": \"2030-12-31T19:00:00.000Z\",\n    \"deepLink\": \"https://t.me/my_channel_bot?start=1759200000077\",\n    \"redirectDropsPayload\": false,\n    \"attributionDisabledReason\": null\n  },\n  \"meta\": {\n    \"message\": \"created\",\n    \"statusCode\": 201\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Промокоды",
      "item": [
        {
          "name": "Промокоды — GET /promo",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/promo",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "promo"
              ]
            },
            "description": "Промокоды вашего бота со статистикой использования. Поля в `snake_case`."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/promo",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "promo"
                  ]
                },
                "description": "Промокоды вашего бота со статистикой использования. Поля в `snake_case`."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 3,\n      \"code\": \"STORY30\",\n      \"discount_type\": \"percent\",\n      \"discount_value\": 30,\n      \"scope\": \"bot\",\n      \"bot_id\": 42,\n      \"plan_id\": null,\n      \"max_uses\": 100,\n      \"used_count\": 7,\n      \"per_user_once\": true,\n      \"valid_from\": null,\n      \"valid_until\": \"2026-10-31T18:59:59.000Z\",\n      \"is_active\": true,\n      \"created_at\": \"2026-09-20T08:00:00.000Z\",\n      \"updated_at\": \"2026-09-20T08:00:00.000Z\",\n      \"bot_name\": \"Premium kanal\",\n      \"plan_name\": null,\n      \"redemption_count\": 7,\n      \"discount_given_tiyin\": \"105000000\"\n    }\n  ],\n  \"meta\": {\n    \"message\": \"Promo codes\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        },
        {
          "name": "Создать промокод — POST /promo",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/promo",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "promo"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"discountType\": \"percent\",\n  \"discountValue\": 30,\n  \"maxUses\": 100,\n  \"validUntil\": \"2026-10-31T18:59:59Z\",\n  \"code\": \"STORY30\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Создаёт промокод на скидку при оформлении подписки."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/promo",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "promo"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"discountType\": \"percent\",\n  \"discountValue\": 30,\n  \"maxUses\": 100,\n  \"validUntil\": \"2026-10-31T18:59:59Z\",\n  \"code\": \"STORY30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Создаёт промокод на скидку при оформлении подписки."
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": 3,\n    \"code\": \"STORY30\",\n    \"discount_type\": \"percent\",\n    \"discount_value\": 30,\n    \"scope\": \"bot\",\n    \"bot_id\": 42,\n    \"plan_id\": null,\n    \"max_uses\": 100,\n    \"used_count\": 0,\n    \"per_user_once\": true,\n    \"valid_from\": null,\n    \"valid_until\": \"2026-10-31T18:59:59.000Z\",\n    \"is_active\": true,\n    \"created_at\": \"2026-09-20T08:00:00.000Z\",\n    \"updated_at\": \"2026-09-20T08:00:00.000Z\"\n  },\n  \"meta\": {\n    \"message\": \"Promo code created\",\n    \"statusCode\": 201\n  }\n}"
            }
          ]
        },
        {
          "name": "Изменить промокод — PATCH /promo/{id}",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/promo/3",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "promo",
                "3"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"isActive\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Включает или выключает код, меняет лимит и срок. Передайте хотя бы одно поле."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/promo/3",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "promo",
                    "3"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"isActive\": false\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "description": "Включает или выключает код, меняет лимит и срок. Передайте хотя бы одно поле."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": {\n    \"id\": 3,\n    \"code\": \"STORY30\",\n    \"discount_type\": \"percent\",\n    \"discount_value\": 30,\n    \"scope\": \"bot\",\n    \"bot_id\": 42,\n    \"plan_id\": null,\n    \"max_uses\": 100,\n    \"used_count\": 7,\n    \"per_user_once\": true,\n    \"valid_from\": null,\n    \"valid_until\": \"2026-10-31T18:59:59.000Z\",\n    \"is_active\": false,\n    \"created_at\": \"2026-09-20T08:00:00.000Z\",\n    \"updated_at\": \"2026-09-20T08:00:00.000Z\",\n    \"bot_name\": \"Premium kanal\",\n    \"plan_name\": null,\n    \"redemption_count\": 7,\n    \"discount_given_tiyin\": \"105000000\"\n  },\n  \"meta\": {\n    \"message\": \"Promo code updated\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        },
        {
          "name": "Удалить промокод — DELETE /promo/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/promo/3",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "promo",
                "3"
              ]
            },
            "description": "Удаляет код, который ни разу не применяли. Использованный код можно только выключить."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "DELETE",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/promo/3",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "promo",
                    "3"
                  ]
                },
                "description": "Удаляет код, который ни разу не применяли. Использованный код можно только выключить."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": null,\n  \"meta\": {\n    \"message\": \"Promo code deleted\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Статистика",
      "item": [
        {
          "name": "Продажи за день — GET /user-bot/today-statistics",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/user-bot/today-statistics?startDate=2026-09-01&endDate=2026-09-29",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "user-bot",
                "today-statistics"
              ],
              "query": [
                {
                  "key": "startDate",
                  "value": "2026-09-01"
                },
                {
                  "key": "endDate",
                  "value": "2026-09-29"
                }
              ]
            },
            "description": "Продажи и выручка за день или период. По умолчанию — за сегодня. Ответ — массив из одного объекта. Суммы в сумах, числа приходят строками."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/user-bot/today-statistics?startDate=2026-09-01&endDate=2026-09-29",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-bot",
                    "today-statistics"
                  ],
                  "query": [
                    {
                      "key": "startDate",
                      "value": "2026-09-01"
                    },
                    {
                      "key": "endDate",
                      "value": "2026-09-29"
                    }
                  ]
                },
                "description": "Продажи и выручка за день или период. По умолчанию — за сегодня. Ответ — массив из одного объекта. Суммы в сумах, числа приходят строками."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"subscribers_in_channel\": \"1238\",\n      \"total_revenue_today\": \"61500000\",\n      \"sales_today\": \"123\",\n      \"average_sale_price_today\": \"500000\"\n    }\n  ],\n  \"meta\": {\n    \"message\": \"success\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        },
        {
          "name": "Сводка по боту — GET /user-bot/statistics/{botId}",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/user-bot/statistics/0",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "user-bot",
                "statistics",
                "0"
              ]
            },
            "description": "Общие показатели бота за всё время. Ответ — массив из одного объекта. Суммы в сумах."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/user-bot/statistics/0",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-bot",
                    "statistics",
                    "0"
                  ]
                },
                "description": "Общие показатели бота за всё время. Ответ — массив из одного объекта. Суммы в сумах."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"subscribers_in_channel\": \"1238\",\n      \"total_revenue\": \"1832000000\",\n      \"all_users_count\": \"69946\",\n      \"starting_point_users_count\": \"30870\",\n      \"average_check\": \"512340.55\",\n      \"subscriber_conversion_percent\": 5.2,\n      \"user_conversion_percent\": 44.1,\n      \"subscribed_ended_after_free_trial\": 139,\n      \"subscribed_ended_after_plan\": 12083,\n      \"not_subscribed\": 51210,\n      \"subscribed\": 1238,\n      \"not_confirm_card\": 3587\n    }\n  ],\n  \"meta\": {\n    \"message\": \"success\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        },
        {
          "name": "Воронка за период — GET /user-bot/period-statistics/{botId}",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/user-bot/period-statistics/0?fromDate=2026-09-01T00:00:00Z&toDate=2026-09-30T23:59:59Z",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "user-bot",
                "period-statistics",
                "0"
              ],
              "query": [
                {
                  "key": "fromDate",
                  "value": "2026-09-01T00:00:00Z"
                },
                {
                  "key": "toDate",
                  "value": "2026-09-30T23:59:59Z"
                }
              ]
            },
            "description": "Новые пользователи, подписки и выручка за период. Ответ — массив из одного объекта. Суммы в сумах."
          },
          "response": [
            {
              "name": "Пример ответа",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "url": {
                  "raw": "{{baseUrl}}/user-bot/period-statistics/0?fromDate=2026-09-01T00:00:00Z&toDate=2026-09-30T23:59:59Z",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "user-bot",
                    "period-statistics",
                    "0"
                  ],
                  "query": [
                    {
                      "key": "fromDate",
                      "value": "2026-09-01T00:00:00Z"
                    },
                    {
                      "key": "toDate",
                      "value": "2026-09-30T23:59:59Z"
                    }
                  ]
                },
                "description": "Новые пользователи, подписки и выручка за период. Ответ — массив из одного объекта. Суммы в сумах."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"data\": [\n    {\n      \"starting_point_users_count\": \"1840\",\n      \"all_users_count\": \"4120\",\n      \"subscribed\": \"236\",\n      \"subscribers_in_channel\": \"1238\",\n      \"total_revenue\": \"118000000\",\n      \"average_check\": \"500000.00\",\n      \"user_conversion_percent\": 44.6,\n      \"subscriber_conversion_percent\": 5.7\n    }\n  ],\n  \"meta\": {\n    \"message\": \"success\",\n    \"statusCode\": 200\n  }\n}"
            }
          ]
        }
      ]
    }
  ]
}
