Geavanceerde queries — de API filteren, projecteren en pagineren
PremiumNaast het aanroepen van één endpoint tegelijk biedt de Omniscol-API drie zoekingangen. Samen dekken ze het zoeken in de volledige tekst, het herleiden van een voor mensen leesbare naam tot een technische identificatie, en het uitvoeren van een gefilterde, geprojecteerde en gepagineerde query over elk lees-endpoint heen — zonder dat u zelf meerdere aanroepen aan elkaar hoeft te rijgen.
Dezelfde bouwstenen beantwoorden de vragen die een intranet, een reserveringstool of een ETL het vaakst stelt — te beginnen met “welk lokaal of welke docent is vrij op dit tijdslot?” (zie Een vrij lokaal of een vrije docent vinden).
De drie ingangen in één oogopslag
| Endpoint | Wat het doet | Ideaal voor |
|---|---|---|
POST /api/search |
Globale zoekopdracht in de volledige tekst over het hele account. Splitst uw tekst in woorden (hoofdletter- en accentongevoelig) en geeft de JSON-paden terug waar elk woord gevonden is. | Snel nagaan “waar komt deze term voor?”. |
POST /api/search/entity |
Herleidt een naam tot een entiteit. Kan omgaan met accenten, jokertekens en benaderende overeenkomst (Dice-gelijkenis), en geeft het type, de identificatie en de context van de entiteit terug. | “4V” omzetten naar de klas, of “Marieke de Vries” naar de docent. |
POST /api/search/query |
Query-orkestrator: roept een lees-endpoint aan en past daarna een where-filter, een veldprojectie, een sortering en een paginering toe op het resultaat. |
De complexe, gefilterde vragen die anders meerdere aanroepen zouden kosten. |
Alle drie staan ze in de interactieve API-referentie (de pagina /developers), onder de sectie Search, en ze vereisen authenticatie — zie Omniscol-API.
Het filter where (in Mango-/MongoDB-stijl)
/api/search/entity en /api/search/query accepteren allebei een
where-clausule: een gestructureerd filter met operatoren in
MongoDB-stijl. Een veld komt overeen met ofwel een rechtstreekse waarde
(impliciete gelijkheid), ofwel een object met operatoren; meerdere
operatoren op hetzelfde veld worden gecombineerd met een impliciete
EN. De veldnamen accepteren de puntnotatie om een bovenliggende
context te bereiken (bijvoorbeeld sites.name).
| Operator | Betekenis |
|---|---|
$eq / $ne |
Gelijk / niet gelijk |
$gt $gte $lt $lte |
Vergelijkingen |
$in / $nin |
Waarde binnen / buiten een lijst |
$exists |
Het veld is aanwezig |
$regex |
Reguliere expressie (hoofdletterongevoelig) |
$contains |
Een tekenreeks of een array bevat een waarde (hoofdletterongevoelig) |
$like |
Benaderende overeenkomst, waarbij accenten en leestekens worden genegeerd (Dice) |
$and $or $not |
Logische samenstelling |
Een paar voorbeelden:
{ "capacity": { "$gte": 20, "$lte": 50 } }
{ "level": { "$in": ["vmbo", "havo", "vwo"] } }
{ "name": { "$regex": "^lab" } }
{ "city": { "$like": "s hertogenbosch" } }
{ "$or": [ { "capacity": { "$gte": 50 } }, { "specialisation": "chemistry" } ] }
Projectie, sortering en paginering
Op /api/search/query houden nog vier knoppen het antwoord compact en
geordend — wat telt voor een dashboard, en nog meer voor een AI-agent die
per token wordt afgerekend:
project— de lijst met velden die u wilt behouden (puntnotatie toegestaan). Al het overige valt af.sort— één veld,ascofdesc. Het pseudoveld_count.<veld>sorteert op de lengte van een arrayveld.limitenoffset— pagineren de resultaten.
Het antwoord bevat ook een meta-blok: hoeveel elementen er vóór het
filteren waren, hoeveel er door het filter zijn gekomen, en hoeveel er
zijn teruggegeven.
Een volledig voorbeeld
De lokalen met minstens 30 plaatsen zoeken, alleen hun naam en hun capaciteit behouden, van groot naar klein, en de eerste 20 nemen:
curl -X POST "https://uw-school.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 is de interne naam van het uit te voeren lees-endpoint (zoals het
op de pagina /developers wordt weergegeven), params bevat de
parameters die eigen zijn aan dat endpoint, en extract_path wijst zo
nodig de array aan die binnen het resultaat gefilterd moet worden — hier
weggelaten, wordt die automatisch herkend.
Een vrij lokaal of een vrije docent vinden
De meest voorkomende integratie — een intranet, een reserveringstool of een ETL voeden — is “wie of wat is op dat moment vrij?”. De availability-endpoints beantwoorden dat rechtstreeks: ze geven per entiteit alleen de vrije tijdslots op de gevraagde datums terug, waarbij de lessen, de afwezigheden en de verplichte beschikbaarheid al zijn meegerekend.
De beschikbaarheid vraagt u op twee manieren op:
- Afgebakend —
GET /api/schedules/availability/{datesrange}/{entity}(zo nodig/{entityId}) voor één entiteitstype —teachers,classrooms,groups,resources… - Expliciet filter —
GET /api/schedules/availability/{datesrange}met eenfilter, waarmee u de verzameling inperkt met dezelfde$whereals hierboven.
{datesrange} schrijft u als YYYYMMDD, en segmenten gescheiden door
komma's vragen losse datums op — ideaal voor “twee bepaalde maandagen”:
20261005,20261012. Elk teruggegeven tijdslot bevat day, start,
end en time (in minuten): “minstens 3 uur” wordt aan uw kant dus een
test time >= 180.
Een docent die vrij is op een bepaald tijdslot
“Welke docenten zijn vrij op maandag 5 oktober?” — één enkele afgebakende aanroep:
curl -G "https://uw-school.omniscol.com/api/schedules/availability/20261005/teachers" \
-H "Authorization: Bearer $OMNISCOL_TOKEN" \
--data-urlencode "with_entities=true"
De vrije tijdslots komen gegroepeerd terug, eerst per soort en dan per
docent — bijvoorbeeld
{ "availability": { "teachers": { "d.devries": [ { "day": "2026-10-05", "start": "14:00", "end": "17:00", "time": 180 } ] } } } —
en uw tool kiest het tijdslot dat het gewenste moment dekt.
Lokalen van een bepaalde omvang, vrij op twee maandagen
Combineer een entiteitsfilter en de beschikbaarheid in één enkele
aanroep, met een nuttige deelverzameling van de syntaxis — enkel
$where op de capaciteit:
curl -G "https://uw-school.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"
Omniscol geeft de vrije tijdslots terug, op beide maandagen, van elk
lokaal met minstens 30 plaatsen. Uw ETL houdt vervolgens de lokalen over
die op elk van de datums een venster van 3 uur hebben
(time >= 180) — het samenstellen over meerdere dagen blijft aan uw
kant, wat de regel expliciet en controleerbaar houdt.
Het filter accepteert, per entiteitstype, een eenvoudige lijst met
identificaties ({"classrooms":["A101","B204"]}), een jokerteken
({"teachers":"*"}), een eenvoudige veldovereenkomst
({"teachers":[{"email":"…"}]}) of de gestructureerde $where die hier
getoond wordt.
De juiste ingang kiezen
- “Waar komt dit woord voor?” →
POST /api/search. - “Met welke entiteit komt deze naam overeen?” →
POST /api/search/entity. - “Geef me de lokalen met meer dan 30 plaatsen, gesorteerd, eerste pagina” →
POST /api/search/query. - “Wie of wat is vrij op dit tijdslot?” →
GET /api/schedules/availability/….
Voor een AI-agent
Deze ingangen bestaan voor een groot deel voor AI-agenten. Het zoeken
in de volledige tekst en de entiteitsresolutie zetten de formulering van
een gebruiker (“docent Jan de Boer”, “klas 4V”) om in precieze
identificaties; de query-orkestrator beantwoordt daarna een gefilterde
vraag in één enkele aanroep en geeft alleen de gevraagde velden terug —
in plaats van meerdere aanroepen en een veel te groot antwoord. Wanneer u
een agent aansluit via MCP — een externe AI-agent aansluiten, horen deze tools bij wat
hij kan gebruiken.
Aansluiten op een intranet, een ETL of een partnertool
Dezelfde lees-ingangen zijn wat een externe tool dagelijks aanroept. Gangbare vormen:
- Een ophaalactie naar een intranet of een dashboard — uw pagina roept de lees-endpoints aan (beschikbaarheid, het endpoint voor de lessen, de dashboards) met een beperkt API-token, en toont het resultaat. Aan de kant van Omniscol hoeft u niets te installeren.
- Een nachtelijke ETL — een geplande taak haalt op wat ze nodig heeft
(de lessen over een datumvenster, de uren van een docent, de bezetting
van de lokalen) en laadt dat in uw informatiesysteem.
search/queryhoudt elke ophaalactie gefilterd, geprojecteerd en gepagineerd, voor een compact antwoord. - Een push vanuit uw systeem — de omgekeerde richting, om Omniscol
afgestemd te houden op uw bron van waarheid: een nachtelijke taak kan
klassen en docenten bijwerken (
POST /api/external/classes,POST /api/external/teachers) of een catalogus met aangepaste vakken (POST /api/admin/subjects/custom) uit uw database laden. - Een SIS-/ERP-pakket — voor Aurion, Auriga en soortgelijke systemen is de daarvoor bedoelde connector de juiste tool — zie Synchronisatie met externe systemen.
- Gebeurtenisgestuurd — om op de hoogte gebracht te worden van een wijziging in plaats van in een lus te blijven bevragen, registreert u een hook — zie API-aanpassingen.
Houd elke integratie beperkt: een token dat begrensd is tot de endpoints die werkelijk nuttig zijn, dat regelmatig vernieuwd wordt, en alleen-lezen overal waar de integratie alleen leest. Zie Omniscol-API.