Het salesteam krijgt via verschillende kanalen steeds dezelfde vraag: welke problemen proberen potentiële klanten al op te lossen? Handmatig zoeken op TikTok levert allerlei video’s op, maar het is lastig om de zoektocht een week later te herhalen, de resultaten te vergelijken en uit te leggen waarom een bepaalde video in het rapport staat. Voor een kleinschalig onderzoek kun je openbare zoekresultaten voor enkele specifieke zoekopdrachten omzetten in een reproduceerbare gegevensstroom: sla het oorspronkelijke antwoord op, haal de velden voor video en maker eruit, verwijder dubbele resultaten en beoordeel afzonderlijk de signalen van koop- of productkeuze-intentie.

Hieronder staat een werkbare Python-aanpak met TikTok Scraper API van jsonscraper. Deze is bijvoorbeeld geschikt voor een dienst voor videobewerking die wil weten hoe makers problemen met ondertiteling, sjablonen en export beschrijven. Het script verzamelt de geretourneerde zoekresultaten; vervolgens controleert een analist de classificatie en bepaalt welke formuleringen bruikbaar zijn voor onderzoek naar het publiek. Dit is een manier om observaties van openbare content te organiseren, geen automatische telling van alle gebruikers met koopintentie.
Het probleem: er zijn publieksvragen, maar het onderzoek is moeilijk te herhalen
Bij handmatig onderzoek gaat de context gemakkelijk verloren. De ene medewerker zoekt op ‘ondertiteling toevoegen’, een andere op ‘automatische ondertiteling voor Reels’ en een derde slaat alleen video’s op die diegene interessant vindt. In de uiteindelijke tabel lopen verschillende zoekopdrachten, datums, statistieken en selectiecriteria door elkaar. Wanneer een manager vraagt om de analyse te herhalen of twee weken te vergelijken, moet niet alleen worden achterhaald wat de resultaten waren, maar ook hoe de zoektocht precies verliep.
Het is nuttiger om vooraf de observatie-eenheid vast te leggen: een gevonden video met beschrijvingstekst, identificatiecode, link, maker en beschikbare openbare statistieken. Bij elke video worden de oorspronkelijke zoekopdracht en het tijdstip van verzamelen bewaard. Zo kun je afzonderlijk beantwoorden welke formuleringen voorkomen, welke problemen worden genoemd, welke video’s meer openbare reacties kregen en wat er tussen de opgeslagen momentopnamen is veranderd.
Neem als voorbeeld een bedrijf dat een hulpmiddel ontwikkelt voor ondertiteling en korte video’s. Het wil openbare video’s vinden waarin makers het expliciet hebben over handmatige transcriptie, fouten in spraakherkenning, timing van ondertitels of het voorbereiden van content voor meerdere platforms. Je moet een maker niet op basis van één video als ‘lead’ of ‘koper’ bestempelen: een onderzoeker kan content rangschikken op basis van waarneembare signalen en de conclusies daarna handmatig controleren.
De aanpak: zoeken, vastleggen, opschonen, beoordelen
De pijplijn bestaat uit vier stappen. Eerst stelt het team een kleine woordenlijst met zoekopdrachten samen, waarbij elke zoekopdracht aansluit op een specifieke publieksbehoefte. Daarna vraagt het script videozoekresultaten op en slaat het de volledige JSON-respons op. In de derde stap worden verschillende antwoordstructuren genormaliseerd naar één rij per video en dubbele resultaten op basis van de identificatiecode verwijderd. Tot slot kennen regels of een afzonderlijke AI-classificator een prioriteit toe voor handmatige controle, met behoud van de reden voor die beoordeling.
Door deze stappen te scheiden, is het proces reproduceerbaar. Met het ruwe antwoord kun je wijzigingen in velden of fouten bij het normaliseren onderzoeken. De genormaliseerde tabel is handig voor filteren en visualiseren. In een afzonderlijke beoordelingstabel kun je regels wijzigen zonder de API opnieuw aan te roepen, mits de opgeslagen gegevens geschikt zijn voor herverwerking en voldoen aan de bewaartermijn van het team.
Als uitgangspunt kun je zoekopdrachten gebruiken als ‘fouten in automatische ondertiteling’, ‘hoe voeg ik snel ondertiteling toe’ en ‘korte video’s monteren voor bedrijven’. Dit zijn slechts voorbeelden; pas de formuleringen aan de taal van het publiek en het product aan. Bewaar zoekopdrachten samen met de resultaten, want verschillende woorden leveren verschillende selecties op.
Wat TikTok Scraper API biedt
In de gepubliceerde documentatie van jsonscraper staat voor videozoekopdrachten de GET-route \/searchVideo op het basisadres https:\/\/tiktok.evelode.com. De verplichte parameter is keyword; de gedocumenteerde optionele parameters zijn onder meer count, cursor, region, date_posted, sort_by en cache_timeout. Zo accepteert sort_by de gedocumenteerde waarden most-liked, relevance en date-posted, en accepteert date_posted waarden zoals this-week of all-time. De exacte lijst met parameters en het doel van de route staan in de documentatie van TikTok API-eindpunten.
De sleutel wordt als queryparameter license_key doorgegeven. In het voorbeeld hieronder wordt deze uit de omgevingsvariabele JSONSCRAPER_TIKTOK_LICENSE_KEY gelezen, zodat het geheim niet in de code wordt opgeslagen of in logs verschijnt. Gebruik voor de authenticatie en parameterkeuze de actuele voorwaarden van je toegang; de pagina over TikTok Scraper API bevat een productbeschrijving en links naar een demo en documentatie.
Verwerk zoekresultaten op basis van hun structuur, niet op basis van de aanname dat er maar één array is. In een gecontroleerd voorbeeld gaf de API een status op het hoogste niveau en een object tiktok terug. Video’s kunnen staan in tiktok.aweme_list, terwijl zoekresultaten ook voorkomen in tiktok.search_item_list[].aweme_info. Controleer beide vormen. In gevonden objecten zijn, wanneer de velden aanwezig zijn, de video-ID, beschrijving, link, publicatietijd, makersinformatie en statistieken beschikbaar, zoals weergaven, likes, reacties en shares. Beschouw statistieken en velden als optioneel: de code mag geen fictieve nullen invullen wanneer een waarde ontbreekt.
Voor paginering van zoekresultaten wordt cursor gebruikt. Als het script de resultaten verder ophaalt, moet het de ontvangen waarde als een ondoorzichtig token voor het volgende verzoek doorgeven, in plaats van deze zelf te berekenen. Voor een eerste prototype is het verstandig om per zoekopdracht het verzamelen tot één pagina te beperken. Dat vereenvoudigt de controle en houdt de belasting voorspelbaar. Later kun je paginering toevoegen met een limiet aan het aantal pagina’s en bescherming tegen een cursor die steeds opnieuw terugkomt.
De omgeving voorbereiden
Het voorbeeld gebruikt Python 3.8 of nieuwer en de standaardbibliotheek. Stel de sleutel in als omgevingsvariabele, bijvoorbeeld in de shell op macOS of Linux:
export JSONSCRAPER_TIKTOK_LICENSE_KEY="uw_sleutel"
python tiktok_demand.py
In Windows PowerShell kun je de variabele als volgt instellen:
$env:JSONSCRAPER_TIKTOK_LICENSE_KEY="uw_sleutel"
python .\\tiktok_demand.py
Het script voert voor elk trefwoord een afzonderlijk verzoek uit. Het controleert HTTP-fouten, het JSON-antwoord en de status op het hoogste niveau, en haalt vervolgens objecten uit beide bevestigde arrayvarianten. Ruwe antwoorden worden regel voor regel opgeslagen in een JSONL-bestand: elke regel bevat de zoekopdracht, het observatietijdstip en de oorspronkelijke respons. Het tweede deel maakt een CSV met gestandaardiseerde velden. De sleutel staat niet in de code en de geheime waarde wordt niet afgedrukt.
Voorbeeld: zoekresultaten verzamelen en normaliseren
import csv
import json
import os
import time
from datetime import datetime, timezone
from pathlib import Path
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
from urllib.request import Request, urlopen
BASE_URL = "https:\/\/tiktok.evelode.com\/searchVideo"
QUERIES = [
"fouten in automatische ondertiteling",
"hoe voeg ik snel ondertiteling toe",
"korte video's monteren voor bedrijven",
]
def extract_videos(payload):
"""Ondersteunt beide waargenomen structuren van zoekresultaten."""
tiktok = payload.get("tiktok") or {}
videos = []
aweme_list = tiktok.get("aweme_list") or []
if isinstance(aweme_list, list):
videos.extend(item for item in aweme_list if isinstance(item, dict))
search_items = tiktok.get("search_item_list") or []
if isinstance(search_items, list):
for item in search_items:
if not isinstance(item, dict):
continue
video = item.get("aweme_info")
if isinstance(video, dict):
videos.append(video)
return videos
def fetch(query, license_key):
params = {
"keyword": query,
"count": 20,
"sort_by": "relevance",
"date_posted": "this-month",
"region": "US",
"license_key": license_key,
}
url = BASE_URL + "?" + urlencode(params)
request = Request(url, headers={"Accept": "application\\/json"})
try:
with urlopen(request, timeout=45) as response:
payload = json.loads(response.read().decode("utf-8"))
except HTTPError as exc:
raise RuntimeError("API retourneerde HTTP-status {}".format(exc.code)) from exc
except (URLError, TimeoutError, json.JSONDecodeError) as exc:
raise RuntimeError("API-verzoek kon niet worden uitgevoerd of geparseerd") from exc
if payload.get("status") != "ok":
raise RuntimeError("De API-responsstatus was niet ok")
return payload
def metric(statistics, key):
value = statistics.get(key)
return value if isinstance(value, (int, float)) else ""
def main():
license_key = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
if not license_key:
raise SystemExit("Stel JSONSCRAPER_TIKTOK_LICENSE_KEY in de omgeving in")
raw_path = Path("tiktok_raw.jsonl")
csv_path = Path("tiktok_videos.csv")
seen_ids = set()
rows = []
with raw_path.open("a", encoding="utf-8") as raw_file:
for query in QUERIES:
observed_at = datetime.now(timezone.utc).isoformat()
payload = fetch(query, license_key)
raw_file.write(json.dumps({
"query": query,
"observed_at": observed_at,
"response": payload,
}, ensure_ascii=False) + "\\n")
for video in extract_videos(payload):
video_id = video.get("aweme_id")
if not video_id or video_id in seen_ids:
continue
seen_ids.add(video_id)
author = video.get("author") or {}
stats = video.get("statistics") or {}
rows.append({
"query": query,
"observed_at": observed_at,
"video_id": video_id,
"created_at": video.get("create_time", ""),
"description": video.get("desc", ""),
"share_url": video.get("share_url", ""),
"author_username": author.get("unique_id", ""),
"author_nickname": author.get("nickname", ""),
"views": metric(stats, "play_count"),
"likes": metric(stats, "digg_count"),
"comments": metric(stats, "comment_count"),
"shares": metric(stats, "share_count"),
})
time.sleep(1)
columns = [
"query", "observed_at", "video_id", "created_at", "description",
"share_url", "author_username", "author_nickname", "views",
"likes", "comments", "shares",
]
with csv_path.open("w", newline="", encoding="utf-8") as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=columns)
writer.writeheader()
writer.writerows(rows)
print("{} unieke geretourneerde video's opgeslagen in {}".format(len(rows), csv_path))
if __name__ == "__main__":
main()
De waarde count is hier ingesteld als de gewenste omvang van de selectie per zoekopdracht. Het script gaat er niet van uit dat de API precies dat aantal elementen moet retourneren: het werkelijke aantal rijen is afhankelijk van de respons. De pauze tussen verzoeken is een eenvoudige maatregel om het tempo van de uitvoering te regelen, geen bewering over een limiet of vereiste van de dienst. Voeg voor een productieschema begrensde herhaalpogingen, foutmonitoring en regels voor een toegestane verzoekfrequentie toe, afgestemd op de voorwaarden van je abonnement.
De resulterende tabel lezen
In de CSV staat elke rij voor één unieke geretourneerde video die via een van de zoekopdrachten is gevonden. Het veld query geeft de herkomst van de vermelding aan, observed_at het tijdstip van de momentopname en video_id dient als sleutel voor het verwijderen van duplicaten. Met de beschrijving en link kan een analist de context controleren; openbare tellers helpen de respons op het moment van verzamelen te beoordelen. Gebruik voor langetermijnvergelijkingen afzonderlijke waarnemingen: overschrijf de statistiekgeschiedenis niet als je veranderingen wilt kunnen zien.
Tellers voor weergaven, likes, reacties en shares zijn momentopnamen van openbare statistieken die de API op het tijdstip van het verzoek retourneert. Ze kunnen in afzonderlijke objecten ontbreken; een lege waarde in de CSV betekent daarom dat het numerieke veld in de respons ontbrak. Dat is iets anders dan nul en moet bij het berekenen van totalen apart worden behandeld. Bovendien weerspiegelen de gevonden resultaten de selectie voor specifieke woorden, een regio, een tijdsfilter en verzoekparameters. Ze beschrijven de gevonden video’s, niet alle content of het volledige publiek van het platform.
Voor een eerste beoordeling van mogelijke relevantie kun je een transparante regelmatrix opstellen: overeenkomsten met probleemformuleringen, vermeldingen van een gebruikt hulpmiddel, vragen over prijs of vergelijking en concrete werkscenario’s. Bewaar afzonderlijke kenmerken en de reden voor de beoordeling in plaats van alleen een ondoorzichtige score. Een video met een vraag over de nauwkeurigheid van automatische transcriptie kan bijvoorbeeld de markering ‘controleren: kwaliteit wordt besproken’ krijgen; een video met algemene contenttips ‘lage inhoudelijke relevantie’.
AI inzetten zonder de rol van rechter aan het model over te laten
Wanneer je een selectie hebt verzameld, kan een model helpen beschrijvingen te labelen volgens een vooraf vastgelegd schema: probleem, genoemd hulpmiddel, toon van de vraag en aanwezigheid van een signaal dat iemand een product kiest. Geef het model alleen de benodigde velden door, bijvoorbeeld de beschrijvingstekst en de identificatiecode van de vermelding, en vraag om vaste JSON met labels en een korte motivering. Bewaar de versie van de instructie, het model en het resultaat bij de oorspronkelijke rij, zodat je de labels opnieuw kunt genereren of er steekproefsgewijs een menselijke controle op kunt uitvoeren.
Een bruikbare opdracht voor de classificator moet de uitvoer beperken tot waarneembare signalen. Vraag of de tekst een expliciet probleem met ondertiteling bevat, om een aanbeveling voor een hulpmiddel vraagt of een werkproces bespreekt. Voeg bij onvoldoende gegevens een categorie ‘onvoldoende context’ toe. Het model mag niet op basis van één openbare video de identiteit van de maker, diens koopintentie of demografische kenmerken afleiden. Het resultaat is een lijst onderwerpen voor analyse, geen lijst mensen voor automatisch contact.
Neem voor een beoordeling van de labelkwaliteit een willekeurige deelverzameling en ken handmatig dezelfde categorieën toe. Vergelijk de overeenstemming per label en bestudeer fouten: een model kan sarcasme bijvoorbeeld als klacht behandelen of educatief advies aanzien voor persoonlijke ervaring. Het aanpassen van de zoekwoordenlijst en instructie is vaak nuttiger dan het model meteen ingewikkelder te maken. Bewaar voor het rapport de oorspronkelijke teksten en links volgens het vastgestelde beleid voor opslag en toegang.
Automatisering volgens een schema en kwaliteitscontrole
Na een geslaagde handmatige uitvoering kun je het script volgens een schema laten draaien via cron, een taakplanner van een cloudplatform of een orkestrator zoals n8n. De praktische volgorde van stappen blijft hetzelfde: lees de zoekwoordenlijst, roep de API aan, controleer de status, sla het ruwe antwoord op, normaliseer de video’s, registreer nieuwe momentopnamen en maak een rapport. Geef de sleutel door via het geheimenbeheer van de uitvoeringsomgeving, niet via een spreadsheet, workflowtekst of foutmelding.
Vier controles zijn nuttig voor een geautomatiseerde taak. Ten eerste: is het verzoek geslaagd en is de respons JSON? Ten tweede: is de status op het hoogste niveau gelijk aan de verwachte waarde? Ten derde: kan de verwerker beide structuren van zoekresultaten aan en gaat hij goed om met ontbrekende velden? Ten vierde: worden het aantal nieuwe unieke video’s en het aantal fouten in het logboek opgenomen? Als er plotseling geen resultaten zijn, moet het rapport een lege selectie als status van de uitvoering tonen, in plaats van deze zonder toelichting te vermengen met een normaal geslaagd rapport.
Voeg paginering pas toe nadat de eerste pagina is gecontroleerd. Voor de zoekroute vermeldt de documentatie de parameter cursor; bewaar het ontvangen token en geef het zonder wijzigingen door in het volgende verzoek. Stel een maximumaantal pagina’s per zoekterm in en stop de lus wanneer er geen nieuwe elementen zijn, geen volgende cursor beschikbaar is of een al verwerkte cursor opnieuw verschijnt. Zo blijven de looptijd en de omvang van de verzameling beheersbaar. Dat er een cursor is, maakt het mogelijk de resultaten verder op te vragen, maar betekent niet dat alle publicaties worden gevonden.
Een nieuwe uitvoering op dezelfde dag kan overlappende video’s opleveren. Gebruik daarom een stabiele video-ID als sleutel voor het verwijderen van duplicaten en bewaar de momentopnamen als afzonderlijke registraties met observatiedatum. Als je een overzicht nodig hebt, bouw dat dan op basis van de momentopnamen: zo kun je onderscheid maken tussen een video die voor het eerst is gevonden en een video die in meerdere zoekopdrachten voorkwam of later opnieuw is opgehaald.
Statistieken: wat je op een geldige manier kunt vergelijken
Voor operationele monitoring zijn het aantal unieke gevonden video’s per zoekopdracht, het aandeel video’s met een ingevulde beschrijving, de verdeling van beschikbare reacties en de frequentie van bepaalde thema’s nuttig. Leg bij het vergelijken van zoekopdrachten dezelfde parameters en uitvoeringsperiode vast. Als de ene uitvoering this-week gebruikt en de andere this-month, kan het verschil in volume door het tijdvenster worden verklaard. Zonder verdere analyse kun je dat dus niet als een verandering in interesse interpreteren.
Voor het vergelijken van statistieken van één video in de tijd zijn meerdere momentopnamen en een uniforme opslagstructuur nodig. Bewaar per datum de oorspronkelijke waarden zoals ze zijn ontvangen en bereken daarna het verschil tussen waarnemingen. Noem het verschil geen groei per dag als de werkelijke intervallen tussen uitvoeringen uiteenliepen. Zo helpt rangschikken op likes om opvallende video’s in de verzamelde selectie te vinden, maar meet het niet de commerciële effectiviteit van een maker of product.
Het eindrapport voor het marketingteam kan drie niveaus combineren: voorbeelden van publieksformuleringen met klikbare links, thematische groepen problemen en een kwantitatieve beschrijving van de verzamelde selectie. Vermeld bij elke conclusie het aantal waarnemingen, de zoekopdrachten en de verzamelperiode. Dat geeft managers context en stelt analisten in staat dezelfde filters op dezelfde brongegevens toe te passen.
Veelvoorkomende fouten en hoe je ze voorkomt
Een leeg veld als nul behandelen
Als statistieken of makersinformatie ontbreken, laat de code hierboven de cel leeg. Zo blijft het onderscheid behouden tussen een onbekende waarde en een gemeten nul. Stel voor analyses expliciet vast hoe je ontbrekende waarden verwerkt en vermeld hoeveel rijen bij een berekening zijn uitgesloten.
Aannemen dat een zoekopdracht altijd één array retourneert
In zoekresultaten komen zowel aweme_list als geneste elementen search_item_list[].aweme_info voor. De verwerker controleert beide vormen en negeert elementen van het verkeerde type. Als het schema verandert, helpen de opgeslagen ruwe antwoorden om de nieuwe locatie van de gegevens snel te vinden; met JSON-testbestanden kun je de oplossing controleren voordat de volgende uitvoering plaatsvindt.
Dezelfde video opnieuw als een afzonderlijk signaal tellen
Een video kan overeenkomen met meerdere zoekwoorden. In het voorbeeld wordt de video maar één keer in de uiteindelijke CSV opgenomen en geeft het zoekveld de eerste overeenkomst volgens de huidige volgorde aan. Als je alle verbanden tussen video en zoekopdracht wilt bewaren, gebruik dan een aparte koppeltabel of bewaar een lijst met zoekopdrachten per identificatiecode, in plaats van de herkomst van de vermelding te verwijderen.
Niet-vergelijkbare selecties vergelijken
Zoekwoord, regio, tijdsfilter, sortering en uitvoeringsdatum zijn van invloed op de selectie. Bewaar de parameters bij de respons en wijzig steeds maar één factor wanneer het onderzoek varianten vergelijkt. Zo kun je bepalen of een verandering in de resultaten samenhangt met de manier waarop de zoekresultaten worden weergegeven of met gewijzigde experimentinstellingen.
Correlatie presenteren als koopintentie
Videobeschrijvingen en openbare tellers geven aanwijzingen over content en publieksreacties. Op zichzelf laten ze niet zien wie klaar is om te kopen, of iemand een advertentie heeft gezien of wat het conversiepercentage is. Gebruik ze om hypotheses te formuleren, onderwerpen te toetsen en content voor te bereiden. Beoordeel de verkoopeffectiviteit aan de hand van je eigen campagnedata, afgestemd op dit onderzoek qua tijd en publiek.
De pijplijn uitbreiden
Wanneer de basisversie stabiel werkt, kun je een configuratiebestand toevoegen met zoekopdrachten en uitvoeringsparameters. Zo kun je de woordenlijst aanpassen zonder de Python-code te wijzigen. Een volgende stap is een koppeltabel voor zoekopdrachten en thematische clusters, zoals ‘herkenningskwaliteit’, ‘montagesnelheid’ en ‘export’. Het team moet die categorieën definiëren en aan de hand van voorbeelden controleren; de API retourneert zoekgegevens, maar de onderzoeker bepaalt de betekenisvolle indeling.
In plaats van CSV kun je voor opslag een relationele database gebruiken met tabellen voor uitvoeringen, video’s en statistiekmomentopnamen. Een unieke index op de video-ID voorkomt duplicaten in de catalogus, terwijl momentopnamen het mogelijk maken veranderingen in beschikbare tellers te volgen. Bewaar de observatiedatum in UTC en de versie van de normalisator. Als de extractielogica verandert, kun je het gearchiveerde JSONL-bestand opnieuw verwerken en de resultaten vergelijken.
In n8n kan de verzameling volgens een schema worden uitgevoerd, terwijl de normalisatiecode in een afzonderlijke Python-service of node draait, mits de gekozen omgeving de benodigde bewerkingen ondersteunt. Voor de eerste fase is een model niet noodzakelijk: zorg eerst voor een stabiele gegevensverzameling en meet daarna hoeveel tijd handmatige classificatie kost en welke categorieën terugkeren. AI is zinvol wanneer het concreet, repetitief werk vermindert en de labels controleerbaar zijn.
Als de onderzoeksvraag niet draait om zoeken op formuleringen, maar om het regelmatig volgen van een specifiek account, bevat de officiële documentatie een afzonderlijke route \/getUserFeed met de parameters query, max_cursor en count. Voor een hashtag is er \/getHashtagFeed met de parameter cursor. Dit zijn verschillende verzamelmethoden: kies een endpoint op basis van de onderzoeksvraag en vervang niet het ene type selectie door het andere.
Het resultaat: een herhaalbare selectie in plaats van een verzameling bladwijzers
Na de uitvoering heeft het team twee nuttige resultaten: een archief met oorspronkelijke antwoorden en een tabel met unieke video’s, de zoekterm, observatiedatum, link, beschrijving en beschikbare statistieken. Daarmee kun je publieksvragen handmatig groeperen, teksten gecontroleerd classificeren, een wekelijkse samenvatting maken en herhaalde momentopnamen vergelijken. De code verwerkt verzoekfouten expliciet, controleert de status op het hoogste niveau, herkent twee structuren van zoekresultaten en bewaart ontbrekende statistieken als ontbrekende waarden.
Het praktische voordeel voor het team is een transparantere beslissing over welke problemen het in interviews, op een landingspagina of in een advertentieboodschap moet toetsen. Als het onderzoek een ander type gegevens vereist, wijzig dan de zoekopdrachten of gebruik de bijbehorende gedocumenteerde route. Raadpleeg de documentatie van TikTok API om parameters te controleren voordat je de pijplijn aanpast; productinformatie en de demo zijn te vinden op de pagina over TikTok Scraper API.
Deze aanpak beantwoordt de oorspronkelijke vraag: maak van zoeken op TikTok een reproduceerbaar onderzoeksproces. Het script verzamelt de specifieke geretourneerde video’s en bewaart de herkomst en momentopnamen. Een mens of controleerbare classificator zet de inhoud vervolgens om in hypotheses over de vraag. Het team krijgt zo een basis voor vervolgbeslissingen, zonder de grens tussen openbare contentsignalen en bevestigde verkoopresultaten uit het oog te verliezen.