Direct Data

Pesquisa Avançada

Manual de Integração — API Direct Data


Produto: Pesquisa Avançada — Busca Filtrada de Pessoas Físicas e Jurídicas

Base URL: /api/AdvancedSearch

Autenticação: Header Token (Guid)

Versão: 2.1

Sumário

1. Visão Geral

1.1 Descrição do Produto

A Pesquisa Avançada é o produto Direct Data que permite ao cliente realizar buscas filtradas de Pessoas Jurídicas (PJ) e Pessoas Físicas (PF). O fluxo é dividido em duas etapas:

  1. Filtro: o cliente envia critérios de busca (razão social, CNAE, UF, endereço, nome, data de nascimento etc.) e recebe uma lista de candidatos contendo identificadores internos (Id) e dados básicos. Essa etapa não consome saldo.
  2. Processamento: o cliente seleciona os Ids desejados e dispara o processamento. O backend faz o enriquecimento completo dos registros e retorna um SearchUid que identifica a pesquisa concluída. Os resultados detalhados são obtidos via ViewSearch. Essa etapa consome saldo conforme a quantidade de itens processados.
Base URL: /api/AdvancedSearch
Protocolo: HTTPS
Formato de dados: JSON (application/json) em todos os endpoints

1.2 Autenticação

Todos os endpoints exigem autenticação via header Token contendo o GUID de API emitido pela Direct Data para a sua empresa. Esse token é único por empresa e deve ser tratado como credencial sensível.

Header Tipo Obrigatório Descrição
Token Guid Sim Token de API fornecido pela Direct Data, no formato 00000000-0000-0000-0000-000000000000.
Content-Type string Sim Sempre application/json.
Como obter seu Token de API: acesse o painel da Direct Data, faça login com sua conta e vá até a tela de perfil em https://app.directd.com.br/configuracoes/perfil. O Token é exibido nessa página e pode ser copiado para uso em todas as chamadas desta API.

1.3 Estrutura de Resposta Padrão

Todas as respostas estendem o envelope ResponseMetaDataDTO. Independente de sucesso ou falha, o cliente sempre receberá os campos abaixo no corpo da resposta:

{
  "success": true,
  "status": "OK",
  "elapsedTimeMs": 124,
  "dateTimeExecution": "08/05/2026 14:32:15",
  "error": null
}
Campo Tipo Descrição
successboolIndica se a operação foi bem sucedida (HTTP 2xx).
statusstringDescrição textual do status HTTP retornado.
elapsedTimeMslongTempo total de processamento da requisição em milissegundos.
dateTimeExecutionstringData e hora em que a requisição foi executada no servidor.
errorobjectObjeto com fieldName e message em caso de erro. null em caso de sucesso.
Boas práticas de tratamento:

1.4 Enumeradores

Status do Item Pesquisado (campo resultId)

Após chamar ProcessingIds, cada item da pesquisa passa por um ciclo de processamento. O campo resultId retornado em ViewSearch.searchItems[] indica o estado atual do item, e o campo result traz a descrição textual correspondente. Os valores possíveis retornados pela API são:

resultIdresult (texto)Descrição
1Na FilaItem criado e aguardando para iniciar o processamento.
3PesquisandoItem em execução
4Pesquisado com SucessoPesquisa concluída com sucesso.
5Parcialmente PequisadoPesquisa concluída parcialmente
6Falha na PesquisaFalha ao processar o item. Candidato típico para Reprocessing.
7Resultado SigilosoDocumento localizado, porém com informação de natureza sigilosa.
Status finais (terminais): 4 — Pesquisado com Sucesso, 5 — Parcialmente Pequisado, 6 — Falha na Pesquisa e 7 — Resultado Sigiloso. Esses estados não mudarão sem uma nova chamada de Reprocessing.
Status transitórios: 1 — Na Fila e 3 — Pesquisando indicam que o item ainda está em processamento. Quando algum item da pesquisa estiver em estado transitório, repita a chamada de ViewSearch após alguns segundos.

