Product

Topic Engine Content Engine Code-to-Docs AEO Rank Research-Driven Content Autopilot Visibility Tracking Website & Migration Content Factory Pricing

Resources

Browse all resources → Case Studies Blog FAQ Use Cases Knowledge Base Research Docs

API Reference

Business Impact Report

The full traffic and leads report for a domain: Search Console, AI answer arrivals, calls to action, leads and a daily series.

GET/api/v1/reports/business-impact

The same numbers as the Business Impact page in Studio, from the same code path: organic search and AI engine visits, leads, call to action clicks, per segment and per AI engine, with the previous window and a daily series. Add format=csv for the daily series as CSV.

Query Parameters

NameTypeRequiredDescription
domainstringOptionalThe domain to report on (e.g., "example.com"). Required when the key can read more than one domain; GET /api/v1/domains lists them.
daysnumberOptionalWindow length in days, up to 366. The window ends on the last day data was received.Default: 28
fromstringOptionalStart of a calendar window, YYYY-MM-DD (use with to instead of days)
tostringOptionalEnd of a calendar window, YYYY-MM-DD
formatstringOptionalSet to "csv" for CSV instead of JSON (e.g., "csv")

Code Examples

curl:

bash
curl "https:">//studio.aeocontent.ai/api/v1/reports/business-impact?domain=example.com&days=28" \
  -H "Authorization: Bearer $AEO_API_KEY"

CSV:

bash
curl "https:">//studio.aeocontent.ai/api/v1/reports/business-impact?domain=example.com&days=28&format=csv" \
  -H "Authorization: Bearer $AEO_API_KEY" \
  -o daily.csv

JavaScript:

javascript
const res = await fetch(
  class="code-string">"https:class="code-commentclass="code-string">">//studio.aeocontent.ai/api/v1/reports/business-impact?domain=example.com&days=28",
  { headers: { Authorization: class="code-string">`Bearer ${process.env.AEO_API_KEY}` } },
);
const { data } = await res.json();
class=class="code-string">"code-comment">// every visitor: data.site.search_clicks.total and .change_pct
class=class="code-string">"code-comment">// consent sample: data.totals.organic_leads

Python:

python
import os, requests

res = requests.get(
    class="code-string">"https:class="code-commentclass="code-string">">//studio.aeocontent.ai/api/v1/reports/business-impact",
    headers={class="code-string">"Authorization": fclass="code-string">"Bearer {os.environ['AEO_API_KEY']}"},
    params={class="code-string">"domain": class="code-string">"example.com", class="code-string">"days": 28},
)
data = res.json()[class="code-string">"data"]

Try it

Response

Abridged: site also carries people, search_impressions, cta_clicks, form_successes and applications; the response also has definitions, coverage, measurement, previous, by_segment, leads_by_event and cta_by_event.

