> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pubrio.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Operadores AND / OR

> Substitua o operador AND/OR padrão de qualquer filtro multivalorado — referência completa com exemplos copiáveis.

`filter_conditions` é um único array opcional no corpo da requisição. Cada entrada promove um filtro multivalorado do comportamento padrão OR ("corresponde a qualquer") para AND ("corresponde a todos"), ou vice-versa. Os filtros que você não listar mantêm seus padrões.

## Esquema

<CodeGroup>
  ```json JSON theme={null}
  {
    "filter_conditions": [
      { "key": "technologies", "operator": "and" },
      { "key": "verticals",    "operator": "or"  }
    ]
  }
  ```

  ```typescript TypeScript theme={null}
  type FilterCondition = {
    /** Filter name to override. See "Supported keys" below. */
    key: string;
    /** Case-insensitive: "and" | "or". Default is "or" for arrays. */
    operator: "and" | "or";
  };

  type SearchRequest = {
    // …all your other filters…
    filter_conditions?: FilterCondition[];
  };
  ```
</CodeGroup>

<Note>
  `key` e `operator` são obrigatórios em toda entrada. Uma entrada que contenha apenas `operator` é ignorada silenciosamente — não existe uma substituição global.
</Note>

***

## Por que isso importa

O operador padrão é OR porque a maioria dos fluxos de prospecção quer alcance amplo: "pessoas em *qualquer* um destes países", "empresas marcadas com *qualquer* uma destas verticais". Para segmentação de alta precisão — "usa *todas* as ferramentas `Salesforce` + `HubSpot` + `Marketo`" — você precisa do AND.

O custo de errar:

* **Queria AND, obteve OR:** a resposta retorna resultados demais — você vê empresas que correspondem a apenas uma tag, não à pilha completa. Fácil de perceber, custa qualidade de resultado.
* **Queria OR, obteve AND:** a resposta retorna poucos resultados — geralmente devolve quase nenhuma linha em filtros AND multivalorados, porque arrays do mundo real raramente contêm todos os valores solicitados. Fácil de perceber, parece uma consulta quebrada.

Por baixo dos panos, o mecanismo compila a sua escolha de operador para um operador nativo de array do Postgres: `&&` (sobreposição) para OR, `@>` (contém) para AND. Ambos são compatíveis com índices, então a diferença de custo está no *tamanho do resultado*, não na latência da consulta.

***

## Chaves suportadas

O conjunto exato de chaves depende do endpoint que você está chamando:

| Chave                                    | `/companies/search` | `/people/search` | `/companies/advertisements/search` | Padrão | O que `and` significa                                          |
| ---------------------------------------- | ------------------- | ---------------- | ---------------------------------- | ------ | -------------------------------------------------------------- |
| `technologies`                           | sim                 | sim              | —                                  | OR     | Tem todas as tecnologias da lista                              |
| `categories`                             | sim                 | sim              | —                                  | OR     | Marcada com todas as categorias                                |
| `verticals`                              | sim                 | sim              | —                                  | OR     | Pertence a todas as verticais                                  |
| `vertical_categories`                    | sim                 | sim              | —                                  | OR     | Está em todas as categorias verticais                          |
| `vertical_sub_categories`                | sim                 | sim              | —                                  | OR     | Está em todas as subcategorias verticais                       |
| `keywords`                               | sim                 | sim              | —                                  | OR     | A descrição contém todas as palavras-chave                     |
| `places`                                 | sim                 | sim              | —                                  | OR     | Listada em todos os lugares                                    |
| `exclude_places`                         | sim                 | sim              | —                                  | OR     | Excluída de todos os lugares                                   |
| `advertisement_target_locations`         | sim                 | —                | —                                  | OR     | O anúncio tem como alvo todos os países (endpoint de empresa)  |
| `advertisement_exclude_target_locations` | sim                 | —                | —                                  | OR     | O anúncio exclui todos os países                               |
| `advertisement_search_terms`             | sim                 | —                | —                                  | OR     | O texto do anúncio contém todos os termos                      |
| `job_exclude_locations`                  | sim                 | —                | —                                  | OR     | A vaga exclui todas as localizações                            |
| `social_media`                           | —                   | sim              | —                                  | OR     | A pessoa tem todas as contas de redes sociais listadas         |
| `target_locations`                       | —                   | —                | sim                                | OR     | O anúncio tem como alvo todos os países (endpoint de anúncios) |
| `exclude_target_locations`               | —                   | —                | sim                                | OR     | O anúncio exclui todos os países                               |

<Tip>
  As chaves acima espelham os arrays `enum` na especificação OpenAPI (`company_filter_conditions`, `people_filter_conditions`, `ads_filter_conditions`). Enviar uma chave não suportada para um endpoint é ignorado silenciosamente.
</Tip>

***

## Receitas

