Skip to content

Profile ​

Matching reads the profile on the signed-in account. A thin signup (email, password, name) is enough to create the account. Scholarships stay narrow until you fill the fields below.

Send Authorization: Bearer <token> on every call on this page.

Read the profile ​

graphql
query Profile {
  me {
    id
    email
    firstName
    lastName
    dateOfBirth
    phone
    gender
    address {
      addressLine1
      city
      state
      zip
    }
    education {
      schoolLevel
      gpaOption
      degree
      degreeType
      collegeName
      collegeGraduationYear
      enrolled
    }
    citizenship
    ethnicity
    militaryAffiliation
    careerGoal
    profileCompletion {
      percentage
    }
  }
}

me is null only when the account could not be loaded. An unauthenticated call fails instead of returning an empty profile.

Dictionaries ​

Load these once and cache them. Every profile enum below is a value from this query. Display name to the student. Sending "California" or "senior" does not match.

graphql
query Dictionaries {
  references {
    dictionaries {
      citizenship { value name }
      ethnicities { value name }
      careerGoals { value name }
      degreeTypes { value name }
      degrees { value name }
      gpas { value name }
      genders { value name }
      states { value name }
      schoolLevels { value name }
      militaryAffiliations { value name }
    }
    zipData(zipCode: "94105") {
      city
      state {
        name
        abbreviation
      }
    }
  }
}

gpas includes N/A and the numeric strings 2.0 through 4.1. That string is what you send as education.gpaOption.

zipData fills city and state from a US zip. You still save those on the profile yourself.

references.dictionaries.highSchools(search:, type:, state:, limit:) looks up a school by name. type is HIGH_SCHOOL or COLLEGE. state is a postal abbreviation such as CA, and it only applies to high schools. Use the returned name for collegeName or highSchoolName.

Save the profile ​

Send only the fields the student has answered. Omitted top-level fields stay as they are.

graphql
mutation UpdateProfile($input: UpdateUserInput!) {
  viewer {
    updateUser(input: $input) {
      success
      updatedFields
      user {
        dateOfBirth
        address { state zip }
        education { schoolLevel degree degreeType gpaOption }
        citizenship
        careerGoal
      }
      errors { code field message }
    }
  }
}
json
{
  "input": {
    "dateOfBirth": "2007-04-12T00:00:00.000Z",
    "gender": "female",
    "phone": "+14155550123",
    "citizenship": "US_CITIZEN",
    "ethnicity": "ASIAN_PACIFIC_ISLANDER",
    "militaryAffiliation": "NONE",
    "careerGoal": "COMPUTERS_IT_TECHNOLOGY",
    "address": {
      "addressLine1": "1 Market St",
      "city": "San Francisco",
      "state": "CALIFORNIA",
      "zip": "94105"
    },
    "education": {
      "schoolLevel": "HIGH_SCHOOL_SENIOR",
      "degree": "COMPUTER_INFORMATION_SCIENCES",
      "degreeType": "BACHELORS",
      "gpaOption": "3.8",
      "enrolled": false,
      "collegeGraduationYear": 2031,
      "potentialColleges": ["Stanford University", "UC Berkeley"]
    }
  }
}

Check success. On failure, errors names the field. A full walk-through is in the student flow.

Fields that change matches ​

FieldSend
dateOfBirthISO-8601 timestamp. Age rules are checked against this date, not a stored age.
address.stateA State enum such as CALIFORNIA.
education.schoolLevelHIGH_SCHOOL_FRESHMAN, HIGH_SCHOOL_SOPHOMORE, HIGH_SCHOOL_JUNIOR, HIGH_SCHOOL_SENIOR, COLLEGE_1ST_YEAR, COLLEGE_2ND_YEAR, COLLEGE_3RD_YEAR, COLLEGE_4TH_YEAR, GRADUATE_STUDENT, ADULT_NON_TRADITIONAL.
education.degreeA DegreeField such as COMPUTER_INFORMATION_SCIENCES. This is the field of study.
education.degreeTypeBACHELORS, ASSOCIATES, MASTERS, DOCTORAL, CERTIFICATE, GRADUATE_CERTIFICATE, UNDECIDED.
education.gpaOptionA GPA string from dictionaries.gpas.
citizenshipUS_CITIZEN, US_PERMANENT_RESIDENT, US_TEMPORARY_RESIDENT.
ethnicityAFRICAN_AMERICAN, AMERICAN_INDIAN_NATIVE_ALASKAN, ASIAN_PACIFIC_ISLANDER, CAUCASIAN, HISPANIC_LATINO, OTHER.
genderA value from dictionaries.genders.
militaryAffiliationA value from dictionaries.militaryAffiliations.
careerGoalCOMPUTERS_IT_TECHNOLOGY, HEALTH_CARE_NURSING, BUSINESS_MARKETING_MANAGEMENT, TEACHING_EDUCATION, ART_DESIGN_FASHION, LAW_CRIMINAL_JUSTICE, CULINARY_ARTS, BEAUTY_COSMETOLOGY, VOCATIONAL_TECHNICAL, OTHER.

College names: send education.potentialColleges as the full list of schools the student is considering. Sending collegeName1 through collegeName4 rewrites that list and clears any slot you leave out. For a student who is already enrolled, set education.enrolled: true and education.collegeName to the current school.

profileCompletion.percentage is Core's completeness score. Use it for a progress meter. It is not a list of missing fields. percentageOrNull is null when Core did not report a score, so a client can keep the last known percentage instead of showing 0.

dictionaries.profilePolicies.minAge is the youngest date of birth the profile will accept.

Some states require a consent step before you save citizenship or ethnicity. dictionaries.states.requiresSpiConsent tells you when to show it. Saving spiCollect: false clears citizenship and ethnicity already stored on the account.

The student's applications ​

graphql
query MyApplications($first: Int!, $after: String) {
  viewer {
    applications(
      filters: { status: [SUBMITTED] }
      pagination: { first: $first, after: $after }
      sort: { field: DATE_APPLIED, direction: DESC }
    ) {
      totalCount
      pageInfo { hasNextPage endCursor }
      nodes {
        id
        dateApplied
        scholarship { id title amount deadline }
      }
    }
  }
}

status is INCOMPLETE, IN_PROGRESS, READY_TO_SUBMIT, or SUBMITTED. submittedAfter and submittedBefore bound dateApplied. Sort fields are DATE_APPLIED, DEADLINE, AMOUNT, and STATUS_UPDATED_AT.

Owlflow partner API