Open Source INTelligence Engine
Uma API de OSINT (Open Source Intelligence) 100% própria que busca usernames em múltiplas plataformas simultaneamente, com arquitetura assíncrona, rate limiting por plano e suporte a webhooks.
Dado um username (ex: john_doe), a OSINTER API verifica em quais plataformas esse usuário existe, retornando:
- Todos os sites onde o perfil foi encontrado
- URLs diretas para cada perfil encontrado
- Progresso parcial enquanto busca
- Suporte a webhooks para notificação quando concluído
- Resultados armazenados temporariamente (1 hora no Redis)
| Versão | Quantidade |
|---|---|
| Anterior | 30+ sites |
| Atual | 410+ sites (globais e brasileiros) |
- Node.js 20+
- Redis 7+
- Docker e Docker Compose (recomendado)
git clone <repository-url>
cd osintercp .env.example .envEdite o arquivo .env conforme necessário.
# Desenvolvimento
docker-compose up
# Produção
docker-compose -f docker-compose.prod.yml up -d# Instale dependências
npm install
# Inicie o Redis (se não estiver rodando)
redis-server
# Inicie a API
npm run start:dev
# Em outro terminal, inicie o Worker
npm run start:dev -- --entryFile src/worker| Variável | Descrição | Padrão |
|---|---|---|
PORT |
Porta da API | 3000 |
NODE_ENV |
Ambiente | development |
API_PREFIX |
Prefixo da API | /api/v1 |
REDIS_HOST |
Host do Redis | localhost |
REDIS_PORT |
Porta do Redis | 6379 |
REDIS_PASSWORD |
Senha do Redis | (vazio) |
OSINTER_TIMEOUT |
Timeout por site (ms) | 15000 |
OSINTER_CONCURRENCY |
Requisições simultâneas | 10 |
FREE_TIER_LIMIT |
Limite plano Free | 10 |
BASIC_TIER_LIMIT |
Limite plano Basic | 100 |
PRO_TIER_LIMIT |
Limite plano Pro | 1000 |
ENTERPRISE_TIER_LIMIT |
Limite plano Enterprise | 10000 |
WEBHOOK_TIMEOUT |
Timeout webhook (ms) | 5000 |
WEBHOOK_RETRY_ATTEMPTS |
Tentativas retry | 3 |
API_KEY_SALT |
Salt para geração de keys | my-super-secret-salt |
npm run seed:api-keysIsso irá gerar 4 API keys, uma para cada plano:
osinter_free_xxx... (10 buscas/mês)
osinter_basic_xxx... (100 buscas/mês)
osinter_pro_xxx... (1000 buscas/mês)
osinter_enterprise_xxx... (10000 buscas/mês)
Todos os endpoints protegidos exigem o header X-API-Key.
Inicia uma busca por username.
Request:
curl -X POST http://localhost:3000/api/v1/search \
-H "X-API-Key: osinter_free_abc123..." \
-H "Content-Type: application/json" \
-d '{
"username": "john_doe",
"webhookUrl": "https://meusite.com/webhook"
}'Body:
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
username |
string |
Sim | Username para buscar |
webhookUrl |
string |
Não | URL para receber resultado quando pronto |
Response (202 Accepted):
{
"jobId": "osinter_550e8400-e29b-41d4-a716-446655440000",
"status": "pending",
"checkStatusUrl": "/api/v1/result/osinter_550e8400-e29b-41d4-a716-446655440000",
"estimatedTime": "45-90 seconds"
}Consulta o status/resultado de uma busca.
Request:
curl -X GET http://localhost:3000/api/v1/result/osinter_abc-123-def \
-H "X-API-Key: osinter_free_abc123..."Response (Em processamento):
{
"jobId": "osinter_abc-123-def",
"status": "processing",
"progress": 45,
"processedSites": 14,
"totalSites": 410,
"partialResults": [
{ "site": "GitHub", "url": "https://github.com/john_doe", "found": true }
]
}Response (Concluído):
{
"jobId": "osinter_abc-123-def",
"status": "completed",
"completedAt": "2026-01-15T10:30:00Z",
"processingTimeMs": 45200,
"totalSitesSearched": 410,
"totalFound": 47,
"results": [
{ "site": "GitHub", "url": "https://github.com/john_doe" },
{ "site": "Twitter", "url": "https://twitter.com/john_doe" },
{ "site": "Reddit", "url": "https://reddit.com/user/john_doe" }
]
}Health check completo (API, Redis, Queue).
curl http://localhost:3000/api/v1/healthLiveness probe (simples).
Readiness probe.
Cria uma nova API Key (para administração).
Request:
curl -X POST http://localhost:3000/api/v1/auth/create \
-H "Content-Type: application/json" \
-d '{"tier": "pro"}'Response:
{
"keyId": "550e8400-e29b-41d4-a716-446655440000",
"key": "osinter_pro_550e8400-e29b-41d4-a716-446655440000",
"tier": "pro",
"createdAt": "2026-01-15T10:30:00Z"
}Lista todos os sites suportados pela engine.
curl http://localhost:3000/api/v1/sites \
-H "X-API-Key: osinter_free_abc123..."Se fornecido webhookUrl no POST /search, a API enviará um POST quando a busca for concluída:
Payload enviado:
{
"event": "search.completed",
"jobId": "osinter_abc-123-def",
"timestamp": "2026-01-15T10:30:00Z",
"data": {
"status": "completed",
"completedAt": "2026-01-15T10:30:00Z",
"processingTimeMs": 45200,
"totalSitesSearched": 410,
"totalFound": 47,
"results": [...]
}
}Headers:
Content-Type: application/jsonX-OSINTER-Webhook: 1
| Método | Descrição |
|---|---|
GET |
Requisição GET padrão |
HEAD |
Requisição HEAD (apenas cabeçalhos) |
POST |
Requisição POST com body |
PUT |
Requisição PUT com body |
| Estratégia | Descrição |
|---|---|
status200 |
Status 200-299 = perfil existe |
status404 |
Status NÃO 404 = perfil existe |
contentNotFound |
Se texto NÃO contiver "not found" |
contentFound |
Se texto CONTIVER determinado conteúdo |
redirect |
Detecta redirecionamentos suspeitos |
custom |
Validação programática personalizada |
| Feature | Descrição |
|---|---|
headers |
Headers customizados por site |
payload |
Body para requisições POST/PUT |
errorTypes[] |
Múltiplos critérios de "não encontrado" |
urlProbe |
URL separada para probing vs URL pública |
regexCheck |
Valida username antes de consultar |
errorCode |
Código HTTP customizado de erro |
| Plano | Limite Mensal | Formato da Key |
|---|---|---|
| Free | 10 buscas | osinter_free_{uuid} |
| Basic | 100 buscas | osinter_basic_{uuid} |
| Pro | 1000 buscas | osinter_pro_{uuid} |
| Enterprise | 10000 buscas | osinter_enterprise_{uuid} |
Quando o limite é excedido:
{
"statusCode": 429,
"message": "Monthly limit exceeded for plan BASIC. Used: 100/100",
"error": "Too Many Requests"
}osinter-api/
├── src/
│ ├── main.ts # Entry point da API
│ ├── worker.ts # Entry point do Worker
│ ├── app.module.ts # Módulo principal
│ ├── config/ # Configurações e validação
│ ├── common/ # Guards, Interceptors, Filters
│ ├── engine/ # OSINTER Engine (coração)
│ │ ├── osinter.engine.ts # Engine principal de busca
│ │ ├── http-client.ts # HTTP com timeout/retry
│ │ ├── user-agent.ts # User agents rotativos
│ │ └── validators.ts # Estratégias de detecção
│ └── modules/
│ ├── osinter/ # Módulo de busca
│ │ ├── constants/
│ │ │ └── sites-list.ts # 410+ sites
│ │ ├── interfaces/
│ │ ├── osinter.controller.ts
│ │ ├── osinter.service.ts
│ │ ├── osinter.processor.ts
│ │ └── osinter.module.ts
│ ├── auth/ # Módulo de autenticação/API keys
│ └── health/ # Health checks
├── test/
│ ├── unit/ # Testes unitários
│ ├── e2e/ # Testes end-to-end
│ └── mocks/ # Mocks para testes
├── docker/
│ ├── Dockerfile.api # Multi-stage build
│ └── Dockerfile.worker # Multi-stage build
├── docker-compose.yml # Dev
├── docker-compose.prod.yml # Prod
├── eslint.config.mjs # ESLint strict
└── package.json
# Testes unitários
npm run test
# Testes em watch mode
npm run test:watch
# Cobertura
npm run test:cov
# Testes e2e
npm run test:e2e
# Lint e Typecheck
npm run lint
npm run typecheck- API REST com NestJS + TypeScript
- Fila assíncrona com BullMQ + Redis
- Worker separado para processamento
- Dados temporários expiram após 1 hora no Redis
- Multi-stage Docker builds otimizados
- 410+ sites configurados
- Suporte a GET, HEAD, POST, PUT
- Headers customizados por site
- Request payload para POST/PUT
- Múltiplas estratégias de detecção
- Sistema de
errorTypes[]para evitar falsos positivos urlProbeseparada para API interna vs URL pública- Validação de username via
regexCheck
- Timeout por requisição configurável
- User agents rotativos para evitar bloqueios
- Headers realistas (Accept, Accept-Language, etc)
- Tratamento robusto de erros
- API Keys com validação por regex
- Rate limiting por plano
- Guards de autenticação e rate limit
- Interceptors para logging
Verifique:
- Redis está rodando?
- Host/porta corretos no
.env? - Senha configurada se necessária?
Isso é normal - alguns sites bloqueiam requisições automatizadas. A OSINTER Engine usa:
- User agents rotativos
- Headers realistas
- Timeouts adequados
Verifique:
- Worker está rodando?
- Conectado ao mesmo Redis da API?
- Queue name é o mesmo?
Corrigido! Os Dockerfiles agora usam multi-stage build adequado:
- Builder:
npm ci(todas deps) →npm run build - Final:
npm ci --only=production→ copia apenas/dist
MIT
Esta ferramenta é para fins educacionais e de pesquisa. Use-a de forma responsável e em conformidade com os Termos de Serviço de cada site consultado.