Walker Formulation Academy for developers API reference Error catalog OpenAPI
Sections

Analytics

Methods in this section: 4. All methods

MethodPathDescriptionScopesStatus
GET/analytics/timeseriesTime seriesanalytics:readAvailable
GET/analytics/traffic-sourcesTraffic sourcesanalytics:readAvailable
GET/analytics/funnelFunnelanalytics:readAvailable
GET/analytics/visibilityVisibilityanalytics:readAvailable
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

FieldTypeDescription
metricstring
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.
fromstring
required
In: query. Start of the period, inclusive. Format YYYY-MM-DD.
tostring
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.
granularitystring
optional
In: query. The series step; day by default.
enginestring
optional
In: query. The search engine for impressions, clicks, ctr, position; the cell market default if omitted.
clusterstring
optional
In: query. A query cluster id; a foreign or missing one gives not_found.

Response body

FieldTypeDescription
dataobject
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

FieldTypeDescription
fromstring
required
In: query. Start of the period, inclusive. Format YYYY-MM-DD.
tostring
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.
includestring
optional
In: query. series adds a daily series to every source.

Response body

FieldTypeDescription
dataarray<TrafficSourceRow>
required
data_as_ofobject
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

FieldTypeDescription
fromstring
required
In: query. Start of the period, inclusive. Format YYYY-MM-DD.
tostring
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.
enginestring
optional
In: query. The market search engine by default; both is not available in every market.

Response body

FieldTypeDescription
dataobject
required
data.enginestring
required

Values: yandex google both
data.fromstring
required
Date YYYY-MM-DD.
data.tostring
required
Date YYYY-MM-DD.
data.stepsarray<FunnelStep>
required
data.by_channelarray<object>
required
data.search_by_enginearray<object>
optional
Only engine=both: the engines separately.
data.by_productarray<object>
required
data.crmobject
required
data.crm.availabilitystring
required

Values: ok no_data
data.crm.reasonstring
optional
data_as_ofobject
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

FieldTypeDescription
fromstring
required
In: query. Start of the period, inclusive. Format YYYY-MM-DD.
tostring
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.
compareboolean
optional
In: query. Add a comparison with the previous period; false by default.
enginestring
optional
In: query. The market search engine by default.
clusterstring
optional
In: query. A query cluster id; a foreign or missing one gives not_found.

Response body

FieldTypeDescription
dataobject
required
data.fromstring
required
Date YYYY-MM-DD.
data.tostring
required
Date YYYY-MM-DD.
data.enginestring
required

Values: yandex google both
data.shareobject
required
data.share.availabilitystring
required
data.share.reasonstring
optional
data.share.sourcestring
required
data.share.data_as_ofobject
required
Source → the date up to which its data is complete. A source with no data is not listed.
data.share.dataobject
required
data.distributionobject
required
data.distribution.availabilitystring
required
data.distribution.reasonstring
optional
data.distribution.sourcestring
required
data.distribution.data_as_ofobject
required
Source → the date up to which its data is complete. A source with no data is not listed.
data.distribution.dataobject
required
data.sovobject
required
data.sov.availabilitystring
required
data.sov.reasonstring
optional
data.sov.sourcestring
required
data.sov.data_as_ofobject
required
Source → the date up to which its data is complete. A source with no data is not listed.
data.sov.dataobject
required
data.aeoobject
required
data.aeo.availabilitystring
required
data.aeo.reasonstring
optional
data.aeo.sourcestring
required
data.aeo.data_as_ofobject
required
Source → the date up to which its data is complete. A source with no data is not listed.
data.aeo.dataobject
required
data.regionsobject
required
data.regions.availabilitystring
required
data.regions.reasonstring
optional
data.regions.sourcestring
required
data.regions.data_as_ofobject
required
Source → the date up to which its data is complete. A source with no data is not listed.
data.regions.dataobject
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