Skip to content

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.

The file

prospector.hinow-agent.jsonjson
{
 "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"
    }
   ]
  }
 }
}

The five routes

RouteToolFor what
search_people/v1/tools/linkedin-profileProfessionals by free text + filters (role, location). mode: basic for lean lists.
search_leads/v1/tools/leads-finderB2B list Apollo-style — the most expensive; the prompt requires explicit confirmation first.
search_companies_maps/v1/tools/google-mapsLocal businesses with phone, address and ratings.
search_site_contacts/v1/tools/website-contactsScrapes a company's website for emails, phones and social networks.
search_resultGET /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.

Behavior in conversation

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.

How to adapt to your case

  • Paste your key hi_... in auth.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.

All ready-made flows

Other complete agents to import and adapt.