# Anatel — Produtos Homologados (`kman-br/anatel`) Actor

Busca, novidades e validação em lote nos dados abertos da Anatel, com fonte e privacidade.

- **URL**: https://apify.com/kman-br/anatel.md
- **Developed by:** [Kman](https://apify.com/kman-br) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 registro homologados

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Anatel — Produtos Homologados

### Português

Busque produtos nos dados abertos oficiais da Anatel, acompanhe novidades e consulte listas de modelos. A saída inclui fonte, hash, data de coleta e avisos. A busca padrão por **Apple, modelos contendo A**, retorna produtos reais e repete os resultados em cada execução.

Fontes: [produtos homologados (ZIP/CSV)](https://www.anatel.gov.br/dadosabertos/paineis_de_dados/certificacao_de_produtos/produtos_certificados.zip) e, opcionalmente, [Marca Anatel (ZIP/CSV)](https://www.anatel.gov.br/dadosabertos/paineis_de_dados/certificacao_de_produtos/Marca_Anatel.zip). Créditos: Agência Nacional de Telecomunicações. Consulte os [catálogos oficiais](https://dados.gov.br/dados/conjuntos-dados/produtos-de-telecomunicacoes-homologados-pela-anatel) para metadados e licença.

**Cobertura Certifica não comprovada.** O CSV não identifica o sistema emissor. A [orientação da Anatel](https://www.gov.br/anatel/pt-br/regulado/certificacao-de-produtos/consulta-publica) recomenda consultar SCH e Certifica; em correspondências, prevalece Certifica. Este Actor não faz login nesses sistemas. Um modelo ausente no CSV pode estar no Certifica. O resultado não substitui a consulta ao certificado vigente.

#### Exemplos

```json
{"modo":"busca","fabricante":"Apple","modelo":"A","maxItems":100}
```

```json
{"modo":"novos","fabricante":"Samsung","modelo":"","desde":"2026-09-01","maxItems":1000}
```

```json
{"modo":"validar_lote","fabricante":"","modelo":"","listaModelos":["A3287","A3290","MODELO-A-CONFERIR"]}
```

```json
{"modo":"busca","fabricante":"Cabletech","modelo":"SC-APC SM","incluirMarcaAnatel":true,"maxItems":50}
```

| Input | Comportamento |
|---|---|
| `modo` | `busca`, `novos` ou `validar_lote` |
| `fabricante`, `modelo`, `tipoProduto` | Texto contido no campo, sem distinguir caixa e acentos. Filtros combinados com AND |
| `numeroHomologacao` | Número completo de 12 dígitos, com ou sem hífens |
| `desde` | Data de homologação inclusiva, `AAAA-MM-DD` |
| `listaModelos` | Até 100 modelos; comparação exata, sem distinguir caixa e acentos |
| `incluirMarcaAnatel` | Inclui declarações identificadas por processo SEI. Padrão `false` |
| `maxItems` | Máximo de registros válidos, de 1 a 100.000. Padrão 100 |
| `incremental` | Padrão `false` em busca/lote; `true` suprime registros já entregues |
| `cacheHours` | Padrão 24; intervalo para consultar atualização. `0` verifica HEAD a cada run |
| `timeoutSecs` | Timeout por tentativa, inclusive leitura do corpo. Padrão 45 segundos |

Ao usar a interface, limpe os filtros preenchidos Apple/A para outra busca. Na entrada programática, filtros omitidos são limpos quando outro fabricante/número/tipo ou modo é informado. Input vazio usa Apple/A.

`novos` sempre usa estado persistente por filtros e entrega somente identidades ainda não entregues. A primeira execução entrega a fotografia atual, filtrada por `desde` quando fornecido. Alterações de situação em uma identidade existente não são novidades; use `busca` com `incremental:true` para receber alterações de campos. As execuções precisam compartilhar o mesmo storage de estado; execute sequencialmente. Um limite deixa itens pendentes para a próxima execução.

O cache usa intervalo diário, HEAD/ETag/Last-Modified e SHA-256 como fallback. Reutilizar dados mantém `retrieved_at` da coleta original, sem fingir uma nova coleta. Uma consulta incremental concluída sem mudança grava **zero itens**; o `RUN_SUMMARY` informa `sem_mudanca`. A busca padrão continua retornando resultados mesmo com cache. Indisponibilidade durante uma checagem obrigatória gera diagnóstico explícito; não usa cache vencido como sucesso silencioso.

#### Saída e cobrança

Cada registro contém `numero_homologacao`, `numero_processo_sei`, `fabricante`, `solicitante`, `modelo`, `nome_comercial`, `tipo_produto`, `data_homologacao`, `validade`, `situacao`, `situacao_requerimento`, `fonte`, `sistema_origem`, `source_url`, `source_name`, `source_sha256`, `source_row`, `retrieved_at`, `warnings`, `status` e `consulta_modelo`. Datas de coleta usam ISO 8601 com `-03:00`. `source_row` é o índice do registro CSV mais cabeçalho; não é linha física quando há quebras dentro de aspas.

Campo ausente ou omitido = `null` e aviso. Marca Anatel não fornece número de homologação nem validade: conserva processo SEI e situação da homologação. Na base principal, `situacao` é situação do certificado de conformidade; `situacao_requerimento` é a situação do requerimento. `validade` reproduz a data do certificado de conformidade, sem deduzir vigência da homologação.

| Status | Significado | Evento cobrado |
|---|---|---|
| `ok` / `parcial` | Registro com identidade e modelo; `parcial` tem avisos, inclusive cobertura Certifica | `homologacao` |
| `sem_resultado` | Não encontrado nesta fotografia e filtros | Nenhum |
| `fonte_indisponivel` | Timeout, bloqueio, 429 ou 5xx após retentativas | Nenhum |
| `erro` | Layout incompatível, registro sem identidade/modelo ou erro de execução | Nenhum |

Cada registro válido corresponde a um evento `homologacao`, inclusive registro Marca Anatel com processo SEI e modelo. Uma consulta em lote pode encontrar vários registros por modelo. Erros, diagnósticos e ausência não recebem evento. O teto de gasto configurado na plataforma limita a entrega; teto zero interrompe antes de baixar a fonte. O resumo informa limites atingidos, eventos solicitados e efetivamente cobrados. Consulte o preço vigente na Store.

`RUN_SUMMARY` no Key-Value Store contém contagens de leitura/gravação/erros, hashes das fontes, hash agregado, cache, requisições, truncamento e cobrança. `hash_fonte` é SHA-256 dos hashes originais das fontes concatenados com quebra de linha. Dataset e resumo são disponibilizados na saída do Actor. Quando número/modelo aparece em várias linhas, retorna uma representante com prioridade à maior data da fonte; tipos e situações são os dessa linha, sem agregação.

#### Privacidade e execução

CPF é protegido. Solicitantes ficam inteiros somente com marcador explícito: LTDA, S.A., S/A, S.A, CIA, COOPERATIVA, ASSOCIAÇÃO, FUNDAÇÃO, INSTITUTO, MINISTÉRIO, UNIVERSIDADE, INC, LLC, CO., CORP, GMBH ou LIMITED. A comparação exige limite de palavra e ignora acento/caixa. Todos os demais nomes recebem máscara e aviso LGPD, inclusive ME/EPP/EIRELI, marcas conhecidas e nomes com CNPJ válido. A regra é conservadora e pode mascarar empresas. Não há enriquecimento de pessoas, endereços, contatos ou IMEI. Os dados são sanitizados antes de persistir; o ZIP bruto é processado apenas em memória.

HTTP 429/5xx e timeout têm duas retentativas com backoff. `Retry-After` é respeitado; acima de 60 segundos o run registra indisponibilidade e para, sem antecipar a tentativa. O download tem limites de tamanho e o parser rejeita mudanças de layout. O processamento inicial do CSV completo exige memória; recomenda-se 2 GB para a primeira coleta. O estado sanitizado é comprimido no Key-Value Store.

### English

Search official Anatel open data, track newly observed products, and look up batches of exact model names. The default Apple/A search returns real records on every run. Sources are the official [homologated products ZIP](https://www.anatel.gov.br/dadosabertos/paineis_de_dados/certificacao_de_produtos/produtos_certificados.zip) and optional [Marca Anatel ZIP](https://www.anatel.gov.br/dadosabertos/paineis_de_dados/certificacao_de_produtos/Marca_Anatel.zip).

**Certifica coverage is unverified.** CSV rows do not identify their issuing system. A missing result does not prove that a product lacks homologation. Check both public systems following [Anatel's guidance](https://www.gov.br/anatel/pt-br/regulado/certificacao-de-produtos/consulta-publica); Certifica takes precedence when both contain a number. This Actor does not authenticate to either system.

Inputs retain Portuguese names. `busca` uses combined substring filters; `novos` returns new identities since the preceding completed deliveries for those filters; `validar_lote` takes `listaModelos` and uses exact, case/accent insensitive model matching. The first `novos` run returns the current snapshot, optionally filtered by inclusive `desde`. Clear Apple/A prefilled filters when searching another manufacturer. Empty programmatic input uses Apple/A with a default maxItems of 100.

Use `incremental:true` for repeat suppression. Share the state storage and run sequentially. Daily cached snapshots, HEAD validators and SHA-256 avoid redundant downloads. An unchanged completed incremental query writes zero items. Changed fields are detected in incremental `busca`; `novos` tracks identities only. Limits preserve remaining records for later runs.

Every item includes an exact source URL, original-source SHA-256, CSV record index, original collection timestamp with `-03:00`, warnings and status. Missing fields are `null` with warnings. Marca Anatel records use their SEI process number; absent homologation numbers are never invented. `validade` is the conformity-certificate date from the CSV, not a legal determination of approval validity.

Only valid `ok`/`parcial` records trigger a `homologacao` event, including Marca Anatel rows with a process number and model. Empty results and failures do not trigger billing events. Batch queries may return several billable records per model. Spending caps stop further delivery. See the Store for current pricing.

The `RUN_SUMMARY` key reports rows read/written, errors, original-source hashes, cache checks, limits and charges. CPF identifiers are protected. Applicant names remain whole only with an explicit marker: LTDA, S.A., S/A, S.A, CIA, COOPERATIVA, ASSOCIAÇÃO, FUNDAÇÃO, INSTITUTO, MINISTÉRIO, UNIVERSIDADE, INC, LLC, CO., CORP, GMBH or LIMITED. Matching uses word boundaries and ignores case/accents. Every other name is masked with an LGPD warning, including ME/EPP/EIRELI, known brands and names with valid CNPJ identifiers. This conservative rule may mask companies. Raw downloads remain in memory; persisted data is sanitized. Initial processing of the complete source is memory intensive (2 GB recommended); state payloads are compressed. Timeouts, rate limits, server errors and schema drift produce explicit diagnostics.

# Actor input Schema

## `modo` (type: `string`):

Busca por filtros; novidades comparadas com estado anterior; lote de modelos exatos.

## `fabricante` (type: `string`):

Contém o texto, ignorando acentos e caixa. Limpe Apple para buscar outro fabricante.

## `modelo` (type: `string`):

Busca contém; no lote, cada modelo é comparado exatamente.

## `numeroHomologacao` (type: `string`):

Número completo; comparação ignora pontuação.

## `tipoProduto` (type: `string`):

Contém o texto informado.

## `desde` (type: `string`):

Data inclusiva AAAA-MM-DD; opcional. Sem data, novos começa com a fotografia atual.

## `listaModelos` (type: `array`):

Obrigatório no modo validar_lote. Ausência significa somente não encontrado neste CSV.

## `incremental` (type: `boolean`):

busca padrão false sempre devolve dados; novos usa diff por identidade. true permite segundo run sem mudança gravar zero. Limites não descartam itens pendentes.

## `incluirMarcaAnatel` (type: `boolean`):

Inclui o CSV oficial de declaração de conformidade com Marca Anatel. Identidade por processo SEI; não inventa número de homologação ausente.

## `maxItems` (type: `integer`):

Limite de registros válidos; diagnósticos gratuitos não contam.

## `timeoutSecs` (type: `integer`):

Segundos para cabeçalhos e corpo; duas retentativas em 429/5xx/timeout.

## `cacheHours` (type: `number`):

24 = no máximo uma checagem por dia por storage. 0 = HEAD em todo run; ETag/Last-Modified/hash evitam reprocessamento.

## Actor input object example

```json
{
  "modo": "busca",
  "fabricante": "Apple",
  "modelo": "A",
  "numeroHomologacao": "",
  "tipoProduto": "",
  "listaModelos": [],
  "incremental": false,
  "incluirMarcaAnatel": false,
  "maxItems": 100,
  "timeoutSecs": 45,
  "cacheHours": 24
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "modo": "busca",
    "fabricante": "Apple",
    "modelo": "A",
    "numeroHomologacao": "",
    "tipoProduto": "",
    "listaModelos": [],
    "incremental": false,
    "incluirMarcaAnatel": false,
    "maxItems": 100,
    "timeoutSecs": 45,
    "cacheHours": 24
};

// Run the Actor and wait for it to finish
const run = await client.actor("kman-br/anatel").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "modo": "busca",
    "fabricante": "Apple",
    "modelo": "A",
    "numeroHomologacao": "",
    "tipoProduto": "",
    "listaModelos": [],
    "incremental": False,
    "incluirMarcaAnatel": False,
    "maxItems": 100,
    "timeoutSecs": 45,
    "cacheHours": 24,
}

# Run the Actor and wait for it to finish
run = client.actor("kman-br/anatel").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "modo": "busca",
  "fabricante": "Apple",
  "modelo": "A",
  "numeroHomologacao": "",
  "tipoProduto": "",
  "listaModelos": [],
  "incremental": false,
  "incluirMarcaAnatel": false,
  "maxItems": 100,
  "timeoutSecs": 45,
  "cacheHours": 24
}' |
apify call kman-br/anatel --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kman-br/anatel"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ktF9MtoUriXoVp3LZ/builds/3zarJw7U3jGyOO2vn/openapi.json
