To find public TikTok videos mentioning a brand and containing explicit advertising language, collect results for several search queries, extract captions, and flag marker words. The result is a CSV of links and available metrics—a queue for human review, not an automated determination of compliance.
This process can help an agency compare a campaign with its brief or an in-house team maintain a list of public mentions. It organizes search results and preserves the signals an analyst can use to decide which videos to open and examine.
What should you look for in a video?
For an advertising review, the important questions are whether the creator has a connection to the brand and how that connection is disclosed alongside a recommendation. The FTC’s influencer guidance explains that a material connection may be financial, professional, personal, or family-related, and that a disclosure should be clear and understandable. For video endorsements, the FTC says the disclosure should appear in the video itself, not only in the description. A caption is therefore useful for sorting, but by itself it cannot show what viewers saw on screen or heard in the audio.
This script has a narrower purpose: find videos in returned search results whose captions contain brand phrases and possible markers such as “advertising,” “sponsor,” or “partnership.” Adapt the vocabulary to the campaign’s language and terminology. If a marker does not appear in the caption, open the video and inspect its contents: a text match does not establish whether the video itself contains a disclosure.
How do you turn search results into a review queue?
Prepare a short list of queries: the brand name, campaign name, and common spellings of the product name. Run each query separately and save the query text alongside the results. This lets the team see which query found a video and repeat the collection if needed.


For collection, use the jsonscraper TikTok Scraper API. The documented GET endpoint /searchVideo is hosted at https://tiktok.evelode.com and accepts the parameters keyword, count, date_posted, sort_by, region, and cursor. In the observed response, TikTok data contained videos under search_item_list[].aweme_info; aweme_list could be empty. The parser below checks both locations.
Pass the key in the license_key parameter. Store it in an environment variable, not in the script or repository. The TikTok endpoint documentation lists the search parameter names; use the returned cursor to request the next page. Record the number of objects processed and the search query itself: pagination lets you continue through the results, but does not by itself establish that the collection is complete.
A minimal Python example
The script makes one request for each phrase, collects both documented result formats, removes duplicates by video ID, flags words in the description, and writes a CSV. Install requests with python -m pip install requests, set JSONSCRAPER_TIKTOK_LICENSE_KEY in the environment, and run the file. The example works with Python 3.8 and later.
import csv
import os
import sys
import requests
BASE_URL = "https://tiktok.evelode.com/searchVideo"
KEY = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
if not KEY:
raise SystemExit("Set JSONSCRAPER_TIKTOK_LICENSE_KEY first")
QUERIES = ["Example Brand", "Example Product", "Example Campaign"]
MARKERS = ("#реклама", "реклама", "спонсор", "партнерство", "партнёрство", "#ad", "sponsored")
def videos_from(payload):
data = payload.get("tiktok") or {}
videos = data.get("aweme_list") or []
if not videos:
videos = [
item.get("aweme_info")
for item in (data.get("search_item_list") or [])
if isinstance(item, dict) and isinstance(item.get("aweme_info"), dict)
]
return [video for video in videos if isinstance(video, dict)]
rows = {}
for query in QUERIES:
response = requests.get(
BASE_URL,
params={"keyword": query, "count": 20, "date_posted": "this-month", "license_key": KEY},
timeout=30,
)
response.raise_for_status()
payload = response.json()
if payload.get("status") != "ok":
print("Unexpected API status for query:", query, file=sys.stderr)
continue
for video in videos_from(payload):
video_id = video.get("aweme_id")
if not video_id:
continue
author = video.get("author") or {}
stats = video.get("statistics") or {}
caption = video.get("desc") or ""
matched = [word for word in MARKERS if word in caption.casefold()]
row = rows.setdefault(str(video_id), {
"video_id": str(video_id),
"url": video.get("share_url") or "",
"author": author.get("unique_id") or author.get("nickname") or "",
"caption": caption,
"queries": set(),
"disclosure_markers": set(),
"play_count": stats.get("play_count"),
"digg_count": stats.get("digg_count"),
"comment_count": stats.get("comment_count"),
"review_status": "manual_review",
})
row["queries"].add(query)
row["disclosure_markers"].update(matched)
with open("tiktok_disclosure_review.csv", "w", newline="", encoding="utf-8-sig") as file:
fields = ["video_id", "url", "author", "caption", "queries", "disclosure_markers",
"play_count", "digg_count", "comment_count", "review_status"]
writer = csv.DictWriter(file, fieldnames=fields)
writer.writeheader()
for row in rows.values():
row["queries"] = " | ".join(sorted(row["queries"]))
row["disclosure_markers"] = " | ".join(sorted(row["disclosure_markers"]))
writer.writerow(row)
print("Saved", len(rows), "unique returned videos")
Before saving the code, check the external response status and then inspect the data under tiktok. The normalizer reads both video locations. To request the next page, pass the returned cursor into the next request unchanged; this minimal example deliberately makes only one request per query.
What will the CSV show?
Each row connects the video ID and link, the available creator identifier, caption, search phrases, and matching markers. If the response includes view, like, and comment counts, they are saved as context for prioritizing reviews. These fields may be absent; the script leaves them blank rather than substituting zeros.
Next, open the video, check whether a disclosure appears in the video and is noticeable, and record the result using agreed categories, such as “found,” “needs further review,” or “not found during review.” The code only searches the caption for exact text markers; it does not inspect images or audio and does not determine compliance.
For a recurring process, schedule the collection, record the request time, and save the original JSON alongside the CSV. Limit the query list to necessary phrases and set a retention period for collected data. The jsonscraper responsible data collection policy advises reasonable request frequency, data minimization, and reviewing AI results before taking further action.
The result is a reproducible queue of public videos for manual review of advertising disclosures: search matches and available metrics help determine what to open first, while assessment of the video itself remains with the reviewer. Check parameter names in the TikTok API documentation, and find product details on the TikTok Scraper API page.