Replace a program's scorecard
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
Sends the scorecard reviewers fill in, in order (1 to 12 criteria). Each criterion is a score from 1 to 5 (scale_1_5), a score from 1 to 10 (scale_1_10) or a comment (free_text). A criterion with an id is kept and updated; one without an id is added; any existing criterion left out is removed. Scores are required and comments optional unless required says otherwise. These are the program's round questions, the same ones Awards round settings edit. Refused with 409 once any reviewer has scored. Sends nothing. Requires write:awards; the token's user needs the Awards update permission and must manage the program. Also at PUT /v1/awards/workspace/programs/{programId}/scorecard.
Request example
curl --request PUT \ --url 'https://public-api.sessionboard.com/v1/organization/{orgId}/awards/workspace/programs/{programId}/scorecard' \ --header 'x-access-token: <api-token>' \ --header 'Content-Type: application/json' \ --data '{ "criteria": [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "label": "<string>", "type": "scale_1_5", "required": true, "weight": 0, "description": "<string>" } ], "source": { "client": "<string>", "version": "<string>", "run_id": "<string>", "prompt": "<string>" }}'const response = await fetch('https://public-api.sessionboard.com/v1/organization/{orgId}/awards/workspace/programs/{programId}/scorecard', { method: 'PUT', headers: { "x-access-token": "<api-token>", "Content-Type": "application/json" }, body: JSON.stringify({ "criteria": [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "label": "<string>", "type": "scale_1_5", "required": true, "weight": 0, "description": "<string>" } ], "source": { "client": "<string>", "version": "<string>", "run_id": "<string>", "prompt": "<string>" } }),});
const data = await response.json();console.log(data);import requests
response = requests.request( "PUT", "https://public-api.sessionboard.com/v1/organization/{orgId}/awards/workspace/programs/{programId}/scorecard", headers={ "x-access-token": "<api-token>", "Content-Type": "application/json" }, json={ "criteria": [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "label": "<string>", "type": "scale_1_5", "required": True, "weight": 0, "description": "<string>" } ], "source": { "client": "<string>", "version": "<string>", "run_id": "<string>", "prompt": "<string>" } },)
print(response.json())<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://public-api.sessionboard.com/v1/organization/{orgId}/awards/workspace/programs/{programId}/scorecard", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "PUT", CURLOPT_POSTFIELDS => '{ "criteria": [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "label": "<string>", "type": "scale_1_5", "required": true, "weight": 0, "description": "<string>" } ], "source": { "client": "<string>", "version": "<string>", "run_id": "<string>", "prompt": "<string>" }}', CURLOPT_HTTPHEADER => [ "x-access-token: <api-token>", "Content-Type: application/json", ],]);
$response = curl_exec($curl);curl_close($curl);
echo $response;package main
import ( "fmt" "io" "net/http" "strings")
func main() { req, _ := http.NewRequest("PUT", "https://public-api.sessionboard.com/v1/organization/{orgId}/awards/workspace/programs/{programId}/scorecard", strings.NewReader(`{ "criteria": [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "label": "<string>", "type": "scale_1_5", "required": true, "weight": 0, "description": "<string>" } ], "source": { "client": "<string>", "version": "<string>", "run_id": "<string>", "prompt": "<string>" }}`)) req.Header.Add("x-access-token", "<api-token>") req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))}HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://public-api.sessionboard.com/v1/organization/{orgId}/awards/workspace/programs/{programId}/scorecard")) .header("x-access-token", "<api-token>") .header("Content-Type", "application/json") .method("PUT", HttpRequest.BodyPublishers.ofString("{\n \"criteria\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"label\": \"<string>\",\n \"type\": \"scale_1_5\",\n \"required\": true,\n \"weight\": 0,\n \"description\": \"<string>\"\n }\n ],\n \"source\": {\n \"client\": \"<string>\",\n \"version\": \"<string>\",\n \"run_id\": \"<string>\",\n \"prompt\": \"<string>\"\n }\n}")) .build();
HttpResponse<String> response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Try it
Response headers
Authorizations
x-access-tokenstringheaderOrganization API token. Generate from Organization Settings → API Tokens.
AuthorizationBearer <token>headerorOAuth 2.1 access token. Obtained via the OAuth PKCE flow at
/oauth/token.
Send one of these. See Authentication.
Path parameters
orgIdstringpathrequiredYour organization ID. Any other organization returns
404.programIdstring<uuid>pathrequiredThe Awards program ID.
Request body
criteriaobject[]required- Min items
1- Max items
12
Show child attributes
idstring<uuid>An existing criterion of this program's scorecard. Omit to add a new one.
labelstringrequired- Min length
1- Max length
200
typestringrequired- Allowed values
"scale_1_5", "scale_1_10", "free_text"
requiredbooleanweightnumberHow much the criterion counts in the average. Omit to leave it unweighted.
- Minimum
0- Maximum
100
descriptionstringGuidance reviewers see under the criterion.
- Max length
1000
sourceAwardsWorkspaceSourceOptional on every write: which assistant is calling and what the person asked it. Recorded with the change in the organization's activity and on any approval request; never stored on the program.
Show child attributes
clientstringThe assistant's client name (for example
ClaudeorChatGPT).versionstringrun_idstringYour own id for the conversation.
promptstringWhat the person asked the assistant.
- Max length
2000
{ "criteria": [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "label": "<string>", "type": "scale_1_5", "required": true, "weight": 0, "description": "<string>" } ], "source": { "client": "<string>", "version": "<string>", "run_id": "<string>", "prompt": "<string>" }}Responses
200application/json
OK
successbooleanpayloadobjectShow child attributes
scorecardobject[]Show child attributes
idstring<uuid>labelstringtypestringrequiredbooleanweightnumber | nulldescriptionstring | null
400application/json
VALIDATION_ERROR: the body does not match the schema.
Error body for the Awards workspace operations.
errorstringrequired- Allowed values
"VALIDATION_ERROR", "SCOPE_REQUIRED", "ORG_WIDE_TOKEN_REQUIRED", "FORBIDDEN", "NOT_FOUND", "CONFLICT", "QUOTA_EXCEEDED"
messagestringrequiredcodestringA more specific reason, when there is one (
trial_ended,plan_ended).
401
Missing, invalid or expired token.
403application/json
SCOPE_REQUIRED: the token lackswrite:awards. Legacy tokens with no scopes cannot write.ORG_WIDE_TOKEN_REQUIRED: the key is restricted to particular events. The Awards workspace covers every awards program in the organization, so use a key without an event restriction.FORBIDDENwithcode: trial_endedorcode: plan_ended: the organization's self-serve Awards plan is read-only (the trial ended, or the plan was canceled or is unpaid). Everything can still be read; choose a plan to make changes.FORBIDDENwith nocode: the token's user is not an active member of the organization, lacks the Awards permission the operation needs, does not manage the program, or (for the setup answers) is not an organization admin.
These operations do not return enterprise_only; the Enterprise-only items are listed by
GET /v1/organization/{orgId}/awards/workspace/enterprise.
Error body for the Awards workspace operations.
errorstringrequired- Allowed values
"VALIDATION_ERROR", "SCOPE_REQUIRED", "ORG_WIDE_TOKEN_REQUIRED", "FORBIDDEN", "NOT_FOUND", "CONFLICT", "QUOTA_EXCEEDED"
messagestringrequiredcodestringA more specific reason, when there is one (
trial_ended,plan_ended).
404application/json
NOT_FOUND: orgId is not the token's organization, or the program is not in it.
Error body for the Awards workspace operations.
errorstringrequired- Allowed values
"VALIDATION_ERROR", "SCOPE_REQUIRED", "ORG_WIDE_TOKEN_REQUIRED", "FORBIDDEN", "NOT_FOUND", "CONFLICT", "QUOTA_EXCEEDED"
messagestringrequiredcodestringA more specific reason, when there is one (
trial_ended,plan_ended).
409application/json
scoring_started: a reviewer has already scored, so the scorecard can no longer change.
Error body for the Awards workspace operations.
errorstringrequired- Allowed values
"VALIDATION_ERROR", "SCOPE_REQUIRED", "ORG_WIDE_TOKEN_REQUIRED", "FORBIDDEN", "NOT_FOUND", "CONFLICT", "QUOTA_EXCEEDED"
messagestringrequiredcodestringA more specific reason, when there is one (
trial_ended,plan_ended).
Response examples
{ "success": true, "payload": { "scorecard": [ { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "label": "<string>", "type": "<string>", "required": true, "weight": 123.45, "description": "<string>" } ] }}{ "error": "VALIDATION_ERROR", "message": "<string>", "code": "<string>"}{ "error": "SCOPE_REQUIRED", "message": "This operation requires the 'write:awards' scope."}{ "error": "ORG_WIDE_TOKEN_REQUIRED", "message": "The Awards workspace covers every awards program in the organization, so this API key (restricted to particular events) cannot use it. Use a key without an event restriction."}{ "error": "FORBIDDEN", "message": "Your Awards trial has ended. Choose a plan to keep going; everything you made is still here.", "code": "trial_ended"}{ "error": "FORBIDDEN", "message": "Your Awards plan has ended, so the workspace is read-only. Choose a plan to pick up where you left off.", "code": "plan_ended"}{ "error": "FORBIDDEN", "message": "User is not a manager of this program"}{ "error": "NOT_FOUND", "message": "Awards Program could not be found"}{ "code": "scoring_started", "message": "Reviewers have started scoring, so the scorecard can no longer change."}