Nest Data API

A read-only HTTP API over the Nest product database (read replica). Authenticate with a bearer key and pull JSON. Two curated datasets cover the common cases; generic access exposes every non-secret table.

Curated datasets

Pre-joined, cleanly-shaped views with a stable field contract (nest_data, meetings). Start here for student profiles & sessions.

Raw tables

Direct read access to all 102 non-secret tables for anything the curated datasets don't cover. Same auth, generic shape.

nest_data

curated datasetPeople & Coachingread-only

A pre-joined view of student profiles — one clean row per student, pulled from users, program_user, programs, coach_student and roles. Use this instead of stitching those raw tables together yourself.

scope
nest_students
one row per
student (users with the student role)

Fields

FieldTypeDescription
person_idstring (ULID)Nest person id
full_namestringStudent's full name
emailstringPrimary email
programstringMost recent enrolled program
coachstringAssigned coach
statusstringactive · suspended · archived
last_activity_attimestampMost recent activity (UTC)

Call it

GET/v1/nest_data?limit=100  ·  /v1/nest_data/{person_id}
curl -s "https://nest-data-api.egelloc.com/v1/nest_data?limit=100" \
  -H "Authorization: Bearer $NEST_API_KEY"

meetings

curated datasetEngagementread-only

A shaped view of coaching sessions for a student — bookings joined to call_types and the host coach. Requires a person_id.

scope
nest_meetings

Fields

FieldTypeDescription
meeting_idstring (ULID)Booking id
person_idstring (ULID)Student
hoststringCoach hosting the session
typestringCall type
scheduled_attimestampScheduled start (UTC)
duration_minintegerMinutes
statusstringscheduled · completed · cancelled · no_show · rescheduled

Call it

GET/v1/meetings?person_id={id}&limit=100
curl -s "https://nest-data-api.egelloc.com/v1/meetings?person_id=01JKHBVWRXFX2KPZN2TX8DWWG4" \
  -H "Authorization: Bearer $NEST_API_KEY"

student_profile

curated datasetPeople & Coachingread-only

A student's academic / college profile from student_details, keyed by person_id. Home-address fields are intentionally excluded. Pairs with nest_data (identity) and meetings (sessions).

scope
nest_student_profile
one row per
student with a profile

Fields

FieldTypeDescription
person_idstring (ULID)Nest person id
full_namestringStudent's full name
school_name / school_city / school_state / school_countrystringCurrent school
current_gradestringGrade level
expected_graduation_yearstringExpected HS graduation year
current_gpa / gpa_type / scale_typestringGPA and scale
class_rank / sat_score / act_scorestringAcademic standing & test scores
career_aspirations / possible_majorstringGoals
college_goalsjsonTarget colleges / goals
college_factors / scholastic_honorsstringPreferences & honors
updated_attimestampProfile last updated (UTC)

Call it

GET/v1/student_profile/{person_id}  ·  /v1/student_profile?current_grade=&expected_graduation_year=
curl -s "https://nest-data-api.egelloc.com/v1/student_profile/01JKHBVWRXFX2KPZN2TX8DWWG4" \
  -H "Authorization: Bearer $NEST_API_KEY"

meeting_notes

curated datasetPeople & Coachingread-only

A student's coaching session notes — meeting_notes joined to the host coach and its attached doc links, newest first. Requires a person_id; optional coach_id.

scope
nest_meeting_notes

Fields

FieldTypeDescription
note_idstring (ULID)Note id
person_idstring (ULID)Student
coachstringHost coach
datedateSession date
meeting_typestringType of session
subjectstringSubject/title
notetextSession note (student-facing)
internal_notetextCoach-facing internal note
linksstring[]Attached doc URLs

Call it

GET/v1/meeting_notes?person_id={id}&limit=100
curl -s "https://nest-data-api.egelloc.com/v1/meeting_notes?person_id=01JKHBVWRXFX2KPZN2TX8DWWG4" \
  -H "Authorization: Bearer $NEST_API_KEY"

check_ins

curated datasetPeople & Coachingread-only

A student's weekly check-ins with their Q&A nested per check-in. Requires person_id; optional status (pending · completed · missed · excused). Newest week first.

