Appearance
Student flow
Call auth.createUser to register a new student or auth.login to authenticate a returning student. Both mutations return a JWT. Then call viewer.updateUser to save the profile and scholarships.list to fetch matches.
Send Authorization: Bearer <token> with viewer.updateUser and scholarships.list. Owlflow associates the account with your organization during registration. Partner identification documents that lookup.
Register
Header: Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7
Use a new key for each registration attempt. If the request times out, retry it with the same key to avoid creating a duplicate account.
graphql
mutation Signup($input: CreateUserInput!) {
auth {
createUser(input: $input) {
success
token
expiresAt
user {
id
email
firstName
lastName
}
errors {
code
field
message
}
}
}
}json
{
"input": {
"email": "ava@example.com",
"password": "correct-horse-battery",
"firstName": "Ava",
"lastName": "Nguyen"
}
}Store the token that Owlflow returns and use it to authenticate subsequent requests. A successful registration signs the student in immediately.
Sign in
Call auth.login when a student returns to your site. Set remember to true to extend the session.
graphql
mutation Login($input: LoginInput!) {
auth {
login(input: $input) {
token
expiresAt
user {
id
email
}
}
}
}json
{
"input": {
"email": "ava@example.com",
"password": "correct-horse-battery",
"remember": true
}
}Update the profile
Owlflow uses the student's profile to determine scholarship eligibility. For enum fields, send values from references.dictionaries rather than display text such as "California" or "senior."
graphql
mutation UpdateProfile($input: UpdateUserInput!) {
viewer {
updateUser(input: $input) {
success
user {
firstName
lastName
dateOfBirth
address {
state
zip
}
education {
schoolLevel
gpaOption
degree
degreeType
collegeGraduationYear
}
citizenship
careerGoal
}
errors {
code
field
message
}
}
}
}json
{
"input": {
"firstName": "Ava",
"lastName": "Nguyen",
"dateOfBirth": "2007-04-12T00:00:00.000Z",
"phone": "+14155550123",
"citizenship": "US_CITIZEN",
"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",
"collegeGraduationYear": 2031
}
}
}gpaOption is one of the GPA strings from references.dictionaries, including N/A.
Search
Set isEligible to true to return only scholarships that match the student's profile. Combine it with other filters to narrow the results. The search field searches scholarship content. Pass the previous pageInfo.endCursor as after to load the next page.
graphql
query Matches(
$first: Int!
$after: String
$filters: ScholarshipFilters
) {
scholarships {
list(filters: $filters, pagination: { first: $first, after: $after }) {
totalCount
totalAmount
pageInfo {
hasNextPage
endCursor
}
nodes {
id
title
amount
deadline
isEasy
requirementSummary {
type
count
label
}
}
}
}
}json
{
"first": 20,
"filters": {
"isEligible": true,
"isActive": true,
"capBasedSortEnabled": true,
"search": "engineering",
"state": ["CALIFORNIA"],
"schoolLevel": ["HIGH_SCHOOL_SENIOR"],
"minAmount": 1000,
"isEasy": true
}
}ScholarshipFilters also accepts deadlineBefore, degree, fieldOfStudy, maxRequirements, and requirementTypes with mode INCLUDE or EXCLUDE. Use isSaved: true for saved scholarships and isIgnored: true for ignored scholarships.
