Skip to content

Profile ​

Query me to read the signed-in student's profile. Call viewer.updateUser to save changes. Owlflow uses those fields to calculate scholarship eligibility. More profile data usually produces more matches.

Send Authorization: Bearer <token> with every request 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
    }
  }
}

Owlflow returns me: null only when it can't load the account. Without a valid JWT, Owlflow returns an authentication error instead of an empty profile.

Dictionaries ​

Load and cache the dictionaries before building your profile form. Send the value in mutations and display the corresponding name to the student. Do not send display labels such as "California" or "senior" in place of enum values.

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
      }
    }
  }
}

The gpas dictionary includes N/A and unweighted 4.0-scale strings from 2.0 through 4.1. Send the selected string as education.gpaOption.

Call references.zipData to look up a city and state from a US ZIP code. references.zipData doesn't update the profile. Send the returned city and state through viewer.updateUser.

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 school name Owlflow returns for collegeName or highSchoolName.

Save the profile ​

Send only the fields the student has provided. Owlflow leaves omitted top-level fields unchanged.

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 viewer.updateUser.success before updating your interface. When validation fails, each item in errors identifies the affected field. The student flow includes the full mutation.

Fields that change matches ​

viewer.updateUser refreshes the student's eligibility cache whenever a matching field changes. The next scholarships.list(filters: { isEligible: true }) call returns the updated matches.

The "Catalog share" column shows the share of active scholarships that check each field:

FieldCatalog shareSend
firstName, lastName, email99.8%Non-empty strings and the student's real email address.
citizenship98.2%US_CITIZEN, US_PERMANENT_RESIDENT, US_TEMPORARY_RESIDENT.
education.schoolLevel97.2%HIGH_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.enrolled49.6%true if enrolled in college, false otherwise.
education.degreeType46.7%BACHELORS, ASSOCIATES, MASTERS, DOCTORAL, CERTIFICATE, GRADUATE_CERTIFICATE, UNDECIDED.
address (state, zip, city, addressLine1)44.5%address.state takes a State enum such as CALIFORNIA, not a postal code like CA.
phone39.0%E.164 phone number such as +14155550123.
education.gpaOption36.8%One-decimal 4.0-scale GPA string from dictionaries.gpas ("2.0" through "4.1", or "N/A").
education.collegeName / education.potentialColleges26.7%School names (up to 5), not numeric school codes.
dateOfBirth20.2%ISO-8601 date or timestamp. Core checks age rules against this date, not a stored age.
gender6.1%A value from dictionaries.genders (male, female, other).
education.highSchoolName3.8%High school name string.
ethnicity3.3%AFRICAN_AMERICAN, AMERICAN_INDIAN_NATIVE_ALASKAN, ASIAN_PACIFIC_ISLANDER, CAUCASIAN, HISPANIC_LATINO, OTHER.
education.highSchoolGraduationYear2.9%Four-digit graduation year such as 2027.
careerGoal2.0%COMPUTERS_IT_TECHNOLOGY, HEALTH_CARE_NURSING, BUSINESS_MARKETING_MANAGEMENT, TEACHING_EDUCATION, ART_DESIGN_FASHION, LAW_CRIMINAL_JUSTICE, CULINARY_ARTS, BEAUTY_COSMETOLOGY, VOCATIONAL_TECHNICAL, OTHER.
education.degree0.1%A DegreeField such as COMPUTER_INFORMATION_SCIENCES. This is the field of study.
militaryAffiliationTargetedA value from dictionaries.militaryAffiliations.

Send education.potentialColleges as the complete list of schools the student is considering. Using the legacy fields collegeName1 through collegeName4 replaces the entire list and clears any slots you omit. For an enrolled student, set education.enrolled to true and send the current school in education.collegeName.

profileCompletion.percentage is Core's profile completeness score. Show it in a progress indicator. The score doesn't identify missing fields. When Core doesn't report a score, percentageOrNull is null. The client can retain the last known value instead of displaying zero.

dictionaries.profilePolicies.minAge specifies the date-of-birth cutoff for the minimum age (16).

dictionaries.states.requiresSpiConsent identifies states that require consent before collecting citizenship or ethnicity. Saving spiCollect: false clears any citizenship and ethnicity values Core stores 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 set the lower and upper bounds for dateApplied. Sort fields are DATE_APPLIED, DEADLINE, AMOUNT, and STATUS_UPDATED_AT.

Owlflow partner API