scope
nest_check_ins

Fields

FieldTypeDescription
check_in_idstring (ULID)Check-in id
person_idstring (ULID)Student
week_enddateWeek the check-in covers
statusstringpending · completed · missed · excused
ratingintegerSelf-rating (nullable)
submitted_attimestampWhen submitted (UTC)
responsesobject[][{ position, question, answer }]

Call it

GET/v1/check_ins?person_id={id}&status=completed
curl -s "https://nest-data-api.egelloc.com/v1/check_ins?person_id=01JKHBVWRXFX2KPZN2TX8DWWG4" \
  -H "Authorization: Bearer $NEST_API_KEY"

essays

curated datasetPeople & Coachingread-only

A student's essays. The list is light (metadata); the single-essay endpoint adds the full body + feedback. Requires person_id for the list; optional status / type. Newest first.

scope
nest_essays

List fields

FieldType
essay_id / person_idstring (ULID)
name / type / target_name / prompt_titlestring
word_count / character_count / limit_count / revision_numberinteger
limit_type / statusstring
submitted_at / due_date / application_deadline / updated_attimestamp

Single (GET /v1/essays/{essay_id}) additionally returns prompt_text, essay_text, submitted_essay_text, and the editor/coach/student feedback fields + loom_url.

Call it

curl -s "https://nest-data-api.egelloc.com/v1/essays?person_id=01JK…&status=in_review" -H "Authorization: Bearer $NEST_API_KEY"

conversations

curated datasetPeople & Coachingread-only

Student↔coach message threads and their messages. Requires person_id for the thread list; optional status / type. Messages are fetched per thread.

scope
nest_conversations

Endpoints

GET/v1/conversations?person_id={id}

Thread fields: conversation_id, person_id, type, title, status, coach, last_message_at, created_at.

GET/v1/conversations/{conversation_id}/messages

Message fields: message_id, conversation_id, sender_role, sender, message, is_system_message, created_at, edited_at (soft-deleted excluded).

Call it

curl -s "https://nest-data-api.egelloc.com/v1/conversations/01JK…/messages" -H "Authorization: Bearer $NEST_API_KEY"

staff

curated datasetPeople & Coachingread-only

egelloC staff directory — users holding a coach/admin/CX/Strategist/editor role, with their roles aggregated. Optional status and role filters.

scope
nest_staff

Fields

FieldType
person_idstring (ULID)
full_name / email / status / avatarstring
rolesstring[]

Call it

curl -s "https://nest-data-api.egelloc.com/v1/staff?role=coach" -H "Authorization: Bearer $NEST_API_KEY"

Using the API

All routes are read-only GETs returning JSON, over HTTPS. Base URL https://nest-data-api.egelloc.com/v1.

Authentication

Send a bearer key on every data route (this catalog and health need none). Keys are scoped — nest_students, nest_meetings, nest_other.

Authorization: Bearer <your-api-key>
SituationStatusMeaning
valid key, in scope200Data returned
missing / bad key401No or invalid Authorization header
wrong scope403Key not scoped for that dataset
unknown id / table404No matching row or non-readable table
bad filter column400Filter column not on that table

Pagination

ParamTypeDescription
limitintegerRows to return. Default 100, max 1000
offsetintegerRows to skip. Default 0

List responses are enveloped: { items, limit, offset, total }.

Generic table access

Read any non-secret table directly. Columns come from the read-only grant, so responses never include password hashes, auth/OAuth tokens, or reset tokens.

GET/v1/tables  ·  /v1/tables/{table}?{column}={value}
curl -s "https://nest-data-api.egelloc.com/v1/tables/essays?type=personal_statement&limit=50" \
  -H "Authorization: Bearer $NEST_API_KEY"

Any column can be an equality filter. Excluded: password hashes, remember_token, personal_access_tokens, password_reset_tokens, SSO/OAuth creds, session/cache/job tables.

Health & docs

curl -s https://nest-data-api.egelloc.com/v1/health     → {"status":"ok"}
curl -s https://nest-data-api.egelloc.com/v1/health/db  → {"status":"ok","db":"ok"}

Interactive OpenAPI docs: /docs · /redoc.