Integrations & API
Looker Studio
Pull daily visibility, share of voice and cited sources into Looker Studio with Rixe's community connector.
The Rixe connector for Looker Studio brings your daily visibility, share of voice and cited sources into the reports you already build there, without exporting CSV files. It is a Google Apps Script "community connector" that reads the REST API with an API key, so it is read-only like the API behind it.
The connector is not listed in the Looker Studio gallery. You deploy your own copy from our script, under your own Google account. The API key stays in that account, nothing passes through a third party, and revoking the key in Rixe disconnects the report at once.
Before you start
- A plan that can create API keys. See Plans and limits.
- An owner or admin to create the key.
- A Google account that can use Apps Script and Looker Studio.
Setup
- Create an API key. In Rixe, open the user menu at the bottom of the sidebar, go to Settings › Developer, click Add API key, name it "Looker Studio" and tick
read:scoresandread:sources. Click Generate key and copy the key; it is shown only once. The API keys card also has a Looker Studio connector link back to this page. - Copy the script. Open the connector script (it is served as plain text,
Code.gs), select all and copy it. - Create an Apps Script project. Go to script.google.com, choose New project and name it "Rixe connector".
- Paste the code and the manifest. Replace the contents of
Code.gswith the script. In Project settings, turn on Show "appsscript.json" manifest file in editor, then replace the contents ofappsscript.jsonwith the manifest below. - Deploy as a Looker Studio connector. Choose Deploy › Test deployments, pick Looker Studio, and open the link Apps Script shows you.
- Paste your API key when Looker Studio asks for it.
- Pick a workspace and a data set. Choose the Workspace (or All workspaces, which merges every workspace the key can reach) and a Data set: Daily visibility or Cited sources. Click Connect.
Manifest (appsscript.json)
{
"timeZone": "Etc/UTC",
"dependencies": {},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"urlFetchWhitelist": ["https://api.rixe.ai/"],
"dataStudio": {
"name": "Rixe AI Visibility",
"logoUrl": "https://app.rixe.ai/logo.png",
"company": "Rixe",
"companyUrl": "https://rixe.ai",
"addonUrl": "https://developers.rixe.ai/developers/looker-studio",
"supportUrl": "https://developers.rixe.ai/developers/looker-studio",
"description": "Daily AI search visibility per brand and engine, share of voice and cited sources from your Rixe workspaces.",
"sources": ["RIXE"],
"shortDescription": "AI visibility scores, share of voice and citations",
"authType": ["KEY"],
"feeType": ["FREE"]
}
}Fields: Daily visibility
One row per day, brand and engine, read from GET /v1/daily-scores. The report's date range control sets the window; up to 20,000 rows are read per refresh.
| Field | Type | Meaning |
|---|---|---|
| Date | dimension | Measurement day (UTC). |
| Brand | dimension | Your brand or a tracked competitor. |
| Engine | dimension | The engine code, for example chatgpt-search or google-aio. |
| Is competitor | dimension | true for competitor rows, false for your own brand. |
| Insufficient sample | dimension | true when too few measurements stand behind the row to give a score. |
| Measurements | metric (sum) | Questions asked to that engine that day. |
| Mentions | metric (sum) | Answers that named the brand. |
| Visibility score | metric (average) | Mentions divided by measurements. |
| Share of voice | metric (average) | The brand's share of all brand mentions. |
| Average position | metric (average) | Where in the answer the brand appears; 1 is first. |
| CI low / CI high | metric (average) | The Wilson confidence interval around the score. |
Filter out insufficient rows
Add a filter Insufficient sample = false to every chart. A rate from a handful of measurements looks like a real change and is not one. Rixe needs at least 4 measurements before it shows a score; see Visibility score.
Competitor rows carry the competitor's name in Brand and Is competitor = true. Their score is in the same Visibility score field, so one chart broken down by Brand shows you against them.
For an accurate visibility score over a period, build a calculated field SUM(Mentions) / SUM(Measurements) rather than averaging Visibility score. An average of daily rates gives a quiet day the same weight as a busy one.
Fields: Cited sources
Read from GET /v1/citations. This data set is a snapshot of the current source statistics; the date range control does not apply to it.
| Field | Type | Meaning |
|---|---|---|
| Domain | dimension | The cited site. |
| Source kind | dimension | The type of site, as a stable code (for example haber news, forum, dizin directory). |
| Access | dimension | How a brand can get onto the site (sign-up, application, editorial, sponsored, not reachable). |
| Mentions brand | dimension | true when your brand was named in an answer citing the domain. |
| Citations | metric (sum) | How many answers cited the domain. |
| Prompts covered | metric (sum) | Tracked questions whose answers cite the domain. |
The figures are kept per engine and month, so the same domain can appear on several rows. Use Domain as the dimension and let Looker Studio sum the metrics.
Refresh frequency
Measurement runs daily, so there is nothing new to fetch more often than that. Set the data source's data freshness to 12 hours. The API allows 1,200 requests per minute; if a report shows "Rate limit reached", lower the freshness rather than the number of charts.
Updating the connector
When we change the script, the connector script serves the new version. Paste it over your old Code.gs and deploy again.
Troubleshooting
| Message in Looker Studio | Cause | Fix |
|---|---|---|
| The API key was revoked or is wrong. | The key was revoked or mistyped. | Create a new key and reconnect. |
| The API key is missing a scope this data set needs. | The key lacks read:scores (daily) or read:sources (sources). | Create a key with both scopes. |
| Rate limit reached. | Too many refreshes. | Raise the data freshness interval. |
Related pages
Still stuck? Write to [email protected] and a person will answer.