Appearance
Apply
Call applyV2 once to open the application, then submitApplicationRequirementV2 once for each requirement the student finishes. The application is complete when viewer.allMandatoryRequirementsCompleted is true on the scholarship returned by that save. There is no later submit call.
Send Authorization: Bearer <token>. Load the requirement ids and limits from scholarship detail before you render the form.
Use the V2 mutations. They return the scholarship, including the new progress, so you do not refetch the detail after every save.
Open the application
graphql
mutation Apply($scholarshipId: ID!, $subSource: String) {
scholarships {
applyV2(scholarshipId: $scholarshipId, subSource: $subSource) {
application { id dateApplied }
scholarship {
id
title
viewer { hasApplication hasSubmitted allMandatoryRequirementsCompleted }
}
}
}
}json
{ "scholarshipId": "12345", "subSource": "partner-site" }subSource is your own label for where the student started the application. hasApplication becomes true. A scholarship with no mandatory requirements can already be complete after this call.
Save one answer
requirementId is the requirement definition id. scholarshipId is the scholarship. Pass id only when you are replacing an answer that already has an applicationRequirement.id.
graphql
mutation SaveRequirement($input: ApplicationRequirementInput!) {
scholarships {
submitApplicationRequirementV2(input: $input) {
applicationRequirement { id }
scholarship {
id
viewer {
allMandatoryRequirementsCompleted
requirementProgress { completed progress }
}
}
}
}
}Keep the returned applicationRequirement.id. That is the id you pass to delete, and the id you pass to overwrite this answer later.
A goal requirement is written once. Sending it again does not change the stored payload.
Short answer (INPUT)
json
{
"input": {
"type": "INPUT",
"scholarshipId": "12345",
"requirementId": "901",
"text": "Lincoln High School"
}
}The prompt is title and description. config may carry extra validation for that field.
Essay (TEXT)
json
{
"input": {
"type": "TEXT",
"scholarshipId": "12345",
"requirementId": "902",
"text": "I want to study computer science because..."
}
}Stay inside minWords, maxWords, minCharacters, and maxCharacters. essayTopics are optional prompts you can show before the student writes.
When allowFile is true the student may upload instead of typing. Send fileBase64 and fileName, and stay inside allowedExtensions and maxFileSize (bytes). source is an optional label such as search or recommended.
AI drafts are optional. See Essays.
Survey (SURVEY)
answers maps each question id to a list of selected option values. Radio questions have one value. Checkbox questions have one or more. Use questions.options.value, not the label.
json
{
"input": {
"type": "SURVEY",
"scholarshipId": "12345",
"requirementId": "903",
"answers": {
"q-1": ["yes"],
"q-2": ["leadership", "community"]
}
}
}Confirmation (SPECIAL_ELIGIBILITY)
The requirement's specialEligibilityValue is the sentence you show. The saved answer scholarships.net sends for a checked box is the string true.
json
{
"input": {
"type": "SPECIAL_ELIGIBILITY",
"scholarshipId": "12345",
"requirementId": "904",
"specialEligibilityValue": "true"
}
}File (FILE) and image (IMAGE)
json
{
"input": {
"type": "FILE",
"scholarshipId": "12345",
"requirementId": "905",
"fileName": "transcript.pdf",
"fileBase64": "<base64>"
}
}Image uses type: "IMAGE" and checks allowedFormats instead of allowedExtensions. Also stay inside minWidth, maxWidth, minHeight, and maxHeight when the requirement sets them. To attach a file the student already uploaded, send accountFileId instead of fileBase64.
Goal (GOAL)
Show link. variant is TRACKING_MODE_FULL or TRACKING_MODE_LINK. When the student finishes, save a JSON object:
json
{
"input": {
"type": "GOAL",
"scholarshipId": "12345",
"requirementId": "906",
"goalValue": { "source": "partner-site", "completedAt": "2026-10-06T18:00:00.000Z" }
}
}Replace or remove an answer
Overwrite by sending the same mutation with id set to the existing applicationRequirement.id.
Remove an answer:
graphql
mutation DeleteRequirement($id: ID!, $scholarshipId: ID!, $type: RequirementTypeEnum!) {
scholarships {
deleteApplicationRequirementV2(id: $id, scholarshipId: $scholarshipId, type: $type) {
scholarship {
id
viewer { allMandatoryRequirementsCompleted }
}
}
}
}json
{ "id": "555", "scholarshipId": "12345", "type": "TEXT" }id is the saved answer, not the requirement definition.
Skip optional requirements by never saving them. isOptional: true on the requirement means the application can complete without that answer.
