name: comercialrs-painel-api-discovery
description: "Reverse-engineered Painel do Corretor GraphQL API for ComercialRS integration"
triggers:
- "extrair dados do link do painel"
- "GraphQL painel do corretor"
- "painel API authentication"
- "Auth0 painel corretor"
Painel do Corretor — GraphQL API Discovery
Contexto
O Painel do Corretor (app2.paineldocorretor.com.br) é uma SPA React que exige Auth0 para autenticação. O Jina AI (r.jina.ai) retorna apenas a página de login — não consegue extrair dados de links autenticados. A solução é usar a GraphQL API diretamente.
Credenciais
Conta Tecrocha (atual, maio 2026):
- - Login:
contato@rochasalesseguros.com.br/221109 - - Tenant ID:
a1af7a2f-7ec6-40cd-b257-86c045875979 - - API Key:
iMHa6T8M0XfRuS7AJep1lcgOwUdCgZ6KV7a9uWXV4Bg0 - - Auth0 Domain:
auth.paineldocorretor.com.br - - Auth0 Client ID:
MtCJ0_REDACTED - - API Host:
api.paineldocorretor.net(NÃOpaineldocorretor.com.br) - - GraphQL Endpoint:
https://api.paineldocorretor.net/graphql - - Audience:
https://paineldocorretor.com.br/api/ - - Login:
davi.freire@rochasalesseguros.com.br/131415pi - - A API usa GraphQL POST (não GET REST)
- - O header
ReferereOriginparecem ser necessários - -
api.paineldocorretor.neté o host da API (NÃOpaineldocorretor.com.br) - -
client_id: MtCJ0_REDACTEDé fixo (extraído do JS bundle) - - Para investigar novos campos: usar GraphQL introspection query via browser console no Painel logado
- - Chatwoot WhatsApp ID:
5511999396355@s.whatsapp.net→ strip55prefix +@s.whatsapp.net→11999396355 - - Panel phone:
79998851112→ confronta direto (formato DDD + número, sem country code) - - omes de digits >= 10 e <= 13: DDD (2 dígitos) + 8 ou 9 dígitos = 10 ou 11 (com 55 na frente = 12 ou 13)
- - Ler lista de leads do Panel para matching
- - Detectar mudanças de etapa no Panel para sync Chatwoot ← Panel
- - POST
/api/crm/negocios→ criar lead no Panel (200 OK) - - PUT
/api/crm/negocios/etapas/{etapaId}via workflow n8n (funciona) - -
Novos Leads - -
Qualificação - -
Reunião agendada - -
Proposta Enviada p/cliente - -
Remarketing(com espaço no final) - - Código usava
https://api.paineldocorretor.net/ - - Correto:
https://paineldocorretor.com.br/api/ - - Sintoma: Auth0 retorna
invalid_audienceouinvalid_audience specified for password grant exchange - - Código usava só
grant_type: 'password' - - Correto:
grant_type: 'http://auth0.com/oauth/grant-type/password-realm'+ paramrealm: 'Username-Password-Authentication' - - Sintoma: Auth0 retorna
access_denied - - Código usava
query GetNegocio($id: ID!) - - Correto:
query GetNegocio($id: UUID!) - - Sintoma: GraphQL retorna
The variable 'id' is not compatible with the type... UUID! - -
firecrawl_server.pyem/var/www/comercialrs/firecrawl_server.py(porta 9085, systemd firecrawl) - - Credenciais:
contato@rochasalesseguros.com.br / 221109 - - Cliente ID:
MtCJ0bBdECwihpKoeTBf9L0E6JvCEx24 - - Audience:
https://paineldocorretor.com.br/api/ - - GraphQL:
https://api.paineldocorretor.net/graphql
Conta Davi (legada, não usar para novos projetos):
Autenticação (Auth0 Resource Owner Password)
⚠️ OPÇÃO 1 (Python urllib — produção):
`python
import urllib.request, http.cookiejar, json
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
login_data = json.dumps({
"grant_type": "http://auth0.com/oauth/grant-type/password-realm",
"realm": "Username-Password-Authentication",
"username": "davi.freire@rochasalesseguros.com.br", # NÃO "email", é "username"!
"password": "131415pi",
"client_id": "REDACTED",
"audience": "https://paineldocorretor.com.br/api/",
"scope": "openid profile offline_access email",
"response_type": "token id_token"
}).encode()
req = urllib.request.Request(
"https://auth.paineldocorretor.com.br/oauth/token",
data=login_data,
headers={"Content-Type": "application/json", "Accept": "application/json"}
)
resp = opener.open(req)
token = json.loads(resp.read().decode())['access_token']
`
⚠️ OPÇÃO 2 (JWT manual do browser — debug):
O token JWT pode ser extraído manualmente do localStorage do browser quando logado no Painel:
`javascript
JSON.parse(localStorage.getItem('vuex')).auth.accessToken
`
Isso retorna um JWT RS256. Útil para debug rápido, mas o token expira — verificar sempre se a API retorna AUTH_NOT_AUTHORIZED.
Headers obrigatórios para TODAS as chamadas GraphQL:
`
Authorization: Bearer
X-Tenant: a1af7a2f-7ec6-40cd-b257-86c045875979
Content-Type: application/json
`
⚠️ Sem X-Tenant → retorna AUTH_NOT_AUTHORIZED
ERRO COMUM: Se o campo for "email" em vez de "username", retorna HTTP 400 Bad Request.
Buscar Negócio (GraphQL)
`python
query = {
"query": """
query GetNegocio($id: UUID!) {
negocio(id: $id) {
id
nome
criadoEm
fechamento
etapa { id nome }
contato { id nome email telefones }
produto { nome }
etiquetas { nome }
valor
anotacoes { mensagem criadoEm tipo }
}
}
""",
"variables": {"id": "
}
req2 = urllib.request.Request(
"https://api.paineldocorretor.net/graphql",
data=json.dumps(query).encode(),
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
"Accept": "application/json",
"Referer": "https://app2.paineldocorretor.com.br/crm/negocios/
"Origin": "https://app2.paineldocorretor.com.br"
},
method="POST"
)
resp2 = opener.open(req2, timeout=10)
body = json.loads(resp2.read().decode())
`
Campos Confirmados do Tipo Negocio
| Campo | Descrição | |
| ------- | ----------- | |
id | UUID | |
nome | Nome do negócio/cliente | |
criadoEm | Data de criação (ISO 8601) | |
fechamento | Data de fechamento | |
etapa { id nome } | Etapa atual (ex: "Reunião agendada") | |
contato { id nome email telefones } | Dados do contato | |
produto { nome } | Produto | |
etiquetas { nome } | Tags | |
valor | Valor do negócio | |
anotacoes { mensagem criadoEm tipo } | Notas | |
| Painel Etapa | Kanban status | |
| --- | --- | |
| Novos Leads | todo | |
| Qualificação | in_progress | |
| Reunião agendada | in_progress | |
| Proposta Enviada p/cliente | in_progress | |
| Remarketing | remarketing | |
| inbox_id | Nome | Canal |
| --- | --- | --- |
| 16 | Renato Godoy | API |
| 17 | Rocha-Sales-Oficial | |
| 2 | SDR-ROCHA-SALES | API |
| 3 | Rafael William | API |
| 8 | Vinicius | API |
| 10 | Raissa Silva | API |
| 11 | Julietti Maer | API |
| 9 | Keila Mariana Lacerda | API |
| 15 | Julia Lima | API |
| 4 | Rainany | API |
| 5 | Pietra | API |
Próximos Passos
1. Criar Edge Function chatwoot-webhook — recebe webhooks do Chatwoot, casando leads por telefone
2. Redesign KanbanBoard do ComercialRS com as etapas do Painel
3. Integrar com Chatwoot Dashboard App
🔧 Problemas Corrigidos (Jun 2026)
firecrawl_server.py em produção — 3 erros simultâneos (25/jun/2026)
Erro 1: AUDIENCE errado
Erro 2: grant_type sem realm
Erro 3: tipo UUID! vs ID!
Metodologia de Debug (não confie em grep/máscara)
1. Valores no arquivo pareciam certos no grep, mas estavam mascarados/redactados — grep ou cat mostravam auth.p...m.br mas era auth.paineldocorretor.net real.
2. Verificar bytes exatos: python3 -c "with open('/path', 'rb') as f: print(repr(f.read()[idx:idx+N]))" — bypassa qualquer filtro/máscara da saída.
3. Arquivo corrompido por herdocs SSH — herdocs SSH com <<'EOF' comem backslashes ( $ vira vazio em Python). SOLUÇÃO: escrever arquivo localmente com write_file, codificar base64, enviar via SSH: B64=$(base64 -w 0 local.py) && ssh "echo '$B64' | base64 -d > remote.py".
4. Arquivo reescrito do zero em 25/jun/2026 — firecrawl_server.py em /var/www/comercialrs/ reconstruído com parâmetros Auth0 corretos.
Credenciais de produção (jun 2026)