TikTok Shop Hot Products ranked a MagSafe-compatible magnetic phone case SKU at #1 as of 2026-08-12T06:01:42Z. That board has no keyword time series, so the next step is to score magnetic phone case on Amazon, Google Shopping, Google Search, and YouTube from Python. On the 2026-08-12 pull, Amazon sat at score 29.2 with volume 15,677 on 2026-07-31 (+7.35% over 30D, -18.44% over 3M, -64.35% over 12M). Google Shopping sat at 12.0 on 2026-08-08 (+71.43% over 7D from 7.0 on 2026-08-01, -61.29% over 3M). Google Search sat at 12.0 on 2026-08-08 (0.0% over 7D, -62.5% over 3M). YouTube sat at 50.0 on 2026-08-08 (+100.0% over 7D from 25.0, +8.7% over 3M). TikTok keyword series returned no_data. One Bearer POST, four sources, double-parsed JSON.

Shared Python client

Reuse the same helper as the Python Trends API integration and the Google Sheets Trends API monitor. requests, Bearer auth, second json.loads on body.

import json
import os
import requests

API_URL = "https://api.trendsapi.ai/api"
API_KEY = os.environ["TRENDSAPI_API_KEY"]

def trends_api(payload):
    res = requests.post(
        API_URL,
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json",
        },
        json=payload,
        timeout=60,
    )
    res.raise_for_status()
    envelope = res.json()
    # body is a JSON string; parse it a second time
    return json.loads(envelope["body"])

Free tier is 100 successful requests per month. Starter 5,000. Pro 25,000. Business 100,000. Only HTTP 200 counts.

Step 1: read the live board

get_top_trends needs a type and no keyword. Limit 25 returned the MagSafe magnetic phone case at rank 1, a leopard print phone case at rank 2, striped slip-on sandals at rank 3, and a blackhead remover pore vacuum at rank 4.

board = trends_api({
    "mode": "get_top_trends",
    "type": "TikTok Shop Hot Products",
    "limit": 25,
})
print(board["as_of_ts"], board["data"][0])

Normalize the long SKU title to magnetic phone case. Keep rank 1 and the as_of_ts 2026-08-12T06:01:42Z in the output row for audit. Marketplace context from Amazon Best Sellers Top Rated on the same session window (as_of_ts 2026-08-10T04:01:35Z) led with AA batteries, AAA batteries, and Crocs Classic Clog at ranks 1 through 3, then microfiber sheets and essence Lash Princess mascara lower in the top 10. None of those titles are MagSafe cases, so the magnetic case signal is social-commerce led rather than Amazon bestseller led. Store board type, offset 0, and limit 25 beside the rank so a later pull can prove the same feed.

Step 2: Amazon growth and volume

Amazon is the absolute-volume anchor. Prefer monthly presets. On this pull, 7D and 14D returned collapsed_range. Amazon source notes live at Amazon trends.

amazon = trends_api({
    "mode": "get_growth",
    "source": "amazon",
    "keyword": "magnetic phone case",
    "percent_growth": ["7D", "14D", "30D", "3M", "6M", "12M"],
})
Period Status Recent date Score Volume Growth
7D collapsed_range n/a n/a n/a n/a
14D collapsed_range n/a n/a n/a n/a
30D success 2026-07-31 29.2 15,677 +7.35%
3M success 2026-07-31 29.2 15,677 -18.44%
6M success 2026-07-31 29.2 15,677 -52.9%
12M success 2026-07-31 29.2 15,677 -64.35%

Baseline scores and volumes tell the same story: 27.2 / 14,588 on 2026-06-30, 35.8 / 19,199 on 2026-04-30, 62.0 / 33,236 on 2026-01-31, and 81.9 / 43,959 on 2025-07-31. Volume growth was +7.47% (30D), -18.34% (3M), -52.83% (6M), and -64.34% (12M), within 0.2 points of score growth on each successful period. Metadata on the Amazon growth call reported 49 total data points with 5 calculations attempted and all_successful false because of the two collapsed short windows. The short Amazon rebound sits on a steep year-long decline.

Step 3: Shopping, Search, and YouTube

Call each source separately. Shopping, Search, and YouTube tip on 2026-08-08 for this pull. Shopping field notes live at Google Shopping trends.

for source, periods in [
    ("google shopping", ["7D", "14D", "30D", "3M", "6M", "12M"]),
    ("google search", ["7D", "14D", "30D", "3M", "6M", "12M"]),
    ("youtube", ["7D", "14D", "30D", "3M", "6M", "12M"]),
]:
    body = trends_api({
        "mode": "get_growth",
        "source": source,
        "keyword": "magnetic phone case",
        "percent_growth": periods,
    })
    print(source, body["results"])
