Target costume is not following the Halloween calendar. get_growth on Google Search for the week of 2026-08-29 returned score 100.0 against a 7D baseline of 2.0, growth +4,900 percent. Prior late-October peaks in the same series never cleared 14. Google Shopping hit 93.0 vs 6.0 (+1,450 percent). The generic keyword halloween costume only reached Search 23.0 and Shopping 10.0. On the live Google Trends board at 2026-09-01T10:01:38Z, target costume sat at rank 17. A demand job that waits for October would have missed the week.

What did the live Google Trends board show on 2026-09-01?

get_top_trends with type Google Trends, limit 25, as_of 2026-09-01T10:01:38Z:

rank keyword
1 dolly parton
2 tim curry
3 nepal
4 lunar eclipse
17 target costume

Rank 17 is a live board token, not a weekly score. The 7D rank_change sort on the same board returned only 2 movers against baseline 2026-08-25T02:01:58Z: lil durk +66 (rank 94 vs 160) and google docs +3 (rank 44 vs 47). target costume was not in that mover list, which means it was already high enough on 2026-08-25 that a 7D rank delta did not fire. Pair the board timestamp with get_growth. Do not treat absence from rank_change as absence of a weekly spike.

Source fields for this board are documented on Google Trends. The demand-sensing loop that stores board rank plus growth is on Demand sensing API.

How far above the Halloween calendar is target costume search?

get_time_series on Google Search, keyword target costume, weekly points. Halloween 2026 is 2026-10-31, eight weeks after the 2026-08-29 tip week.

week score
2021-10-30 14
2022-10-29 11
2023-10-28 9
2024-11-02 10
2025-11-01 14
2026-08-22 2
2026-08-29 100

The 2026-08-29 week is the series peak at 100. Every prior Halloween-adjacent peak in this pull stayed at or below 14. Weeks from 2026-08-01 through 2026-08-15 were 1, 1, then 2. get_growth windows vs that 100.0 tip:

period baseline date baseline score growth
7D 2026-08-22 2.0 +4,900%
14D 2026-08-15 2.0 +4,900%
30D 2026-08-01 1.0 +9,900%
3M 2026-05-30 1.0 +9,900%
12M 2025-08-30 1.0 +9,900%

Those percent figures are real point-to-point math against a 1.0 or 2.0 baseline. They are not a quality warning. The finding is the 100 vs 14 gap against every prior October, not the 9,900 percent label.

Did Shopping and YouTube move with Search?

Yes on Shopping. Mixed on YouTube.

Google Shopping target costume, week 2026-08-29, score 93.0 vs 6.0 on 2026-08-22, 7D growth +1,450 percent. 14D vs 8.0 on 2026-08-15 was +1,062.5 percent. 3M vs 7.0 on 2026-05-30 was +1,228.57 percent. The 30D and 12M Shopping windows baselined at 0.0 and returned growth 999999. Print 93.0 vs 0.0. Do not store 999999.

YouTube target costume scored 100.0 vs 2.0 on 2026-08-22, 7D +4,900 percent. The 14D, 30D, and 3M YouTube windows baselined at 0.0 with growth 999999 and a low-quality warning (over 90 percent zeros). The 7D move is usable. The longer YouTube windows are not.

Google News target costume scored 100.0 vs 4.0 on 2026-08-22, 7D +2,400 percent. 14D was the same 100.0 vs 4.0. 30D baselined at 0.0 with 999999 and the same low-quality warning. News coverage moved with Search. Treat the 100.0 News score as a coverage spike, not as purchase intent.

POST https://api.trendsapi.ai/api
Authorization: Bearer <api_key>
Content-Type: application/json

{"mode":"get_growth","source":"google shopping","keyword":"target costume","percent_growth":["7D","14D","30D","3M"]}
import json
import os
import urllib.request

payload = {
    "mode": "get_growth",
    "source": "google shopping",
    "keyword": "target costume",
    "percent_growth": ["7D", "14D", "30D", "3M"],
}
req = urllib.request.Request(
    "https://api.trendsapi.ai/api",
    data=json.dumps(payload).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {os.environ['TRENDSAPI_API_KEY']}",
        "Content-Type": "application/json",
    },
    method="POST",
)
with urllib.request.urlopen(req, timeout=60) as resp:
    envelope = json.loads(resp.read().decode("utf-8"))
