# Google Trends API: Empty Searches Cost 0 Credits (https://www.socialcrawl.dev/blog/google-trends-api)
> Empty Google Trends API searches now return 404 with 0 credits charged. Live production curls cover Trends empties, News ranks, and app filter refusals.
An empty Google Trends API explore now returns **404** with `credits_used: 0` — not a paid empty series. That is the headline change in SocialCrawl's September 2026 honesty wave: empty Trends interest is free, unsupported filters refuse with a free 400 that names the fix, Google News rows ship contiguous ranks at the exact depth you asked for, and Trends marks the still-counting period as `partial`.
Every curl and credit receipt below was captured on production on **2026-09-08** — all nine behaviours, including the app-marketplace filter refusals. Auth is `x-api-key` on `/v1/google_trends/*`, `/v1/google_news/*`, `/v1/app_store/*`, and `/v1/google_play/*`.
The [Google Trends](https://trends.google.com/trends/) UI is free to explore. Google's first-party Trends API is a [gated alpha](https://developers.google.com/search/blog/2025/07/trends-api). Production callers still need empty-interest and filter semantics today — that is what this post measures. Vendor pricing lives in the sibling roundup, [Best Google Trends APIs 2026](/blog/best-google-trends-apis-2026); this post is the billing ledger.
## What happens when a Google Trends API search returns empty?
If Google Trends holds too little search volume to build a series, SocialCrawl returns `RESOURCE_NOT_FOUND` and does not charge. Official Trends semantics already treat very low volume as **0**, not as measurable interest ([Google Trends FAQ](https://support.google.com/trends/answer/4365533)). Values are a 0–100 index normalized to the geography and time window, not absolute search counts. Charting a paid row of zeros used to look like a successful answer. A free 404 is the honest one: there was no series to bill for.
The pre-change upgrade note (2026-09-07) recorded empty explores as **200 + 5 credits** for an empty series. That figure was not re-measured as old behaviour in this harvest — only the after column below is live evidence from production.
```bash
curl "https://www.socialcrawl.dev/v1/google_trends/explore?keywords=zzqqxjw" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
```
```json
{
"success": false,
"error": {
"type": "RESOURCE_NOT_FOUND",
"message": "No search-interest data were returned for this keyword. The location and timeframe were accepted; Google Trends simply holds too little search volume for this keyword in that combination to build a result. Try a wider `timeframe`, a broader keyword, or the keyword in the local language of the location you requested. You were not charged for this request.",
"status": 404
},
"credits_used": 0
}
```
Read the receipt carefully. The location and timeframe were accepted; the failure is “no measurable interest,” not a bad param. The message says you were not charged, and `credits_used: 0` matches. `zzqqxjw` is a nonsense token chosen so the empty path is deterministic. A real low-volume niche term in a narrow location/timeframe can also 404 — that is a fact about interest, not a transport failure. The same empty-interest rule applies on `/v1/google_trends/rising?keyword=zzqqxjw` (also 404, `credits_used: 0` on 2026-09-08).
When interest *does* exist, every time-series point carries a boolean `partial`. On a live `taylor swift` explore the same day (53 weekly points, average 25, `credits_used: 5`), only the still-counting final bucket was `partial: true`:
| date | value | partial |
| --- | ---: | --- |
| 2026-08-23 | 16 | false |
| 2026-08-30 | 14 | false |
| 2026-09-06 | 16 | **true** |
Without the flag, that last bucket looks like a real dip or spike. Drop `partial: true` points before you chart. The flag flips when Google closes the period — do not treat any single date as eternally partial. Full Trends contract: [/docs/google_trends](/docs/google_trends). Credit rules for empty upstream bodies: [/docs/credits](/docs/credits). Error taxonomy for 404 vs 400: [/docs/errors](/docs/errors).
## How does Google News API ranking work after the update?
The same honesty wave hit the Google News API. Request a depth, get that many rows, each with a contiguous 1-based `rank`. No gaps, no repeats, no silent over-delivery. If you paginate or pin “top N” headlines in a product, missing ranks and extra rows are the kind of bug that only shows up after someone screenshots your UI.
The upgrade note described earlier pages that could return **29** articles for `depth=20`, or leave position missing on many rows. Again: that is the pre-change note, not a this-run measurement. Production on 2026-09-08 looked like this:
```bash
curl "https://www.socialcrawl.dev/v1/google_news/search?keyword=openai&depth=20" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
```
| check | result |
| --- | --- |
| `data.total` | 20 |
| item count | 20 |
| ranks | 1, 2, 3, …, 20 |
| contiguous / no dups | yes |
| `credits_used` | 1 |
Sample rows from that response:
| rank | source | title |
| ---: | --- | --- |
| 1 | BBC | OpenAI chief scientist warns no-one is prepared for consequences of AI |
| 2 | bloomberg.com | OpenAI Top Scientist Urges 'Extreme Caution' With Pace of AI |
| 3 | Yahoo Tech | OpenAI's chief scientist says AI labs may need to slow down… |
| 20 | New York Post | OpenAI hires Chuck Schumer's daughter… |
`rank` is list position for the page SocialCrawl returned for this request — not an external Google News “score.” Google News itself is a consumer product without a public Search developer contract ([Google News Help](https://support.google.com/googlenews/answer/9010862)); a third-party Google News data API fills that gap. Endpoint reference: [/docs/google_news](/docs/google_news). For vendor pricing on news APIs, see [Best Google News APIs 2026](/blog/best-google-news-apis-2026) — that sibling owns the comparison table; this section only proves rank and depth honesty on SocialCrawl's own endpoint.
## What do unsupported filters return on app review APIs?
Filter honesty is the other half of the wave. If a parameter looks supported but the store cannot apply it upstream, SocialCrawl refuses with a free **400** that names the param and points at the fix — instead of returning an unfiltered feed and charging you as if the filter worked. That failure mode is worse than a hard error: your code thinks it got one-star reviews, your dashboard plots them, and the bill still moved.
Apple's public review feed cannot be filtered by star rating upstream. Asking for `rating=1` on App Store reviews used to (per the upgrade note) return **200 + 5 credits** of unfiltered data. Live on 2026-09-08:
```bash
curl "https://www.socialcrawl.dev/v1/app_store/app-reviews?app_id=310633997&rating=1" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
```
```json
{
"success": false,
"error": {
"type": "INVALID_REQUEST",
"message": "`rating` is not supported on app_store/app-reviews: Apple's review feed cannot be filtered by star rating upstream, and forwarding it would return the unfiltered feed under a filtered request. Use /v1/google_play/app-reviews for a real star filter, or request a larger `depth` here and filter on each review's `review.rating.value`.",
"status": 400
},
"credits_used": 0
}
```
Google Play *does* support a star filter on `/v1/google_play/app-reviews`, but out-of-range values are also free 400s. `rating=7` on `com.spotify.music` returned `INVALID_REQUEST` with `` `rating` must be a whole number from 1 to 5. Received "7". `` and `credits_used: 0`. Official first-party review APIs ([Play Developer](https://developers.google.com/android-publisher/api-ref/rest/v3/reviews/list), [App Store Connect](https://developer.apple.com/documentation/appstoreconnectapi/customer-reviews)) only cover apps you own. Competitive review mining is why third-party App Store reviews API and Google Play reviews API surfaces exist — and why silent filter drops are expensive. Pricing roundup for that category: [Best App Review APIs 2026](/blog/best-app-review-apis-2026).
The rest of the live marketplace behaviours from the same harvest:
| Behaviour | After (measured 2026-09-08) | Before (upgrade note only) |
| --- | --- | --- |
| Trends `category=games` | 400 + 0cr, names numeric `category` | 200 + 5cr all-categories |
| Play `rating=7` | 400 + 0cr (must be 1–5) | 200 + 5cr treated as 5 |
| Play `/locations` | 211 storefronts / ~28 KB / 1cr | ~269k rows / ~46 MB |
| App Store `country=uk` | 400 + 0cr → use `GB` | Silent wrong-market suggestions |
| Listings `filters=not-json` | 400 + 0cr + JSON example | 200 + 10cr unfiltered |
Client validation runs before billing ([/docs/errors](/docs/errors)): a free 400 that tells you what to fix is cheaper than a successful-looking unfiltered page. The Trends `category=games` row is the same pattern on the Google Trends API itself — send a numeric category code, or omit it; do not pay for an all-categories series you did not ask for.
## How do you call the Google Trends API from Python?
Minimal path: get an API key, put it in the environment, replay a call that costs nothing while you wire auth. This is the Google Trends API Python path without a scraper's rate-limit roulette.
1. Create a key and keep the free credits for smoke tests.
2. Replay the empty explore (0 credits) or a tiny News depth call (1 credit) before you spend on a live Trends series (5 credits).
3. Then open the Explorer and the platform docs: [/docs/google_trends](/docs/google_trends), [/docs/google_news](/docs/google_news), [/docs/credits](/docs/credits), [/docs/errors](/docs/errors).
```python
resp = requests.get(
"https://www.socialcrawl.dev/v1/google_trends/explore",
params={"keywords": "zzqqxjw"},
headers={"x-api-key": os.environ["SOCIALCRAWL_API_KEY"]},
timeout=30,
)
print(resp.status_code, resp.json().get("credits_used"))
# 404 0
```
Unofficial Google Trends Python clients such as [pytrends](https://github.com/GeneralMills/pytrends) (archived read-only in April 2025) are a different category: no credit receipt, no documented empty-interest 404, no `partial` flag on the open period. If you need a billed Google Trends API with those receipts, start from the empty explore above and only then pay for a real keyword.
Reproducibility from this harvest: empty/filter validation = **0** credits; live Trends explore = **5**; News `depth=20` = **1**; Play `/locations` = **1**. Quote per-call `credits_used` — shared-key balance deltas can include concurrent work on the same key.
## Frequently asked questions
### Does an empty Google Trends API search still cost credits?
No. On production (2026-09-08), `GET /v1/google_trends/explore?keywords=zzqqxjw` returned HTTP 404 `RESOURCE_NOT_FOUND` with `credits_used: 0`, and the error message states you were not charged. The same empty path on `/v1/google_trends/rising` was also free.
### Is there an official Google Trends API from Google?
The Trends UI is public. Google announced a [first-party Trends API alpha in July 2025](https://developers.google.com/search/blog/2025/07/trends-api), but it remains gated. Most production callers still use third-party Trends APIs, which is why empty-interest and filter semantics matter on the wire today.
### How do you use the Google Trends API with Python?
Set `SOCIALCRAWL_API_KEY`, then `requests.get` against `/v1/google_trends/explore` as in the Python section above. Replay the empty keyword first (free smoke), then call a real term when you are ready to spend 5 credits.
### What does the `partial` flag mean on a Trends time series?
It marks a bucket Google is still accumulating — normally the latest period. On the 2026-09-08 `taylor swift` capture, only `2026-09-06` was `partial: true`. Drop those points before charting; the flag flips when the period closes, so do not hard-code any date as forever partial.
### Do unsupported filters on Google Play / App Store review APIs still charge?
No. Apple `rating` on `/v1/app_store/app-reviews`, Play `rating=7`, unknown App Store `country=uk`, and malformed listings `filters` all returned free 400s with `credits_used: 0` on the 2026-09-08 production smoke. The response names the bad param and, where useful, the endpoint that actually supports the filter.
For the Trends contract, credit refunds, and error taxonomy: [/docs/google_trends](/docs/google_trends), [/docs/credits](/docs/credits), [/docs/errors](/docs/errors). Sibling pricing deep-dives if you need vendor tables: [Best Google Trends APIs 2026](/blog/best-google-trends-apis-2026), [Best Google News APIs 2026](/blog/best-google-news-apis-2026), [Best App Review APIs 2026](/blog/best-app-review-apis-2026).