1.5 Fluxo de Integração Recomendado

O fluxo padrão de uso da API combina os endpoints de Filtro, Processamento e Visualização, conforme o diagrama abaixo:

Cliente Direct Data API | | |-- POST /FilterLegalPerson -------------->| | (filtros: CNAE, UF, Razão Social...) | |<-- 200 { listFilters[], numberOfCompanies } | | | | (cliente seleciona Ids desejados) | | | |-- POST /ProcessingIds ------------------>| | { listIds, searchName } | |<-- 200 { searchUid: "abc-123-..." } -----| | | | (aguarda alguns segundos / minutos) | | | |-- POST /ViewSearch --------------------->| | { searchUid } | |<-- 200 { viewSearch: { searchItems[], consumptionTotal } } | | | (em caso de falha em algum item:) | |-- POST /Reprocessing ------------------->| | { guid: searchUid } | |<-- 200 { success: true } |
Para Pessoa Física basta substituir FilterLegalPerson por FilterNaturalPerson. Os demais passos (ProcessingIds, ViewSearch, Reprocessing) são compartilhados entre PJ e PF.

2. Endpoints POST

2.1 FilterLegalPerson

POST /api/AdvancedSearch/FilterLegalPerson

Realiza a busca filtrada de Pessoas Jurídicas. Retorna a lista de empresas que atendem aos critérios e a quantidade total de registros encontrados. Esta operação não consome saldo — ela serve para o cliente avaliar o resultado antes de disparar o processamento.

Content-Type: application/json

Body da Requisição

CampoTipoObrigatórioDescrição
companyNamestringNãoRazão Social ou parte da razão social.
openingDateStartstringNãoData inicial de abertura da empresa. Formatos aceitos: yyyy-MM-dd ou dd-MM-yyyy.
openingDateEndstringNãoData final de abertura da empresa. Formatos aceitos: yyyy-MM-dd ou dd-MM-yyyy.
companySizestringNãoID do porte. Aceita: "0" Não Informado, "1" Micro Empresa, "3" Empresa de Porte Pequeno, "5" Demais.
cnaestringNãoCódigo CNAE (apenas dígitos, ex: "6201500").
citystringNãoNome ou código da cidade.
statestringNãoSigla da UF, 2 letras (ex: "SP").
legalNaturestringNãoCódigo da Natureza Jurídica (apenas dígitos, ex: "2062"). A tabela oficial é mantida pelo IBGE/CONCLA e adotada pela Receita Federal. Versão atualmente vigente: Natureza Jurídica 2021. Sempre confira a versão mais atual no índice oficial do CONCLA.
Pelo menos um filtro é obrigatório. Requisições com todos os campos vazios são rejeitadas. Recomenda-se combinar critérios para reduzir o volume de resultados e melhorar a precisão da busca.

Exemplo de Requisição

POST /api/AdvancedSearch/FilterLegalPerson HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
Content-Type: application/json

{
  "companyName": "",
  "openingDateStart": "2020-01-01",
  "openingDateEnd": "2024-12-31",
  "companySize": "",
  "cnae": "6201500",
  "city": "",
  "state": "SP",
  "legalNature": ""
}

Exemplo de Resposta (200)

{
  "success": true,
  "status": "OK",
  "elapsedTimeMs": 845,
  "dateTimeExecution": "08/05/2026 14:32:15",
  "error": null,
  "listFilters": [
    {
      "id": "9c4b1e02-...",
      "cnpj": "12345678000190",
      "companyName": "EXEMPLO TECNOLOGIA LTDA",
      "tradeName": "EXEMPLO TECH",
      "openingDate": "2021-04-12"
    }
  ],
  "numberOfCompanies": 1
}

Campos da Resposta

CampoTipoDescrição
listFiltersarrayLista de empresas que atendem aos critérios.
listFilters[].idstringIdentificador interno do registro — usar em ProcessingIds.
listFilters[].cnpjstringCNPJ da empresa (apenas dígitos).
listFilters[].companyNamestringRazão Social.
listFilters[].tradeNamestringNome Fantasia.
listFilters[].openingDatestringData de abertura da empresa.
numberOfCompaniesintQuantidade total de empresas encontradas pelo filtro.