<Tabs>
  <Tab title="Todas as tecnologias (empresas)">
    **Objetivo:** empresas que usam *todas* Python, PostgreSQL e Kubernetes — não apenas uma.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -X POST https://api.pubrio.com/companies/search \
        -H "Content-Type: application/json" \
        -H "pubrio-api-key: YOUR_API_KEY" \
        -d '{
          "technologies": [37, 152, 408],
          "filter_conditions": [
            { "key": "technologies", "operator": "and" }
          ],
          "per_page": 25,
          "page": 1
        }'
      ```

      ```python Python theme={null}
      import requests

      response = requests.post(
          "https://api.pubrio.com/companies/search",
          headers={
              "Content-Type": "application/json",
              "pubrio-api-key": "YOUR_API_KEY",
          },
          json={
              "technologies": [37, 152, 408],
              "filter_conditions": [
                  { "key": "technologies", "operator": "and" }
              ],
              "per_page": 25,
              "page": 1,
          },
      )
      print(response.json())
      ```

      ```javascript Node.js theme={null}
      const response = await fetch("https://api.pubrio.com/companies/search", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "pubrio-api-key": "YOUR_API_KEY",
        },
        body: JSON.stringify({
          technologies: [37, 152, 408],
          filter_conditions: [
            { key: "technologies", operator: "and" }
          ],
          per_page: 25,
          page: 1,
        }),
      });
      console.log(await response.json());
      ```
    </CodeGroup>

    Remova a entrada `filter_conditions` para ampliar a busca para *qualquer* uma das três.
  </Tab>

  <Tab title="Qualquer localização + exclusão">
    **Objetivo:** empresas em *qualquer* um dos países EUA, Canadá ou Reino Unido, mas nunca em São Francisco.

    OR já é o padrão para `locations`, então deixamos implícito. `exclude_places` cuida do filtro negativo de forma independente — nenhuma substituição é necessária.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -X POST https://api.pubrio.com/companies/search \
        -H "Content-Type: application/json" \
        -H "pubrio-api-key: YOUR_API_KEY" \
        -d '{
          "locations": ["US", "CA", "GB"],
          "exclude_places": ["San Francisco"],
          "per_page": 25,
          "page": 1
        }'
      ```

      ```python Python theme={null}
      import requests

      response = requests.post(
          "https://api.pubrio.com/companies/search",
          headers={
              "Content-Type": "application/json",
              "pubrio-api-key": "YOUR_API_KEY",
          },
          json={
              "locations": ["US", "CA", "GB"],
              "exclude_places": ["San Francisco"],
              "per_page": 25,
              "page": 1,
          },
      )
      print(response.json())
      ```

      ```javascript Node.js theme={null}
      const response = await fetch("https://api.pubrio.com/companies/search", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "pubrio-api-key": "YOUR_API_KEY",
        },
        body: JSON.stringify({
          locations: ["US", "CA", "GB"],
          exclude_places: ["San Francisco"],
          per_page: 25,
          page: 1,
        }),
      });
      console.log(await response.json());
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Campanhas de anúncios multirregionais">
    **Objetivo:** anúncios que têm como alvo ativo *tanto* a UE quanto os EUA (campanhas multirregionais) — não anúncios de mercado único. Usa o esquema dedicado `ads_filter_conditions` com a chave `target_locations`.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -X POST https://api.pubrio.com/companies/advertisements/search \
        -H "Content-Type: application/json" \
        -H "pubrio-api-key: YOUR_API_KEY" \
        -d '{
          "target_locations": ["US", "DE", "FR"],
          "filter_conditions": [
            { "key": "target_locations", "operator": "and" }
          ],
          "start_dates": ["2026-01-01"],
          "end_dates":   ["2026-04-22"],
          "per_page": 25,
          "page": 1
        }'
      ```

      ```python Python theme={null}
      import requests

      response = requests.post(
          "https://api.pubrio.com/companies/advertisements/search",
          headers={
              "Content-Type": "application/json",
              "pubrio-api-key": "YOUR_API_KEY",
          },
          json={
              "target_locations": ["US", "DE", "FR"],
              "filter_conditions": [
                  { "key": "target_locations", "operator": "and" }
              ],
              "start_dates": ["2026-01-01"],
              "end_dates":   ["2026-04-22"],
              "per_page": 25,
              "page": 1,
          },
      )
      print(response.json())
      ```

      ```javascript Node.js theme={null}
      const response = await fetch("https://api.pubrio.com/companies/advertisements/search", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "pubrio-api-key": "YOUR_API_KEY",
        },
        body: JSON.stringify({
          target_locations: ["US", "DE", "FR"],
          filter_conditions: [
            { key: "target_locations", operator: "and" }
          ],
          start_dates: ["2026-01-01"],
          end_dates:   ["2026-04-22"],
          per_page: 25,
          page: 1,
        }),
      });
      console.log(await response.json());
      ```
    </CodeGroup>

    <Note>
      O endpoint de anúncios usa seu próprio esquema `ads_filter_conditions` (conjunto de chaves menor: `target_locations`, `exclude_target_locations`). As chaves que você pode substituir em `/companies/search` e `/people/search` *não* se aplicam aqui.
    </Note>
  </Tab>

  <Tab title="Pessoas em empresas com múltiplas ferramentas">
    **Objetivo:** pessoas que trabalham em empresas que têm *tanto* o Salesforce quanto o HubSpot instalados — um sinal clássico de substituição de CRM. Demonstra o mecanismo unificado: mesma chave `technologies`, mesmo operador, mas em `/people/search`.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -X POST https://api.pubrio.com/people/search \
        -H "Content-Type: application/json" \
        -H "pubrio-api-key: YOUR_API_KEY" \
        -d '{
          "people_titles": ["RevOps", "Sales Operations"],
          "technologies": [114, 287],
          "filter_conditions": [
            { "key": "technologies", "operator": "and" }
          ],
          "per_page": 25,
          "page": 1
        }'
      ```

      ```python Python theme={null}
      import requests

      response = requests.post(
          "https://api.pubrio.com/people/search",
          headers={
              "Content-Type": "application/json",
              "pubrio-api-key": "YOUR_API_KEY",
          },
          json={
              "people_titles": ["RevOps", "Sales Operations"],
              "technologies": [114, 287],
              "filter_conditions": [
                  { "key": "technologies", "operator": "and" }
              ],
              "per_page": 25,
              "page": 1,
          },
      )
      print(response.json())
      ```

      ```javascript Node.js theme={null}
      const response = await fetch("https://api.pubrio.com/people/search", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "pubrio-api-key": "YOUR_API_KEY",
        },
        body: JSON.stringify({
          people_titles: ["RevOps", "Sales Operations"],
          technologies: [114, 287],
          filter_conditions: [
            { key: "technologies", operator: "and" }
          ],
          per_page: 25,
          page: 1,
        }),
      });
      console.log(await response.json());
      ```
    </CodeGroup>
  </Tab>
</Tabs>

***

## Erros comuns

<AccordionGroup>
  <Accordion title="Esquecer a key e enviar apenas operator" icon="circle-xmark">
    Não existe um botão global de "operador padrão". Cada entrada precisa nomear um filtro específico:

    ```json theme={null}
    // Ignored — no key
    { "filter_conditions": [{ "operator": "and" }] }

    // Correct — overrides only the technologies filter
    { "filter_conditions": [{ "key": "technologies", "operator": "and" }] }
    ```
  </Accordion>

  <Accordion title="Esperar que as entradas se combinem" icon="circle-xmark">
    As entradas são substituições independentes por chave — elas não se encadeiam. Listar tanto `technologies` quanto `verticals` não cria uma expressão booleana entre elas; cada uma apenas define o operador do seu próprio array.

    A combinação *entre* chaves de filtro diferentes é sempre AND (todo filtro precisa corresponder). Você não pode combinar com OR duas dimensões de filtro distintas através de `filter_conditions`. Se precisar de uma busca com OR verdadeiro entre filtros diferentes, execute duas requisições e combine os resultados no seu lado.
  </Accordion>

  <Accordion title="Usar AND em um array longo" icon="triangle-exclamation">
    AND é `column @> ARRAY[…]` — todo valor precisa estar presente. Com 8 ou mais valores, você quase sempre obtém zero linhas, porque a marcação no mundo real é esparsa. Mantenha os arrays com AND entre 2 e 4 valores; use OR para filtragem exploratória ou em nível de categoria.
  </Accordion>

  <Accordion title="Chave errada em filtros de empresa no /people/search" icon="circle-xmark">
    Em `/people/search`, o nome na API de pessoas é `company_places` / `company_locations`. Mas dentro de `filter_conditions[].key` você precisa usar o **nome do mecanismo** — `places`, `locations`. O remapeamento acontece internamente antes de `filter_conditions` ser consultado.

    ```json theme={null}
    // Won't override — engine doesn't see "company_places" as a filter key
    { "filter_conditions": [{ "key": "company_places", "operator": "and" }] }

    // Correct
    { "filter_conditions": [{ "key": "places", "operator": "and" }] }
    ```

    Tabela completa de remapeamento na página [People + Company Filters](/pt/developer-guides/filters/people-with-company-filters#key-remap-reference).
  </Accordion>
</AccordionGroup>

<Tip>
  Na dúvida, omita `filter_conditions` primeiro e verifique se a contagem de resultados corresponde às expectativas. Adicione substituições apenas para os filtros em que o padrão não corresponde à sua intenção — isso mantém o payload da requisição menor e mais fácil de depurar.
</Tip>

***

## Veja também

<CardGroup cols={2}>
  <Card title="Visão Geral de Filtros" icon="filter" href="/pt/developer-guides/filters/overview">
    O modelo mental — comece aqui se `filter_conditions` for a sua primeira parada.
  </Card>

  <Card title="Filtros de Pessoas + Empresa" icon="users-rectangle" href="/pt/developer-guides/filters/people-with-company-filters">
    Como combinar filtros de empresa em `/people/search`, incluindo o remapeamento de chaves.
  </Card>

  <Card title="Referência de Company Search" icon="building" href="/pt/api-reference/endpoint/companies/search">
    Esquema completo de requisição para `/companies/search` (inclui `company_filter_conditions`).
  </Card>

  <Card title="Referência de People Search" icon="user" href="/pt/api-reference/endpoint/people/search">
    Esquema completo de requisição para `/people/search` (inclui `people_filter_conditions`).
  </Card>
</CardGroup>
