BigQuery stores rows. It does not send Authorization: Bearer. A Cloud Function, Cloud Run job, Airflow task, or pandas job POSTs https://api.trendsapi.ai/api, parses the string body, then loads. Looker and Grafana read the tables. They do not call the API. Fields: the API reference. Caps: pricing.
POST outside the warehouse
inner = json.loads(resp.json()["body"])
# series: list of {date, value, keyword, source}
# growth: {results: [{period, growth, direction, recent_date, ...}]}
Write the inner JSON to Cloud Storage, then bq load or an insert. If the load fails, retry the load. Do not POST again for the same keyword and window. Official usage notes count each 200. The parse step is on parse the body.
source values are MCP strings such as google search. A live board is type Google Trends and belongs in a third table with as_of_ts, rank, and label.
Two schemas
Series table:
date DATE, value FLOAT64, keyword STRING, source STRING
Growth table:
keyword STRING, source STRING, period STRING, growth FLOAT64, direction STRING,
recent_date DATE, baseline_date DATE, recent_value FLOAT64, baseline_value FLOAT64
growth is a signed percent. value and recent_value are 0-100. Mixing them in one MEASURE named "score" is a dashboard bug. That split is on get_growth and get_time_series.
Partition series on date. Cluster on keyword, source. Multi-source growth rows keep one source per row, not a comma-separated cell.
What reads the table
Looker explores the growth table. Grafana charts the series table. Power BI can import either. None of those tools should hold the Trends API key if the warehouse already has the rows.