Raw Data API
Raw Data API предоставляет доступ к сырым данным о взаимодействиях пользователей: просмотры страниц, сессии, события, показы и клики. Это детальные данные на уровне отдельных событий.
Endpoint
URL, по которому отправляются запросы к API
POST /v1/reports/path_to_conversion?project_id={project_id}
Параметры запроса
Query-параметры
__________________________________________________________________________________

`project_id` (обязательный) - ID проекта
Тело запроса
{
  "ResponseType": "JSON",
  "Fields": ["InteractionTime", "InteractionType", "InteractionUrlPath"],
  "InteractionFilter": {
    "DateFrom": "2024-01-01",
    "DateTo": "2024-01-31",
    "InteractionType": ["PageView", "Click"]
  },
  "Offset": 0,
  "Limit": 1000
}
Параметры
__________________________________________________________________________________
InteractionFilter
__________________________________________________________________________________
Типы взаимодействий (InteractionType)
__________________________________________________________________________________
Доступные поля
Поля взаимодействий
___________________________________________________________________________
URL и навигация
__________________________________________________________________________________
UTM метки
__________________________________________________________________________________
Медиа-информация
__________________________________________________________________________________
Технические данные
___________________________________________________________________________
Геолокация
___________________________________________________________________________
Аналитические ID
___________________________________________________________________________
Целевые события в контексте взаимодействия
___________________________________________________________________________
E-commerce данные
___________________________________________________________________________
Кастомные параметры
___________________________________________________________________________
Примеры запросов
Получение базовых данных о просмотрах страниц
curl -X POST "https://api.targetads.io/v1/reports/raw_reports?project_id=12486" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "ResponseType": "JSON",
    "Fields": [
      "InteractionTime",
      "InteractionType",
      "InteractionUrlPath",
      "InteractionDeviceID"
    ],
    "InteractionFilter": {
      "DateFrom": "2024-01-01",
      "DateTo": "2024-01-31",
      "InteractionType": ["PageView"]
    },
    "Limit": 1000
  }'
Анализ медийных кликов с UTM метками
curl -X POST "https://api.targetads.io/v1/reports/raw_reports?project_id=12486" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "ResponseType": "JSON",
    "Fields": [
      "InteractionTime",
      "InteractionType",
      "InteractionMediaCampaignName",
      "InteractionUtmSource",
      "InteractionUtmMedium",
      "InteractionUtmCampaign"
    ],
    "InteractionFilter": {
      "DateFrom": "2024-01-01",
      "DateTo": "2024-01-31",
      "InteractionType": ["Click"],
      "MediaCampaignId": [12345, 12346]
    }
  }'
E-commerce события (покупки)
curl -X POST "https://api.targetads.io/v1/reports/raw_reports?project_id=12486" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "ResponseType": "JSON",
    "Fields": [
      "InteractionTime",
      "InteractionDeviceID",
      "InteractionEcomId",
      "InteractionEcomAmount",
      "InteractionEcomItemsName",
      "InteractionEcomItemsPrice"
    ],
    "InteractionFilter": {
      "DateFrom": "2024-01-01",
      "DateTo": "2024-01-31",
      "InteractionType": ["Purchase"]
    }
  }'
Пагинация больших выборок
# Первая страница
curl -X POST "https://api.targetads.io/v1/reports/raw_reports?project_id=12486" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "ResponseType": "JSON",
    "Fields": ["InteractionTime", "InteractionType", "InteractionDeviceID"],
    "InteractionFilter": {
      "DateFrom": "2024-01-01",
      "DateTo": "2024-01-31",
      "InteractionType": ["PageView"]
    },
    "Offset": 0,
    "Limit": 10000
  }'

# Вторая страница
# ... изменить Offset на 10000
Формат ответа
Успешный ответ
{
  "data": [
    {
      "InteractionTime": "2024-01-15 10:30:45",
      "InteractionType": "PageView",
      "InteractionUrlPath": "/products/item-123",
      "InteractionDeviceID": "abc123def456"
    },
    {
      "InteractionTime": "2024-01-15 10:31:20",
      "InteractionType": "Click",
      "InteractionUrlPath": "/checkout",
      "InteractionDeviceID": "abc123def456"
    }
  ],
  "count": 2,
  "has_more": false
}
Ошибка валидации
{
  "ErrorCode": 400,
  "ErrorMessage": "validate error",
  "Errors": [
    {
      "Error": true,
      "FailedField": "Fields",
      "Tag": "required",
      "Value": null
    }
  ]
}

Лимиты и ограничения


API имеет технические ограничения, которые следует

учитывать при построении интеграции:


Максимум записей за запрос: 10,000,000
Минимум полей: 3
Максимум значений в фильтре:
  • CampaignId/PlacementId: 20
  • Остальные фильтры: 5
Rate limit: 40 запросов в минуту на project_id

Таймаут: 300 секунд

Рекомендации по оптимизации
Понимание структуры пути
Используйте `/v1/meta/campaigns` для получения списка кампаний и делайте отдельные запросы:
# Получить список кампаний
campaigns = get_campaigns(project_id)

# Запросить данные по каждой кампании
for campaign in campaigns[:10]:  # По 10 кампаний за раз
    data = get_raw_data(
        project_id=project_id,
        campaign_ids=[campaign['placement_id']]
    )
Используйте пагинацию
offset = 0
limit = 100000
all_data = []

while True:
    response = get_raw_data(offset=offset, limit=limit)
    all_data.extend(response['data'])

    if not response['has_more']:
        break

    offset += limit
Оптимизируйте периоды
Разбивайте длинные периоды на недели или месяцы:
from datetime import datetime, timedelta

def split_by_weeks(date_from, date_to):
    current = datetime.strptime(date_from, '%Y-%m-%d')
    end = datetime.strptime(date_to, '%Y-%m-%d')

    while current < end:
        week_end = min(current + timedelta(days=7), end)
        yield current.strftime('%Y-%m-%d'), week_end.strftime('%Y-%m-%d')
        current = week_end
Обработка ошибок
import requests
import time

def get_raw_data_with_retry(payload, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = requests.post(url, json=payload, headers=headers)

            if response.status_code == 429:
                # Rate limit - ждем 60 секунд
                time.sleep(60)
                continue

            if response.status_code == 500:
                # Server error - retry с exponential backoff
                time.sleep(2 ** attempt)
                continue

            response.raise_for_status()
            return response.json()

        except requests.exceptions.RequestException as e:
            if attempt == max_retries - 1:
                raise
            time.sleep(2 ** attempt)

    raise Exception("Max retries exceeded")