2.2 FilterNaturalPerson

POST /api/AdvancedSearch/FilterNaturalPerson

Realiza a busca filtrada de Pessoas Físicas. Retorna a lista de pessoas que atendem aos critérios e a quantidade total de registros encontrados. Esta operação não consome saldo.

Content-Type: application/json

Body da Requisição

CampoTipoObrigatórioDescrição
fullNamestringNãoNome completo ou parte do nome.
motherNamestringNãoNome da mãe.
postalCodestringNãoCEP no formato NNNNN-NNN ou NNNNNNN.
streetstringNãoLogradouro.
citystringNãoCidade.
statestringNãoSigla da UF, 2 letras (ex: "RJ").
numberstringNãoNúmero do endereço.
neighborhoodstringNãoBairro.
emailstringNãoE-mail.
phoneNumberstringNãoTelefone (apenas dígitos).
dateOfBirthStartstringNãoData inicial de nascimento. Formatos aceitos: yyyy-MM-dd ou dd-MM-yyyy.
dateOfBirthEndstringNãoData final de nascimento. Formatos aceitos: yyyy-MM-dd ou dd-MM-yyyy.
receiveAuxilioEmergencialboolean?Não PremiumFiltra por recebimento de Auxílio Emergencial. true = recebe; false = não recebe; omitido = filtro desligado.
receiveAuxilioReconstrucaoboolean?Não PremiumFiltra por recebimento de Auxílio Reconstrução. true = recebe; false = não recebe; omitido = filtro desligado.
receiveBolsaFamiliaboolean?Não PremiumFiltra por recebimento de Bolsa Família. true = recebe; false = não recebe; omitido = filtro desligado.
receiveBPCboolean?Não PremiumFiltra por recebimento de BPC (Benefício de Prestação Continuada). true = recebe; false = não recebe; omitido = filtro desligado.
receiveGarantiaSafraboolean?Não PremiumFiltra por recebimento de Garantia Safra. true = recebe; false = não recebe; omitido = filtro desligado.
receiveSeguroDefesoboolean?Não PremiumFiltra por recebimento de Seguro Defeso. true = recebe; false = não recebe; omitido = filtro desligado.
Pelo menos um filtro é obrigatório. Requisições com todos os campos vazios/nulos são rejeitadas com HTTP 400.

Exemplo de Requisição — filtro padrão

POST /api/AdvancedSearch/FilterNaturalPerson HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
Content-Type: application/json

{
  "fullName": "JOAO DA SILVA",
  "state": "RJ",
  "dateOfBirthStart": "1980-01-01",
  "dateOfBirthEnd": "1990-12-31"
}

Exemplo de Requisição — com filtros Premium

POST /api/AdvancedSearch/FilterNaturalPerson HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
Content-Type: application/json

{
  "state": "SP",
  "receiveBolsaFamilia": true,
  "receiveBPC": false
}

Exemplo de Resposta (200)

{
  "success": true,
  "status": "OK",
  "elapsedTimeMs": 612,
  "dateTimeExecution": "08/05/2026 14:33:02",
  "error": null,
  "listFilters": [
    {
      "id": "0a5d7b22-...",
      "cpf": "12345678901",
      "fullName": "JOAO DA SILVA",
      "motherName": "MARIA DA SILVA",
      "dateOfBirth": "1985-07-22"
    }
  ],
  "numberOfPeople": 1
}

Campos da Resposta

CampoTipoDescrição
listFiltersarrayLista de pessoas que atendem aos critérios.
listFilters[].idstringIdentificador interno do registro — usar em ProcessingIds.
listFilters[].cpfstringCPF (apenas dígitos).
listFilters[].fullNamestringNome completo.
listFilters[].motherNamestringNome da mãe.
listFilters[].dateOfBirthstringData de nascimento.
numberOfPeopleintQuantidade total de pessoas encontradas pelo filtro.

