---
title: "Update scorecard"
method: PATCH
path: "/v3/scorecards/{id}"
tags: ["Scorecards"]
---

# Update scorecard

`PATCH /v3/scorecards/{id}`

## Request

- Base URL: `https://harvest.greenhouse.io`
- URL: `https://harvest.greenhouse.io/v3/scorecards/{id}`
- Auth: one of:
  - OAuth 2
    - Authorization code: `https://auth.greenhouse.io/authorize`
    - Client credentials
    - Token URL: `https://auth.greenhouse.io/token` scopes: `harvest:scorecards:update`
  - HTTP bearer

Patch an existing scorecard. The body replaces values wholesale on the fields it includes — sending a new `notes` value overwrites the previous one rather than appending. Set `status` to `complete` to submit a draft scorecard (this stamps `submitted_at` and ends the edit window for non-admin users). Editing submitted scorecards is governed by the organization's scorecard-edit permissions: Site Admins can edit any time, while Job Admins are bound by the 30-day edit window.

## Path parameters

- `id` integer, required

## Request body

- object
  - `interviewer_id` integer, required: Id of the Greenhouse user this scorecard is assigned to (the interviewer being scored against).
  - `interviewed_at` string, date-time, required: Timestamp the interview took place, in ISO 8601.
  - `notes` string: Free-text "key takeaways" (pros, cons, follow-ups). Replaces the existing value wholesale.
  - `candidate_rating` 'strong_no' | 'no' | 'yes' | 'strong_yes' | 'no_decision': Overall recommendation. One of `strong_no` ("Definitely Not"), `no`, `yes`, `strong_yes`, or `no_decision`.
  - `private_notes` string: Free-text private notes; only readers with the "see private notes" permission see these. Replaces the existing value wholesale.
  - `status` 'draft' | 'complete': Lifecycle status. Move a `draft` to `complete` to submit (Greenhouse stamps `submitted_at` on transition). Site Admins can edit submitted scorecards at any time; Job Admins are bound by the organization's scorecard-edit window.
  - `public_notes` string: Free-text "note to other interviewers". Replaces the existing value wholesale.
  - `submitter_id` integer, required: Id of the user submitting (or last editing) the scorecard. Usually matches `interviewer_id`.
  - `question_answers` object[]: Answers to merge into the draft, matched to existing answer rows by `scorecard_question_id`. Entries present are updated; entries omitted are untouched; `value: null` clears an answer. Matching is against the kit's active questions — an answer whose question has since been deactivated can only be edited via the per-resource endpoints.
    - `scorecard_question_id` integer, required: Id of the scorecard question being answered. Must belong to the scorecard's interview kit (`GET /v3/scorecard_questions?interview_kit_ids=...`). Questions with `answer_type: "instruction"` are display-only and rejected.
    - `value` union, required: The answer, shaped by the question's `answer_type`: string for `text`, boolean for `yes_no`, option id for `single_select`, array of option ids for `multi_select` (treated as a set — the current selection is replaced; only active options are selectable). Select values are option ids only; option names are not accepted (unlike custom field values). Required: send an explicit `null` to clear an answer. A value whose type does not match the question's `answer_type` is rejected. Writing a `text` value stores plain text — any rich-text formatting previously entered in the Greenhouse UI is cleared.
      - string: Answer for a `text` question. Stored as plain text.
      - boolean: Answer for a `yes_no` question.
      - integer: Id of the selected option for a `single_select` question. Must belong to the question.
      - integer[]: Ids of the selected options for a `multi_select` question. Replaces the current selection as a set; each id must belong to the question.
  - `candidate_attributes` object[]: Attribute ratings to merge into the draft, matched to existing rows by `job_candidate_attribute_id`. Entries present are updated; entries omitted are untouched; `value: null` clears a rating.
    - `job_candidate_attribute_id` integer, required: Id of the job candidate attribute being rated. Must belong to the application's job (`GET /v3/job_candidate_attributes?job_ids=...`).
    - `value` 'definitely_not' | 'no' | 'yes' | 'strong_yes' | 'mixed' | 'no_decision' | 'null', nullable: Rating for this attribute. One of `definitely_not`, `no`, `yes`, `strong_yes`, `mixed`, or `no_decision`. Send `null` to clear; a cleared rating reads back as `no_decision`. Omitting the key leaves the current rating untouched (a note-only update); each entry must include `value` or `note`.
    - `note` string, nullable: Free-text note explaining the rating. Send `null` to clear.

