# Feeds for Google Sheets and Looker Studio

> Per-project CSV links you can paste into =IMPORTDATA in Google Sheets or use as a CSV source. One dataset per link, read-only, revocable, with an optional expiry.

## What a feed is

A feed is a link to one CSV file with one dataset of one project. Google Sheets reads it with `IMPORTDATA`, and a dashboard reads it as a CSV source. A feed link is read-only: it cannot change anything, and it opens only the dataset it was made for.

Feeds do not spend credits. They read what Rankfinity already has.

## Create a feed

1. Open **My account › API & feeds** and find the **Feeds** card.
2. Choose the project and the dataset. Optionally give it a name and an expiry in days.
3. Click **Create feed** and copy the link. **The link is shown once.** Rankfinity stores only a hash.
4. To stop a feed, click **Revoke**. It stops working at once.

You need edit access to the project to create or revoke a feed. A view-only team member cannot create one. Each project can have up to 20 live feeds.

## Datasets

| Dataset | One row per | Columns |
|---|---|---|
| `rankings` | keyword and device (latest result, up to 500 rows) | keyword, device, rank, previous_rank, change, measured, url, measured_at, stale, status |
| `aiv` | AI app, plus an `overall` row | scope, app, visibility_pct, answers, answers_naming_brand, run_finished_at, status |
| `audit-issues` | failed check in the latest site audit | check, title, severity, affected_pages, audit_finished_at, root_url, status |
| `backlinks` | referring domain in the saved backlink profile | referring_domain, backlinks, rank, first_seen, fetched_at, status |

For charts over time, use the history datasets. They keep every measurement, newest first, up to 5,000 rows each:

| Dataset | One row per | Columns |
|---|---|---|
| `rankings-history` | rank check, per keyword, location and device | keyword, location, device, position, date, measured, status |
| `map-arp-history` | map scan, per keyword | keyword, date, arp, avg_rank, found_pct, scan_id, status |
| `aiv-history` | AI app per finished run, plus an `overall` row | date, run_id, app, visibility_pct, answers, status |
| `audit-history` | finished site audit | date, audit_id, score, failed_checks, pages_crawled, root_url, status |
| `backlinks-history` | saved backlink profile | date, referring_domains, backlinks, dofollow, nofollow, rank, spam_score, broken_backlinks, status |

`date` is an ISO 8601 timestamp in UTC. A `measured` value of `false` means the check was not fully measured (`status` says whether it was partial or failed): its position is empty, and it is not a rank. For Looker Studio, see [Looker Studio dashboard](/docs/looker-studio).

Read the `status` column first. `ok` means a real row. Any other text says why there is no data yet, for example "no site audit has run yet". An empty cell means the value was not measured. It is never a zero.

## Google Sheets

Paste the link into a cell, wrapped in `IMPORTDATA`:

```
=IMPORTDATA("https://app.rankfinity.app/api/feeds/v1/rf_feed_...csv")
```

Sheets refreshes an `IMPORTDATA` cell about once an hour and on recalculation. Rankfinity updates the data after each check, so the sheet catches up on the next refresh.

## Looker Studio

Looker Studio has no built-in "CSV from URL" source. The step-by-step route is in [Looker Studio dashboard](/docs/looker-studio): one feed per dataset, each in a Google Sheet tab with `IMPORTDATA`, then a Google Sheets source in Looker Studio. The same page links a sample dashboard spec (JSON).

Looker Studio sees the same columns as the CSV. Use the `status` column as a filter to hide the explanation rows.

## Safety

- The link is the credential. Anyone who has it can read that dataset until you revoke it. Do not paste it into public documents.
- The link is served with `no-store`, `no-referrer` and `noindex` headers, so browsers and search engines do not keep or index it.
- Formulas in data (for example a keyword that starts with `=`) are written with a leading apostrophe, so a spreadsheet shows them as text and does not run them.
- A feed stops working if its creator loses access to the project or their account is inactive.
- A feed link is limited per minute (the operator sets the limit). Too many requests return `429`.

