Описание BI API
Рекомендации к формированию запросов:
  • ограничивать все запросы по датам: рекомендуется выставлять интервал размером не более 2-х недель
  • не делать одинаковые запросы чаще 1 раза в 15 минут: данные обновляются с интервалом в 1 час
  • в запросе за данными указывать только необходимые поля
  • не производить одновременно несколько запросов
1. Login
POST https://bi-v2.upravel.com/API/REST/login					
Request body:						
{
 "Username":"<имя пользователя>",
 "Password":"<пароль>"
}
Response (Success):						
{
 "UserName":"<имя пользователя>",
 "Token":"<token для доступа к API>"
}
Response (Fail):						
{
 "Type":"access",
 "Message": "Bad username or password, please validate or try using another realm"
}  
2. Logout
GET https://bi-v2.upravel.com/API/REST/<token>/logout
Response:						
{
 "Message":"Session successfully logged out"
}	
3. Получение списка доступных полей

GET https://bi-v2.upravel.com/API/REST/person/<token>/fields?platformName=<platform>
Необязательный параметр platformName стоит заполнять, если пользователю доступны несколько платформ.
GET https://bi-v2.upravel.com/API/REST/person/<token>/fields?platformName=<platform>				
Необязательный параметр platformName стоит заполнять, если пользователю доступны несколько платформ.	
Response:						
{
 "Dimensions": ["daily_table", "advertiser_id", "creative_id", "publisher_id"], // поля для группировки
 "Kpis": ["requests", "bids", "imps", "clicks", "ctr"]  // аггрегаты
}
4. Получение данных

POST
https://bi-v2.upravel.com/API/REST/person/<token>/reports/<report_id>/data/<page>/<count>
report_id - Параметр не используется. Сохранён для совместимости. Передаём "Traffic".
page - номер страницы paging'а. Страницы нумеруются с 0.
count - количество записей на странице.

Все даты в формате "yyyy-MM-dd".

Для получения данных без постраничной навигации нужно использовать адрес https://bi-v2.upravel.com/API/REST/person/<token>/reports/<report_id>/data
Request body:					
{
 "GroupBy":["<поле группировки1>, <поле группировки2>", ...], // обязательно
 "StartDate":"<начало периода (yyyy-MM-dd)>", // обязательно
 "EndDate":"<конец периода (yyyy-MM-dd)>", // обязательно
 "OrderBy":[
   {"field": "<поле сортировки>", "order":"<направление сортировки (asc/desc)>"},
   ...
 ],
 "Filter": [ //фильтры
   {
     "Field":"<поле фильтрации>",
     "Values":["<значение1>", "<значение2>", ...], // между значениями одного поля используется логическое ИЛИ
     "Op":"<операция (=, <>, >, <, >=, <=, like)>"
   }, // между фильтрами по разным полям используется логическое И
   ...
 ],
 "DataFields":["<поле1>", "<поле2>", ...], // обязательно. Список запрашиваемых полей.
 "Timezone":180, // Опционально. Таймзона, в которой требуется получить данные (в минутах относительно UTC. 180 - UTC+3). Работает только в специальных платформах.
 "PlatformName":"<имя_платформы>" // Опционально. Заполняется, если пользователю доступны несколько платформ.
}												
Response (Success):					
{
 "Total":{
   "DataCount": [
     {
       "Field":"<имя поля>",
       "Value":"<значение поля>"
     },
     ...
   ],
   "RecCount":<общее количество различных значений поля, указанного в GroupBy>
 },
 "Data": [
   {
     "DataFields": [
       {"Field":"<имя поля>", "Value":"<значение поля>"    },
       ...
     ],
     "GroupingFields": [
       {"Field":"<поле группировки1>","Value":"<значение>"},
       {"Field":"<поле группировки2>","Value":"<значение>"},
       …
     ]
   },
   ...
 ]
}

Response (в случае незаполнения обязательных полей или использования несуществующих полей данных):
{
 "Type": "exception",
 "Message": "<сообщение, поясняющее, в чём ошибка>"
}

Response (в случае неверного token'а):
{
 "Type": "access",
 "Message": "Token invalid"
}
Пример запроса:						
{
 "GroupBy": ["placement_id"],
 "StartDate": "2014-01-01",
 "EndDate": "2014-01-07",
 "DataFields": ["bids", "imps", "clicks", "adv_payout", "pub_payout"],
 "Filter": [{
   "Field": "publisher_id", "Values": [41], "Match": "equals"
 }]
}
						
Пример ответа: 
{
 "Total": {
   "DataCount": [
     {"Field": "bids", "Value": "12345678"},
     {"Field": "imps", "Value": "1365872" },
     {"Field": "clicks", "Value": "21621"},
     {"Field": "adv_payout", "Value": "30733.028700000148"},
     {"Field": "pub_payout", "Value": "0.0"}
   ],
   "RecCount": 1
 },
 "Data": [
   {
     "DataFields":
     [
       {"Field": "bids", "Value": "12345678"},
       {"Field": "imps", "Value": "1365872" },
       {"Field": "clicks", "Value": "21621"},
       {"Field": "adv_payout", "Value": "30733.028700000148"},
       {"Field": "pub_payout", "Value": "0.0"}
     ],
     "GroupingFields":
     [
       {"Field":"placement_id","Value":"1519"}
     ]
   }
 ]
}
5. Получение данных о платформе

GET https://bi-v2.upravel.com/API/REST/person/<token>/platform?platformName=<platform>
platform - имя платформы, о которой нужна информация. Если параметр не передать, возвращается первая из доступных.
Response (Success):
{
 "Dimensions": [ // доступные поля группировки
   {
     "field": "campaign_id", // "техническое" имя поля
     "group_id": 1, // идентификатора группы полей
     "editable": false, // можно ли редактировать значение поля
     "filter_only": false, // применимо ли поле только для фильтрации, но не для группировки
     "names": { // человекочитаемые имена поля на разных языках платформы
       "ru": "Id кампании",
       "en": "Campaign Id"
     }
   }, ...
 ],
 "Kpis": [
   // аналогично Dimensions
 ],
 "Groups": [1], // идентификаторы групп полей
 "Widgets": [ // UI-виджеты доступные для платформы.
   "table",
   "chart",
   "offline_reports"
 ],
 "Languages": [ // языки, поддерживаемые платформой
   "ru",
   "en"
 ],
 "Timezones": [], // Таймзоны, в которых доступны полноценные данные платформы. Не поддерживается большинством платформ.
 "Editable": false, // возможно ли редактирование данных платформы
 "Names": { // человекочитаемые имена платформы на разных языках платформы
   "ru": "DSP",
   "en": "DSP"
 }
}