Un profesional del marketing puede encontrar en TikTok un video cuyo autor habla del producto que busca, pero pasar de esa señal a un contacto verificable es más difícil: el nombre del autor en TikTok puede diferir del de IG, y el perfil puede ser privado o no tener ningún vínculo confirmado con esa persona. El resultado práctico no es una lista automática de «leads listos», sino una tabla de comprobaciones: el video original, el autor de TikTok, el nombre de usuario de IG supuesto, la respuesta de la API y el estado para revisarlo más adelante.
A continuación se presenta un proceso mínimo en Python para esta tarea. Busca videos públicos por frase clave, extrae los campos disponibles del autor y consulta perfiles de IG solo si ya tienes un nombre de usuario fundamentado que quieras verificar. La API puede obtener datos de un perfil a partir del nombre de usuario, pero no determina automáticamente si dos cuentas pertenecen a la misma persona.
Qué resultado conviene automatizar
Imagina un equipo que vende equipos para preparar café en casa y quiere encontrar a autores de videos públicos sobre cómo preparar bebidas. La búsqueda manual es útil para familiarizarse inicialmente con el contenido, pero, cuando se repite, resulta difícil conservar qué video condujo al contacto, de dónde salió el nombre del perfil y qué se verificó exactamente.

El flujo separa tres acciones: buscar videos en TikTok, guardar los datos observados y consultar el perfil de IG supuesto. Así, el analista puede abrir un único archivo CSV y ver la procedencia de cada candidato. Los campos de IG solo deben rellenarse después de encontrar el nombre de usuario en una descripción pública, un enlace del autor o tras verificarlo manualmente con otros materiales disponibles.
Este método es útil para una agencia, un equipo de investigación o un profesional del marketing interno que necesita una lista pequeña y reproducible para calificar manualmente. Conserva el contexto del hallazgo y no convierte la similitud entre nombres en una afirmación de identidad.
Qué campos se pueden obtener
La ruta documentada de TikTok /searchVideo requiere el parámetro keyword; también están disponibles count, date_posted, sort_by, region y cursor. En las respuestas observadas aparecen el identificador del video, la descripción, la fecha de publicación, el enlace, los datos del autor y las métricas públicas de interacción. El conjunto real de campos puede variar, por lo que el código de abajo utiliza una lectura segura con valores vacíos.
Para IG, este flujo utiliza la ruta GET documentada /v1/user/by/username con el parámetro username. La respuesta puede incluir el nombre de usuario, el nombre visible, el estado de privacidad y verificación, el número de publicaciones, seguidores y seguidos, y la biografía. Estos datos sirven para que un especialista los examine y decida qué hacer, no para puntuar al autor.
La documentación oficial de TikTok API describe los parámetros de búsqueda, mientras que la documentación de IG API describe los métodos y parámetros de IG. Las definiciones de API incorporadas de jsonscraper también especifican las rutas, los nombres de los parámetros y las formas de respuesta observadas; las comprobaciones citadas tienen fecha del 25 de octubre de 2026.
Configura las claves y la lista de candidatos
Guarda las claves de API en las variables de entorno JSONSCRAPER_TIKTOK_LICENSE_KEY y JSONSCRAPER_INSTAGRAM_LICENSE_KEY. No las incluyas en el código fuente, archivos CSV ni registros de tareas. Para instalar la biblioteca de solicitudes, ejecuta python -m pip install requests. El siguiente ejemplo requiere Python 3.8 o posterior.
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",
})
# Completa este diccionario solo con nombres de usuario
# encontrados por separado y añadidos tras verificar manualmente la fuente.
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.")
Por qué el procesador contempla dos estructuras de respuesta
En las búsquedas de TikTok, los videos aparecen en dos lugares: tiktok.aweme_list y tiktok.search_item_list[].aweme_info. En una respuesta de búsqueda observada, la primera lista podía estar vacía mientras que los elementos aparecían en la segunda. Por eso, el ejemplo combina ambas fuentes y elimina duplicados por aweme_id. Primero comprueba el status externo y después lee el objeto tiktok.

