Search & SEO

How do you get Google Trends data via API?

Call ReefAPI's google-trends engine for trending searches, realtime story clusters, keyword suggestions and the category taxonomy. Interest-over-time, related queries and interest-by-region are no longer served to API clients by Google - we return an explicit DISABLED error for those three rather than a plausible-looking empty chart, and the realtime endpoint still carries the related-query lists.

Google Trends engineLive JSON5 steps1,000 free credits

This guide demonstrates the real Google Trends API engine with a captured response from . The example is only published because the engine passed the SEO snapshot gate.

Use case

Trend monitoring, SEO research, newsroom alerting and demand-signal discovery.

Step by step

Call the live endpoint

  1. 1

    Skip the three closed endpoints

    interest_over_time, related_queries and interest_by_region return DISABLED. If your design depends on a 0-100 interest curve, that data is no longer available to any API client, ours included.

  2. 2

    Disambiguate the keyword first

    google-trends/v1/suggest returns entity candidates with a mid and a type label. 'apple' resolves to a Fruit and a Technology company among others, and picking the wrong one silently changes the topic.

  3. 3

    Pull trending_now for the story

    One call per geo returns trending searches with three news articles each, a bucketed traffic string and a publish timestamp. Read the articles for the URLs; ignore the row-level link, which is generic.

  4. 4

    Pull realtime_trending for the keywords

    Same trends, different payload: no article bodies, but every story carries its related_queries list and category_ids. hours accepts 4, 24, 48 or 168.

  5. 5

    Treat traffic as an ordinal

    '2000+' and 2000000 are both bucket floors. Rank on them, alert on changes in them, but never total them or report them as search volume.

Code

Copy the request

These snippets use the captured request params for google-trends/v1/trending_now.

curl -X POST https://api.reefapi.com/google-trends/v1/trending_now \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"geo":"US"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.google-trends.trending_now with {"geo":"US"}.
Real response

Captured output from ReefAPI

Captured on UTC. The response below is the committed snapshot, including the API envelope and metadata.

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/google-trends/v1/trending_now",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "geo": "US"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "google-trends",
    "endpoint": "trending_now",
    "mode": "live",
    "latency_ms": 654.8,
    "record_count": 10,
    "bytes": 21435,
    "cache_hit": false,
    "completeness_pct": 100,
    "charged_credits": 1,
    "version": "1.2.0"
  },
  "data": {
    "geo": "US",
    "trends": [
      {
        "title": "miami airport",
        "traffic": "500+",
        "approx_traffic": 500,
        "link": "https://trends.google.com/trending/rss?geo=US",
        "picture": "https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR3K6tdTzhCkrHFaHQw6XIXirKTZA2t8y8-TuOGhVOYbD0IurECyZl5hH-xBi8",
        "pub_date": "Wed, 23 Sep 2026 14:20:00 -0700",
        "articles": [
          {
            "title": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "source": "[trimmed-depth]",
            "picture": "[trimmed-depth]"
          },
          {
            "title": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "source": "[trimmed-depth]",
            "picture": "[trimmed-depth]"
          },
          {
            "title": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "source": "[trimmed-depth]",
            "picture": "[trimmed-depth]"
          }
        ]
      },
      {
        "title": "kevin durant",
        "traffic": "500+",
        "approx_traffic": 500,
        "link": "https://trends.google.com/trending/rss?geo=US",
        "picture": "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQ3EyNGAFSuAojJjxgQ8ewrwgV3d2zZ5kAuR_6Dbpv-ptPVlegWwGfzBUOYgYo",
        "pub_date": "Wed, 23 Sep 2026 14:20:00 -0700",
        "articles": [
          {
            "title": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "source": "[trimmed-depth]",
            "picture": "[trimmed-depth]"
          },
          {
            "title": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "source": "[trimmed-depth]",
            "picture": "[trimmed-depth]"
          },
          {
            "title": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "source": "[trimmed-depth]",
            "picture": "[trimmed-depth]"
          }
        ]
      },
      {
        "title": "khloe kardashian",
        "traffic": "500+",
        "approx_traffic": 500,
        "link": "https://trends.google.com/trending/rss?geo=US",
        "picture": "https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcT9rFVSerPT52NKJBS_AUuAnI8G86RkiJZOpVXgh8WJO2xTC2th3fbaWpvLrzs",
        "pub_date": "Wed, 23 Sep 2026 14:20:00 -0700",
        "articles": [
          {
            "title": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "source": "[trimmed-depth]",
            "picture": "[trimmed-depth]"
          },
          {
            "title": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "source": "[trimmed-depth]",
            "picture": "[trimmed-depth]"
          },
          {
            "title": "[trimmed-depth]",
            "url": "[trimmed-depth]",
            "source": "[trimmed-depth]",
            "picture": "[trimmed-depth]"
          }
        ]
      }
    ]
  }
}
Manual way

Why this is hard manually