200Report (abridged)
json
{
  class="code-string">"data": {
    class="code-string">"domain": class="code-string">"example.com",
    class="code-string">"generated_at": class="code-string">"2026-10-10T12:00:00.000Z",
    class="code-string">"period": {
      class="code-string">"from": class="code-string">"2026-09-10",
      class="code-string">"to": class="code-string">"2026-10-07",
      class="code-string">"days": 28,
      class="code-string">"previous": {
        class="code-string">"from": class="code-string">"2026-08-13",
        class="code-string">"to": class="code-string">"2026-09-09"
      },
      class="code-string">"data_through": class="code-string">"2026-10-07",
      class="code-string">"note": class="code-string">"GA4 delivers data with a 24-48h delay; the window ends on the last day received. Sessions, leads and clicks are attributed to the traffic source of the session in which they happened."
    },
    class="code-string">"site": {
      class="code-string">"search_clicks": {
        class="code-string">"source": class="code-string">"google_search_console",
        class="code-string">"label": class="code-string">"Clicks from Google search",
        class="code-string">"measured_from": class="code-string">"2026-03-01",
        class="code-string">"days_measured": 28,
        class="code-string">"window_covered": true,
        class="code-string">"total": 2034,
        class="code-string">"previous": 1263,
        class="code-string">"change_pct": 61,
        class="code-string">"baseline_available_from": null,
        class="code-string">"daily": [
          {
            class="code-string">"date": class="code-string">"2026-10-07",
            class="code-string">"value": 81
          }
        ]
      },
      class="code-string">"ai_arrivals": {
        class="code-string">"source": class="code-string">"cloudflare_referrers",
        class="code-string">"label": class="code-string">"Visits from AI answers",
        class="code-string">"note": class="code-string">"Counted at the Cloudflare edge from the referrer, for every visitor. A floor: most visits arrive with no referrer attached.",
        class="code-string">"measured_from": class="code-string">"2026-05-12",
        class="code-string">"days_measured": 28,
        class="code-string">"window_covered": true,
        class="code-string">"total": 412,
        class="code-string">"previous": 300,
        class="code-string">"change_pct": 37,
        class="code-string">"baseline_available_from": null,
        class="code-string">"daily": [
          {
            class="code-string">"date": class="code-string">"2026-10-07",
            class="code-string">"value": 17
          }
        ],
        class="code-string">"engines": [
          {
            class="code-string">"engine": class="code-string">"chatgpt",
            class="code-string">"label": class="code-string">"ChatGPT",
            class="code-string">"visits": 260
          }
        ]
      }
    },
    class="code-string">"totals": {
      class="code-string">"sessions": 5120,
      class="code-string">"engaged_sessions": 3010,
      class="code-string">"organic_sessions": 2210,
      class="code-string">"ai_sessions": 180,
      class="code-string">"paid_sessions": 640,
      class="code-string">"direct_sessions": 1500,
      class="code-string">"leads": 140,
      class="code-string">"organic_leads": 98,
      class="code-string">"ai_leads": 6,
      class="code-string">"cta_clicks": 410,
      class="code-string">"organic_cta_clicks": 260,
      class="code-string">"ai_cta_clicks": 21
    },
    class="code-string">"change_pct": {
      class="code-string">"sessions": 12,
      class="code-string">"organic_leads": null
    },
    class="code-string">"ai_engines": [
      {
        class="code-string">"engine": class="code-string">"chatgpt",
        class="code-string">"label": class="code-string">"ChatGPT",
        class="code-string">"sessions": 120,
        class="code-string">"leads": 6,
        class="code-string">"cta_clicks": 14
      }
    ],
    class="code-string">"daily": [
      {
        class="code-string">"date": class="code-string">"2026-10-07",
        class="code-string">"sessions": 190,
        class="code-string">"organic_sessions": 84,
        class="code-string">"ai_sessions": 7,
        class="code-string">"leads": 5,
        class="code-string">"organic_leads": 4,
        class="code-string">"cta_clicks": 12,
        class="code-string">"organic_cta_clicks": 9
      }
    ]
  },
  class="code-string">"meta": {
    class="code-string">"request_id": class="code-string">"a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    class="code-string">"timestamp": class="code-string">"2026-10-10T12:00:00.000Z"
  }
}
409Google Analytics not connected
json
{
  class="code-string">"error": {
    class="code-string">"code": class="code-string">"not_connected",
    class="code-string">"message": class="code-string">"example.com has no Google Analytics property linked yet, so there is nothing to report. Ask your AEO Content contact to link it."
  }
}
403Domain below the Business plan
json
{
  class="code-string">"error": {
    class="code-string">"code": class="code-string">"plan_required",
    class="code-string">"message": class="code-string">"API access is included with the Business plan, and example.com is not on the Business plan or higher. Upgrade on the Billing page in Studio."
  }
}

Sent with a Retry-After header: the seconds until the next request is allowed.

429Rate limit exceeded
json
{
  class="code-string">"error": {
    class="code-string">"code": class="code-string">"rate_limit_exceeded",
    class="code-string">"message": class="code-string">"Rate limit exceeded. Limits: 60 requests a minute, 2000 a day."
  }
}

null is not zero

null means not measured for this window, never zero. Every metric under site carries measured_from: days before it were unmeasured.
Figures under site count every visitor. totals and everything from Google Analytics is a consent sample: use it for shares and splits, not absolute traffic. Never sum numbers across sources.