Source Recent date Score 7D 14D 30D 3M 6M 12M
google shopping 2026-08-08 12.0 +71.43% 0.0% 0.0% -61.29% -74.47% -79.31%
google search 2026-08-08 12.0 0.0% -7.69% -20.0% -62.5% -33.33% -20.0%
youtube 2026-08-08 50.0 +100.0% +13.64% 0.0% +8.7% -9.09% -12.28%

Shopping 7D baseline was 7.0 on 2026-08-01. Shopping 14D and 30D baselines were both 12.0 (flat). Longer Shopping windows remain deep red: 31.0 on 2026-05-09 (3M), 47.0 on 2026-02-07 (6M), and 58.0 on 2025-08-09 (12M). Search baselines were 12.0 on 2026-08-01 (7D, flat), 13.0 on 2026-07-25 (14D), 15.0 on 2026-07-11 (30D), 32.0 on 2026-05-09 (3M), 18.0 on 2026-02-07 (6M), and 15.0 on 2025-08-09 (12M). YouTube baselines were 25.0 on 2026-08-01 (7D), 44.0 on 2026-07-25 (14D), 50.0 on 2026-07-11 (30D, flat), 46.0 on 2026-05-09 (3M), 55.0 on 2026-02-07 (6M), and 57.0 on 2025-08-09 (12M). The short YouTube and Shopping bounce sits against weak Search and a year-down Amazon volume level.

Step 4: TikTok keyword series is a separate signal

try:
    tiktok = trends_api({
        "mode": "get_growth",
        "source": "tiktok",
        "keyword": "magnetic phone case",
        "percent_growth": ["7D", "14D", "30D"],
    })
except Exception as exc:
    tiktok = {"error": str(exc)}

On 2026-08-12 the TikTok keyword series returned no_data for magnetic phone case. That does not contradict TikTok Shop Hot Products rank 1. The board is a live SKU ranking. The keyword series is a separate hashtag and search history. Keep both fields in the scorecard: tiktok_shop_rank=1 and tiktok_keyword=no_data.

Step 5: Amazon history for level checks

series = trends_api({
    "mode": "get_time_series",
    "source": "amazon",
    "keyword": "magnetic phone case",
})
print(series[-1], max(series, key=lambda p: p["value"]))

Amazon monthly history for magnetic phone case peaks at score 100.0 with volume 53,642 on 2025-04-30. Nearby highs were 90.8 / 48,733 on 2025-06-30, 90.1 / 48,356 on 2025-05-31, and 90.8 / 48,681 on 2024-01-31. Earlier peaks include 83.6 / 44,866 on 2023-12-31 and 81.9 / 43,959 on 2025-07-31. The 2026 path falls hard: 62.0 / 33,236 on 2026-01-31, 35.8 / 19,199 on 2026-04-30, 27.2 / 14,588 on 2026-06-30, then 29.2 / 15,677 on 2026-07-31. Early series points include 25.9 / 13,903 on 2022-07-31 and 41.1 / 22,048 on 2022-12-31, so the category has multi-year Amazon coverage for threshold logic. The 30D lift from June is real, but the tip remains far below the 2025 peak.

Put the scorecard in one function

def score_magnetic_phone_case():
    board = trends_api({
        "mode": "get_top_trends",
        "type": "TikTok Shop Hot Products",
        "limit": 5,
    })
    rank = next(
        (row[0] for row in board["data"] if "magnetic" in row[1].lower() and "case" in row[1].lower()),
        None,
    )
    sources = ["amazon", "google shopping", "google search", "youtube"]
    growth = {
        src: trends_api({
            "mode": "get_growth",
            "source": src,
            "keyword": "magnetic phone case",
            "percent_growth": ["30D", "3M", "12M"],
        })
        for src in sources
    }
    return {
        "as_of_ts": board["as_of_ts"],
        "tiktok_shop_rank": rank,
        "tiktok_keyword": "no_data",
        "growth": growth,
    }

Read the scorecard as three layers. Layer one is TikTok Shop rank 1 at 2026-08-12T06:01:42Z with TikTok keyword no_data. Layer two is the short bounce: Shopping +71.43% over 7D, YouTube +100.0% over 7D, Amazon +7.35% over 30D. Layer three is the long fade: Amazon -64.35% over 12M from 81.9, Shopping -79.31% over 12M from 58.0, Search -20.0% over 12M from 15.0. A buy decision that only reads rank 1 is incomplete. A buy decision that only reads 12M is also incomplete. Keep all three layers in one JSON object and threshold on Amazon volume plus at least one short-window source.

For always-on MagSafe and power bank grids without Python, pipe the same get_growth calls into Sheets with the Google Sheets Trends API Apps Script client. For broader demand framing across categories, see the demand sensing API use-case page.