Manual de Integração — API Direct Data
O Look a Like é o produto Direct Data que constrói listas de empresas similares a um perfil definido pelo cliente, a partir de critérios de negócio como atividade econômica (CNAE), localização (UF, cidade, bairro, CEP), porte, situação cadastral, situação especial e faixa de funcionários. O resultado final é um arquivo CSV enriquecido, pronto para uso comercial.
Esta API permite ao cliente submeter os filtros de busca, visualizar uma amostra do resultado (top 5 empresas) antes de comprar, cotar o preço para uma quantidade desejada, confirmar a compra (cobrança automática) e baixar o arquivo final quando o enriquecimento concluir.
/api/LookALikeapplication/json)
previewGuid ou exportGuid) e faz polling nos endpoints de
status até a conclusão. Volume típico: 5–30 s para o preview e até alguns minutos para o
enriquecimento, dependendo da quantidade adquirida.
O fluxo do Look a Like é composto por quatro conceitos principais:
| Conceito | Identificador | Descrição |
|---|---|---|
| Filtro | — | Conjunto de critérios de busca enviado no body do endpoint Filter (CNAE, UF, porte, etc.). Pelo menos uma whitelist deve ser fornecida. |
| Preview | previewGuid |
Resultado da execução dos filtros — uma lista candidata de empresas. Inclui o total encontrado e uma amostra de até 5 empresas. Sem custo. |
| Cotação (Quote) | — | Cálculo de preço para exportar uma quantidade específica do preview. Sem efeito colateral — não cobra nem reserva. |
| Export (Compra) | exportGuid |
Confirmação da compra: cria o compilado, cobra a empresa e enfileira o enriquecimento. Quando concluído, o CSV fica disponível para download. |
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 (POST) | Sempre application/json nos endpoints POST. Não é necessário nos GET. |
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.
Todas as respostas (exceto Download, que devolve um stream binário) 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": "22/05/2026 14:32:15",
"error": null
}
| Campo | Tipo | Descrição |
|---|---|---|
success | bool | Indica se a operação foi bem sucedida (HTTP 2xx). |
status | string | Descrição textual do status HTTP retornado. |
elapsedTimeMs | long | Tempo total de processamento da requisição em milissegundos. |
dateTimeExecution | string | Data e hora em que a requisição foi executada no servidor. |
error | object | Objeto com fieldName e message em caso de erro. null em caso de sucesso. |
Retornado no campo previewStatus dos endpoints Filter e GetPreview:
| Valor | Nome | Descrição |
|---|---|---|
1 | Processing | Em processamento — aguardando o worker construir a lista. |
2 | PreviewCompleted | Preview pronto — totalFound e sample disponíveis. |
3 | Failed | Falha na construção do preview. |
Retornado no campo exportStatus dos endpoints Purchase e GetExport:
| Valor | Nome | Descrição |
|---|---|---|
1 | Processing | Export criado e pagamento em andamento. |
2 | Enriching | Pagamento confirmado — enriquecimento do arquivo CSV em andamento. |
3 | Completed | Arquivo CSV pronto para download. |
4 | Error | Falha após o pagamento — o valor foi estornado automaticamente. refundReason traz o motivo. |
Define em qual coluna de CNAE o filtro unificado é aplicado:
| Valor | Nome | Descrição |
|---|---|---|
1 | Both | Aplica em ambas as colunas (primário e secundário). |
2 | PrimaryOnly | Aplica somente na coluna de CNAE primário. |
3 | SecondaryOnly | Aplica somente na coluna de CNAE secundário. |
O fluxo padrão segue 6 etapas: enviar filtros, aguardar o preview, cotar, comprar, aguardar o enriquecimento e finalmente baixar o CSV.
Filter envia os critérios
de busca e cria o preview; GetPreview retorna o status e (quando pronto) o total
encontrado mais uma amostra de 5 empresas.
Submete os filtros de busca e dispara a construção assíncrona do preview. Retorna o
previewGuid que deve ser usado em todas as chamadas subsequentes do fluxo. Pelo menos
uma whitelist deve estar preenchida em algum dos filtros.
numberOfResults aceita no máximo
100.000. Valores acima desse limite (ou ausentes/negativos) são revertidos
silenciosamente para o default de 1.000. Para volumes maiores, gere
previews separados com filtros diferentes.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
numberOfResults | long | Não | Limite máximo de resultados a considerar no preview. Mínimo: 1. Máximo: 100.000. Default: 1.000. |
filters | object | Sim | Conjunto de filtros de busca — ver tabela abaixo. |
ignoredCnpjList | array<string> | Não | Lista de CNPJs que devem ser excluídos do resultado do preview. Útil para remover clientes já existentes ou empresas que não devem ser prospectadas. Aceita CNPJ formatado ("12.345.678/0001-99") ou apenas dígitos ("12345678000199"). CNPJs duplicados dentro da lista são ignorados automaticamente. Máximo: 100.000 itens. |
filters
A maioria dos campos aceita o formato FormValue:
{ "whiteList": ["valor1", "valor2"], "blackList": ["valor3"] }
whiteList inclui apenas as empresas que possuem os valores informados;
blackList exclui empresas que possuem os valores informados. Ambas as listas podem ser vazias.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
employeeCountRange |
{ min: int, |
Não |
Faixa de número de funcionários. Use exatamente uma das cinco faixas válidas:
|
postalCodes |
FormValue | Não | CEPs no formato XXXXX-XXX (ex: "01310-100"). |
states |
FormValue | Não | Siglas de UF brasileiras, 2 letras (ex: "SP", "RJ"). |
cities |
FormValue | Não | Nomes de cidades (ex: "São Paulo", "Campinas"). |
neighborhoods |
FormValue | Não | Nomes de bairros (ex: "Centro", "Jardim Paulista"). |
primaryCnae |
FormValue | Não | Código CNAE primário da empresa (apenas dígitos, ex: "6201500"). |
secondaryCnae |
FormValue | Não | Código CNAE secundário da empresa (apenas dígitos, ex: "6201500"). |
unifiedCnae |
{ mode: int, |
Não |
Filtro unificado de CNAE — aplica sobre CNAE primário, secundário ou ambos conforme o mode:
|
companySize |
FormValue | Não |
ID do porte da empresa:
|
specialStatus |
FormValue | Não |
ID da situação especial da empresa:
|
registrationStatus |
FormValue | Não |
ID da situação cadastral da empresa:
|
openingDateStart |
string | Não | Data de abertura mínima, no formato dd/MM/yyyy (ex: "01/01/2010"). |
openingDateEnd |
string | Não | Data de abertura máxima, no formato dd/MM/yyyy (ex: "31/12/2020"). Deve ser maior ou igual a openingDateStart quando ambos forem informados. |
POST /api/LookALike/Filter HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
Content-Type: application/json
{
"numberOfResults": 5000,
"filters": {
"states": { "whiteList": ["SP"], "blackList": [] },
"cities": { "whiteList": ["São Paulo"], "blackList": [] },
"neighborhoods": { "whiteList": ["Centro", "Bela Vista"], "blackList": [] },
"primaryCnae": { "whiteList": ["6201500", "6202300"], "blackList": [] },
"companySize": { "whiteList": ["1", "3"], "blackList": [] },
"registrationStatus": { "whiteList": ["1"], "blackList": [] },
"employeeCountRange": { "min": 10, "max": 49 },
"openingDateStart": "01/01/2010",
"openingDateEnd": "31/12/2020"
}
}
{
"success": true,
"status": "OK",
"elapsedTimeMs": 215,
"dateTimeExecution": "22/05/2026 14:32:15",
"error": null,
"previewGuid": "a1b2c3d4-e5f6-7890-abcd-1234567890ab",
"previewStatus": "Processing",
"createdAt": "22/05/2026 14:32:15"
}
| Campo | Tipo | Descrição |
|---|---|---|
previewGuid | Guid | Identificador público do preview. Use em GetPreview, Quote e Purchase. |
previewStatus | string | Sempre Processing na criação. Faça polling em GetPreview até virar PreviewCompleted. |
createdAt | string (dd/MM/yyyy HH:mm:ss) | Timestamp da criação do preview. |
Retorna o status atual do preview. Quando o status é PreviewCompleted, a resposta
inclui o total de empresas encontradas (totalFound) e uma amostra de até 5 empresas
(sample).
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
previewGuid | Guid | Sim | Guid público do preview retornado por Filter. |
GET /api/LookALike/Preview/a1b2c3d4-e5f6-7890-abcd-1234567890ab HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
{
"success": true,
"status": "OK",
"elapsedTimeMs": 89,
"dateTimeExecution": "22/05/2026 14:33:08",
"error": null,
"previewGuid": "a1b2c3d4-e5f6-7890-abcd-1234567890ab",
"previewStatus": "PreviewCompleted",
"createdAt": "22/05/2026 14:32:15",
"completedAt": "22/05/2026 14:32:48",
"totalFound": 3247,
"sample": [
{
"companyName": "TECIDOS EXEMPLO LTDA",
"startOfActivity": "14/03/2010",
"city": "São Paulo",
"companySize": "ME"
}
]
}
| Campo | Tipo | Descrição |
|---|---|---|
previewGuid | Guid | Eco do parâmetro recebido. |
previewStatus | string | Status atual: Processing, PreviewCompleted ou Failed. |
createdAt | string | Timestamp da criação. |
completedAt | string | Timestamp da conclusão (somente quando PreviewCompleted). |
totalFound | long | Quantidade total de empresas encontradas. Somente quando PreviewCompleted. |
sample[] | array | Amostra de até 5 empresas. Somente quando PreviewCompleted. |
sample[].companyName | string | Razão Social da empresa. |
sample[].startOfActivity | string (dd/MM/yyyy) | Data de início de atividade da empresa. |
sample[].city | string | Cidade. |
sample[].companySize | string | Porte (MEI, ME, EPP, PJ). |
Quote calcula o preço sem efeito colateral. Purchase efetiva a compra,
cobra o valor da empresa via saldo/faturamento e enfileira o enriquecimento do arquivo.
Calcula o preço para exportar uma quantidade específica do preview. Não cobra nem reserva nada. Útil para o cliente exibir o valor antes de confirmar a compra.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
previewGuid | Guid | Sim | Guid de um preview com status PreviewCompleted. |
quantity | long | Sim | Quantidade de empresas a exportar (1 ≤ quantity ≤ totalFound). |
POST /api/LookALike/Quote HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
Content-Type: application/json
{
"previewGuid": "a1b2c3d4-e5f6-7890-abcd-1234567890ab",
"quantity": 500
}
{
"success": true,
"status": "OK",
"elapsedTimeMs": 35,
"dateTimeExecution": "22/05/2026 14:35:02",
"error": null,
"previewGuid": "a1b2c3d4-e5f6-7890-abcd-1234567890ab",
"quantity": 500,
"unitPrice": 0.45,
"totalPrice": 225.00,
"currency": "BRL"
}
| Campo | Tipo | Descrição |
|---|---|---|
previewGuid | Guid | Eco do preview cotado. |
quantity | long | Quantidade cotada. |
unitPrice | decimal | Preço unitário (por item). |
totalPrice | decimal | Preço total (unitPrice × quantity). |
currency | string | Código ISO 4217 da moeda. Sempre "BRL". |
Confirma a compra: cria o compilado (subset do preview), cobra o valor da empresa e enfileira o
enriquecimento. Retorna o exportGuid que deve ser usado para acompanhar o status e
baixar o arquivo final.
Error com o motivo em refundReason.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
previewGuid | Guid | Sim | Guid de um preview com status PreviewCompleted. |
quantity | long | Sim | Quantidade de empresas a exportar (1 ≤ quantity ≤ totalFound). |
POST /api/LookALike/Purchase HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
Content-Type: application/json
{
"previewGuid": "a1b2c3d4-e5f6-7890-abcd-1234567890ab",
"quantity": 500
}
{
"success": true,
"status": "OK",
"elapsedTimeMs": 412,
"dateTimeExecution": "22/05/2026 14:36:14",
"error": null,
"exportGuid": "b2c3d4e5-f6a7-8901-bcde-2345678901bc",
"exportStatus": "Processing",
"amountCharged": 225.00,
"currency": "BRL",
"purchasedAt": "22/05/2026 14:36:14"
}
| Campo | Tipo | Descrição |
|---|---|---|
exportGuid | Guid | Identificador público do export. Use em GetExport e Download. |
exportStatus | string | Sempre Processing na criação. Faça polling em GetExport. |
amountCharged | decimal | Valor efetivamente cobrado. |
currency | string | Sempre "BRL". |
purchasedAt | string (dd/MM/yyyy HH:mm:ss) | Timestamp da confirmação da compra. |
GetExport retorna o status; Download retorna o stream do arquivo
quando o status é Completed.
Retorna o estado atual de um export. O cliente deve fazer polling neste endpoint até o status
ficar Completed (ou Error em caso de falha).
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
exportGuid | Guid | Sim | Guid público do export retornado por Purchase. |
GET /api/LookALike/Export/b2c3d4e5-f6a7-8901-bcde-2345678901bc HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
{
"success": true,
"status": "OK",
"elapsedTimeMs": 47,
"dateTimeExecution": "22/05/2026 14:42:01",
"error": null,
"exportGuid": "b2c3d4e5-f6a7-8901-bcde-2345678901bc",
"exportStatus": "Completed",
"listName": "Têxtil SP — Maio/2026",
"quantity": 500,
"amountCharged": 225.00,
"currency": "BRL",
"purchasedAt": "22/05/2026 14:36:14",
"completedAt": "22/05/2026 14:41:53",
"refundReason": null,
"isDownloadReady": true
}
| Campo | Tipo | Descrição |
|---|---|---|
exportGuid | Guid | Eco do parâmetro recebido. |
exportStatus | string | Processing, Enriching, Completed ou Error. |
listName | string | Nome da lista gerado automaticamente pela API no padrão API_Preview_{guid}_{data}. |
quantity | long | Quantidade adquirida. |
amountCharged | decimal | Valor cobrado. |
currency | string | Sempre "BRL". |
purchasedAt | string (dd/MM/yyyy HH:mm:ss) | Timestamp da compra. |
completedAt | string (dd/MM/yyyy HH:mm:ss) | Timestamp da conclusão do enriquecimento (ou da falha). |
refundReason | string | Motivo do estorno em caso de Error. null em sucesso. |
isDownloadReady | bool | true quando o arquivo está pronto para download. |
Devolve o stream de um pacote ZIP contendo o arquivo CSV final com os dados
enriquecidos (e eventuais metadados auxiliares). Disponível apenas quando o status do export é
Completed. O conteúdo é entregue como application/zip com cabeçalho
Content-Disposition: attachment.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
exportGuid | Guid | Sim | Guid público do export. |
GET /api/LookALike/Export/b2c3d4e5-f6a7-8901-bcde-2345678901bc/Download HTTP/1.1
Host: {base-url-directdata}
Token: 00000000-0000-0000-0000-000000000000
HTTP/1.1 200 OK
Content-Type: application/zip
Content-Disposition: attachment; filename="LookALike-API_Preview_a1b2c3d4-e5f6-7890-abcd-ef1234567890.zip"
<binary ZIP stream>
# Dentro do ZIP (exemplo):
# resultado.csv ← lista enriquecida (CNPJ, Razão Social, CNAE, etc.)
# metadata.json ← metadados da exportação (opcional)
ResponseMetaDataDTO. Em caso de erro, retorna apenas o código HTTP correspondente
(sem body) — ver tabela de erros na seção 5.4.
Quando uma requisição falha (exceto no Download), 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": "22/05/2026 14:40:01",
"error": {
"fieldName": "Token",
"message": "Token de acesso inválido. Verifique suas credenciais."
}
}
// Exemplo de resposta 404 Not Found (Guid não pertence à empresa)
{
"success": false,
"status": "Not Found",
"elapsedTimeMs": 28,
"dateTimeExecution": "22/05/2026 14:40:14",
"error": {
"fieldName": "previewGuid",
"message": "Preview não encontrado ou não acessível."
}
}
Token está ausente, mal formado ou
não corresponde a uma empresa válida.previewGuid ou exportGuid) não existe ou não pertence à
empresa autenticada.Quote e Purchase).
POST /api/LookALike/Filter · GET /api/LookALike/Preview/{previewGuid}
| Código | Condição | Campo | Mensagem |
|---|---|---|---|
| 400 | Filtros vazios (nenhuma whitelist preenchida) | filters | Pelo menos um filtro (whiteList) deve ser preenchido. |
| 400 | IgnoredCnpjList excede 100.000 itens | ignoredCnpjList | A lista de CNPJs ignorados excede o limite máximo de 100.000 itens. |
| 404 | Preview não encontrado ou não pertence à empresa | previewGuid | Preview não encontrado ou não acessível. |
| 401 | Header Token ausente ou inválido | Token | Token de acesso inválido. Verifique suas credenciais. |
| 403 | Empresa sem o produto habilitado | Product | Produto não liberado para esta empresa. |
| 500 | Exceção não tratada no servidor | — | Erro inesperado ao processar a requisição. |
POST /api/LookALike/Quote · POST /api/LookALike/Purchase
| Código | Condição | Campo | Mensagem |
|---|---|---|---|
| 400 | Quantidade inválida (≤ 0 ou > totalFound) | quantity | A quantidade deve ser maior que zero e não pode exceder o total encontrado no preview. |
| 400 | Quantidade excede o máximo contratado | quantity | A quantidade excede o máximo permitido por exportação via API. |
| 400 | Preview ainda em processamento | previewGuid | O preview ainda está em processamento. Tente novamente em instantes. |
| 400 | Preview falhou | previewGuid | O processamento do preview falhou. |
| 404 | Preview não encontrado ou não pertence à empresa | previewGuid | Preview não encontrado ou não acessível. |
| 409 | Preview já foi comprado anteriormente (status AwaitingPayment, Processing, Paid, Enriching ou Completed) | previewGuid | Este preview já foi comprado. Gere um novo preview para realizar outro pedido. |
| 402 | Saldo/faturamento inválido ou cobrança recusada | companyId | Saldo insuficiente para realizar. Por favor, verifique. |
| 401 | Header Token ausente ou inválido | Token | Token de acesso inválido. Verifique suas credenciais. |
| 403 | Empresa sem o produto habilitado | Product | Produto não liberado para esta empresa. |
| 500 | Exceção não tratada no servidor | — | Erro inesperado ao processar a requisição. |
GET /api/LookALike/Export/{exportGuid} · GET /api/LookALike/Export/{exportGuid}/Download
| Código | Condição | Campo | Mensagem |
|---|---|---|---|
| 404 | Export não encontrado ou não pertence à empresa | exportGuid | Export não encontrado ou não acessível. |
| 409 | Tentativa de download antes do status Completed | exportGuid | O export ainda não está disponível para download. |
| 502 | Falha ao recuperar o arquivo do serviço de enriquecimento | — | Falha ao recuperar o arquivo do serviço de enriquecimento. |
| 401 | Header Token ausente ou inválido | Token | Token de acesso inválido. Verifique suas credenciais. |
| 403 | Empresa sem o produto habilitado | Product | Produto não liberado para esta empresa. |
| 500 | Exceção não tratada no servidor | — | Erro inesperado ao processar a requisição. |