2.3 ProcessingIds

POST /api/AdvancedSearch/ProcessingIds

Dispara o processamento dos registros selecionados a partir do resultado de FilterLegalPerson ou FilterNaturalPerson. O backend cria uma pesquisa, retorna imediatamente o SearchUid e o enriquecimento ocorre de forma assíncrona. O cliente deve aguardar e consultar os resultados via ViewSearch.

Esta etapa consome saldo conforme a quantidade de Ids enviados em listIds e a tabela de preços contratada. Verifique seu saldo antes de disparar processamentos com listas grandes.
Content-Type: application/json

Body da Requisição

CampoTipoObrigatórioDescrição
listIdsarray<string>SimLista de Ids retornados em FilterLegalPerson.listFilters[].id ou FilterNaturalPerson.listFilters[].id.
searchNamestringNãoNome amigável da pesquisa, usado para identificá-la posteriormente em relatórios.
premiumbooleanNão PremiumQuando true, o retorno inclui dados de benefícios sociais. Aplicável somente a CPFs. Padrão: false.
Modo Premium e formato de retorno em ViewSearch
Pesquisas com premium: false (padrão) devolvem o payload plano de Cadastro Pessoa Física Plus em searchItems[].returnJson.
Pesquisas com premium: true devolvem um envelope com dois sub-objetos:
{
  "metaDados": { ... },
  "retorno": {
    "cadastroPessoaFisicaPlus": { ... },
    "beneficiosSociais": { ... }
  }
}
Se o serviço de Benefícios Sociais falhar, beneficiosSociais será null e o resultado do item ficará como Sucesso Com Ressalvas.

Exemplo de Requisição — padrão

POST /api/AdvancedSearch/ProcessingIds HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
Content-Type: application/json

{
  "listIds": [
    "9c4b1e02-...",
    "0a5d7b22-..."
  ],
  "searchName": "Prospecção SP — Tecnologia (Maio/2026)"
}

Exemplo de Requisição — modo Premium

POST /api/AdvancedSearch/ProcessingIds HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
Content-Type: application/json

{
  "listIds": [
    "9c4b1e02-...",
    "0a5d7b22-..."
  ],
  "searchName": "Beneficiários SP (Maio/2026)",
  "premium": true
}

Exemplo de Resposta (200)

{
  "success": true,
  "status": "OK",
  "elapsedTimeMs": 215,
  "dateTimeExecution": "08/05/2026 14:34:18",
  "error": null,
  "searchUid": "f1e2d3c4-b5a6-7890-1234-567890abcdef"
}

Campos da Resposta

CampoTipoDescrição
searchUidGuidIdentificador único da pesquisa criada — utilizar em ViewSearch e Reprocessing.

2.4 ViewSearch

POST /api/AdvancedSearch/ViewSearch

Retorna o detalhamento completo de uma pesquisa previamente criada via ProcessingIds. Inclui o consumo total da pesquisa e a lista de itens processados — cada item com seu status individual e o JSON enriquecido devolvido pelas fontes de dados.

Content-Type: application/json

Body da Requisição

CampoTipoObrigatórioDescrição
searchUidGuidSimSearchUid retornado por ProcessingIds.

Exemplo de Requisição

POST /api/AdvancedSearch/ViewSearch HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
Content-Type: application/json

{
  "searchUid": "f1e2d3c4-b5a6-7890-1234-567890abcdef"
}

Exemplo de Resposta (200)

{
  "success": true,
  "status": "OK",
  "elapsedTimeMs": 380,
  "dateTimeExecution": "08/05/2026 14:36:45",
  "error": null,
  "viewSearch": {
    "consumptionTotal": 4.50,
    "errors": [],
    "warnings": [
      {
        "title": "Documento não localizado",
        "description": "1 item retornou sem dados na fonte externa."
      }
    ],
    "searchItems": [
      {
        "name": "EXEMPLO TECNOLOGIA LTDA",
        "document": "12345678000190",
        "resultId": 4,
        "result": "Pesquisado com Sucesso",
        "returnJson": { "...": "payload completo do enriquecimento" }
      },
      {
        "name": "OUTRA EMPRESA EXEMPLO LTDA",
        "document": "98765432000110",
        "resultId": 6,
        "result": "Falha na Pesquisa",
        "returnJson": null
      }
    ]
  }
}

