Prospector — people search
Finds people, companies and public contacts (LinkedIn, Google Maps, company websites) with the asynchronous jobs pattern: starts the search, notifies the user and queries the result.
Updated on Sep 02, 2026
Prospecting is the use case where the agent replaces hours of browsing: "HR managers in Curitiba", "physical therapy clinics in Campinas with phone", "find the contact for acme.com".
Searches run on HINOW's data tools (/v1/tools/*) — LinkedIn, B2B leads Apollo-style, Google Maps and website scraping — which are asynchronous by nature: the route responds immediately with a job_id and the search continues on the server. It's the same pattern as the video, and the agent converses naturally while waiting.
Cost per search
Each tool has a ceiling (e.g., website scraping ≤ $0.80; LinkedIn profiles ≤ $2) and billing is for actual usage — a typical scrape runs ~$0.04. The prompt asks to confirm filters before broad searches and limit results to 10.
How to import
On the platform: Agents → Import, choose the downloaded file. It enters as a new draft (nothing existing is changed), with observability IDs renewed. Then fill in what belongs to your environment — credentials, URLs and knowledge bases — and publish.
{
"format": "hinow.agent",
"version": 1,
"exported_at": "2026-09-01T00:00:00Z",
"credentials_included": false,
"agent": {
"name": "Prospector",
"description": "Encontra pessoas, empresas e contatos públicos (LinkedIn, Google Maps, sites) com o padrão assíncrono de jobs: inicia a busca, avisa o usuário e consulta o resultado.",
"avatar": null,
"model": null,
"system_prompt": null,
"config": {},
"tools": null,
"workflow": {
"nodes": [
{
"id": "start",
"type": "start",
"position": {
"x": 300,
"y": 0
},
"data": {
"label": "Início",
"variables": []
}
},
{
"id": "agent-1",
"type": "agent",
"position": {
"x": 285,
"y": 160
},
"data": {
"name": "prospector",
"model": "hinow/himax",
"system_prompt": "Você é um assistente de prospecção B2B. Encontra pessoas, empresas e contatos públicos na web para o time comercial.\n\nCOMO AS BUSCAS FUNCIONAM (leia com atenção)\nToda busca é ASSÍNCRONA, em duas etapas:\n1. Chame a rota de busca. Ela responde na hora com um job_id — a busca continua rodando no servidor.\n2. AVISE o usuário, em uma frase, o que você está buscando (\"Buscando gerentes de RH em Curitiba, um instante...\").\n3. Chame resultado_busca com o job_id. Se status for \"running\" ou \"queued\", chame de novo — até 4 vezes. Se ainda não terminou, ESCREVA O CÓDIGO DO JOB NA SUA MENSAGEM (ex.: `busca: 0b1b638b-…`, o id completo) e diga que o usuário pode perguntar \"e aí?\" em instantes. Só o que você escreve fica na conversa — na próxima mensagem, retome pelo código que VOCÊ anotou, nunca invente um.\n4. Quando status=\"succeeded\", apresente o resultado.\n\nCOMO APRESENTAR\n- Tabela com as colunas que importam (nome, cargo, empresa, local, link).\n- Diga quantos resultados vieram e ofereça refinar.\n- NUNCA invente pessoa, cargo, e-mail ou telefone: só o que a busca devolveu.\n\nREGRAS\n- Antes de buscas amplas, confirme os filtros com o usuário (cargo, local, quantidade). Busca custa dinheiro.\n- Peça no máximo o necessário: maxItems=10 salvo pedido diferente.\n- Dados são públicos e para prospecção legítima. Recuse pedidos de vigilância de indivíduos, listas para spam em massa ou dados de menores. Em caso de dúvida sobre a finalidade, pergunte.\n- Não acumule jobs: termine (ou desista de) uma busca antes de abrir outra.",
"config": {
"temperature": 0.3,
"max_tool_loops": 14
}
}
},
{
"id": "hook-1",
"type": "webhook",
"position": {
"x": 575,
"y": 160
},
"data": {
"label": "Busca na web",
"config": {
"name": "HINOW Tools",
"baseUrl": "https://api.hinow.ai/v1/tools",
"timeout": 30000,
"auth": {
"type": "bearer",
"token": "COLE_SUA_API_KEY_hi"
},
"retryOnError": true,
"maxRetries": 2,
"routes": [
{
"id": "r1",
"name": "buscar_pessoas",
"method": "POST",
"path": "/linkedin-profile",
"description": "Busca pessoas no LinkedIn por texto livre e filtros. Responde com um job_id.",
"whenToUse": "Para encontrar profissionais: 'gerentes de RH em Curitiba', 'CTOs de fintech'. É o começo do fluxo assíncrono — depois chame resultado_busca.",
"responseDescription": "202 com data.job_id e data.poll_url. A busca continua no servidor.",
"parameters": [
{
"name": "searchQuery",
"type": "string",
"required": true,
"description": "Busca em texto livre: nomes, cargos, palavras-chave",
"howToObtain": "Monte a partir do pedido do usuário",
"example": "gerente de recursos humanos"
},
{
"name": "locations",
"type": "array",
"required": false,
"description": "Locais das pessoas (cidades, estados, países)",
"example": "[\"Curitiba, Brazil\"]"
},
{
"name": "currentJobTitles",
"type": "array",
"required": false,
"description": "Cargos atuais para filtrar",
"example": "[\"HR Manager\"]"
},
{
"name": "maxItems",
"type": "number",
"required": false,
"description": "Quantos perfis (padrão 25, máx 100). Use 10 salvo pedido diferente",
"example": "10"
},
{
"name": "mode",
"type": "string",
"required": false,
"description": "basic (nome/headline) ou full (perfil completo). Use basic para listas",
"example": "basic"
}
],
"enabled": true
},
{
"id": "r2",
"name": "buscar_leads",
"method": "POST",
"path": "/leads-finder",
"description": "Lista de leads B2B estilo Apollo: pessoas por cargo/local + dados da empresa.",
"whenToUse": "SÓ quando o usuário pedir explicitamente uma lista de leads/prospecção B2B, e DEPOIS de confirmar cargo, local e quantidade — é a busca mais cara.",
"responseDescription": "202 com data.job_id. Depois, resultado_busca.",
"parameters": [
{
"name": "contact_job_titles",
"type": "array",
"required": false,
"description": "Cargos desejados",
"example": "[\"Head of Marketing\"]"
},
{
"name": "contact_location",
"type": "array",
"required": false,
"description": "Locais das pessoas",
"example": "[\"Brazil\"]"
},
{
"name": "company_industry",
"type": "array",
"required": false,
"description": "Setores da empresa",
"example": "[\"software\"]"
},
{
"name": "max_result",
"type": "number",
"required": false,
"description": "Quantos leads (padrão 25). Confirme com o usuário",
"example": "10"
}
],
"enabled": true
},
{
"id": "r3",
"name": "buscar_empresas_maps",
"method": "POST",
"path": "/google-maps",
"description": "Empresas no Google Maps: telefone, endereço, site, categoria e avaliações.",
"whenToUse": "Para achar negócios locais e telefones confiáveis: 'clínicas de fisioterapia em Campinas'. Fluxo assíncrono — depois chame resultado_busca.",
"responseDescription": "202 com data.job_id.",
"parameters": [
{
"name": "searchStringsArray",
"type": "array",
"required": true,
"description": "Termos de busca (nicho e/ou nome)",
"example": "[\"clínica de fisioterapia\"]"
},
{
"name": "locationQuery",
"type": "string",
"required": false,
"description": "Onde buscar (cidade, região)",
"example": "Campinas, SP"
},
{
"name": "maxCrawledPlacesPerSearch",
"type": "number",
"required": false,
"description": "Máximo de lugares por termo (padrão 5)",
"example": "5"
}
],
"enabled": true
},
{
"id": "r4",
"name": "buscar_contatos_site",
"method": "POST",
"path": "/website-contacts",
"description": "Varre o site de uma empresa atrás de e-mails, telefones e redes sociais públicas.",
"whenToUse": "Quando já se sabe a empresa e falta o contato: 'ache o contato da acme.com'. Fluxo assíncrono — depois chame resultado_busca.",
"responseDescription": "202 com data.job_id.",
"parameters": [
{
"name": "websites",
"type": "array",
"required": true,
"description": "URLs dos sites a varrer",
"example": "[\"https://www.acme.com\"]"
}
],
"enabled": true
},
{
"id": "r5",
"name": "resultado_busca",
"method": "GET",
"path": "/jobs/{{job_id}}",
"description": "Consulta o andamento e o resultado de uma busca iniciada.",
"whenToUse": "Logo depois de qualquer rota de busca, com o job_id devolvido. Repita enquanto status for queued/running (até 4 vezes por turno).",
"responseDescription": "data.status: queued | running | succeeded | failed. Quando succeeded, data.result traz os itens e data.cost o custo real.",
"parameters": [
{
"name": "job_id",
"type": "string",
"required": true,
"description": "Id do job",
"howToObtain": "Veio da resposta da rota de busca",
"example": "0b1b638b-..."
}
],
"enabled": true
}
]
}
}
},
{
"id": "end-1",
"type": "end",
"position": {
"x": 305,
"y": 330
},
"data": {
"label": "Fim",
"status": "success"
}
}
],
"edges": [
{
"id": "e1",
"source": "start",
"target": "agent-1"
},
{
"id": "e2",
"source": "hook-1",
"target": "agent-1",
"sourceHandle": "tool",
"targetHandle": "slot-1"
},
{
"id": "e3",
"source": "agent-1",
"target": "end-1"
}
]
}
}
}| Route | Tool | For what |
|---|---|---|
search_people | /v1/tools/linkedin-profile | Professionals by free text + filters (role, location). mode: basic for lean lists. |
search_leads | /v1/tools/leads-finder | B2B list Apollo-style — the most expensive; the prompt requires explicit confirmation first. |
search_companies_maps | /v1/tools/google-maps | Local businesses with phone, address and ratings. |
search_site_contacts | /v1/tools/website-contacts | Scrapes a company's website for emails, phones and social networks. |
search_result | GET /v1/tools/jobs/{{job_id}} | The poll: queued → running → succeeded with the result and actual cost. |
Routes without bodyTemplate, on purpose
Search tools have dozens of optional fields. Without bodyTemplate, the parameters the model fills become the entire body — unused optional ones simply don't appear. It's the right pattern for APIs with many optional fields.
The prompt defines the protocol: start the search → announce in one sentence what you're searching for → query the result up to 4 times → if it hasn't finished, note the job code in the message and invite "what's up?" — which resumes by code in the next message, on the same thread_id.
And ethical limits stay in the prompt, not in hope: public data, legitimate prospecting, refusal to surveil individuals and spam lists.
- Paste your key
hi_...inauth.token(the same bearer pays for searches). - Prospecting that records: add a second Webhook card with your CRM — found the lead, register it right away (pattern from Post-sale for writing with approval).
- Instagram: there's also
/v1/tools/instagram-profile; it enters as another route. - Sales teams: a Router up front separates "search" from "qualify" with dedicated prompts.

