---
title: "Search Tes teaching jobs"
method: GET
path: "/tes/jobs/search"
tags: ["Tes"]
---

# Search Tes teaching jobs

`GET /tes/jobs/search`

## Request

- Base URL: `https://api.crawlora.net/api/v1`
- URL: `https://api.crawlora.net/api/v1/tes/jobs/search`
- Auth: API key in header `x-api-key`

Searches Tes's (tes.com) teaching-jobs board. Returns listing facts (title, employer, location, salary, contract terms/types) plus a short excerpt of the listing description, not the full long-form job-description copy, and the same live faceted-search breakdown (position/subject/workplace category trees with counts, plus contract type/term counts) the real search page renders as its filter sidebar. location is a free-text place name (a UK town/city, an international city, or a bare country name) resolved to coordinates; omit for Tes's own default market, "United Kingdom". radius_miles selects the search radius around location. contract_type and contract_term are validated against Tes's own small, closed label sets. position, subject, and workplace are comma-separated filters -- Tes's own category labels are numerous and can change, so read a prior response's own facets.positions[].value (and facets.positions[].children[].value)/facets.subjects[].value/facets.workplaces[].children[].value for the live, current set rather than guessing. salary_min filters to jobs with an advertised salary at or above that amount (in the searched market's local currency); Tes's own filter panel offers only a minimum, no maximum.

## Query parameters

- `keywords` string
- `location` string
- `radius_miles` 3 | 5 | 10 | 15 | 20 | 30 | 50 | 70 | 100 | 500
- `page` integer
- `page_size` integer
- `sort` 'relevance' | 'newest' | 'distance'
- `contract_type` 'Full Time' | 'Part Time'
- `contract_term` 'Permanent' | 'Fixed Term' | 'Casual' | 'Maternity Cover' | 'Temporary' | 'Supply'
- `position` string
- `subject` string
- `workplace` string
- `salary_min` integer

## Headers

- `x-api-key` string, required

## Response `200`

OK

- TesJobSearchResponseDoc
  - `code` integer
  - `data` TesJobSearchResponse
    - `facets` TesJobFacets
      - `contract_terms` TesJobFacet[]
        - `children` TesJobFacet[]
        - `count` integer
        - `value` string
      - `contract_types` TesJobFacet[]
        - `children` TesJobFacet[]
        - `count` integer
        - `value` string
      - `positions` TesJobFacet[]
        - `children` TesJobFacet[]
        - `count` integer
        - `value` string
      - `subjects` TesJobFacet[]
        - `children` TesJobFacet[]
        - `count` integer
        - `value` string
      - `workplaces` TesJobFacet[]
        - `children` TesJobFacet[]
        - `count` integer
        - `value` string
    - `jobs` TesJobSummary[]
      - `closing_date` string
      - `contract_terms` string[]
      - `contract_types` string[]
      - `employer` string
      - `employer_logo_url` string
      - `id` string
      - `location` string
      - `salary` string
      - `short_description` string
      - `title` string
      - `url` string
    - `keywords` string
    - `location` string
    - `page` integer
    - `page_size` integer
    - `total` integer
  - `msg` string

## Other responses

- `400`: Bad Request
- `429`: Too Many Requests
- `503`: Service Unavailable

---

[API](https://skmtc.dev/crawlora/apis/crawlora-api.md) · [All operations](https://skmtc.dev/crawlora/apis/crawlora-api/llms.txt) · [OpenAPI document](https://skmtc.dev/crawlora/apis/crawlora-api/revisions/028417aa35bb?raw)
