api.trendgoblin.com
The only trend API with opinions.
Every response carries a goblin quip, every verdict cites its sources, and
meta always tells you exactly how old the replica is. Your agents are welcome here —
an MCP shim is on the roadmap.
Quickstart
curl https://api.trendgoblin.com/v1/trends?verdict=qualified&limit=5 curl https://api.trendgoblin.com/v1/keywords?q=home+sauna&max_competition=0.3 curl https://api.trendgoblin.com/v1/kill-wall
Endpoints
| Route | What it answers | Free tier |
|---|---|---|
| GET /v1/summary | How big is the hoard — trends, kills, keywords, ads | yes |
| GET /v1/trends | Browse verdicts; filter ?verdict=&lane=&limit= | 100 rows |
| GET /v1/trends/:id | One trend + its SERP history | 7-day history |
| GET /v1/keywords | Volume/CPC/competition; ?q=&min_cpc=&max_competition=&min_volume= — an unparseable number is a loud 400, never a silently dropped filter | 100 rows |
| GET /v1/search | Unified search over trend titles + keywords; ?q=. On a miss, returns the closest tracked titles — no naked negatives | 25 rows each — every tier |
| GET /v1/kill-wall | Trends we told people to skip, newest first | yes, all of it |
| GET /v1/proven-offers | Advertisers still paying to run the same ads months later, with the price band and newest listings from their storefront; ?min_days=&limit=&offset=. Every ad carries its Meta Ad Library link. Not a verdict — see the caveat on every response | 100 rows |
| GET /v1/momentum | Splits the already-exploding half by whether the move is still running; ?class=confirmed|yearly_only|quarter_only and ?level=trend|keyword. Every class ships its backtested repeat rate, its lift over the base rate, and the validation population — see below. level=keyword returns the raw signal with no verdict, evidence or kill test attached, and says so in meta.scope | 100 rows |
| GET /v1/shortlist | The trends that clear every bar we can measure, with the funnel that produced them; ?min_volume=&min_cpc=&max_difficulty=. A sequence of filters, not a score | 100 rows |
| GET /v1/collapsing | Demand falling hard enough to be worth avoiding, each with its curve | 100 rows |
| GET /v1/founding-seats | How many of the 100 founding seats are actually taken, counted from issued keys | yes |
| GET /v1/lanes | Per-lane counts plus the lane × next-action matrix, over the whole index including the trends we have not labelled. Every number the dashboard shows about filtering comes from here rather than being typed into the page. | free |
Verdict legend
- Qualified
- Demand, buyer and margin gates all cleared. Requires evidence we cannot collect without an owner, so this bucket is usually empty — and we say so rather than filling it.
- Early signal
- Buyers look plausible but are not yet confirmed.
- Watch
- Traffic is real and moving; nobody has shown us money yet. Most of the board sits here.
- Won't pay
- Killed before it could eat a test budget. The reason is on the card.
- Unknown
- On the board, not yet gated. Not a judgement — an admission.
Kill test. The cheapest thing that would prove an idea wrong — stated as a cost and a number of hours, e.g. $40 · 3h. It means "spend this to falsify it", not "delete this".
Snapshot. One SERP observation of one keyword on one date. N snapshots is how many times we have looked, not how many results there are.
Paging
?limit= caps rows per request — 100 free, 500 with a key.
?offset= pages through the full result set and is free: the
whole index is reachable without a key. It was gated once; withholding rows turned out to be
the laziest gate we could have picked, so it is gone. Free offsets are capped at 5,000 rows
in, past which you want the CSV export. List responses carry total and
has_more so you never have to guess whether you have reached the end.
Authentication
Send X-TrendGoblin-Key. No key is the free tier. No account either — these endpoints do not know what an account is. A key we do
not recognise, or one that has been revoked, is a 401 — never a quiet downgrade
to free data, because a wrong key returning thin results with a 200 is
indistinguishable from the free tier working correctly.
Rate limits: 60 requests/minute without a key (per IP), 600/minute with one (per key), so
one customer cannot exhaust another. Over the limit is a 429 in the same JSON
envelope as everything else.
Momentum, and what we could not do
We went looking for a signal that flags a topic before it reads as exploding. We did not find one, and this section exists to say so rather than to sell the attempt.
Method: every priced keyword carries its own monthly search-volume series. We cut each series at a point in the past, computed candidate signals from only the months before the cut, then observed what the months after the cut actually did. Nothing is forecast — the future is observed. Held out at 3, 6 and 12 months across 5,185 non-overlapping cut points from 516 keywords with 85–104 months of history each.
| Signal | Kept climbing over the next 6mo | vs base rate |
|---|---|---|
| Base rate (any trend) | 6.4% | — |
| Up 100%+ on the year (what an explosion product ranks on) | 23.4% | 3.7x |
| Up on the year AND last quarter 2x the nine months before it | 39.1% | 6.1x |
| Up on the year, quarter has not followed | 18.0% | 2.8x |
| Quarter broke, year not yet up 100% (the "early" idea) | 6.0% | 0.94x |
That last row is the negative result. A quarter breaking away while the year is
still quiet predicted explosions at 0.94x the base rate — worse than picking at random. So
there is no early-warning class in this product, and quarter_only ships with a
null rate and a warning attached rather than a claim.
What the quarter break does do is split the already-exploding list roughly in half by whether the move is still running: 39% against 18%. A yearly percentage cannot tell those apart, because it reads the same for both.
Split-half. Every threshold above — the 2x, the +100%, the conjunction itself — was chosen after seeing results on all 516 validation keywords, which is in-sample selection. Splitting those keywords into two halves by hash and re-running gives 33.8% and 44.3% (lift 5.62x and 6.53x), against 20.5% and 26.1% for the year-only signal on the same halves. The effect survives the split, so the honest figure is the range 34–44% rather than the point estimate.
Caveats that travel with the number. The 516 validation keywords are 1% of the corpus and were not sampled to represent it; the signal is applied to keywords it was not validated on. Observations within one keyword are autocorrelated, though precision averaged per keyword (38.1%) tracks the raw figure. And a backtested rate describes a population, not an individual keyword — 39% of a group repeated, which is not a 39% chance for the row you are looking at.
Honesty contract
- Free tier is real. No credit card, and no daily quota to burn — row caps are per request, and the only ceiling is a rate limit of 60 requests a minute per IP, counted per Cloudflare location rather than globally. In practice that means bursts are tolerated more readily than the number suggests; we would rather state the mechanism than a round number that is tidier than the truth. This API needs no account at all; the dashboard at /app does, and it is the only thing on this site behind a signup.
- We report replica age.
meta.replica_age_hourson every call. If it's stale, you'll know. - The index is young. Live since September 2026, accruing daily. We never imply depth we don't have.
- Errors roast the request, not you:
{"ok":false,"error":{...},"goblin":"That trend goblin'd away."}
Paid
Goblin Pro is $29/mo — first 100 subscribers keep $19/mo, locked forever.
Full history, higher limits, unlimited tracked trends, and CSV export at 500 rows a call instead of 100. The CSV format itself is free — only the row cap is tiered. Key goes in the X-TrendGoblin-Key header.
Billing switches on at launch; the price is on this page. This API needs neither an account nor a key. The dashboard needs a free account, and that is the only thing here behind a signup.