{"id":20609,"date":"2026-09-27T11:58:58","date_gmt":"2026-09-27T09:58:58","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=20609"},"modified":"2026-09-27T12:21:00","modified_gmt":"2026-09-27T10:21:00","slug":"ga4-advisor-chat-api-verify-runreport","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/","title":{"rendered":"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport"},"content":{"rendered":"<p>A useful analytics assistant needs an answer that can be checked. This walkthrough asks Analytics Advisor for sessions by channel, adds a comparison period, and checks the numbers with an explicit Data API request. The result is a small investigation with saved inputs and outputs, rather than an automatically trusted explanation.<\/p>\n<p><strong>Documentation checked: 25 September 2026.<\/strong> The chat endpoint is an early-preview v1alpha feature. Availability and access must be checked for the intended property. On 27 September 2026, the three documented API requests were executed from the command line against an authorized GA4 property. The structured table for 1\u20137 September matched all four channel-group rows from runReport exactly; no property values are reproduced here. <a href=\"#source-1\">[1]<\/a><\/p>\n<h2>1. Prepare a limited reporting question<\/h2>\n<p>The example compares 1\u20137 September 2026 with 25\u201331 August 2026. Both periods have seven days and the same weekday composition. The metric is <code>sessions<\/code>, grouped by <code>sessionDefaultChannelGroup<\/code>. These names come from the API schema. <a href=\"#source-4\">[4]<\/a> Explicit dates avoid moving meanings such as \u201clast week\u201d.<\/p>\n<p>A channel is an attribution grouping, not a person or a campaign budget. The first question deliberately asks for a count rather than a cause. A lower count can justify investigation, but cannot independently show which marketing action caused it.<\/p>\n<h2>2. Authorize and save the first answer<\/h2>\n<p>The example runs in Bash with gcloud, curl and jq installed. The Cloud project must have the Analytics Data API enabled, and the signed-in account needs access to the property and permission to use the quota project. Cloud project ID and numeric Analytics property ID are different identifiers.<\/p>\n<p>Chat needs <code>analytics.chatbot.read<\/code>; the later report check needs <code>analytics.readonly<\/code>. The sample requests both. Credentials remain in the local gcloud flow, not in article code or a public webpage. <a href=\"#source-1\">[1]<\/a><a href=\"#source-3\">[3]<\/a><\/p>\n<p>Current Cloud CLI versions can block these Analytics scopes for the built-in OAuth client. A Desktop app OAuth client should be created in the intended Cloud project, downloaded as JSON and supplied with <code>--client-id-file<\/code>. Google documents this flag for scopes outside the default Cloud set. <a href=\"#source-6\">[6]<\/a><\/p>\n<pre><code># Bash; gcloud, curl and jq required\nset -euo pipefail\nexport PROJECT_ID='REPLACE_WITH_CLOUD_PROJECT'\nexport PROPERTY_ID='REPLACE_WITH_NUMERIC_PROPERTY_ID'\nexport OAUTH_CLIENT_FILE='REPLACE_WITH_DOWNLOADED_DESKTOP_CLIENT_JSON'\ngcloud auth application-default login --client-id-file=\"$OAUTH_CLIENT_FILE\" --scopes=\"https:\/\/www.googleapis.com\/auth\/cloud-platform,https:\/\/www.googleapis.com\/auth\/analytics.chatbot.read,https:\/\/www.googleapis.com\/auth\/analytics.readonly\"\ngcloud auth application-default set-quota-project \"$PROJECT_ID\"\n\ncat &gt; question.json &lt;&lt;'JSON'\n{\n  \"userQuery\": \"For 2026-09-01 through 2026-09-07, report sessions by sessionDefaultChannelGroup. Use these exact dates and API field names. State any limitation and do not infer causes.\",\n  \"returnPropertyQuota\": true\n}\nJSON\ncurl --fail-with-body --silent --show-error \\\n  \"https:\/\/analyticsdata.googleapis.com\/v1alpha\/properties\/${PROPERTY_ID}:chat\" \\\n  -H \"Authorization: Bearer $(gcloud auth application-default print-access-token)\" \\\n  -H \"x-goog-user-project: ${PROJECT_ID}\" \\\n  -H \"Content-Type: application\/json\" \\\n  --data-binary @question.json -o answer.json\njq '{sessionId, blocks, propertyQuota}' answer.json<\/code><\/pre>\n<p>A successful response can contain text and table blocks. Keeping the complete response preserves its context. A missing table is not a table full of zeros. Currency signs, percentage signs and formatted cell values should not be silently converted into bare numbers. The response contract and session fields are documented separately. <a href=\"#source-2\">[2]<\/a><\/p>\n<h2>3. Ask a follow-up in the returned session<\/h2>\n<p>The next command reads the returned session identifier; an absent identifier stops the script. It then asks for the earlier period. For further turns, the latest response supplies the next session ID. Different properties, clients and access contexts should have separate session storage.<\/p>\n<pre><code>SESSION_ID=$(jq -er '.sessionId | strings | select(length &gt; 0)' answer.json)\njq -n --arg sid \"$SESSION_ID\" '{\n  sessionId: $sid,\n  userQuery: \"Compare those sessions by sessionDefaultChannelGroup with 2026-08-25 through 2026-08-31. Show both totals and absolute differences. Separate observations from hypotheses.\",\n  returnPropertyQuota: true\n}' &gt; followup.json\ncurl --fail-with-body --silent --show-error \\\n  \"https:\/\/analyticsdata.googleapis.com\/v1alpha\/properties\/${PROPERTY_ID}:chat\" \\\n  -H \"Authorization: Bearer $(gcloud auth application-default print-access-token)\" \\\n  -H \"x-goog-user-project: ${PROJECT_ID}\" \\\n  -H \"Content-Type: application\/json\" \\\n  --data-binary @followup.json -o followup-answer.json\njq '{sessionId, blocks, propertyQuota}' followup-answer.json<\/code><\/pre>\n<p>Session context helps connect questions, but the comparison still needs explicit dates and definitions. \u201cOrganic Search declined\u201d describes a result. \u201cThe new landing page caused the decline\u201d requires additional evidence. Saving both prompts makes that distinction reviewable.<\/p>\n<h2>4. Reproduce the count with runReport<\/h2>\n<p>The second API call requests the two date ranges, the same dimension and the same metric directly. It is a separate report, not an instruction to the assistant to agree with itself. The report API documents date ranges, headers, row counts and metadata. <a href=\"#source-3\">[3]<\/a><\/p>\n<pre><code>cat &gt; report-request.json &lt;&lt;'JSON'\n{\n  \"dateRanges\": [\n    {\"startDate\":\"2026-09-01\",\"endDate\":\"2026-09-07\",\"name\":\"current\"},\n    {\"startDate\":\"2026-08-25\",\"endDate\":\"2026-08-31\",\"name\":\"previous\"}\n  ],\n  \"dimensions\": [{\"name\":\"sessionDefaultChannelGroup\"}],\n  \"metrics\": [{\"name\":\"sessions\"}],\n  \"limit\": \"1000\",\n  \"returnPropertyQuota\": true\n}\nJSON\ncurl --fail-with-body --silent --show-error \\\n  \"https:\/\/analyticsdata.googleapis.com\/v1beta\/properties\/${PROPERTY_ID}:runReport\" \\\n  -H \"Authorization: Bearer $(gcloud auth application-default print-access-token)\" \\\n  -H \"x-goog-user-project: ${PROJECT_ID}\" \\\n  -H \"Content-Type: application\/json\" \\\n  --data-binary @report-request.json -o report-response.json\njq '{dimensionHeaders,metricHeaders,rows,rowCount,metadata,propertyQuota}' report-response.json<\/code><\/pre>\n<p>Header order determines how row values are interpreted. With multiple ranges, the date-range dimension distinguishes the periods. Comparison by row position alone is unsuitable because channels can appear in different orders or be absent. For each channel, the arithmetic is current minus previous. A percentage change needs a nonzero previous value; a missing row and a measured zero are different cases.<\/p>\n<h2>5. Inspect limitations before using the result<\/h2>\n<p>The <a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ga4-api-response-inspector\/\">GA4 API Response Inspector<\/a> accepts the saved <code>report-response.json<\/code> for metadata and quota review. It does not parse chat responses. The assistant output is checked against the report separately. A reported threshold, sampling information or incomplete pagination needs to remain visible in the investigation.<\/p>\n<p><code>returnPropertyQuota<\/code> requests the chat quota state; it does not reserve capacity. An absent quota object means unknown, not unlimited. Authentication, permission and quota failures should be recorded before retrying. Automatic repeated chat calls can consume additional quota and produce different answers. <a href=\"#source-1\">[1]<\/a><\/p>\n<h2>6. Keep the output reviewable<\/h2>\n<p>The working record consists of the two prompts, two chat responses, report request and report response, plus the time of retrieval. Access should follow the sensitivity of the property data. Google&#8217;s privacy notice states that conversations may be processed by human reviewers to improve the product. Customer names and confidential campaign plans therefore do not belong in an otherwise numerical question. <a href=\"#source-5\">[5]<\/a><\/p>\n<p>A successful review ends with a documented number and an explanation of any mismatch. It may also end with \u201cnot reproducible\u201d. Both outcomes are more useful than an unsupported recommendation to change campaign spend.<\/p>\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ol>\n<li id=\"source-1\"><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/reporting\/data\/v1\/advisor-basics\" target=\"_blank\" rel=\"noopener noreferrer\">Analytics Advisor API guide<\/a><\/li>\n<li id=\"source-2\"><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/reporting\/data\/v1\/rest\/v1alpha\/properties\/chat\" target=\"_blank\" rel=\"noopener noreferrer\">properties.chat reference<\/a><\/li>\n<li id=\"source-3\"><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/reporting\/data\/v1\/rest\/v1beta\/properties\/runReport\" target=\"_blank\" rel=\"noopener noreferrer\">properties.runReport reference<\/a><\/li>\n<li id=\"source-4\"><a href=\"https:\/\/developers.google.com\/analytics\/devguides\/reporting\/data\/v1\/api-schema\" target=\"_blank\" rel=\"noopener noreferrer\">Data API schema<\/a><\/li>\n<li id=\"source-5\"><a href=\"https:\/\/support.google.com\/helpguide\/answer\/14185196\" target=\"_blank\" rel=\"noopener noreferrer\">Chat AI Privacy Hub<\/a><\/li>\n<li id=\"source-6\"><a href=\"https:\/\/docs.cloud.google.com\/sdk\/gcloud\/reference\/auth\/application-default\/login\" target=\"_blank\" rel=\"noopener noreferrer\">Google Cloud CLI: gcloud auth application-default login<\/a><\/li>\n<\/ol>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>A reproducible channel comparison with properties.chat, session context, quota information and a separate runReport check.<\/p>\n","protected":false},"author":1,"featured_media":20687,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-20609","post","type-post","status-publish","format-standard","hentry","category-digital-analytics"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"A reproducible channel comparison with properties.chat, session context, quota information and a separate runReport check.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"A reproducible channel comparison with properties.chat, session context, quota information and a separate runReport check.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-27T09:58:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-27T10:21:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-20609-rest20260927-dark.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport\",\"datePublished\":\"2026-09-27T09:58:58+00:00\",\"dateModified\":\"2026-09-27T10:21:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/\"},\"wordCount\":790,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-20609-rest20260927-dark.png\",\"articleSection\":[\"Digital Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/\",\"name\":\"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-20609-rest20260927-dark.png\",\"datePublished\":\"2026-09-27T09:58:58+00:00\",\"dateModified\":\"2026-09-27T10:21:00+00:00\",\"description\":\"A reproducible channel comparison with properties.chat, session context, quota information and a separate runReport check.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-20609-rest20260927-dark.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-20609-rest20260927-dark.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-analytics\\\/ga4-advisor-chat-api-verify-runreport\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport | Lukas Wojcik","description":"A reproducible channel comparison with properties.chat, session context, quota information and a separate runReport check.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport | Lukas Wojcik","og_description":"A reproducible channel comparison with properties.chat, session context, quota information and a separate runReport check.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-27T09:58:58+00:00","article_modified_time":"2026-09-27T10:21:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-20609-rest20260927-dark.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport","datePublished":"2026-09-27T09:58:58+00:00","dateModified":"2026-09-27T10:21:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/"},"wordCount":790,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-20609-rest20260927-dark.png","articleSection":["Digital Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/","name":"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-20609-rest20260927-dark.png","datePublished":"2026-09-27T09:58:58+00:00","dateModified":"2026-09-27T10:21:00+00:00","description":"A reproducible channel comparison with properties.chat, session context, quota information and a separate runReport check.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-20609-rest20260927-dark.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-20609-rest20260927-dark.png","width":1200,"height":630,"caption":"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/ga4-advisor-chat-api-verify-runreport\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Querying GA4 Analytics Advisor via API and Checking the Answer with runReport"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20609","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=20609"}],"version-history":[{"count":2,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20609\/revisions"}],"predecessor-version":[{"id":20705,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/20609\/revisions\/20705"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/20687"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=20609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=20609"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=20609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}