

# Confira o status do perfil do TikTok antes de usar dados ausentes

Confira a identidade do perfil e o status do resultado antes de usar um campo ausente. Um campo ausente pode significar coisas diferentes. Um campo opcional pode estar vazio em um perfil válido. Um alvo bloqueado, privado ou errado é um problema diferente. Mantenha um valor desconhecido como desconhecido. Não o substitua por zero.

## Use o seu próprio perfil conhecido

Um Actor é um programa hospedado de coleta de dados. Uma Task é uma predefinição de entrada salva. O Actor [TikTok Channel Scraper](https://apify.com/chronometrica/tiktok-channel-scraper) coleta linhas da fonte. Você decide quais linhas o seu trabalho pode usar. O Actor não toma essa decisão por você.

A Task pública atual é [Bulk TikTok Profile Scraper](https://apify.com/chronometrica/tiktok-channel-scraper/examples/bulk-tiktok-profile-scraper). A entrada de amostra salva tem dois URLs públicos:

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

Use o seu próprio perfil conhecido

Substitua esses URLs de amostra pelos URLs dos seus próprios perfis públicos conhecidos. Uma Task pública é apenas uma entrada inicial. Ela não prova que a conferência ou a decisão é automática.

O build público 0.1.27 foi conferido em 2026-10-13. Essa data de conferência não é o horário de uma linha. `observedAt` é o horário em uma linha da fonte. Use `observedAt` quando você julgar se um valor é atual.

## Envie somente perfis conhecidos

O campo de entrada é `startUrls`. Você pode enviar de 1 a 1.000 URLs ou handles de perfis conhecidos. Um handle é o nome público depois do sinal @. Envie perfis que você já conhece.

Esta entrada não busca usuários. Ela não descobre países. Ela não coleta publicações nem comentários. Ela não recupera dados privados de contato. Ela não faz login. Ela não contorna um captcha nem um desafio.

Strings de entrada duplicadas são conferidas uma vez. Uma linha de resultado significa um perfil tentado. Essa linha nem sempre é um perfil útil. Execute um perfil pretendido antes de enviar uma lista longa.

## Leia estes campos primeiro

Revise `input`, `channelId`, `channelUrl`, `handle`, `status`, `statusReason`, `isBillable` e `observedAt` em cada linha. `channelId` é o id da fonte para esse perfil. `status` é o resultado da fonte para essa tentativa. `statusReason` diz por que o status foi definido, quando um motivo está presente.

Campos opcionais podem incluir `followersCount`, `bioLink`, `description`, `detectedEmails` e `accountRegion`. Quando `countPrecision` está presente, ele informa a qualidade de uma contagem. Leia esse campo junto com essa contagem. Não o ignore.

`isBillable` é um dado de cobrança em uma linha. O dado diz se a linha é elegível para uma cobrança. Elegível significa que a linha pode ser cobrada. O dado não é prova de uma cobrança real. Um recibo de cobrança prova uma cobrança. `isBillable` não prova quem é o perfil. Ele não prova que cada campo está completo. `billableRows` conta as linhas elegíveis para uma cobrança. Essa contagem não é prova de pagamento.

Mantenha cada status da fonte no esquema atual. O status muda o que você faz em seguida:

- `ok` significa que o perfil voltou. Você ainda precisa de uma identidade correspondente e dos campos exigidos. Um campo opcional ainda pode ser null.
- `partial` significa que o perfil voltou, mas a linha está incompleta. Não descarte a linha inteira até conferir cada campo exigido.
- `private` significa que a parte privada continua indisponível. Não trate a linha como um zero público.
- `login_required` significa que a fonte pediu um login. Pare. Este Actor não faz login.
- `not_found` significa que o perfil não estava visível nesta conferência. Isso não diz quando nem por quê. Isso não prova exclusão.
- `blocked` significa que o acesso à fonte foi bloqueado. Não preencha os campos ausentes. Não leia o bloqueio como zero seguidores.
- `challenge` significa que a fonte mostrou um desafio. Não o resolva.
- `rate_limited` significa que a fonte limitou a conferência. Salve a linha. Você pode planejar uma nova conferência depois. Não tente de novo em um loop.
- `parser_miss` significa que a conferência não leu os fatos esperados. Não invente esses fatos.
- `invalid_input` significa que o formato da entrada não era válido. Corrija somente um formato que você possa mostrar que está errado.
- `failed` significa que a tentativa falhou por outro motivo da fonte. Salve o motivo e o horário. Não invente os fatos ausentes.

Uma linha indisponível não prova que a conta foi excluída. Ela não prova que a conta não tem seguidores.

## Saiba o que uma execução de controle fez e não fez

O controle atual 0.1.27 usou um perfil. A linha correspondeu ao `channelId` pretendido. Ela correspondeu ao `channelUrl` ou ao handle pretendido. Ela correspondeu a `followersCount`. O status foi `ok`.

O campo opcional `commerceCategory` era null. `isCommerce`, `isSeller` e `isPrivate` eram false. Null significa que o valor não foi dado. False significa que a fonte deu um não real. Não transforme false em ausente. Não transforme null em false. Não copie o false de `isCommerce` para o `commerceCategory` null.

Esse controle não testou perfis privados. Ele não testou perfis bloqueados. Ele não provou que cada campo do perfil está completo. Um e-mail oculto ou ausente não pode ser criado. Se `detectedEmails` é null ou está vazio, isso não prova que o dono não tem contato público.

## Compare os totais da execução com a sua lista

O OUTPUT da execução usa estes nomes exatos:

- `requestedChannels` é um número. O número conta as tentativas de entrada processadas. O número é igual a `rows.length`. `rows.length` é o número dessas linhas de tentativa. Este número não é a lista original. Você é dono da lista original. A lista permanece separada.
- `acceptedProfileInputs` é um número. O número é igual a `rows.length` menos `rejectedInputs`.
- `rejectedInputs` é um número. O número conta entradas que a execução recusou. A execução recusa entradas inválidas e entradas sem suporte. `rejectedInputs` não é uma lista.
- `datasetRows` é o número de linhas de perfil retornadas. Essas linhas são as linhas de perfil tentadas.
- `usefulRows` é o número de linhas retornadas que o Actor marca como úteis. O Actor é o programa que marca cada linha.
- `billableRows` é o número de linhas retornadas elegíveis para uma cobrança. Elegível significa que uma linha pode ser cobrada. O número não é prova de pagamento.
- `nonUsefulRows` é o número de linhas retornadas que não são úteis.
- `statusCounts` é o número de linhas retornadas em cada status. `datasetRows` e `statusCounts` descrevem linhas retornadas. Eles não descrevem a lista original.

`datasetRows` não é o número de perfis conferidos completos. Uma execução pode terminar e ainda conter alvos que falharam. Uma linha útil ainda pode não ter um campo que você exige. Uma linha cobrável ainda pode não ter um campo opcional. Leia a linha. Não pare no total.

## Nomeie os campos que o seu trabalho precisa

Antes de descartar um perfil parcial, liste os campos que a próxima tarefa precisa. Um campo de que você não precisa pode permanecer null. Um campo de que você precisa deve estar presente antes de você aceitar a linha.

Para cada campo exigido, salve o valor da fonte e um estado de disponibilidade. Use um estado somente quando os dados retornados pela fonte sustentam esse estado:

- `present` significa que um valor voltou. False está presente. Zero está presente somente quando a fonte retornou zero.
- `explicitly_empty` significa que a fonte retornou um valor vazio, como uma lista vazia.
- `absent_or_unavailable` significa que o campo é null, ou que a linha não pôde fornecê-lo.
- `not_requested` significa que esta tarefa não usa esse campo.

Uma lista vazia não é o mesmo que null. Null é desconhecido. Não grave o desconhecido como zero.

Este é um registro que você escreve. Não é uma linha de saída do Actor:

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

Nomeie os campos que o seu trabalho precisa

## Confira cada perfil nesta ordem

1. Mantenha a sua lista original de perfis conhecidos. Uma lista é a sua relação local. Dê a cada linha da lista a própria chave local. Leia os estados que voltam. Não prometa um e-mail oculto. Não prometa contornar um bloqueio de acesso. Não prometa um reparo para cada falha da fonte. A mesma string de entrada é conferida uma vez. A contagem da sua lista e a contagem de tentativas únicas podem ser diferentes. A chave local mantém cada linha da lista ligada à observação correta.
2. Execute primeiro um perfil pretendido. Leia a identidade retornada, o status e `observedAt`. Confira `channelId` quando ele estiver presente. Confira o handle e o URL pretendidos. Um nome de exibição familiar não basta para reparar um alvo errado. Confira primeiro se a identidade retornada corresponde ao perfil pretendido. Este artigo não ensina como unir outros nomes do mesmo criador. Depois que a identidade corresponder, você decide se os dados são utilizáveis.
3. Separe um status ruim de um campo vazio. O status `ok` ou `partial`, com uma identidade correspondente, ainda pode ter um `bioLink` opcional null. Esse perfil ainda pode ser útil. `blocked`, `challenge` e `login_required` significam que a fonte não deu acesso. `private` significa que a parte privada continua indisponível. `not_found` não diz quando o perfil deixou de estar visível. Também não diz por quê.
4. Julgue cada campo exigido por si. Salve o valor da fonte e o estado de disponibilidade. Mantenha false como false. Mantenha null como desconhecido. Mantenha uma lista vazia separada de null. Se a sua tarefa não precisa do campo, use `not_requested`. Não reprove o perfil por um campo que você não pediu para usar.
5. Compare o OUTPUT com a lista. Compare `acceptedProfileInputs` com as suas entradas únicas. Compare as linhas tentadas com `datasetRows`. Leia também `usefulRows`, `nonUsefulRows`, `rejectedInputs` e `statusCounts`. Não informe `datasetRows` como perfis completos. Não suponha que `billableRows` contém cada campo opcional.
6. Escolha um próximo estado para cada tentativa única. Use `accepted_for_required_fields` quando a identidade corresponde e cada campo exigido está presente. Use `useful_but_required_gap` quando a identidade corresponde, mas um campo exigido está ausente. Use `source_unavailable` quando a fonte não retornou o perfil utilizável. Use `identity_mismatch` quando o id, o handle ou o URL não é o perfil pretendido. Use `invalid_input` quando o próprio formato está errado. Corrija somente um formato que você possa mostrar que é inválido. Uma falha da fonte pode justificar uma nova conferência planejada depois. Ela não justifica um loop de novas tentativas. Ela não justifica resolver um desafio. Mantenha `observedAt` e `statusReason` com a observação.
7. Em uma atualização posterior, use a mesma identidade da fonte e os mesmos campos exigidos. Se uma linha mais antiga tinha um valor e a nova linha está indisponível, você não tem uma observação atual. O valor antigo é histórico. Mantenha a data dele. Marque o valor atual como desconhecido. Não leve o valor antigo adiante como o valor atual. Não o mude para zero. Não chame a mudança de queda total.
8. Escreva um relatório de disponibilidade. Esse relatório lista cada perfil, os campos exigidos e cada estado não resolvido. Use uma linha somente para o trabalho cujos campos exigidos estão presentes. Mantenha uma lacuna de coleta separada de uma afirmação sobre o dono. Uma lacuna não significa que o dono não tem esse fato. Ela não significa que o dono não tem esse tipo de conta.

## Escolha aceitar, parcial, tentar novamente ou revisar

O próximo estado informa a condição dos dados. A decisão de quem lê informa o que fazer. Use uma destas quatro decisões: aceitar, parcial, tentar novamente ou revisar.

| Decisão de quem lê | Próximo estado | Motivo | O que você faz |
| --- | --- | --- | --- |
| aceitar | accepted_for_required_fields | A identidade corresponde. Cada campo exigido está presente. | Use a linha somente para esse trabalho. |
| parcial | useful_but_required_gap | A identidade corresponde. Um campo exigido é desconhecido. | Mantenha a linha. Não preencha a lacuna. Não a use onde esse campo é exigido. |
| tentar novamente | source_unavailable, e somente como uma nova conferência planejada depois | A entrada ainda pode ser válida, mas esta tentativa não terminou. `rate_limited` ou `failed` podem servir. | Salve o status, o motivo e `observedAt`. Planeje uma nova conferência depois. Não faça um loop. |
| revisar | identity_mismatch, invalid_input ou um estado da fonte que você não deve forçar | Isto inclui `private`, `blocked`, `challenge`, `login_required`, `not_found` e `parser_miss`. | Mantenha a linha em uma lista de revisão. Corrija somente um formato ruim comprovado. |

Coloque a linha na lista de revisão antes de pensar em outra execução. Uma nova conferência posterior é permitida para uma falha da fonte, como `rate_limited` ou `failed`. Não use essa nova conferência para resolver um desafio. Não a use para fazer login. Não a use para abrir um perfil privado. `challenge` permanece em revisão porque este Actor não resolve desafios. `login_required` permanece em revisão porque este Actor não faz login. `private` permanece indisponível. Uma segunda chamada não torna públicos os dados privados.

## Aprenda as decisões com ficção original

As tabelas e as contagens nesta seção são ficção original. Elas não são um resultado do produto. Elas não mostram uma taxa real de sucesso.

A lista fictícia tem cinco linhas locais:

| Chave local | Entrada | O que é |
| --- | --- | --- |
| R1 | @green | A primeira cópia de um handle público conhecido |
| R2 | @green | Uma duplicata exata de R1 |
| R3 | @blue | Um segundo handle público conhecido |
| R4 | @closed | Um handle conhecido que volta como privado |
| R5 | @unknown | Um handle conhecido que volta como bloqueado |

R1 e R2 usam a mesma string de entrada. A conferência aceita essa string uma vez. Você ainda mantém cinco chaves locais. A execução tem quatro tentativas únicas aceitas e quatro linhas de status. `acceptedProfileInputs` nesta ficção é 4. Esta ficção não mostra uma entrada recusada. Uma execução real ainda pode dar `rejectedInputs` como um número, então você também precisa ler essa contagem.

As linhas fictícias de status são:

| Tentativa | Chaves locais | channelId | status | followersCount | bioLink | Próximo estado |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | R1 e R2 | ID100 | ok | 1.000 | null | accepted_for_required_fields |
| 2 | R3 | ID200 | partial | null | present | useful_but_required_gap |
| 3 | R4 | não utilizável | private | não utilizável | não utilizável | source_unavailable |
| 4 | R5 | não utilizável | blocked | não utilizável | não utilizável | source_unavailable |

A tarefa fictícia precisa de duas coisas. `channelId` deve corresponder ao perfil pretendido. O `followersCount` atual deve estar presente.

R1 cumpre as duas regras. O id é ID100. A contagem atual de seguidores é 1.000, então esse valor está presente. `bioLink` é null. Esta tarefa não exigiu `bioLink`, então o link null permanece desconhecido. Você não inventa um link. R1 é o único perfil único que você pode aceitar para esta tarefa. A decisão de quem lê é aceitar.

R2 não é um segundo criador. É a mesma entrada de R1, e corresponde à mesma observação. Mantenha a chave R2 para que a sua lista possa explicar a duplicata. Não conte R2 como outro perfil com outros 1.000 seguidores.

R3 corresponde a ID200, então a identidade está correta. O status é `partial`. A contagem de seguidores é null. Null não é zero, e a tarefa exige essa contagem. O link da bio está presente, mas ele não preenche a contagem ausente. R3 é `useful_but_required_gap`. A decisão de quem lê é parcial. Mantenha R3 e não o use em trabalho que precise da contagem atual de seguidores. Uma linha útil da fonte ainda pode falhar na sua própria regra de campo.

R4 tem status `private`. Os fatos exigidos não são utilizáveis. R5 tem status `blocked`. Os fatos exigidos não são utilizáveis. Os dois são `source_unavailable`. A decisão de quem lê é revisar. Não leia nenhuma das duas linhas como uma conta excluída. Não leia nenhuma das duas linhas como zero seguidores. Esta ficção não dá `channelId` para R4 nem para R5. Não invente um.

Os `statusCounts` fictícios seguem essas quatro linhas: um `ok`, um `partial`, um `private` e um `blocked`. Se essas quatro linhas são os seus `datasetRows`, a contagem é de 4 tentativas. Essa contagem ainda não é de 4 perfis completos. Um perfil único cumpre a regra de id e de seguidores atuais. Uma linha, R3, tem uma lacuna em um campo exigido. Duas linhas, R4 e R5, estão indisponíveis. Não transforme 1 perfil aceito em 4 tentativas em uma taxa real de sucesso.

Uma segunda observação fictícia de ID100 volta como `blocked`. Mantenha o valor anterior de seguidores, 1.000. Mantenha a data dessa observação anterior. A contagem atual é desconhecida. Não informe zero. Não informe uma queda de 100 por cento. O antigo 1.000 é histórico. Ele não é a contagem atual, e você não o leva adiante como atual.

Use mais um par fictício para que false e null permaneçam separados. Um valor separado de `isSeller` igual a false está presente. A fonte disse não. Um valor separado de `isSeller` igual a null é desconhecido. Ele não significa não. Nenhum estado nesta ficção prova que o dono não tem contato público.

## Mantenha o método na aceitação dos dados do perfil

Este artigo ensina somente como aceitar dados de perfil. Você confere identidade, status, horário e os campos de que a sua tarefa precisa. Depois, você aceita a linha, a mantém parcial, planeja uma nova conferência ou a revisa.

Ordenar perfis por tipo de conta é uma tarefa separada. O feedback é uma tarefa separada. Contagens antigas de publicações são uma tarefa separada. Este método não extrai dados de perfis privados. Ele não retorna listas de seguidores. Ele não descobre contatos. Ele não constrói um histórico de crescimento. Um valor atual ausente é uma lacuna nesta conferência. Não é uma mudança medida.

## Próxima ação

Confira um perfil público conhecido no Actor [TikTok Channel Scraper](https://apify.com/chronometrica/tiktok-channel-scraper). Abra a Task [Bulk TikTok Profile Scraper](https://apify.com/chronometrica/tiktok-channel-scraper/examples/bulk-tiktok-profile-scraper) e substitua os URLs de amostra por esse perfil. Use a linha somente se a identidade, o status e os campos exigidos sustentarem o trabalho.

## Fontes e leituras adicionais

- [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)
- [Discussão pública sobre abordagem manual de UGC](https://www.reddit.com/r/EcommerceWebsite/comments/1rrlb81/im_losing_my_mind_doing_manual_ugc_outreach_are/)