

# Revisá el estado del perfil de TikTok antes de usar un dato faltante

Revisá la identidad del perfil y el estado del resultado antes de usar un campo faltante. Un campo faltante puede significar cosas distintas. Un campo opcional puede estar vacío en un perfil válido. Un destino bloqueado, privado o incorrecto es otro problema. Mantené un valor desconocido como desconocido. No lo reemplaces por cero.

## Usá tu propio perfil conocido

Un Actor es un programa alojado de recolección de datos. Una Task es un ajuste de entrada guardado. El Actor [TikTok Channel Scraper](https://apify.com/chronometrica/tiktok-channel-scraper) recolecta filas de la fuente. Vos decidís qué filas puede usar tu trabajo. El Actor no toma esa decisión por vos.

La Task pública actual es [Bulk TikTok Profile Scraper](https://apify.com/chronometrica/tiktok-channel-scraper/examples/bulk-tiktok-profile-scraper). Su entrada de muestra guardada tiene dos URL públicas:

```json
{
  "startUrls": [
    "https://www.tiktok.com/@mrbeast",
    "https://www.tiktok.com/@nasa"
  ]
}
```

Usá tu propio perfil conocido

Reemplazá esas URL de muestra por las URL públicas de tus propios perfiles conocidos. Una Task pública es solo una entrada de partida. No prueba que el control ni la decisión sean automáticos.

La compilación pública 0.1.27 se revisó el 2026-10-13. Esa fecha de revisión no es la hora de una fila. `observedAt` es la hora en una fila de la fuente. Usá `observedAt` cuando juzgues si un valor es actual.

## Enviá solo perfiles conocidos

El campo de entrada es `startUrls`. Podés enviar de 1 a 1.000 URL o handles de perfiles conocidos. Un handle es el nombre público que va después del signo @. Enviá perfiles que ya conocés.

Esta entrada no busca usuarios. No descubre países. No recolecta publicaciones ni comentarios. No obtiene datos de contacto privados. No inicia sesión. No evita un captcha ni un desafío.

Las cadenas de entrada duplicadas se revisan una sola vez. Una fila de resultado significa un perfil intentado. Esa fila no siempre es un perfil útil. Ejecutá el programa de recolección para un perfil previsto antes de enviar una lista larga.

## Leé estos campos primero

Revisá `input`, `channelId`, `channelUrl`, `handle`, `status`, `statusReason`, `isBillable` y `observedAt` en cada fila. `channelId` es el id de la fuente para ese perfil. `status` es el resultado de la fuente para ese intento. `statusReason` dice por qué se asignó el estado, cuando hay un motivo.

Los campos opcionales pueden incluir `followersCount`, `bioLink`, `description`, `detectedEmails` y `accountRegion`. Cuando `countPrecision` está presente, indica la calidad de un recuento. Leelo junto con ese recuento. No lo ignores.

`isBillable` es un dato de facturación en una fila. El dato dice si la fila es elegible para un cargo. Elegible significa que la fila se puede cobrar. El dato no es prueba de un cargo real. Un recibo de facturación prueba un cargo. `isBillable` no prueba quién es el perfil. No prueba que todos los campos estén completos. `billableRows` cuenta las filas elegibles para un cargo. Ese recuento no es prueba de pago.

Mantené cada estado de la fuente según el esquema actual. El estado cambia lo que hacés después:

- `ok` significa que el perfil volvió. Igual necesitás una identidad coincidente y tus campos obligatorios. Un campo opcional puede seguir en null.
- `partial` significa que el perfil volvió, pero la fila está incompleta. No descartes toda la fila hasta revisar cada campo obligatorio.
- `private` significa que la parte privada sigue no disponible. No trates la fila como un cero público.
- `login_required` significa que la fuente pidió un inicio de sesión. Pará. Este Actor no inicia sesión.
- `not_found` significa que el perfil no estaba visible en este control. No dice cuándo ni por qué. No prueba una eliminación.
- `blocked` significa que se bloqueó el acceso a la fuente. No completes los campos faltantes. No leas el bloqueo como cero seguidores.
- `challenge` significa que la fuente mostró un desafío. No lo resuelvas.
- `rate_limited` significa que la fuente limitó el control. Guardá la fila. Podés planificar una nueva revisión posterior. No reintentes en un bucle.
- `parser_miss` significa que el control no leyó los datos esperados. No inventes esos datos.
- `invalid_input` significa que el formato de la entrada no era válido. Corregí solo un formato que puedas mostrar que está mal.
- `failed` significa que el intento falló por otro motivo de la fuente. Guardá el motivo y la hora. No inventes los datos faltantes.

Una fila no disponible no prueba que la cuenta se haya eliminado. No prueba que la cuenta no tenga seguidores.

## Conocé qué hizo y qué no hizo una ejecución de control

El control actual 0.1.27 usó un perfil. La fila coincidió con el `channelId` previsto. Coincidió con el `channelUrl` o el handle previsto. Coincidió con `followersCount`. Su estado fue `ok`.

El campo opcional `commerceCategory` fue null. `isCommerce`, `isSeller` e `isPrivate` fueron false. Null significa que el valor no se dio. False significa que la fuente dio un no real. No conviertas false en faltante. No conviertas null en false. No copies un `isCommerce` en false dentro del `commerceCategory` en null.

Ese control no probó perfiles privados. No probó perfiles bloqueados. No probó que todos los campos del perfil estén completos. Un correo oculto o faltante no se puede crear. Si `detectedEmails` es null o está vacío, eso no prueba que el propietario no tenga un contacto público.

## Compará los totales de la ejecución con tu lista

La OUTPUT de la ejecución usa estos nombres exactos:

- `requestedChannels` es un número. El número cuenta los intentos de entrada procesados. El número es igual a `rows.length`. `rows.length` es la cantidad de esas filas de intento. Este número no es la lista original del padrón. Vos tenés la lista original del padrón. La lista queda aparte.
- `acceptedProfileInputs` es un número. El número es igual a `rows.length` menos `rejectedInputs`.
- `rejectedInputs` es un número. El número cuenta las entradas que la ejecución rechazó. La ejecución rechaza entradas no válidas y entradas no admitidas. `rejectedInputs` no es una lista.
- `datasetRows` es la cantidad de filas de perfil devueltas. Esas filas son las filas de perfiles intentados.
- `usefulRows` es la cantidad de filas devueltas que el Actor marca como útiles. El Actor es el programa que marca cada fila.
- `billableRows` es la cantidad de filas devueltas que son elegibles para un cargo. Elegible significa que una fila se puede cobrar. El número no es prueba de pago.
- `nonUsefulRows` es la cantidad de filas devueltas que no son útiles.
- `statusCounts` es la cantidad de filas devueltas en cada estado. `datasetRows` y `statusCounts` describen las filas devueltas. No describen la lista original del padrón.

`datasetRows` no es la cantidad de perfiles revisados completos. Una ejecución puede terminar y aun así contener destinos fallidos. Una fila útil puede no tener un campo que vos exigís. Una fila facturable puede no tener un campo opcional. Leé la fila. No te detengas en el total.

## Nombrá los campos que tu trabajo necesita

Antes de descartar un perfil parcial, listá los campos que necesita tu próxima tarea. Un campo que no necesitás puede quedar en null. Un campo que sí necesitás debe estar presente antes de aceptar la fila.

Para cada campo obligatorio, guardá el valor de la fuente y un estado de disponibilidad. Usá un estado solo cuando los datos de la fuente justifiquen ese estado:

- `present` significa que volvió un valor. False está presente. Cero está presente solo cuando la fuente devolvió cero.
- `explicitly_empty` significa que la fuente devolvió un valor vacío, como una lista vacía.
- `absent_or_unavailable` significa que el campo es null, o que la fila no pudo aportarlo.
- `not_requested` significa que esta tarea no usa ese campo.

Una lista vacía no es lo mismo que null. Null es desconocido. No guardes lo desconocido como cero.

Este es un registro que escribís vos. No es una fila de salida del Actor:

```text
field: followersCount
source_value: null
availability: absent_or_unavailable
observedAt: the time on that source row
```

Nombrá los campos que tu trabajo necesita

## Revisá cada perfil en este orden

1. Conservá tu padrón original de perfiles conocidos. Un padrón es tu lista local. Dale a cada fila del padrón su propia clave local. Leé los estados que vuelven. No prometas un correo oculto. No prometas una forma de evitar un bloqueo. No prometas una reparación para cada falla de la fuente. La misma cadena de entrada se revisa una sola vez. El recuento de tu padrón y el recuento de intentos únicos pueden diferir. La clave local mantiene cada fila del padrón unida a la observación correcta.
2. Ejecutá primero el programa de recolección para un perfil previsto. Leé la identidad devuelta, el estado y `observedAt`. Revisá `channelId` cuando esté presente. Revisá el handle y la URL previstos. Un nombre visible conocido no alcanza para corregir un destino incorrecto. Hacé coincidir la identidad primero. Este artículo no te enseña a unir otros nombres del mismo creador. Después de que la identidad coincida, decidís si los datos se pueden usar.
3. Separá un mal estado de un campo vacío. El estado `ok` o `partial`, con una identidad coincidente, puede tener igual un `bioLink` opcional en null. Ese perfil puede seguir siendo útil. `blocked`, `challenge` y `login_required` significan que la fuente no dio acceso. `private` significa que la parte privada sigue no disponible. `not_found` no te dice cuándo el perfil dejó de estar visible. No te dice por qué.
4. Juzgá cada campo obligatorio por separado. Guardá el valor de la fuente y el estado de disponibilidad. Mantené false como false. Mantené null como desconocido. Mantené una lista vacía separada de null. Si tu tarea no necesita el campo, usá `not_requested`. No rechaces el perfil por un campo que no pediste usar.
5. Compará OUTPUT con el padrón. Compará `acceptedProfileInputs` con tus entradas únicas. Compará las filas intentadas con `datasetRows`. Leé también `usefulRows`, `nonUsefulRows`, `rejectedInputs` y `statusCounts`. No informes `datasetRows` como perfiles completos. No supongas que `billableRows` contiene todos los campos opcionales.
6. Elegí un estado siguiente para cada intento único. Usá `accepted_for_required_fields` cuando la identidad coincide y todos los campos obligatorios están presentes. Usá `useful_but_required_gap` cuando la identidad coincide pero falta un campo obligatorio. Usá `source_unavailable` cuando la fuente no devolvió el perfil usable. Usá `identity_mismatch` cuando el id, el handle o la URL no es el perfil previsto. Usá `invalid_input` cuando el formato en sí está mal. Corregí solo un formato que puedas mostrar que no es válido. Una falla de la fuente puede justificar una nueva revisión planificada más tarde. No justifica un bucle de reintentos. No justifica resolver un desafío. Conservá `observedAt` y `statusReason` con la observación.
7. En una actualización posterior, usá la misma identidad de la fuente y los mismos campos obligatorios. Si una fila anterior tenía un valor y la fila nueva no está disponible, no tenés una observación actual. El valor anterior es historial. Conservá su fecha. Marcá el valor actual como desconocido. No arrastres el valor anterior como valor actual. No lo cambies a cero. No llames al cambio una caída total.
8. Escribí un informe de disponibilidad. Ese informe lista cada perfil, los campos obligatorios y cada estado sin resolver. Usá una fila solo para el trabajo cuyos campos obligatorios están presentes. Mantené una brecha de recolección separada de una afirmación sobre el propietario. Una brecha no significa que al propietario le falte ese dato. No significa que al propietario le falte ese tipo de cuenta.

## Elegí aceptar, parcial, reintentar o revisar

El estado siguiente te dice la condición de los datos. La decisión del lector te dice qué hacer. Usá una de estas cuatro decisiones: aceptar, parcial, reintentar o revisar.

| Decisión del lector | Estado siguiente | Motivo | Qué hacés |
| --- | --- | --- | --- |
| aceptar | accepted_for_required_fields | La identidad coincide. Todos los campos obligatorios están presentes. | Usá la fila solo para ese trabajo. |
| parcial | useful_but_required_gap | La identidad coincide. Un campo obligatorio es desconocido. | Conservá la fila. No completes la brecha. No la uses donde ese campo es obligatorio. |
| reintentar | source_unavailable, y solo como una nueva revisión planificada posterior | La entrada puede seguir siendo válida, pero este intento no terminó. Pueden corresponder `rate_limited` o `failed`. | Guardá el estado, el motivo y `observedAt`. Planificá una nueva revisión posterior. No hagas un bucle. |
| revisar | identity_mismatch, invalid_input o un estado de la fuente que no debés forzar | Esto incluye `private`, `blocked`, `challenge`, `login_required`, `not_found` y `parser_miss`. | Dejá la fila en una lista de revisión. Corregí el formato solo cuando se haya demostrado que no es válido. |

Poné la fila en la lista de revisión antes de pensar en otra ejecución. Una nueva revisión posterior está permitida para una falla de la fuente, como `rate_limited` o `failed`. No uses esa revisión para resolver un desafío. No la uses para iniciar sesión. No la uses para abrir un perfil privado. `challenge` queda en revisión porque este Actor no resuelve desafíos. `login_required` queda en revisión porque este Actor no inicia sesión. `private` sigue no disponible. Una segunda llamada no hace públicos los datos privados.

## Aprendé las decisiones con ficción original

Las tablas y los recuentos de esta sección son ficción original. No son un resultado del producto. No muestran una tasa de éxito real.

El padrón ficticio tiene cinco filas locales:

| Clave local | Entrada | Qué es |
| --- | --- | --- |
| R1 | @green | La primera copia de un handle público conocido |
| R2 | @green | Una copia exacta de R1 |
| R3 | @blue | Un segundo handle público conocido |
| R4 | @closed | Un handle conocido que vuelve como privado |
| R5 | @unknown | Un handle conocido que vuelve como bloqueado |

R1 y R2 usan la misma cadena de entrada. El control acepta esa cadena una sola vez. Igual conservás cinco claves locales. La ejecución tiene cuatro intentos únicos aceptados y cuatro filas de estado. `acceptedProfileInputs` en esta ficción es 4. Esta ficción no muestra una entrada rechazada. Una ejecución real puede dar `rejectedInputs` como un número, así que también tenés que leer ese recuento.

Las filas de estado ficticias son:

| Intento | Claves locales | channelId | status | followersCount | bioLink | Estado siguiente |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | R1 y R2 | ID100 | ok | 1.000 | null | accepted_for_required_fields |
| 2 | R3 | ID200 | partial | null | present | useful_but_required_gap |
| 3 | R4 | no usable | private | no usable | no usable | source_unavailable |
| 4 | R5 | no usable | blocked | no usable | no usable | source_unavailable |

La tarea ficticia necesita dos cosas. `channelId` debe coincidir con el perfil previsto. El `followersCount` actual debe estar presente.

R1 cumple las dos reglas. El id es ID100. El recuento actual de seguidores es 1.000, así que ese valor está presente. `bioLink` es null. Esta tarea no exigía `bioLink`, así que el enlace null sigue desconocido. No inventás un enlace. R1 es el único perfil único que podés aceptar para esta tarea. La decisión del lector es aceptar.

R2 no es un segundo creador. Es la misma entrada que R1 y corresponde a la misma observación. Conservá la clave R2 para que tu padrón pueda explicar el duplicado. No cuentes R2 como otro perfil con otros 1.000 seguidores.

R3 coincide con ID200, así que la identidad es correcta. El estado es `partial`. El recuento de seguidores es null. Null no es cero, y la tarea exige ese recuento. El enlace de la biografía está presente, pero no completa el recuento faltante. R3 es `useful_but_required_gap`. La decisión del lector es parcial. Conservá R3 y no lo uses para un trabajo que necesite el recuento actual de seguidores. Una fila útil de la fuente puede igual no cumplir tu propia regla de campos.

R4 tiene el estado `private`. Sus datos obligatorios no se pueden usar. R5 tiene el estado `blocked`. Sus datos obligatorios no se pueden usar. Los dos son `source_unavailable`. La decisión del lector es revisar. No leas ninguna de las dos filas como una cuenta eliminada. No leas ninguna de las dos filas como cero seguidores. Esta ficción no da un `channelId` para R4 ni para R5. No inventes uno.

Los `statusCounts` ficticios siguen esas cuatro filas: uno `ok`, uno `partial`, uno `private` y uno `blocked`. Si esas cuatro filas son tus `datasetRows`, el recuento es 4 intentos. Ese recuento sigue sin ser 4 perfiles completos. Un perfil único cumple la regla del id y del recuento actual de seguidores. Una fila, R3, tiene una brecha en un campo obligatorio. Dos filas, R4 y R5, no están disponibles. No conviertas 1 perfil aceptado de 4 intentos en una tasa de éxito real.

Una segunda observación ficticia de ID100 vuelve como `blocked`. Conservá el valor anterior de seguidores de 1.000. Conservá la fecha de esa observación anterior. El recuento actual es desconocido. No informes cero. No informes una caída del 100 por ciento. Los 1.000 anteriores son historial. No son el recuento actual, y no los arrastrás como actuales.

Usá un par ficticio más para que false y null queden separados. Un valor aparte de `isSeller` en false está presente. La fuente dijo que no. Un valor aparte de `isSeller` en null es desconocido. No significa que no. Ningún estado de esta ficción prueba que el propietario no tenga un contacto público.

## Limitá el alcance a aceptar datos del perfil

Este artículo enseña solo cómo aceptar datos de perfil. Revisás la identidad, el estado, la hora y los campos que tu tarea necesita. Después aceptás la fila, la dejás parcial, planificás una nueva revisión o la revisás.

Ordenar perfiles por tipo de cuenta es una tarea aparte. El feedback es una tarea aparte. Los recuentos de publicaciones anteriores son una tarea aparte. Este método no extrae perfiles privados. No devuelve listas de seguidores. No descubre contactos. No arma un historial de crecimiento. Un valor actual faltante es una brecha en este control. No es un cambio medido.

## Próxima acción

Revisá un perfil público conocido en el Actor [TikTok Channel Scraper](https://apify.com/chronometrica/tiktok-channel-scraper). Abrí la Task [Bulk TikTok Profile Scraper](https://apify.com/chronometrica/tiktok-channel-scraper/examples/bulk-tiktok-profile-scraper) y reemplazá las URL de muestra por ese perfil. Usá la fila solo si su identidad, su estado y sus campos obligatorios sostienen el trabajo.

## Fuentes y lecturas adicionales

- [Actor TikTok Channel Scraper](https://apify.com/chronometrica/tiktok-channel-scraper)
- [Task Bulk TikTok Profile Scraper](https://apify.com/chronometrica/tiktok-channel-scraper/examples/bulk-tiktok-profile-scraper)
- [Discusión pública sobre el contacto manual de UGC](https://www.reddit.com/r/EcommerceWebsite/comments/1rrlb81/im_losing_my_mind_doing_manual_ugc_outreach_are/)