Campos da Resposta

CampoTipoDescrição
viewSearchobjectObjeto com o detalhamento completo da pesquisa.
viewSearch.consumptionTotaldecimalTotal consumido em saldo pela pesquisa.
viewSearch.errorsarrayLista de erros agregados da pesquisa (title, description).
viewSearch.warningsarrayLista de avisos/ressalvas da pesquisa (title, description).
viewSearch.searchItemsarrayItens processados na pesquisa.
searchItems[].namestringNome ou Razão Social do item.
searchItems[].documentstringCPF ou CNPJ do item (apenas dígitos).
searchItems[].resultIdintStatus do item conforme tabela em 1.4 Enumeradores. Valores possíveis: 1, 3, 4, 5, 6 ou 7.
searchItems[].resultstringDescrição textual do status (ex: "Pesquisado com Sucesso", "Falha na Pesquisa").
searchItems[].returnJsondynamicJSON enriquecido devolvido pela fonte de dados — varia por tipo de pesquisa. null em caso de falha ou item ainda não processado.
Como saber se a pesquisa terminou? Itens com resultId = 1 (Na Fila) ou resultId = 3 (Pesquisando) ainda estão em processamento. Aguarde alguns segundos e chame ViewSearch novamente. Recomenda-se polling com intervalo crescente (ex: 3s, 5s, 10s, 30s) até que todos os itens estejam em estado terminal — 4 (Pesquisado com Sucesso), 5 (Parcialmente Pequisado), 6 (Falha na Pesquisa) ou 7 (Resultado Sigiloso).

2.5 Reprocessing

POST /api/AdvancedSearch/Reprocessing

Solicita o reprocessamento de uma pesquisa existente. Útil quando a pesquisa terminou com itens em status terminal de falha — tipicamente 6 — Falha na Pesquisa — e o cliente quer tentar novamente sem precisar refazer a etapa de filtragem. Também pode ser usado para itens em 5 — Parcialmente Pequisado caso se queira tentar uma nova consulta nas fontes que não responderam.

Reprocessamentos podem gerar consumo adicional de saldo para os itens que forem efetivamente executados novamente. Itens já concluídos com sucesso não são cobrados de novo.
Content-Type: application/json

Body da Requisição

CampoTipoObrigatórioDescrição
guidGuidSimSearchUid da pesquisa que será reprocessada.

Exemplo de Requisição

POST /api/AdvancedSearch/Reprocessing HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
Content-Type: application/json

{
  "guid": "f1e2d3c4-b5a6-7890-1234-567890abcdef"
}

Exemplo de Resposta (200)

{
  "success": true,
  "status": "OK",
  "elapsedTimeMs": 142,
  "dateTimeExecution": "08/05/2026 14:38:02",
  "error": null
}
Após chamar Reprocessing, a pesquisa volta ao ciclo de processamento. Use ViewSearch com o mesmo searchUid para acompanhar o resultado.

3. Mapeamento de Erros por Endpoint

3.1 Estrutura do Erro

Quando uma requisição falha, o envelope ResponseMetaDataDTO retorna o campo error preenchido com o nome do campo problemático e a mensagem correspondente. O campo success será false e o status HTTP refletirá o tipo de falha.

// Exemplo de resposta 401 Unauthorized (token inválido)
{
  "success": false,
  "status": "Unauthorized",
  "elapsedTimeMs": 12,
  "dateTimeExecution": "08/05/2026 14:40:01",
  "error": {
    "fieldName": "Token",
    "message": "Token de acesso inválido. Verifique suas credenciais."
  }
}

