Appearance
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 numeric 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
| Field | Send |
|---|---|
dateOfBirth | ISO-8601 timestamp. Core checks age rules against this date, not a stored age. |
address.state | A State enum such as CALIFORNIA. |
education.schoolLevel | 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.degree | A DegreeField such as COMPUTER_INFORMATION_SCIENCES. This is the field of study. |
education.degreeType | BACHELORS, ASSOCIATES, MASTERS, DOCTORAL, CERTIFICATE, GRADUATE_CERTIFICATE, UNDECIDED. |
education.gpaOption | A GPA string from dictionaries.gpas. |
citizenship | US_CITIZEN, US_PERMANENT_RESIDENT, US_TEMPORARY_RESIDENT. |
ethnicity | AFRICAN_AMERICAN, AMERICAN_INDIAN_NATIVE_ALASKAN, ASIAN_PACIFIC_ISLANDER, CAUCASIAN, HISPANIC_LATINO, OTHER. |
gender | A value from dictionaries.genders. |
militaryAffiliation | A value from dictionaries.militaryAffiliations. |
careerGoal | COMPUTERS_IT_TECHNOLOGY, HEALTH_CARE_NURSING, BUSINESS_MARKETING_MANAGEMENT, TEACHING_EDUCATION, ART_DESIGN_FASHION, LAW_CRIMINAL_JUSTICE, CULINARY_ARTS, BEAUTY_COSMETOLOGY, VOCATIONAL_TECHNICAL, OTHER. |
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.
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.