El código conserva solo los campos que realmente están presentes en la respuesta. Un valor vacío significa que el campo no estaba en el objeto recibido; no debe interpretarse como una métrica igual a cero. Conviene guardar los enlaces y las descripciones de los videos junto con las métricas: de lo contrario, la tabla pierde su contexto original al revisarla más adelante.
Añade paginación solo si es necesario
El ejemplo solicita una página y procesa únicamente los elementos recibidos. Si necesitas continuar la búsqueda, la documentación contempla cursor para buscar videos; el valor se obtiene de la respuesta anterior. Guarda el cursor como un valor opaco y pásalo sin calcularlo por tu cuenta. Detén el ciclo cuando la respuesta indique que no hay más resultados o cuando se alcance el límite establecido por el equipo. La paginación amplía el conjunto de resultados devueltos, pero no permite considerarlo una cobertura exhaustiva de todas las publicaciones sobre el tema.
Antes de añadir una exportación automática, comprueba la respuesta real con tu clave y elige un número moderado de páginas. Guarda el JSON original junto a la fila normalizada o por separado con la fecha de ejecución: así podrás averiguar si ha cambiado un campo de la respuesta y volver a procesar los datos si cambia el esquema.
Cómo usar el CSV para calificar contactos
En la tabla puedes filtrar filas según tengan un enlace al video, una descripción, un autor y un perfil de IG completado. Para la primera ronda de revisión son útiles unos estados sencillos: «video encontrado», «nombre de usuario de IG encontrado», «perfil devuelto», «vínculo entre cuentas verificado por una persona» y «descartado». Los estados describen el proceso de verificación, no la calidad ni las intenciones del autor.
Si la tarea requiere un informe reproducible, ejecuta el script según un calendario y añade la fecha de obtención de los datos en una columna aparte. Al comparar las capturas podrás ver qué ha cambiado entre ejecuciones en los campos disponibles, por ejemplo, el número de seguidores del perfil. Guarda por separado las métricas de TikTok y de IG, indicando la plataforma y la hora de observación: corresponden a contextos distintos y a respuestas de API diferentes.
Para un flujo de mayor volumen, sustituye el CSV por una base de datos con una clave primaria basada en la plataforma y el ID del video. Conserva la consulta de texto original, la hora de recopilación y la respuesta sin procesar. Conviene enviar una notificación a Slack o transferir una fila al CRM después de que una persona confirme manualmente el vínculo entre perfiles, y no justo después de que coincidan los nombres.
Límites de interpretación y uso seguro
La búsqueda por frase clave devuelve los resultados encontrados por la API, no una lista completa de publicaciones. El número de visualizaciones, «Me gusta» y seguidores es una captura en el momento de la consulta. Sirve para ordenar una lista de trabajo y revisarla después, pero por sí solo no confirma una intención comercial, una audiencia ni el consentimiento para contactar.
Confirma el vínculo entre perfiles mediante indicios públicos explícitos y registra quién realizó la comprobación y cuándo. Si el nombre de usuario de IG proviene de una tabla de terceros sin una fuente verificable, deja el estado «requiere verificación». Un perfil privado o la ausencia de datos deben registrarse como resultados independientes de la comprobación, sin intentar rellenar los huecos con suposiciones.
Guarda las claves en el almacén de secretos del entorno de trabajo, limita el acceso a las exportaciones y establece un plazo de conservación acorde con el objetivo de la investigación. Transfiere al CRM solo los campos necesarios para el trabajo manual posterior y cumple las normas de las plataformas aplicables y los requisitos de tratamiento de datos.
Qué obtendrás
Al ejecutar el script, se generará un CSV con una lista de los videos encontrados, sus autores y las métricas disponibles, además de campos independientes para verificar IG. Puedes ejecutar el script manualmente, programarlo en CI o utilizar un nodo de solicitud HTTP en una plataforma de automatización. El principio práctico clave es automatizar la recopilación y la estructura de los datos, y dejar la determinación del vínculo entre cuentas como un paso verificable a cargo de una persona.
Para comprobar las rutas y los parámetros disponibles, empieza por TikTok Scraper API y IG Scraper API. Las páginas de producto incluyen ejemplos de solicitudes y enlaces a la documentación; empieza con una consulta pequeña antes de incorporar la recopilación a un proceso permanente.