Admin API: logs and diagnostics
Ten Admin API methods: click search and the click card, the action log, stream logs, and the state of queues, services and settings rollout.
The API offers the same data as the Logs section of the panel and the System status page. All ten methods require a token with Full access («Полный доступ») (full): with a different access type you get 403 token_scope. With an inactive license, the methods respond with 402 — see Expired license. Authorization is described on the Admin API: overview and authorization page, and the response format and common error codes on the Request, response and error format page.
Clicks
Search clicks
GET /api/v1/logs/clicksReturns clicks for a period. You can select clicks by an exact IP, subid or external_id. The search rules are the same as on the Clicks and leads tab.
| Parameter | Type | Required | Description |
|---|---|---|---|
from | string, RFC 3339 date | no | Start of the period by click time. Default — 24 hours ago |
to | string, RFC 3339 date | no | End of the period. Default — the current time. The period is no more than 93 days |
field | string | no | Search attribute: ip, subid or external_id |
value | string | no | The exact attribute value, up to 512 characters. Not accepted without field. For subid — up to 64 characters: Latin letters, digits, _, - and dots (not at the start or end, and not two in a row) |
limit | integer | no | Page size from 1 to 200. Default 100 |
cursor | string | no | The next_cursor value from the previous response |
Response — code 200:
| Field | Type | Description |
|---|---|---|
items | array | Clicks, newest first. If nothing is found, an empty array |
next_cursor | string | Cursor of the next page. An empty string means there are no more pages |
names | object | Names of the campaigns in items: the key is the ID, the value is the name |
Click fields in items
subid— click ID;ts— click time;ip— the visitor's IP.campaign_id,stream_id,source_id,lander_id,offer_id— IDs of the campaign, stream, source, landing page and offer. An empty string if the object was not in the click's path.country,region,city,isp,connection_type— IP-based data.device_type,os,os_version,browser,browser_version,user_agent,lang,referrer— device and browser.is_bot,is_unique— bot and unique click flags.cost— the click's cost in USD.sub_ids,tokens— click parameters.tokens.external_idholds the external_id. Values of parameters with access tokens are replaced with***.
Example request:
curl "https://panel.example.com/api/v1/logs/clicks?from=2026-10-01T00:00:00Z&to=2026-10-04T00:00:00Z&field=ip&value=203.0.113.10&limit=50" \
-H "Api-Key: <token>"Example response, some click fields omitted:
{
"items": [
{
"subid": "k3x9m2q7c1ab",
"ts": "2026-10-03T14:22:05.418Z",
"ip": "203.0.113.10",
"campaign_id": "c41a9e07-52bd-4f13-8a60-9d7e6f5a4b3c",
"stream_id": "5e2d7a10-8c4b-4f6e-b1a9-0d3c2b1a4f5e",
"country": "PL",
"is_bot": false,
"is_unique": true,
"tokens": {"external_id": "ext-448812"}
}
],
"next_cursor": "",
"names": {"c41a9e07-52bd-4f13-8a60-9d7e6f5a4b3c": "FB PL Nutra"}
}Errors:
| Code | code | message | When |
|---|---|---|---|
400 | validation | Некорректное начало периода (invalid period start), Некорректный конец периода (invalid period end) | from or to is not in RFC 3339 format |
400 | validation | Выберите период до 93 дней (choose a period of up to 93 days) | The period is longer than 93 days or to is earlier than from |
400 | validation | Размер страницы: от 1 до 200 (page size: from 1 to 200) | limit is out of range |
400 | validation | Некорректная страница (invalid page) | cursor is not from this method's response |
400 | validation | Проверьте поле и значение поиска (check the search field and value) | An unknown field, value without field, or a value that is not an IP or not a subid |
503 | no_analytics | Аналитика недоступна (analytics unavailable) | Statistics are not connected |
Click card
GET /api/v1/logs/clicks/{id}Returns a click, its landing page clicks and its conversions — the data of the click card. The click is searched across the whole stored history; no period is needed.
| Parameter | Where | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | The click's subid |
Response — code 200:
| Field | Type | Description |
|---|---|---|
click | object | The click with the same fields as in the search items |
history.transitions | array | Landing page clicks, from earliest to latest: ts, lander_id, offer_id. Up to 200 records |
history.transitions_more | boolean | true if there are more than 200 landing page clicks |
history.conversions | array | The click's conversions, newest first, one record per txid with the latest status: subid, ts, status, payout, revenue, offer_id, txid. Up to 200 records |
history.conversions_more | boolean | true if there are more than 200 conversions |
history.lead_updated_at | string or null | Time of the latest lead data for the click. null — there is no lead data |
names | object | Names of the campaign, stream, source, landing pages and offers by their IDs. A deleted object is not in names |
The response does not include the event delivery history: it is returned by GET /api/v1/deliveries/search with the click_id parameter — see Admin API: conversions and postback. Lead data is returned by GET /api/v1/reports/click-lead — see Admin API: reports.
Errors:
| Code | code | message | When |
|---|---|---|---|
400 | validation | Некорректный subid (invalid subid) | id contains invalid characters or is longer than 64 characters |
404 | not_found | Клик не найден (click not found) | There is no click with this subid |
503 | no_analytics | Аналитика недоступна (analytics unavailable) | Statistics are not connected |
Action log
GET /api/v1/logs/auditReturns entries of the user action log, newest first.
| Parameter | Type | Required | Description |
|---|---|---|---|
page | integer | no | Page number, starting from 1. Default 1 |
limit | integer | no | Entries per page, default 100, maximum 500. A value above 500 is replaced with 100 |
q | string | no | Case-insensitive substring search in the action, resource, resource ID and user |
resource | string | no | The exact resource value, for example campaigns — see Resource values |
action | string | no | The exact action value, for example update — see Action values |
user_id | string, UUID | no | ID of the user who performed the action |
outcome | string | no | success — response status from 200 to 399, error — from 400 |
from | string, RFC 3339 date | no | Start of the period, inclusive |
to | string, RFC 3339 date | no | End of the period, exclusive. Must be later than from |
Response — code 200: an object with the fields items, total (the number of entries matching the filter), page and limit.
| Entry field | Type | Description |
|---|---|---|
id | integer | Entry number |
created_at | string, RFC 3339 date | Action time |
context | string | UI — an action in the panel, API — a request with a token |
action, resource, resource_id | string | Action, resource and object ID |
user_id, user_email | string | Who performed it. For a request with a token, user_email has the beginning of the token in square brackets after the login |
ip, user_agent | string | The address and client the request came from |
status | integer | HTTP code of the response to the action |
Example request — failed campaign changes over one day:
curl "https://panel.example.com/api/v1/logs/audit?resource=campaigns&outcome=error&from=2026-10-03T00:00:00Z&to=2026-10-04T00:00:00Z&limit=50" \
-H "Api-Key: <token>"Errors — code 422, code validation:
message | When |
|---|---|
Неизвестный исход (unknown outcome) | outcome is neither success nor error |
Дата должна быть в RFC3339 (the date must be in RFC3339) | from or to is in a different format |
Конец периода должен быть позже начала (the period end must be later than the start) | to is not later than from |
Слишком большой номер страницы (page number too large) | page is greater than 1,000,000 |
Stream logs
Four logs: system — the system log, postback — incoming postbacks, s2s — outgoing S2S, traffic — the traffic log. What goes into them is described on the System log, postbacks and traffic log page. Each log keeps the 2000 latest entries; the logs are shared by the whole installation.
Read a log
GET /api/v1/logs/{stream}Returns the log's entries, newest first.
| Parameter | Where | Type | Required | Description |
|---|---|---|---|---|
stream | path | string | yes | system, postback, s2s or traffic |
q | query | string | no | Keeps the entries whose text contains this string. Case-insensitive |
limit | query | integer | no | Number of entries, default 500, maximum 2000. A value above 2000 is replaced with 500 |
Response — code 200 and an array of entries. If there are no entries, [] is returned.
| Field | Type | Description |
|---|---|---|
ts | integer | Entry time in Unix milliseconds |
text | string | Entry text |
level | string | Level. Present only in the system log |
ctx | string | The service that made the entry. Present only in the system log |
Error: 404, code not_found, message неизвестный поток логов (unknown log stream) — the stream value is not from the list.
Clear a log
DELETE /api/v1/logs/{stream}Deletes all entries of the log for the whole installation. The stream path parameter is the same as for reading.
Response — code 204 with no body.
Deleted entries cannot be restored. The clearing is written to the action log: action delete, resource logs.
Check whether the traffic log is on
GET /api/v1/logs/traffic-enabledNo parameters. Response — code 200:
{"enabled": false}Turn the traffic log on or off
PUT /api/v1/logs/traffic-enabledSwitches recording of the traffic log — the same as the Log («Логировать») toggle on the Traffic («Трафик») tab.
| Body field | Type | Required | Description |
|---|---|---|---|
enabled | boolean | yes | true — record, false — do not record. A request without this field turns the log off |
Response — code 200 and the {"enabled": true} object with the new value.
Error: 400, code bad_request, message invalid json — the body was not parsed.
Diagnostics
Queue state
GET /api/v1/queue-healthReturns the click intake queue and unfinished delivery tasks — the data of the Queue state tab.
No parameters. Response — code 200:
| Field | Type | Description |
|---|---|---|
deliveries | array | The workspace's unfinished tasks by kind. An empty array means there are no unfinished tasks |
deliveries[].kind | string | conversion, s2s or capi |
deliveries[].pending, running, failed | integer | Tasks that are waiting, being sent, and stopped with an error |
deliveries[].expired | integer | Tasks whose processing did not finish in time |
deliveries[].unknown | integer | Tasks without confirmation from the recipient |
deliveries[].oldest_seconds | number | How many seconds the oldest unfinished task has been waiting |
ingest | object or null | The click intake queue of the whole server. null — there is no information from the handler |
ingest_stale | boolean | true if there is no information or it is older than 30 seconds |
checked_at | string, RFC 3339 date | Check time |
Fields of the ingest object
updated_at— time of the latest information from the click handler.clicksandlp— the queues of clicks and landing page clicks. Each has:pending_batches— batches waiting to be written,oldest_seconds— how long the oldest one has been waiting,bytesandmax_bytes— size on disk and the limit,disk_availableanddisk_known— free space and whether it could be determined,scan_ok— the queue was read,delivery_failing— writing to the statistics is currently failing,failures— the number of failed writes since startup,last_success— time of the last successful write in Unix milliseconds,waiting_requests— requests waiting to be saved.geo— the handler's GEO databases:provider,state,bytes,modified_at,last_error. The statuses are covered on the Tracker GEO databases page.
Error: 503, code unavailable — the delivery queue could not be read. The response has the Retry-After: 5 header: repeat the request after 5 seconds.
System status
GET /api/v1/system-healthReturns the data of the System status page: build, services, background tasks and exports.
No parameters. The method responds with code 200 even when a service is unavailable: check the state field.
| Field | Type | Description |
|---|---|---|
revision | string | Build identifier. unknown — not determined |
uptime_seconds | integer | How many seconds the panel service has been running |
process_memory_bytes | integer | Memory of the panel service in bytes |
go_version | string | Runtime version |
services | object | The postgres, clickhouse, redis keys. Each has state — ok or unavailable, bytes — data size, version, and the first two have migrations — the list of applied migrations |
workers | array | Background tasks: name, state, checked_at, stale. A task that has never responded comes with state missing |
workers_available | boolean | false — the task heartbeats could not be read |
exports | object | Number of current CSV exports by state: pending, running, ready, failed. States without exports are not in the object |
exports_available | boolean | false — the export counter could not be read |
ingest, ingest_stale | — | The same as in GET /api/v1/queue-health |
integrations.proxy_nodes | boolean | Whether management of reverse proxy nodes is configured |
checked_at | string, RFC 3339 date | Check time |
Task names in workers: report_exports, deliveries, target-monitor, retention, domain-checks. stale is true if the last heartbeat is older than 3 minutes.
Traffic settings rollout
GET /api/v1/runtime-configShows whether changes to campaigns, streams and domains have reached the traffic processing servers. How to read the statuses is described on the Traffic processing servers page.
No parameters. Response — code 200:
| Field | Type | Description |
|---|---|---|
applied | boolean | true — the current settings version is published and confirmed by all expected servers |
config.revision, config.published_revision | integer | The current and the published settings versions |
config.pending_changes | boolean | true — there are changes not yet included in the published version |
config.published_at | string, RFC 3339 date | Time of the last publication. The field is absent until there has been a publication |
config.last_error | string | Error of the last publication. The field is absent if there was no error |
publication_available | boolean | true — the published settings were read, and their version equals config.published_revision |
nodes_available | boolean | false — the servers' confirmations could not be read |
expected_nodes | integer | Number of expected servers |
nodes | array | Servers: the expected ones first, then the discovered ones |
Server fields in nodes: node — name, revision — the confirmed version, checked_at — the last heartbeat (the field is absent for a server that has never responded), expected — whether it is in the expected list, stale — no fresh heartbeat, instances — how many running servers reported this name, state — the state:
state | State in the panel |
|---|---|
applied | Settings applied («Настройки применены») |
pending | Waiting for update («Ожидает обновления») |
missing | No response («Нет отклика») |
stale | Connection lost («Связь потеряна») |
conflict | Duplicate server name («Повторяется имя сервера») |
unexpected | Not in the expected list («Вне списка ожидаемых») |
unavailable | Check unavailable («Проверка недоступна») |
Error: 503, code config_unavailable, message Состояние конфигурации недоступно (configuration state unavailable).