## Response `200`

Successful

- object
  - `id` integer
  - `created_at` string, date-time
  - `updated_at` string, date-time
  - `interview_kit_id` integer: Id of the interview kit this scorecard was filled out against. The kit determines the questions, focus attributes, and rating scale on the scorecard. The kit also identifies which interview slot on the job's interview plan produced this scorecard.
  - `interviewer_id` integer: Id of the Greenhouse user who participated in the interview and to whom this scorecard is assigned. Each interviewer on a multi-interviewer interview gets their own scorecard.
  - `interviewed_at` string, date-time, nullable: Timestamp the interview took place, in ISO 8601. Mirrors the underlying interview's scheduled time and is set when the scorecard is created (manual scorecards may set this independently).
  - `notes` string, nullable: Free-text "key takeaways" the interviewer recorded on the scorecard (pros, cons, follow-ups). Plain text with `@`-mentions rendered as user names; use `notes_with_tags` for the version where mentions are tagged for downstream parsing.
  - `notes_with_tags` string, nullable: `notes` with `@`-mentions rendered as embedded user tags (e.g. `@[User Name](user:123)`) instead of plain user names, for partners that need to resolve mentioned users.
  - `submitter_id` integer: Id of the Greenhouse user who actually submitted the scorecard. Usually the same as `interviewer_id`, but differs when an admin submits a scorecard on another interviewer's behalf.
  - `candidate_rating` string: Interviewer's overall recommendation on whether the candidate passed the interview. One of `strong_no` ("Definitely Not" in the UI), `no`, `yes`, `strong_yes`, or `no_decision`. `no_decision` is recorded when the interviewer submitted the scorecard without choosing a recommendation.
  - `private_notes` string, nullable: Free-text private notes visible only to users with the "see private notes" permission. Plain text with `@`-mentions rendered as user names; use `private_notes_with_tags` for the tagged version.
  - `private_notes_with_tags` string, nullable: `private_notes` with `@`-mentions rendered as embedded user tags instead of plain user names.
  - `status` 'draft' | 'complete': Lifecycle status of the scorecard. `complete` is submitted feedback (and `submitted_at` is set). `draft` is an autosaved working copy owned by the user who opened the form; it is not shown as feedback and does not mean feedback is owed. Only complete scorecards count toward interview completion and downstream analysis.
  - `public_notes` string, nullable: Free-text "note to other interviewers" the interviewer leaves for the rest of the hiring team. Plain text with `@`-mentions rendered as user names; use `public_notes_with_tags` for the tagged version.
  - `public_notes_with_tags` string, nullable: `public_notes` with `@`-mentions rendered as embedded user tags instead of plain user names.
  - `application_id` integer: Id of the application this scorecard belongs to. Use it to look up the candidate via the applications endpoint.
  - `submitted_at` string, date-time, nullable: Timestamp the scorecard was submitted (moved from `draft` to `complete`), in ISO 8601. `null` while `status` is `draft`. The delta between `interviewed_at` and `submitted_at` is a common "time to submit scorecard" measure.

## Other responses

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

---

[API](https://skmtc.dev/greenhouse/apis/harvest-api.md) - [All operations](https://skmtc.dev/greenhouse/apis/harvest-api/llms.txt) - [OpenAPI document](https://skmtc.dev/greenhouse/apis/harvest-api/revisions/822822e3f771?raw)
