Pular para conteúdo

NOTION_SEARCH - Buscar no Notion

O que é este Node?

O NOTION_SEARCH é o node responsável por buscar páginas e databases no Notion usando texto livre, fazendo busca global no workspace inteiro da integração.

Por que este Node existe?

Buscar por texto livre é essencial quando você não sabe exatamente onde está a informação. O NOTION_SEARCH existe para:

  1. Busca global: Encontrar páginas em qualquer database ou local do workspace
  2. Busca por título: Localizar páginas pelo nome sem saber o ID
  3. Discovery: Descobrir onde determinada informação está armazenada
  4. Fuzzy search: Buscar por palavras-chave sem filtros estruturados

Como funciona internamente?

Quando o NOTION_SEARCH é executado, o sistema:

  1. Autentica na Notion API: Usa o apiKey fornecido com header Notion-Version 2022-06-28
  2. Monta query de busca: Prepara texto de busca e filtros (opcional)
  3. Envia POST: Faz requisição para https://api.notion.com/v1/search
  4. Processa resultados: Recebe array de páginas/databases que contêm o texto
  5. Se erro: Retorna exceção (permissão negada, etc.)
  6. Se sucesso: Retorna results com páginas e databases encontrados

Código interno (baseado na Notion API v1):

case 'search':
  const searchResponse = await firstValueFrom(
    this.httpService.post(`${notionApiUrl}/search`,
      {
        query: data.query || '',
        filter: data.filter || undefined,
        sort: data.sort || undefined,
        page_size: data.pageSize || 100,
      },
      { headers }
    )
  );
  return {
    success: true,
    results: searchResponse.data.results,
    hasMore: searchResponse.data.has_more,
  };

Quando você DEVE usar este Node?

Use NOTION_SEARCH sempre que precisar de buscar por texto livre no Notion:

Casos de uso

  1. Buscar por título: "Encontrar página 'Documentação API'"
  2. Buscar em todo workspace: "Onde está a informação sobre X?"
  3. Localizar database: "Qual database contém 'Clientes'?"
  4. Fuzzy search: "Buscar páginas sobre 'integração'"
  5. Discovery: "Listar todas as páginas editadas recentemente"
  6. Find by keyword: "Páginas que mencionam 'pagamento'"
  • Buscar com filtros estruturados: Use NOTION_QUERY_DATABASE ao invés
  • Você já tem o ID: Use NOTION_GET_PAGE ao invés
  • Buscar em database específico: Use NOTION_QUERY_DATABASE com filtros ao invés

Parâmetros Detalhados

apiKey (string, obrigatório)

O que é: Token de integração do Notion (obtido em notion.so/my-integrations).

Como obter: 1. Acesse https://www.notion.so/my-integrations 2. Clique em "New integration" 3. Dê um nome e selecione workspace 4. Copie o "Internal Integration Token" 5. IMPORTANTE: Compartilhe páginas/databases com a integração!

Flow completo para testar:

