Skip to content

Education contract ​

The Education tab reads one table, programme. Like the job feed, Agisse never writes it: a separate feed provider does. A self-hosted copy starts with an empty tab.

The column list is checked against the Drizzle schema (worker/db/schema.ts) by worker/db/feed-contract.check.ts, so it can't drift.

programme ​

Upsert on url. Rows are public facts about programmes: no personal data.

ColumnTypeRequiredMeaning
urltextyesThe official programme or position page; the primary key
sourcetextyesedu:<scraper>, for example edu:uni or edu:euraxess
kindtextyesmaster, mba, phd (a programme) or phd_position (funded, with a deadline)
titletextyesAs the institution names it ("MSc Financial Economics"); HTML is stripped before display
degreetextnoMSc, MA, MBA, MiM, LLM, MPhil, PhD, ...
institutiontextyes"University of Oxford"
schooltextnoFaculty or business school, when it differs from the institution
domaintextnoThe institution's website (ox.ac.uk), for its logo
countrytextnoISO 3166-1 alpha-2, upper case (NL, US); programmes are worldwide
citytextnoCity
fieldstext[]noKeys of VACANCY_FUNCTIONS (see the feed contract) where they fit, else lower-case field names (economics, computer science)
languagestext[]noTeaching languages, lower-case English names (english)
duration_monthsintegernoLength of the programme
tuition_eurintegernoPer year, in €, for international (non-EU) students; null when unknown. The tuition filter leaves unknown fees out
study_modetextnofull_time, part_time or online
start_datedatenoNext intake
deadlinedatenoNext application deadline; null when unknown
deadline_typetextnoexplicit, rolling or unknown (default), as on vacancy
descriptiontextnoShort plain text, at most about 2000 characters; feeds full-text search
rank_theintegernoThe institution's position in the THE World University Rankings
rank_qsintegernoIts position in the QS World University Rankings
rank_ftintegernoIts position in an FT ranking (business schools)
first_seendateyesFirst day the provider saw it
last_seendateyesLast day the provider saw it listed; refresh it on every run
closed_atdatenoSet once the provider has not seen it for 60 days
searchtsvectornoGenerated by Postgres from title, institution and description. Don't write it
detailsjsonbnoAnything else: GMAT, scholarships, funding, supervisor; defaults to {}

When a programme is open ​

The tab shows a programme while closed_at is null and deadline is null or today or later. A seeker's saved programmes stay in their Saved list after they close, marked closed.

Rows are archived, never pruned: a closed programme keeps its row so past cycles' dates stay on record. Only a takedown request deletes one, and that also removes it from every seeker's Saved list.

Ranking ​

No model call. For each seeker: their degree's field words against the programme's text (half the score), a field they picked, the institution's best ranking position, whether it is the next step after their degree (a master's after a bachelor's, a PhD after a master's), and a deadline within a month (searchProgrammes in worker/lib/programmes.ts).