En marknadsförare kan hitta en TikTok-video där skaparen diskuterar en relevant produkt, men det är svårare att gå från en sådan signal till en kontakt som går att verifiera: användarnamnet på TikTok kan skilja sig från det på IG, och profilen kan vara privat eller sakna en bekräftad koppling till personen. Ett praktiskt resultat är inte en automatisk lista med ”färdiga leads”, utan en kontrolltabell med ursprungsvideon, TikTok-skaparen, det förmodade IG-användarnamnet, API-svaret och en status för fortsatt granskning.
Nedan följer ett enkelt Python-flöde för uppgiften. Det söker efter offentliga videor med en nyckelfras, hämtar tillgängliga uppgifter om skaparen och kontrollerar IG-profiler endast när du redan har ett välgrundat användarnamn att kontrollera. API:et kan hämta profiluppgifter med ett användarnamn, men fastställer inte automatiskt att två konton tillhör samma person.
Vilket resultat är värt att automatisera?
Tänk dig ett företag som säljer utrustning för hemmakaffe och vill hitta skapare av offentliga videor om dryckestillredning. Manuell sökning är användbar för att först bekanta sig med innehållet, men vid upprepning är det svårt att hålla reda på vilken video som ledde till kontakten, var profilnamnet kom ifrån och exakt vad som kontrollerades.

