Consultas avançadas — filtrar, projetar e paginar a API
PremiumAlém de chamar um ponto de acesso de cada vez, a API do Omniscol oferece três superfícies de busca. Juntas, elas cobrem a busca de texto completo, a resolução de um nome humano para um identificador técnico, e a execução de uma consulta filtrada, projetada e paginada por cima de qualquer ponto de acesso em leitura — sem ter de encadear várias chamadas você mesmo.
Essas mesmas peças respondem às perguntas que um intranet, uma ferramenta de reservas ou um ETL colocam com mais frequência — a começar por « que sala ou que professor está livre nesta faixa horária? » (veja Encontrar uma sala ou um professor livre).
As três superfícies num relance
| Ponto de acesso | O que ele faz | Ideal para |
|---|---|---|
POST /api/search |
Busca de texto completo global sobre toda a conta. Divide o seu texto em palavras (insensível a maiúsculas e acentos) e devolve os caminhos JSON onde cada palavra foi encontrada. | Uma localização rápida « onde aparece este termo? ». |
POST /api/search/entity |
Resolve um nome para uma entidade. Gere os acentos, os curingas e a correspondência aproximada (similaridade de Dice), e devolve o tipo, o identificador e o contexto da entidade. | Transformar « 6A » na turma, ou « Martine Dupont » no professor. |
POST /api/search/query |
Orquestrador de consultas: chama um ponto de acesso em leitura, depois aplica um filtro where, uma projeção de campos, uma ordenação e uma paginação sobre o resultado. |
As perguntas complexas e filtradas que de outro modo exigiriam várias chamadas. |
As três figuram na referência de API interativa (a página /developers), sob a seção Search, e exigem uma autenticação — veja API Omniscol.
O filtro where (ao estilo Mango / MongoDB)
/api/search/entity e /api/search/query aceitam ambos uma cláusula
where: um filtro estruturado com operadores ao estilo MongoDB. Um
campo corresponde ora a um valor direto (igualdade implícita), ora a um
objeto de operadores; vários operadores sobre o mesmo campo combinam-se
por um E implícito. Os nomes de campo aceitam a notação com
pontos para alcançar um contexto pai (por exemplo sites.name).
| Operador | Significado |
|---|---|
$eq / $ne |
Igual / diferente |
$gt $gte $lt $lte |
Comparações |
$in / $nin |
Valor dentro / fora de uma lista |
$exists |
O campo está presente |
$regex |
Expressão regular (insensível a maiúsculas) |
$contains |
Uma cadeia ou um array contém um valor (insensível a maiúsculas) |
$like |
Correspondência aproximada, ignorando acentos e pontuação (Dice) |
$and $or $not |
Composição lógica |
Alguns exemplos:
{ "capacity": { "$gte": 20, "$lte": 50 } }
{ "level": { "$in": ["L1", "L2", "L3"] } }
{ "name": { "$regex": "^lab" } }
{ "city": { "$like": "ivry sur seine" } }
{ "$or": [ { "capacity": { "$gte": 50 } }, { "specialisation": "chemistry" } ] }
Projeção, ordenação e paginação
Sobre /api/search/query, mais quatro alavancas mantêm a resposta
compacta e ordenada — o que conta para um painel de controle, e mais
ainda para um agente IA faturado por token:
project— a lista de campos a conservar (notação com pontos autorizada). Todo o resto é descartado.sort— um campo,ascoudesc. O pseudocampo_count.<campo>ordena segundo o comprimento de um campo array.limiteoffset— paginam os resultados.
A resposta devolve também um bloco meta: quantos elementos existiam
antes da filtragem, quantos passaram o filtro, e quantos foram
devolvidos.
Um exemplo completo
Encontrar as salas de pelo menos 30 lugares, conservar apenas o seu nome e a sua capacidade, da maior para a menor, e tomar as 20 primeiras:
curl -X POST "https://sua-escola.omniscol.com/api/search/query" \
-H "Authorization: Bearer $OMNISCOL_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"call": "os_dashboard_classrooms_get",
"where": { "capacity": { "$gte": 30 } },
"project": ["name", "capacity"],
"sort": { "capacity": "desc" },
"limit": 20
}'
call é o nome interno do ponto de acesso em leitura a executar (tal
como exibido na página /developers), params leva os parâmetros
próprios desse ponto de acesso, e extract_path designa se necessário o
array a filtrar dentro do resultado — omitido aqui, ele é detectado
automaticamente.
Encontrar uma sala ou um professor livre
A integração mais comum — alimentar um intranet, uma ferramenta de reservas ou um ETL — é « quem ou o que está livre em tal momento? ». Os pontos de acesso availability respondem a isso diretamente: devolvem, por entidade, unicamente as faixas horárias livres nas datas solicitadas, tendo já em conta as aulas, as ausências e as disponibilidades obrigatórias.
A disponibilidade solicita-se de duas maneiras:
- Escopada —
GET /api/schedules/availability/{datesrange}/{entity}(se necessário/{entityId}) para um tipo de entidade —teachers,classrooms,groups,resources… - Filtro explícito —
GET /api/schedules/availability/{datesrange}com umfilter, onde se restringe o conjunto com o mesmo$wherevisto acima.
{datesrange} escreve-se em YYYYMMDD, e segmentos separados por
vírgulas solicitam datas esparsas — perfeito para « duas
segundas-feiras precisas »: 20261005,20261012. Cada faixa horária
devolvida leva day, start, end e time (em minutos): « pelo menos
3 horas » torna-se, portanto, um teste time >= 180 do seu lado.
Um professor livre numa faixa horária precisa
« Que professores estão livres na segunda-feira 5 de outubro? » — uma só chamada escopada:
curl -G "https://sua-escola.omniscol.com/api/schedules/availability/20261005/teachers" \
-H "Authorization: Bearer $OMNISCOL_TOKEN" \
--data-urlencode "with_entities=true"
As faixas horárias livres voltam agrupadas por natureza, depois por
professor — por exemplo
{ "availability": { "teachers": { "t.dupont": [ { "day": "2026-10-05", "start": "14:00", "end": "17:00", "time": 180 } ] } } } —
e a sua ferramenta retém aquela que cobre a faixa horária desejada.
Salas de certo tamanho, livres em duas segundas-feiras
Combine um filtro de entidade e a disponibilidade numa só chamada, com
um subconjunto útil da sintaxe — apenas $where sobre a capacidade:
curl -G "https://sua-escola.omniscol.com/api/schedules/availability/20261005,20261012" \
-H "Authorization: Bearer $OMNISCOL_TOKEN" \
--data-urlencode 'filter={"classrooms":[{"$where":{"capacity":{"$gte":30}}}]}' \
--data-urlencode "with_entities=true"
O Omniscol devolve as faixas horárias livres, nas duas segundas-feiras,
de cada sala de pelo menos 30 lugares. O seu ETL retém em seguida as
salas que tenham uma janela de 3 horas (time >= 180) em cada
uma das datas — a composição sobre vários dias fica do seu lado, o que
mantém a regra explícita e verificável.
O filter aceita, por tipo de entidade, uma simples lista de
identificadores ({"classrooms":["A101","B204"]}), um curinga
({"teachers":"*"}), uma correspondência de campo simples
({"teachers":[{"email":"…"}]}) ou o $where estruturado mostrado aqui.
Escolher a superfície certa
- « Onde aparece esta palavra? » →
POST /api/search. - « A que entidade corresponde este nome? » →
POST /api/search/entity. - « Dê-me as salas de mais de 30 lugares, ordenadas, primeira página » →
POST /api/search/query. - « Quem ou o que está livre nesta faixa horária? » →
GET /api/schedules/availability/….
Para um agente IA
Essas superfícies existem em grande parte para os agentes IA. A
busca de texto completo e a resolução de entidade transformam a
formulação de um usuário (« professor Jean Dupont », « turma 6A »)
em identificadores precisos; o orquestrador de consultas responde em
seguida a uma pergunta filtrada numa só chamada e devolve apenas os
campos solicitados — em vez de várias chamadas e de uma resposta
sobredimensionada. Quando você conecta um agente via
MCP — conectar um agente IA externo, essas ferramentas fazem parte do que ele pode
utilizar.
Ligá-lo a um intranet, um ETL ou uma ferramenta parceira
Essas mesmas superfícies em leitura são o que uma ferramenta terceira consome no dia a dia. Formas comuns:
- Um puxão para um intranet ou um painel de controle — a sua página chama os pontos de acesso em leitura (disponibilidade, o ponto de acesso das aulas, os painéis de controle) com um token de API restrito, e exibe o resultado. Nada a instalar do lado do Omniscol.
- Um ETL noturno — uma tarefa planejada recupera aquilo de que
precisa (as aulas sobre uma janela de datas, as horas de um professor,
a ocupação das salas) e carrega-o no seu sistema de informação.
search/querymantém cada puxão filtrado, projetado e paginado, para uma resposta compacta. - Uma injeção a partir do seu sistema — o sentido inverso, para
manter o Omniscol alinhado com a sua fonte de verdade: uma tarefa
noturna pode atualizar turmas e professores (
POST /api/external/classes,POST /api/external/teachers) ou carregar um catálogo de disciplinas personalizadas (POST /api/admin/subjects/custom) a partir da sua base. - Um pacote de software SIS / ERP — para Aurion, Auriga e afins, o conector dedicado é a ferramenta adequada — veja Sincronização com sistemas externos.
- Guiado por eventos — para ser notificado de uma mudança em vez de interrogar em ciclo, registre um hook — veja Personalização de API.
Mantenha cada integração restrita: um token limitado aos pontos de acesso realmente úteis, renovado com regularidade, e apenas em leitura onde ela só lê. Veja API Omniscol.