// Exemplo de resposta 403 Forbidden (produto não liberado)
{
  "success": false,
  "status": "Forbidden",
  "elapsedTimeMs": 18,
  "dateTimeExecution": "08/05/2026 14:40:14",
  "error": {
    "fieldName": "Product",
    "message": "Produto não liberado para esta empresa."
  }
}

// Exemplo de resposta 500 Internal Server Error
{
  "success": false,
  "status": "Internal Server Error",
  "elapsedTimeMs": 320,
  "dateTimeExecution": "08/05/2026 14:40:55",
  "error": {
    "fieldName": null,
    "message": "Erro inesperado ao processar a requisição."
  }
}
401 Unauthorized é retornado por todos os endpoints quando o header Token está ausente, mal formado ou não corresponde a uma empresa válida.
403 Forbidden é retornado quando o token é válido mas a empresa não tem o produto Pesquisa Avançada habilitado em seu contrato.

3.2 FilterLegalPerson

POST /api/AdvancedSearch/FilterLegalPerson

CódigoCondiçãoCampoMensagem
400Body inválido ou todos os filtros vaziosfilterPelo menos um filtro deve ser informado.
401Header Token ausente ou inválidoTokenToken de acesso inválido. Verifique suas credenciais.
403Empresa sem o produto Pesquisa Avançada habilitadoProductProduto não liberado para esta empresa.
500Exceção não tratada no servidorErro inesperado ao processar a requisição.

3.3 FilterNaturalPerson

POST /api/AdvancedSearch/FilterNaturalPerson

CódigoCondiçãoCampoMensagem
400Body inválido ou todos os filtros vazios/nulosfilterPelo menos um filtro deve ser informado.
401Header Token ausente ou inválidoTokenToken de acesso inválido. Verifique suas credenciais.
403Empresa sem o produto Pesquisa Avançada habilitadoProductProduto não liberado para esta empresa.
403Filtro Premium utilizado sem o produto Pesquisa Avançada Premium contratadoProductSua empresa não possui contratação do módulo Pesquisa Avançada Premium. Entre em contato com o comercial.
500Exceção não tratada no servidorErro inesperado ao processar a requisição.

3.4 ProcessingIds

POST /api/AdvancedSearch/ProcessingIds

CódigoCondiçãoCampoMensagem
400listIds vazio ou nulolistIdsÉ necessário informar ao menos um Id para processamento.
400Algum Id informado não pertence ao resultado de filtros do clientelistIdsUm ou mais Ids são inválidos ou não pertencem à empresa.
400premium: true enviado com CNPJs na listapremiumFiltros Premium estão disponíveis apenas para Pessoa Física.
401Header Token ausente ou inválidoTokenToken de acesso inválido. Verifique suas credenciais.
403Empresa sem o produto habilitado ou saldo insuficienteProductProduto não liberado ou saldo insuficiente para esta operação.
403premium: true enviado sem o produto Pesquisa Avançada Premium contratadoProductSua empresa não possui contratação do módulo Pesquisa Avançada Premium. Entre em contato com o comercial.
500Exceção não tratada no servidorErro inesperado ao processar a requisição.

3.5 ViewSearch

POST /api/AdvancedSearch/ViewSearch

CódigoCondiçãoCampoMensagem
400searchUid vazio ou em formato inválidosearchUidSearchUid inválido.
404Pesquisa não encontrada para a empresa autenticadasearchUidNão foi encontrada nenhuma pesquisa com este identificador.
401Header Token ausente ou inválidoTokenToken de acesso inválido. Verifique suas credenciais.
500Exceção não tratada no servidorErro inesperado ao processar a requisição.

3.6 Reprocessing

POST /api/AdvancedSearch/Reprocessing

CódigoCondiçãoCampoMensagem
400guid vazio ou em formato inválidoguidSearchUid inválido.
404Pesquisa não encontrada para a empresa autenticadaguidNão foi encontrada nenhuma pesquisa com este identificador.
401Header Token ausente ou inválidoTokenToken de acesso inválido. Verifique suas credenciais.
500Exceção não tratada no servidorErro inesperado ao processar a requisição.