{
  "name": "Teste Notion Search - API Key",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Config",
        "parameters": {
          "assignments": [
            {
              "variable": "notion_api_key",
              "value": "secret_SEU_TOKEN_AQUI"
            }
          ]
        }
      }
    },
    {
      "id": "notion_1",
      "type": "notion",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Buscar Tudo",
        "parameters": {
          "operation": "search",
          "apiKey": "{{notion_api_key}}",
          "query": ""
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "Encontradas {{notion_1.results.length}} páginas!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "notion_1" },
    { "source": "notion_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Lista todas as páginas/databases compartilhados com a integração.

query (string, opcional)

O que é: Texto a buscar nos títulos das páginas e databases.

Padrão: "" (retorna todas as páginas/databases)

Comportamento: - Busca no título de páginas e databases - Case-insensitive (não diferencia maiúsculas/minúsculas) - Busca parcial (não precisa ser palavra completa)

Flow completo para testar:

{
  "name": "Teste Notion - Search Query",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Termo de Busca",
        "parameters": {
          "message": "O que deseja buscar no Notion?",
          "variable": "search_term"
        }
      }
    },
    {
      "id": "notion_1",
      "type": "notion",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Buscar",
        "parameters": {
          "operation": "search",
          "apiKey": "secret_SEU_TOKEN",
          "query": "{{search_term}}"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Encontrou?",
        "parameters": {
          "condition": "{{notion_1.results.length}} > 0"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 50 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "✅ Encontradas {{notion_1.results.length}} páginas com '{{search_term}}'!"
        }
      }
    },
    {
      "id": "message_3",
      "type": "message",
      "position": { "x": 900, "y": 150 },
      "data": {
        "label": "Nada Encontrado",
        "parameters": {
          "message": "❌ Nenhuma página encontrada com '{{search_term}}'"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "notion_1" },
    { "source": "notion_1", "target": "condition_1" },
    { "source": "condition_1", "target": "message_2", "label": "true" },
    { "source": "condition_1", "target": "message_3", "label": "false" },
    { "source": "message_2", "target": "end_1" },
    { "source": "message_3", "target": "end_1" }
  ]
}

Teste: Digite "API" e veja todas as páginas com "API" no título.

filter (object, opcional)

O que é: Filtro para restringir tipo de resultado (page ou database).

Padrão: undefined (retorna ambos)

Filtro por tipo:

{
  "value": "page",
  "property": "object"
}

Ou:

{
  "value": "database",
  "property": "object"
}

Flow completo para testar:

{
  "name": "Teste Notion - Search Filter",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "notion_1",
      "type": "notion",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Buscar Apenas Databases",
        "parameters": {
          "operation": "search",
          "apiKey": "secret_SEU_TOKEN",
          "query": "Clientes",
          "filter": {
            "value": "database",
            "property": "object"
          }
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "📊 Encontrados {{notion_1.results.length}} databases com 'Clientes'"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "notion_1" },
    { "source": "notion_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Retorna apenas databases, ignora páginas.

sort (object, opcional)

O que é: Ordenação dos resultados por última edição.

Padrão: undefined (ordem de relevância do Notion)

Ordenar por última edição:

{
  "direction": "ascending",
  "timestamp": "last_edited_time"
}

Ou descendente:

{
  "direction": "descending",
  "timestamp": "last_edited_time"
}

Flow completo para testar:

{
  "name": "Teste Notion - Search Sort",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "notion_1",
      "type": "notion",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Páginas Recentes",
        "parameters": {
          "operation": "search",
          "apiKey": "secret_SEU_TOKEN",
          "query": "",
          "sort": {
            "direction": "descending",
            "timestamp": "last_edited_time"
          },
          "pageSize": 5
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Top 5",
        "parameters": {
          "message": "📝 5 páginas editadas mais recentemente encontradas!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "notion_1" },
    { "source": "notion_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Retorna as 5 páginas editadas mais recentemente.

pageSize (number, opcional)

O que é: Número máximo de resultados a retornar.

Padrão: 100 (máximo permitido pela Notion API)

Mínimo: 1 Máximo: 100

Flow completo para testar:

{
  "name": "Teste Notion - Search Page Size",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "notion_1",
      "type": "notion",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Buscar Top 3",
        "parameters": {
          "operation": "search",
          "apiKey": "secret_SEU_TOKEN",
          "query": "Tarefa",
          "pageSize": 3
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "Top 3 páginas sobre 'Tarefa':\n1. {{notion_1.results[0].properties.title.title[0].text.content}}\n2. {{notion_1.results[1].properties.title.title[0].text.content}}\n3. {{notion_1.results[2].properties.title.title[0].text.content}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "notion_1" },
    { "source": "notion_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Retorna apenas as 3 primeiras páginas encontradas.

Parâmetros

Campo Tipo Obrigatório Descrição
operation string Sim Deve ser "search"
apiKey string Sim Token de integração do Notion
query string Não Texto a buscar (padrão: "", retorna tudo)
filter object Não Filtrar por tipo: page ou database (padrão: ambos)
sort object Não Ordenar por last_edited_time (padrão: relevância)
pageSize number Não Máximo de resultados (padrão: 100, máx: 100)

Exemplo 1: Buscar Documentação

Objetivo: Encontrar página de documentação por título

JSON para Importar

{
  "name": "Buscar Documentação no Notion",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Assunto",
        "parameters": {
          "message": "Sobre o que você precisa de ajuda?",
          "variable": "assunto"
        }
      }
    },
    {
      "id": "notion_1",
      "type": "notion",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Buscar Docs",
        "parameters": {
          "operation": "search",
          "apiKey": "secret_SEU_TOKEN",
          "query": "{{assunto}}",
          "filter": {
            "value": "page",
            "property": "object"
          },
          "pageSize": 5
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Encontrou?",
        "parameters": {
          "condition": "{{notion_1.results.length}} > 0"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 50 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "📚 Encontrei {{notion_1.results.length}} páginas sobre '{{assunto}}'.\n\nMais relevante: {{notion_1.results[0].url}}"
        }
      }
    },
    {
      "id": "message_3",
      "type": "message",
      "position": { "x": 900, "y": 150 },
      "data": {
        "label": "Nada Encontrado",
        "parameters": {
          "message": "❌ Não encontrei documentação sobre '{{assunto}}'. Tente outro termo."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "notion_1" },
    { "source": "notion_1", "target": "condition_1" },
    { "source": "condition_1", "target": "message_2", "label": "true" },
    { "source": "condition_1", "target": "message_3", "label": "false" },
    { "source": "message_2", "target": "end_1" },
    { "source": "message_3", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Sobre o que você precisa de ajuda?
Usuário: API integração
Sistema: 📚 Encontrei 3 páginas sobre 'API integração'.

Mais relevante: https://www.notion.so/...

Exemplo 2: Listar Páginas Recentes

Objetivo: Mostrar as 5 páginas editadas mais recentemente

JSON para Importar

{
  "name": "Páginas Recentes no Notion",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Intro",
        "parameters": {
          "message": "Buscando páginas editadas recentemente..."
        }
      }
    },
    {
      "id": "notion_1",
      "type": "notion",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Buscar Recentes",
        "parameters": {
          "operation": "search",
          "apiKey": "secret_SEU_TOKEN",
          "query": "",
          "filter": {
            "value": "page",
            "property": "object"
          },
          "sort": {
            "direction": "descending",
            "timestamp": "last_edited_time"
          },
          "pageSize": 5
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Listar",
        "parameters": {
          "message": "📝 PÁGINAS RECENTES:\n\n1. {{notion_1.results[0].properties.title.title[0].text.content}}\n2. {{notion_1.results[1].properties.title.title[0].text.content}}\n3. {{notion_1.results[2].properties.title.title[0].text.content}}\n4. {{notion_1.results[3].properties.title.title[0].text.content}}\n5. {{notion_1.results[4].properties.title.title[0].text.content}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "notion_1" },
    { "source": "notion_1", "target": "message_2" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Buscando páginas editadas recentemente...
Sistema: 📝 PÁGINAS RECENTES:

1. Reunião 15/01/2025
2. Projeto API
3. Documentação
4. Tasks Semana 03
5. Notas Cliente X

Resposta do Node

{
  "success": true,
  "results": [
    {
      "object": "page",
      "id": "a8aec43c-6f00-4f57-89c9-e2e4aa3e8d9f",
      "created_time": "2025-01-15T10:00:00.000Z",
      "last_edited_time": "2025-01-15T10:30:00.000Z",
      "properties": {
        "title": {
          "title": [
            {
              "text": {
                "content": "Documentação API"
              }
            }
          ]
        }
      },
      "url": "https://www.notion.so/..."
    }
  ],
  "hasMore": false
}

Boas Práticas

SIM:

  • Use query vazio para listar todas as páginas compartilhadas
  • Combine com sort para listar páginas recentes
  • Use filter para buscar apenas pages ou apenas databases
  • Valide se results.length > 0 antes de acessar resultados
  • Limite pageSize para melhor performance

NÃO:

  • Não use search para buscar em database específico (use QUERY ao invés)
  • Não acesse índices de array sem validar se existem
  • Não espere busca em conteúdo (só busca em títulos)
  • Não use quando você já tem pageId (use GET ao invés)

Dicas

Busca global: query vazio retorna tudo compartilhado com a integração Títulos apenas: Search busca nos títulos, não no conteúdo das páginas Case insensitive: "API" encontra "api", "Api", "API" Páginas recentes: Use sort com last_edited_time descending Combine com GET: Search para encontrar → GET para detalhes completos Permissões: Só encontra páginas/databases compartilhados com a integração

Próximo Node

NOTION_QUERY_DATABASE - Buscar com filtros estruturados → NOTION_GET_PAGE - Obter página específica por ID → NOTION_CREATE_DATABASE - Criar novo database