Skip to main content

Schools and Companies

Schools and companies are reference data that MLH uses across the platform to describe where people study and work — for example, the school on a user's profile. Most integrations read these records to look up or match an existing school or company by name, rather than creating new ones.

Both are standard REST resources. See Making requests for pagination, filtering, expand, and error responses, and Authentication for how to authenticate and request scopes.

Schools

A school is a university or other institution, with its name, web domain, country, and whether MLH has verified it.

Endpoints

MethodPathDoes
GET/v4/schoolsList schools
GET/v4/schools/{id}Get one school
POST/v4/schoolsCreate a school

{id} is the school's id.

Fields

These fields appear in a school response. On create (POST /v4/schools), you set them in the request body.

FieldTypeRead/writeDescriptionExample
idstringread-onlyUnique identifier for the school."3f8b…"
namestringwriteThe institution's name."University of Waterloo"
domain_namestringwriteThe school's primary web domain, used to match email addresses to a school."uwaterloo.ca"
countrystringwriteThe country the school is in."Canada"
abbreviationsarray of stringswriteCommon short forms or acronyms for the school.["UW", "UWaterloo"]
verifiedbooleanwriteWhether MLH has verified this school record.true
typestringwriteThe kind of institution."university"
created_atintegerread-onlyWhen the record was created, as a Unix timestamp (seconds).1755561600
updated_atintegerread-onlyWhen the record was last updated, as a Unix timestamp (seconds).1755648000

All writable fields are optional; provide the ones you have. In responses, created_at and updated_at are Unix timestamps.

Filtering

GET /v4/schools supports these filters (see Filtering for operator syntax):

  • name[eq], [contains], [excludes], [similar]
  • domain_name[eq], [contains], [excludes]
  • country[eq], [contains], [excludes]
  • verified[eq]

Because user-entered school names vary ("MIT" vs. "Massachusetts Institute of Technology"), use the [similar] fuzzy filter to match a name that isn't exact. See [similar] in Making requests.

Scopes

Requests are authenticated with an OAuth 2.0 access token or a bearer JWT. Request only the scopes your integration needs — see Scopes.

Example

Find schools that fuzzily match a name:

GET /v4/schools?name[similar]=Waterloo&limit=10

Look up one school by its id:

GET /v4/schools/3f8b…

Companies

A company is an organization such as a sponsor or an employer, with its name, slug, and web domain.

Endpoints

MethodPathDoes
GET/v4/companiesList companies
GET/v4/companies/{id}Get one company
POST/v4/companiesCreate a company
PATCH / PUT/v4/companies/{id}Update a company

{id} is the company's id. PATCH and PUT accept the same body; send the fields you want to change.

Fields

These fields appear in a company response. On create and update, you set them in the request body.

FieldTypeRead/writeDescriptionExample
idstringread-onlyUnique identifier for the company."a91c…"
namestringwriteThe company's name."Acme Inc."
slugstringwriteA URL-friendly identifier for the company."acme-inc"
domain_namestringwriteThe company's primary web domain."acme.com"
created_atintegerread-onlyWhen the record was created, as a Unix timestamp (seconds).1755561600
updated_atintegerread-onlyWhen the record was last updated, as a Unix timestamp (seconds).1755648000

All writable fields are optional; provide the ones you have. In responses, created_at and updated_at are Unix timestamps.

Filtering

GET /v4/companies supports these filters (see Filtering for operator syntax):

  • name[eq], [contains], [excludes], [similar]
  • domain_name[eq], [contains], [excludes]

As with schools, use the [similar] fuzzy filter on name to match a company whose name isn't an exact string. See [similar] in Making requests.

Scopes

Requests are authenticated with an OAuth 2.0 access token or a bearer JWT. Request only the scopes your integration needs — see Scopes.

Example

Search companies by partial name:

GET /v4/companies?name[contains]=acme&limit=10

Update a company's domain:

PATCH /v4/companies/a91c…
Content-Type: application/json

{
"domain_name": "acme.io"
}