# body is a JSON string; parse it a second time
body = json.loads(envelope["body"])
for row in body["results"]:
    if row.get("status") == "success" and row.get("baseline_value") == 0:
        print(row["period"], "raw", row["recent_value"], "vs", 0)
        continue
    print(row)

Was the spike category-wide or Target-specific?

Target-specific. Control keywords on the same 2026-08-29 Search week:

keyword Search score Search 7D Shopping score Shopping 7D
target costume 100.0 +4,900% vs 2.0 93.0 +1,450% vs 6.0
halloween costume 23.0 +155.56% vs 9.0 10.0 +42.86% vs 7.0
spirit halloween 15.0 +15.38% vs 13.0 11.0 +10.0% vs 10.0

halloween costume Search 14D was +228.57 percent vs 7.0, 30D +360 percent vs 5.0, 12M +109.09 percent vs 11.0 on 2025-08-30. That is the normal early-season ramp. Shopping 12M for halloween costume was -50.0 percent vs 20.0 on 2025-08-30, so purchase-intent for the generic term is behind last year's late-August week.

spirit halloween Search 14D was -6.25 percent vs 16.0. 30D +66.67 percent vs 9.0. 12M -6.25 percent vs 16.0. Shopping 30D +120 percent vs 5.0, 3M +450 percent vs 2.0. The specialty retailer is ramping. It is not at 100.

A pipeline that alerts on halloween costume Search crossing 20 would have fired (23.0). It would have missed that target costume Search is at the top of its own 5-year range eight weeks early. Watchlist the retailer token and the category token as separate rows. The product-research layout for that split is on ecommerce product research pipeline.

What did Amazon, TikTok, and Reddit return?

Keyword target costume on amazon returned 404 no_data. Same 404 on tiktok and reddit. Absence is a finding. Do not copy halloween costume Amazon volume onto the target costume row.

amazon halloween costume is monthly. 7D returned collapsed_range. Tip month 2026-07-31 scored 0.8 with volume 253,038 vs June 2026-06-30 at 0.4 / 123,495 (+100 percent score, +104.9 percent volume). 3M vs 2026-04-30 (0.2 / 68,583) was +300 percent. 12M vs 2025-07-31 (0.9 / 279,302) was -11.11 percent score and -9.4 percent volume. That Amazon month ends a full month before the 2026-08-29 Search spike, so it cannot confirm or deny the Target-specific week.

How to snapshot this watchlist from Python

Three Search keywords plus two Shopping keywords is 5 get_growth calls. Add one get_top_trends Google Trends board for 6. Free tier is 100 successful 200s per month. A daily job is about 180 before retries and blows the cap. A Monday job is about 24.

import json
import os
import urllib.request

API = "https://api.trendsapi.ai/api"
KEY = os.environ["TRENDSAPI_API_KEY"]


def post(payload: dict) -> dict:
    req = urllib.request.Request(
        API,
        data=json.dumps(payload).encode("utf-8"),
        headers={
            "Authorization": f"Bearer {KEY}",
            "Content-Type": "application/json",
        },
        method="POST",
    )
    with urllib.request.urlopen(req, timeout=60) as resp:
        envelope = json.loads(resp.read().decode("utf-8"))
    if envelope.get("statusCode") != 200:
        raise RuntimeError(envelope)
    return json.loads(envelope["body"])


board = post({"mode": "get_top_trends", "type": "Google Trends", "limit": 25})
rows = []
for keyword, source in [
    ("target costume", "google search"),
    ("target costume", "google shopping"),
    ("halloween costume", "google search"),
    ("halloween costume", "google shopping"),
    ("spirit halloween", "google search"),
]:
    body = post(
        {
            "mode": "get_growth",
            "source": source,
            "keyword": keyword,
            "percent_growth": ["7D", "30D", "12M"],
        }
    )
    rows.append((keyword, source, body.get("results")))
print(board.get("as_of_ts"), board.get("count"), len(rows))

Call one source per request. Multi-source get_growth can 504. Skip 999999 growth when baseline_value is 0.0.

How to put the snapshot on a Prefect schedule

Wrap post in a Prefect task with retries=2 and deploy 0 10 * * 1. The flow, secret block, and quota math live on Prefect Trends API. Store as_of_ts from the board next to each growth recent_date. The 2026-09-01 board and the 2026-08-29 Search week are not the same clock.