Most Google Trends write-ups, including the one that used to sit on this page, are built around interest_over_time: pick a keyword, pick a timeframe, get a 0-100 curve. That surface is closed to API clients now. We call it live and Google refuses it, so the endpoint returns DISABLED with the reason spelled out rather than an empty series. The same applies to related_queries and interest_by_region. Five of the eight actions on this engine still work; three do not, and a library that returns an empty array instead of an error will quietly feed your dashboard a flat line.

The second thing to know before building on trends data is that the 'traffic' number is never a search volume. It is a bucket floor. trending_now returns it as a string with a plus sign - '200+', '2000+', '5000+' - and realtime_trending returns it as a rounded integer that only ever takes values like 50000, 100000, 200000, 500000 and 2000000. Ranking on it works. Summing it does not.

Third, 'apple' is not one thing. Google resolves keywords to entities, and until you know which entity you are asking about, two trend queries that look identical can be about a fruit and a phone company.

ReefAPI way

Why ReefAPI solves it

The three dead endpoints fail loudly. interest_over_time, related_queries and interest_by_region return ok:false with code DISABLED, meta.scope 'ENDPOINT_DISABLED', in about 1.5 ms and with no charge, and the message names the reason: Google now blocks that data for API clients. You find out in your first test run rather than three weeks into a product.

The related-query data itself is not gone, it just moved. realtime_trending returns story clusters, and each story carries a related_queries array - the 'tim curry' cluster in our US run had 127 of them, from 'tim curry movies' through 'tim curry cause of death' to plain misspellings like 'tm curry'. That is the same long-tail keyword material the closed endpoint used to serve, delivered as part of a live story instead of as a keyword lookup. Stories also carry started (epoch) with started_date, ended, active and article_count.

trending_now and realtime_trending look similar and are not. trending_now is the news feed: each row carries three linked articles with title, URL, source and image, a bucketed traffic string, and an RFC-822 pub_date. realtime_trending is the cluster feed: no article bodies, only article_count (44, 19, 51 on our first three stories), but the full related-query list and numeric category_ids. Use trending_now to show a reader what happened; use realtime_trending to mine what people typed.

One honest wart in trending_now: the link field is the same generic Trends RSS URL on every row, not a per-trend permalink. Do not store it as a deep link. The per-row articles carry the real destination URLs.

Timestamps come back in Google's own offset, not yours and not the region's. A German trending_now row was stamped 'Wed, 26 Aug 2026 14:30:00 -0700' - US Pacific, for a DE query. Parse the offset rather than assuming local time, or your 'trending in the last hour' window will be eight hours off.

suggest solves the entity problem in one call. Asking for 'apple' returns five candidates with a Knowledge Graph mid and a human-readable type: /m/04st9hr Topic, /m/014j1m Fruit, /m/0k8z Technology company, and so on. categories returns the full taxonomy - 1,426 entries - and is searchable: querying 'finance' returns id 7 Finance at depth 1 under All categories, id 1138 Business Finance at depth 2 under Business & Industrial, and id 1161 Public Finance at depth 3 under Government, each with parent_id and parent_name so you can walk the tree.

geo changes the feed as you would expect: US returned 'boy abandoned hiking mt fuji' and 'carabao cup draw'; DE returned 'philipp tuermer' with German-language articles from German publishers. trending_now answered in about 780 ms, realtime_trending in about 590 ms.

FAQ

Questions developers ask

Can I still get the 0-100 interest-over-time curve?

No. Google stopped serving that data to API clients. Calling interest_over_time returns ok:false with code DISABLED and meta.scope ENDPOINT_DISABLED in about 1.5 ms, at no charge. related_queries and interest_by_region behave the same way. We return an explicit error instead of an empty series so the failure is visible in testing.

So where do related search queries come from now?

From realtime_trending. Each story cluster carries a related_queries array - our top US story had 127 entries including misspellings and question forms. It is scoped to what is trending rather than to any keyword you choose, but it is the same long-tail material.

Is traffic a search volume?

No. trending_now returns it as a bucket string ('200+', '2000+', '5000+') with approx_traffic as the floor integer. realtime_trending returns rounded integers that only take values like 50000, 100000, 200000, 500000, 2000000. Both are ordinals.

What is the difference between trending_now and realtime_trending?

trending_now gives three linked news articles per trend and no related queries. realtime_trending gives related queries and category_ids but only an article_count, not the articles. They cover the same trends from opposite sides.

Why is a German trend stamped -0700?

Because Google publishes the feed in US Pacific time regardless of the geo you requested. We pass the timestamp through unchanged rather than reinterpret it. Parse the offset in the RFC-822 string.

How do I tell which 'apple' Google means?

Call suggest. It returns entity candidates with a Knowledge Graph mid and a type: /m/014j1m is the Fruit, /m/0k8z is the Technology company. The mid is the stable identifier.

How large is the category tree?

1,426 entries. categories accepts a query and returns matches with id, name, parent_id, parent_name and depth, so you can resolve 'finance' to Finance (7, depth 1), Business Finance (1138, depth 2) or Public Finance (1161, depth 3).