Analytics
Methods in this section: 4. All methods
| Method | Path | Description | Scopes | Status |
|---|
| GET | /analytics/timeseries | Time series | analytics:read | Available |
| GET | /analytics/traffic-sources | Traffic sources | analytics:read | Available |
| GET | /analytics/funnel | Funnel | analytics:read | Available |
| GET | /analytics/visibility | Visibility | analytics:read | Available |
GET /analytics/timeseries Available
#Time series
Series for one to eight metrics by day or week with a summary and a comparison with the previous period. Each series carries its own availability and data-completeness date; days without data are filled with zeros.
- Scopes
analytics:read
- Rate limit
- read
- Idempotency
- not required
- Successful response
200 One series or items in request order.
Parameters
| Field | Type | Description |
|---|
metric | string required | In: query. From 1 to 8 unique metrics, comma-separated: sessions, pageviews, visitors, bounce_rate, impressions, clicks, ctr, position, ai_referrals, bot_hits, leads, deals_won, revenue. |
from | string required | In: query. Start of the period, inclusive. Format YYYY-MM-DD. |
to | string required | In: query. End of the period, inclusive; not later than the last full day (a later value is clamped and echoed in the response). Format YYYY-MM-DD. |
granularity | string optional | In: query. The series step; day by default. |
engine | string optional | In: query. The search engine for impressions, clicks, ctr, position; the cell market default if omitted. |
cluster | string optional | In: query. A query cluster id; a foreign or missing one gives not_found. |
Response body
| Field | Type | Description |
|---|
data | object required | |
Examples
Request
curl -X GET 'https://wfacademy.id/api/public/v1/analytics/timeseries?metric=string&from=2026-09-01&to=2026-09-30' \
-H 'Authorization: Bearer '"$API_KEY"
Response 200
{
"data": {
"metric": "sessions",
"from": "string",
"to": "string",
"granularity": "day",
"agg": "sum",
"engine": null,
"availability": "ok",
"reason": null,
"series": [
null
],
"comparison": {
"current": null,
"prev": null,
"delta_pct": null,
"data_through": null
},
"summary": null,
"cluster_applied": false,
"data_as_of": {}
}
}
Error example
{
"type": "https://wfacademy.id/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Examples are illustrative: the key in them is a placeholder (EXAMPLE), field values are made up.
Possible errors
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing validation_failed not_found
GET /analytics/traffic-sources Available
#Traffic sources
First-visit sources over the period: sessions, visitors and leads. Aggregates by day and source only; no visit rows, IPs or hashes.
- Scopes
analytics:read
- Rate limit
- read
- Idempotency
- not required
- Successful response
200 Sources, most sessions first.
Parameters
| Field | Type | Description |
|---|
from | string required | In: query. Start of the period, inclusive. Format YYYY-MM-DD. |
to | string required | In: query. End of the period, inclusive; not later than the last full day (a later value is clamped and echoed in the response). Format YYYY-MM-DD. |
include | string optional | In: query. series adds a daily series to every source. |
Response body
| Field | Type | Description |
|---|
data | array<TrafficSourceRow> required | |
data_as_of | object required | Source → the date up to which its data is complete. A source with no data is not listed. |
Examples
Request
curl -X GET 'https://wfacademy.id/api/public/v1/analytics/traffic-sources?from=2026-09-01&to=2026-09-30' \
-H 'Authorization: Bearer '"$API_KEY"
Response 200
{
"data": [
{
"source": "google",
"kind": "search",
"sessions": 0,
"visitors": null,
"leads": 0,
"series": [
null
]
}
],
"data_as_of": {}
}
Error example
{
"type": "https://wfacademy.id/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Examples are illustrative: the key in them is a placeholder (EXAMPLE), field values are made up.
Possible errors
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing validation_failed
GET /analytics/funnel Available
#Funnel
The path from search impressions to revenue: steps with their own availability and date, channels and products. The calculation is shared with the cabinet. engine=both shows the engines separately and does not add them up.
- Scopes
analytics:read
- Rate limit
- read
- Idempotency
- not required
- Successful response
200 The funnel of the period.
Parameters
| Field | Type | Description |
|---|
from | string required | In: query. Start of the period, inclusive. Format YYYY-MM-DD. |
to | string required | In: query. End of the period, inclusive; not later than the last full day (a later value is clamped and echoed in the response). Format YYYY-MM-DD. |
engine | string optional | In: query. The market search engine by default; both is not available in every market. |
Response body
| Field | Type | Description |
|---|
data | object required | |
data.engine | string required | Values: yandex google both |
data.from | string required | Date YYYY-MM-DD. |
data.to | string required | Date YYYY-MM-DD. |
data.steps | array<FunnelStep> required | |
data.by_channel | array<object> required | |
data.search_by_engine | array<object> optional | Only engine=both: the engines separately. |
data.by_product | array<object> required | |
data.crm | object required | |
data.crm.availability | string required | Values: ok no_data |
data.crm.reason | string optional | |
data_as_of | object required | Source → the date up to which its data is complete. A source with no data is not listed. |
Examples
Request
curl -X GET 'https://wfacademy.id/api/public/v1/analytics/funnel?from=2026-09-01&to=2026-09-30' \
-H 'Authorization: Bearer '"$API_KEY"
Response 200
{
"data": {
"engine": "yandex",
"from": "string",
"to": "string",
"steps": [
{
"key": null,
"availability": null,
"sources": null,
"unit": null,
"current": null,
"prev": null,
"delta_pct": null,
"data_through": null
}
],
"by_channel": [
{
"channel": "string",
"availability": "string",
"sources": [
null
],
"clicks": null,
"cost": null,
"leads": null
}
],
"search_by_engine": [
{}
],
"by_product": [
{
"course_slug": "string",
"name": null,
"sales_mode": null,
"leads": 0,
"leads_prev": 0,
"deals_won": 0,
"deals_won_prev": 0
}
],
"crm": {
"availability": "ok",
"reason": "string"
}
},
"data_as_of": {}
}
Error example
{
"type": "https://wfacademy.id/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Examples are illustrative: the key in them is a placeholder (EXAMPLE), field values are made up.
Possible errors
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing validation_failed
GET /analytics/visibility Available
#Visibility
Visibility share, position distribution, share of voice (always without competitor names), AI citation and regions. Each section is independent: its own availability, source and date.
- Scopes
analytics:read
- Rate limit
- read
- Idempotency
- not required
- Successful response
200 Five visibility sections.
Parameters
| Field | Type | Description |
|---|
from | string required | In: query. Start of the period, inclusive. Format YYYY-MM-DD. |
to | string required | In: query. End of the period, inclusive; not later than the last full day (a later value is clamped and echoed in the response). Format YYYY-MM-DD. |
compare | boolean optional | In: query. Add a comparison with the previous period; false by default. |
engine | string optional | In: query. The market search engine by default. |
cluster | string optional | In: query. A query cluster id; a foreign or missing one gives not_found. |
Response body
| Field | Type | Description |
|---|
data | object required | |
data.from | string required | Date YYYY-MM-DD. |
data.to | string required | Date YYYY-MM-DD. |
data.engine | string required | Values: yandex google both |
data.share | object required | |
data.share.availability | string required | |
data.share.reason | string optional | |
data.share.source | string required | |
data.share.data_as_of | object required | Source → the date up to which its data is complete. A source with no data is not listed. |
data.share.data | object required | |
data.distribution | object required | |
data.distribution.availability | string required | |
data.distribution.reason | string optional | |
data.distribution.source | string required | |
data.distribution.data_as_of | object required | Source → the date up to which its data is complete. A source with no data is not listed. |
data.distribution.data | object required | |
data.sov | object required | |
data.sov.availability | string required | |
data.sov.reason | string optional | |
data.sov.source | string required | |
data.sov.data_as_of | object required | Source → the date up to which its data is complete. A source with no data is not listed. |
data.sov.data | object required | |
data.aeo | object required | |
data.aeo.availability | string required | |
data.aeo.reason | string optional | |
data.aeo.source | string required | |
data.aeo.data_as_of | object required | Source → the date up to which its data is complete. A source with no data is not listed. |
data.aeo.data | object required | |
data.regions | object required | |
data.regions.availability | string required | |
data.regions.reason | string optional | |
data.regions.source | string required | |
data.regions.data_as_of | object required | Source → the date up to which its data is complete. A source with no data is not listed. |
data.regions.data | object required | |
Examples
Request
curl -X GET 'https://wfacademy.id/api/public/v1/analytics/visibility?from=2026-09-01&to=2026-09-30' \
-H 'Authorization: Bearer '"$API_KEY"
Response 200
{
"data": {
"from": "string",
"to": "string",
"engine": "yandex",
"share": {
"availability": "string",
"reason": "string",
"source": "string",
"data_as_of": {},
"data": {}
},
"distribution": {
"availability": "string",
"reason": "string",
"source": "string",
"data_as_of": {},
"data": {}
},
"sov": {
"availability": "string",
"reason": "string",
"source": "string",
"data_as_of": {},
"data": {}
},
"aeo": {
"availability": "string",
"reason": "string",
"source": "string",
"data_as_of": {},
"data": {}
},
"regions": {
"availability": "string",
"reason": "string",
"source": "string",
"data_as_of": {},
"data": {}
}
}
}
Error example
{
"type": "https://wfacademy.id/developers/errors#scope_missing",
"title": "Scope is missing",
"status": 403,
"code": "scope_missing",
"detail": "EXAMPLE",
"request_id": "req_EXAMPLE"
}
Examples are illustrative: the key in them is a placeholder (EXAMPLE), field values are made up.
Possible errors
invalid_api_key wrong_cell integration_inactive tenant_inactive ip_not_allowed feature_not_in_plan rate_limited wallet_suspended service_unavailable internal_error scope_missing validation_failed not_found