Flödet delar upp arbetet i tre moment: söka efter videor på TikTok, spara observerade uppgifter och kontrollera den förmodade IG-profilen. Det gör att en analytiker kan öppna en enda CSV-fil och se ursprungskedjan för varje kandidat. Fälten för IG bör fyllas i först när användarnamnet har hittats i en offentlig profilbeskrivning eller skaparens länk, eller när en person har verifierat det med annat tillgängligt material.
Metoden passar en byrå, ett researchteam eller en intern marknadsförare som behöver en liten, reproducerbar lista för manuell kvalificering. Den bevarar sammanhanget kring fyndet utan att förvandla liknande namn till ett påstående om att kontona tillhör samma person.
Vilka fält kan hämtas?
TikToks dokumenterade endpoint /searchVideo kräver parametern keyword; även count, date_posted, sort_by, region och cursor finns tillgängliga. Observerade svar innehåller bland annat video-ID, beskrivning, publiceringsdatum, länk, uppgifter om skaparen och offentliga interaktionsmått. De faktiska fälten kan variera, så koden nedan läser värden på ett säkert sätt och använder tomma värden när de saknas.
För IG används i det här flödet den dokumenterade GET-endpointen /v1/user/by/username med parametern username. Svaret kan innehålla användarnamn, visningsnamn, privat- och verifieringsstatus, antal inlägg, följare och följningar samt biografi. Det här är uppgifter som en specialist kan granska och använda som underlag för ett beslut, inte ett betyg på skaparen.
Den officiella dokumentationen för TikTok API beskriver sökparametrarna, medan dokumentationen för IG API beskriver IGs metoder och parametrar. jsonscrapers inbyggda API-definitioner anger också endpoints, parameternamn och observerade svarsformat; kontrollerna som återges här gjordes den 25 oktober 2026.
Ställ in API-nycklar och kandidatlista
Spara API-nycklarna som miljövariabler: JSONSCRAPER_TIKTOK_LICENSE_KEY och JSONSCRAPER_INSTAGRAM_LICENSE_KEY. Lägg dem inte i källkoden, CSV-filen eller jobbens loggar. Installera biblioteket för HTTP-anrop med python -m pip install requests. Exemplet nedan är avsett för Python 3.8 och senare.
import csv
import os
import sys
from urllib.parse import urlencode
import requests
TIKTOK_KEY = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
INSTAGRAM_KEY = os.environ.get("JSONSCRAPER_INSTAGRAM_LICENSE_KEY")
if not TIKTOK_KEY or not INSTAGRAM_KEY:
sys.exit("Set JSONSCRAPER_TIKTOK_LICENSE_KEY and JSONSCRAPER_INSTAGRAM_LICENSE_KEY")
def get_json(base_url, path, params):
response = requests.get(
f"{base_url}{path}",
params=params,
timeout=30,
)
response.raise_for_status()
return response.json()
def extract_videos(payload):
"""Handle both observed TikTok search result locations."""
if payload.get("status") != "ok":
raise RuntimeError(f"TikTok API status: {payload.get('status')}")
tiktok = payload.get("tiktok") or {}
videos = list(tiktok.get("aweme_list") or [])
for item in tiktok.get("search_item_list") or []:
video = item.get("aweme_info")
if video:
videos.append(video)
unique = {}
for video in videos:
video_id = video.get("aweme_id")
if video_id:
unique[video_id] = video
return list(unique.values())
keyword = "домашний кофе"
tiktok_payload = get_json(
"https://tiktok.evelode.com",
"/searchVideo",
{
"license_key": TIKTOK_KEY,
"keyword": keyword,
"count": 20,
"date_posted": "this-month",
"sort_by": "relevance",
},
)
rows = []
for video in extract_videos(tiktok_payload):
author = video.get("author") or {}
stats = video.get("statistics") or {}
rows.append({
"tiktok_video_id": video.get("aweme_id", ""),
"tiktok_url": video.get("share_url", ""),
"video_description": video.get("desc", ""),
"created_at": video.get("create_time", ""),
"tiktok_username": author.get("unique_id", ""),
"tiktok_author_name": author.get("nickname", ""),
"tiktok_followers": author.get("follower_count", ""),
"views": stats.get("play_count", ""),
"likes": stats.get("digg_count", ""),
"instagram_username": "",
"instagram_status": "not checked",
"instagram_followers": "",
"instagram_is_private": "",
"manual_match_review": "required",
})
# Fyll den här ordboken endast med användarnamn som hittats separat
# och lagts till efter manuell kontroll av källan.
verified_instagram_usernames = {
# "tiktok_video_id": "instagram_username"
}
for row in rows:
username = verified_instagram_usernames.get(row["tiktok_video_id"])
if not username:
continue
ig_payload = get_json(
"https://ig.jsonscraper.com",
"/v1/user/by/username",
{
"license_key": INSTAGRAM_KEY,
"username": username,
},
)
if ig_payload.get("status") != "ok":
row["instagram_status"] = "api status: " + str(ig_payload.get("status"))
continue
profile = ig_payload.get("ig") or {}
row["instagram_username"] = profile.get("username", username)
row["instagram_status"] = "profile returned"
row["instagram_followers"] = profile.get("follower_count", "")
row["instagram_is_private"] = profile.get("is_private", "")
row["manual_match_review"] = "check relationship manually"
if rows:
with open("social_lead_checks.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)
else:
print("No video rows returned for this query.")
Varför hanteraren tar hänsyn till två svarsstrukturer
TikToks sökresultat kan innehålla videor på två ställen: tiktok.aweme_list och tiktok.search_item_list[].aweme_info. I ett observerat söksvar kunde den första listan vara tom, medan posterna fanns i den andra. Därför slår exemplet ihop båda källorna och tar bort dubbletter baserat på aweme_id. Först kontrolleras den överordnade status-nyckeln, därefter läses objektet tiktok.

Koden sparar bara fält som faktiskt finns i svaret. Ett tomt värde betyder att fältet saknades i det mottagna objektet; det ska inte tolkas som noll. Det är bra att spara videolänkar och beskrivningar tillsammans med mätvärdena, annars går den ursprungliga kontexten förlorad när tabellen granskas senare.
Lägg till paginering endast vid behov
Exemplet hämtar en sida och behandlar bara de poster som returneras. Om sökningen ska fortsätta har dokumentationen stöd för cursor vid videosökning; värdet hämtas från föregående svar. Behandla cursor som ett ogenomskinligt värde och skicka vidare det utan att beräkna om det själv. Avsluta loopen när svaret anger att det inte finns fler resultat eller när teamets fastställda gräns har nåtts. Paginering utökar mängden returnerade resultat, men ger inte grund för att kalla den en heltäckande samling av alla inlägg om ämnet.
Innan du lägger till automatisk hämtning bör du kontrollera ett faktiskt svar med din egen nyckel och välja ett måttligt antal sidor. Spara ursprunglig JSON tillsammans med den normaliserade raden, eller separat med körningsdatum, så att du kan ta reda på om ett svarsfält har ändrats och bearbeta insamlingen på nytt om schemat ändras.
Så använder du CSV-filen i kvalificeringen
I tabellen kan du filtrera rader efter om de har en videolänk, beskrivning, skapare och ifylld IG-profil. För den första granskningsomgången är enkla statusar användbara: ”video hittad”, ”IG-användarnamn hittat”, ”profil returnerad”, ”kontokoppling verifierad av en person” och ”utesluten”. Statusarna beskriver kontrollförloppet, inte skaparens kvalitet eller avsikter.
Om uppgiften kräver en återkommande rapport kan du köra skriptet enligt ett schema och lägga till hämtningsdatum i en separat kolumn. Då visar en jämförelse av ögonblicksbilder vad som ändrats mellan körningarna i de tillgängliga fälten, till exempel profilens följarantal. TikTok- och IG-mått bör lagras separat, med plattform och observationstid angivna: de gäller olika sammanhang och olika API-svar.
För större volymer kan du ersätta CSV med en databas som använder plattform och video-ID som primärnyckel. Spara den ursprungliga söktexten, insamlingstidpunkten och det obehandlade svaret. Skicka helst en Slack-notis eller överför en post till CRM först efter att en person har bekräftat profilernas koppling, inte direkt när ett namn verkar matcha.
Begränsningar i tolkningen och säker drift
En sökning med en nyckelfras returnerar de API-resultat som hittats, inte en fullständig lista över alla inlägg. Antalet visningar, gilla-markeringar och följare är en ögonblicksbild av svaret vid tidpunkten för anropet. Uppgifterna kan användas för att sortera en arbetslista och för fortsatt granskning, men bekräftar inte i sig kommersiella avsikter, målgrupp eller samtycke till kontakt.
Bekräfta kopplingen mellan profiler med tydliga offentliga belägg och notera vem som gjorde kontrollen och när. Om IG-användarnamnet kommer från ett tredjepartsark utan en källa som går att verifiera bör statusen stå kvar som ”kräver granskning”. En privat profil eller saknade uppgifter ska visas som ett separat kontrollresultat, utan att luckorna fylls i genom antaganden.
Använd en säkerhetslösning för hemligheter i arbetsmiljön, begränsa åtkomsten till exporter och fastställ en lagringstid som motsvarar undersökningens syfte. För endast över de fält till CRM som behövs för det fortsatta manuella arbetet, och följ tillämpliga plattformsregler och krav på databehandling.
Det här får du till slut
Efter körningen finns en CSV-fil med hittade videor, skapare och tillgängliga mätvärden samt separata fält för IG-kontrollen. Skriptet kan köras manuellt, enligt ett schema i CI eller via en HTTP-förfrågningsnod i en automatiseringsplattform. Den viktigaste praktiska principen är att automatisera insamlingen och datastrukturen, men låta en människa verifiera kopplingen mellan kontona.
Börja med TikTok Scraper API och IG Scraper API för att kontrollera endpoints och tillgängliga parametrar. Produktsidorna innehåller exempel på anrop och länkar till dokumentationen; börja med en liten förfrågan innan du bygger in insamlingen i ett återkommande flöde.