---
title: "Create candidate education"
method: POST
path: "/v3/candidate_educations"
tags: ["Candidate Educations"]
---

# Create candidate education

`POST /v3/candidate_educations`

Add a new education entry to a candidate's profile. `candidate_id` is required; school, degree, and discipline are optional but must reference existing custom-field option ids (look these up via `GET /v3/custom_field_options` for the org's `school_name`, `degree`, and `discipline` custom fields, or create new options via `POST /v3/custom_field_options` first). Provide either `start_date`/`end_date` as ISO 8601 dates, or the month/year component pairs when only that granularity is known — the Greenhouse UI displays month-and-year regardless. Greenhouse recomputes `latest` automatically.

## Request body

- object
  - `candidate_id` integer, required
  - `school_name_custom_field_option_id` integer
  - `degree_custom_field_option_id` integer
  - `discipline_custom_field_option_id` integer
  - `start_date` string, date
  - `end_date` string, date
  - `start_date_month` integer
  - `start_date_year` integer
  - `end_date_month` integer
  - `end_date_year` integer

## Response `201`

Successful

- object
  - `id` integer
  - `created_at` string, date-time
  - `updated_at` string, date-time
  - `candidate_id` integer — Id of the candidate (person) this education entry belongs to.
  - `school_name_custom_field_option_id` integer, nullable — Id of the custom-field option representing the school. Resolve the display name via `GET /v3/custom_field_options?ids=<id>`; the school dictionary lives under the org's `school_name` custom field.
  - `degree_custom_field_option_id` integer, nullable — Id of the custom-field option representing the degree (e.g. `Bachelor's`, `Master's`). Resolve the display name via `GET /v3/custom_field_options?ids=<id>`; the degree dictionary lives under the org's `degree` custom field.
  - `discipline_custom_field_option_id` integer, nullable — Id of the custom-field option representing the field of study (e.g. `Computer Science`). Resolve the display name via `GET /v3/custom_field_options?ids=<id>`; the discipline dictionary lives under the org's `discipline` custom field.
  - `start_at` string, date-time, nullable — Start date the education entry covers, in ISO 8601. Only the month and year are surfaced on the candidate profile; any day/time component is stored but ignored by the Greenhouse UI.
  - `end_at` string, date-time, nullable — End date the education entry covers, in ISO 8601. `null` for in-progress education. Only the month and year are surfaced on the candidate profile.
  - `latest` boolean — `true` when this is the candidate's most recent education (by `end_at`). Greenhouse maintains this flag automatically — at most one education per candidate has `latest: true`.
  - `start_date_month` integer, nullable — Month component (1-12) of the education's start, when only month/year granularity is known.
  - `start_date_year` integer, nullable — Year component (e.g. `2014`) of the education's start, when only month/year granularity is known.
  - `end_date_month` integer, nullable — Month component (1-12) of the education's end, when only month/year granularity is known.
  - `end_date_year` integer, nullable — Year component (e.g. `2018`) of the education's end, when only month/year granularity is known.

## Other responses

- `401` — Unauthorized
- `403` — Forbidden
- `422` — Unprocessable Content

---

[API](https://skmtc.dev/greenhouse/apis/auth-api.md) · [All operations](https://skmtc.dev/greenhouse/apis/auth-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/greenhouse/auth-api/revisions/9517a2e54640/schema)
