Skip to content

Proxy Access API ​

Base URL: /api/v1/proxy

Manage proxy (parent/guardian) access to student records. Supports invitation-based onboarding, access management, and controlled data access for authorized proxies.

Note: Access management routes are available under both /access and /proxy-access. Student data routes are available under both /students/{studentID} and /student/{studentID}.

Endpoints Overview ​

Public ​

MethodEndpointAuthDescription
POST/invitations/acceptNoAccept a proxy invitation

Access Management ​

MethodEndpointAuthDescription
GET/accessYesList proxy access records
POST/accessYesCreate proxy access
GET/access/my_studentsYesList proxy user's students
POST/access/create_invitationYesCreate invitation from access view
GET/access/relationship_typesYesList relationship type options
GET/access/{accessID}YesGet access details
PATCH/access/{accessID}YesUpdate access
POST/access/{accessID}/revokeYesRevoke access

Invitations ​

MethodEndpointAuthDescription
GET/invitationsYesList invitations
POST/invitationsYesCreate invitation
POST/invitations/{invitationID}/cancelYesCancel invitation
POST/invitations/{invitationID}/resendYesResend invitation email

Proxy Student Data ​

MethodEndpointAuthDescription
GET/students/{studentID}/gradesYesGet student grades
GET/students/{studentID}/scheduleYesGet student schedule
GET/students/{studentID}/billingYesGet student billing
GET/students/{studentID}/enrollmentsYesGet student enrollments
GET/students/{studentID}/transcriptYesGet student transcript
GET/students/{studentID}/gpaYesGet student GPA
GET/students/{studentID}/holdsYesGet student holds
GET/students/{studentID}/payment_plansYesGet student payment plans

Audit Log ​

MethodEndpointAuthDescription
GET/audit-logYesList proxy audit log entries

Public Endpoints ​

Accept Invitation ​

POST /api/v1/proxy/invitations/accept

Accepts a proxy invitation using the email token. No authentication required.

Request Body ​

FieldTypeRequiredDescription
email_tokenstringYesToken from the invitation email

Example Request ​

json
{
  "email_token": "abc123def456..."
}

Success Response (200 OK) ​

json
{
  "success": true,
  "data": {
    "proxy_access_id": 10,
    "student_id": 1001,
    "access_type": "ACADEMIC"
  }
}

Access Management ​

List Access Records ​

GET /api/v1/proxy/access

Query Parameters ​

ParameterTypeDescription
student_idintegerFilter by student
proxy_person_idstring (UUID)Filter by proxy person
access_typestringFilter by type: ACADEMIC, FINANCIAL
is_activebooleanFilter by active status
orderingstringSort by: -granted_at (default)

Success Response (200 OK) ​

json
{
  "count": 5,
  "results": [
    {
      "proxy_access_id": 1,
      "student_id": 1001,
      "proxy_person_id": "550e8400-e29b-41d4-a716-446655440000",
      "relationship_type_id": 1,
      "access_type": "ACADEMIC",
      "is_active": true,
      "is_currently_active": true,
      "granted_at": "2024-09-01T10:00:00Z",
      "expires_at": "2025-09-01T10:00:00Z",
      "created_at": "2024-09-01T10:00:00Z"
    }
  ]
}

Get Access Details ​

GET /api/v1/proxy/access/{accessID}

Success Response (200 OK) ​

json
{
  "proxy_access_id": 1,
  "student_id": 1001,
  "proxy_person_id": "550e8400-e29b-41d4-a716-446655440000",
  "relationship_type_id": 1,
  "access_type": "ACADEMIC",
  "is_active": true,
  "is_currently_active": true,
  "granted_at": "2024-09-01T10:00:00Z",
  "expires_at": "2025-09-01T10:00:00Z",
  "created_at": "2024-09-01T10:00:00Z",
  "created_by": "admin",
  "updated_at": "2024-09-01T10:00:00Z",
  "updated_by": "admin",
  "audit_logs": [
    {
      "audit_id": 1,
      "proxy_access_id": 1,
      "student_id": 1001,
      "proxy_person_id": "550e8400-e29b-41d4-a716-446655440000",
      "action": "GRANTED",
      "action_details": "Academic access granted via invitation",
      "created_at": "2024-09-01T10:00:00Z"
    }
  ]
}

Create Access ​

POST /api/v1/proxy/access

Request Body ​

FieldTypeRequiredDescription
student_idintegerYesStudent to grant access to
proxy_person_idstring (UUID)YesProxy person ID
relationship_type_idintegerYesRelationship type lookup ID
access_typestringYesACADEMIC or FINANCIAL
expires_atstring (datetime)NoExpiration date

Update Access ​

PATCH /api/v1/proxy/access/{accessID}

Request Body ​

FieldTypeRequiredDescription
access_typestringNoACADEMIC or FINANCIAL
is_activebooleanNoActive status
expires_atstring (datetime)NoExpiration date

Revoke Access ​

POST /api/v1/proxy/access/{accessID}/revoke

Revokes proxy access. Sets is_active to false and records the revocation timestamp.


List My Students ​

GET /api/v1/proxy/access/my_students

Returns students accessible to the currently authenticated proxy user, grouped by student with combined access information.

Success Response (200 OK) ​

json
{
  "success": true,
  "data": [
    {
      "student_id": 1001,
      "student_name": "John Smith",
      "has_academic_access": true,
      "has_financial_access": false,
      "academic_expires_at": "2025-09-01T10:00:00Z",
      "relationship_type_display": "Parent"
    }
  ]
}

List Relationship Types ​

GET /api/v1/proxy/access/relationship_types

Returns available proxy relationship types for dropdowns.

Success Response (200 OK) ​

json
{
  "success": true,
  "data": [
    {
      "lookup_value_id": 1,
      "code": "PARENT",
      "display_value": "Parent"
    },
    {
      "lookup_value_id": 2,
      "code": "GUARDIAN",
      "display_value": "Legal Guardian"
    },
    {
      "lookup_value_id": 3,
      "code": "SPOUSE",
      "display_value": "Spouse"
    }
  ]
}

Invitations ​

List Invitations ​

GET /api/v1/proxy/invitations

Query Parameters ​

ParameterTypeDescription
student_idintegerFilter by student
statusstringFilter by status (PENDING, ACCEPTED, CANCELLED, EXPIRED)
invitee_emailstringFilter by invitee email
orderingstringSort by: -created_at (default)

Success Response (200 OK) ​

json
{
  "count": 3,
  "results": [
    {
      "invitation_id": 1,
      "student_id": 1001,
      "invitee_email": "parent@example.com",
      "invitee_first_name": "Jane",
      "invitee_last_name": "Smith",
      "relationship_type_id": 1,
      "grant_academic_access": true,
      "grant_financial_access": false,
      "status": "PENDING",
      "expires_at": "2025-09-01T10:00:00Z",
      "email_token_expires_at": "2024-10-01T10:00:00Z",
      "created_at": "2024-09-01T10:00:00Z"
    }
  ]
}

Create Invitation ​

POST /api/v1/proxy/invitations

Also available via POST /api/v1/proxy/access/create_invitation.

Request Body ​

FieldTypeRequiredDescription
student_idintegerYesStudent ID
invitee_emailstringYesInvitee email address
invitee_phonestringNoInvitee phone (max 30)
invitee_first_namestringYesFirst name (max 100)
invitee_last_namestringYesLast name (max 100)
relationship_type_idintegerYesRelationship type
grant_academic_accessbooleanNoGrant academic access
grant_financial_accessbooleanNoGrant financial access
expires_atstring (datetime)NoAccess expiration date

Example Request ​

json
{
  "student_id": 1001,
  "invitee_email": "parent@example.com",
  "invitee_first_name": "Jane",
  "invitee_last_name": "Smith",
  "relationship_type_id": 1,
  "grant_academic_access": true,
  "grant_financial_access": true,
  "expires_at": "2025-09-01T00:00:00Z"
}

Cancel Invitation ​

POST /api/v1/proxy/invitations/{invitationID}/cancel

Cancels a pending invitation. The invitation token will no longer be valid.


Resend Invitation ​

POST /api/v1/proxy/invitations/{invitationID}/resend

Resends the invitation email with a new token.


Proxy Student Data ​

These endpoints allow authenticated proxy users to view student data they have been granted access to. Academic endpoints require ACADEMIC access type; financial endpoints require FINANCIAL access type.

Student Grades ​

GET /api/v1/proxy/students/{studentID}/grades

Success Response (200 OK) ​

json
{
  "student_id": 1001,
  "grades": [
    {
      "course_name": "College Algebra",
      "course_code": "MATH 101",
      "term_name": "Fall 2024",
      "grade": "A",
      "credits": 3.0,
      "quality_points": 12.0
    }
  ]
}

Student Schedule ​

GET /api/v1/proxy/students/{studentID}/schedule

Success Response (200 OK) ​

json
{
  "student_id": 1001,
  "schedule": [
    {
      "course_name": "College Algebra",
      "course_code": "MATH 101",
      "section_code": "001",
      "term_name": "Spring 2025",
      "days": "MWF",
      "start_time": "09:00",
      "end_time": "09:50",
      "location": "Science Hall 201",
      "instructor": "Dr. Jane Doe"
    }
  ]
}

Student Billing ​

GET /api/v1/proxy/students/{studentID}/billing

Success Response (200 OK) ​

json
{
  "student_id": 1001,
  "balance": 5250.00,
  "transactions": [
    {
      "description": "Tuition - Fall 2024",
      "amount": 15000.00,
      "transaction_date": "2024-08-15T00:00:00Z",
      "transaction_type": "CHARGE",
      "status": "POSTED"
    }
  ]
}

Student Enrollments ​

GET /api/v1/proxy/students/{studentID}/enrollments

Success Response (200 OK) ​

json
{
  "student_id": 1001,
  "enrollments": [
    {
      "course_name": "College Algebra",
      "course_code": "MATH 101",
      "section_code": "001",
      "term_name": "Spring 2025",
      "credits": 3.0,
      "status": "REGISTERED"
    }
  ]
}

Student Transcript ​

GET /api/v1/proxy/students/{studentID}/transcript

Success Response (200 OK) ​

json
{
  "student_id": 1001,
  "transcript": [
    {
      "term_name": "Fall 2024",
      "course_name": "College Algebra",
      "course_code": "MATH 101",
      "grade": "A",
      "credits": 3.0,
      "quality_points": 12.0
    }
  ]
}

Student GPA ​

GET /api/v1/proxy/students/{studentID}/gpa

Success Response (200 OK) ​

json
{
  "student_id": 1001,
  "cumulative_gpa": 3.45,
  "term_gpa": 3.67,
  "total_credits": 45.0
}

Student Holds ​

GET /api/v1/proxy/students/{studentID}/holds

Success Response (200 OK) ​

json
{
  "student_id": 1001,
  "holds": [
    {
      "hold_type": "FINANCIAL",
      "reason": "Outstanding balance",
      "start_date": "2024-12-01T00:00:00Z",
      "end_date": null,
      "is_active": true
    }
  ]
}

Student Payment Plans ​

GET /api/v1/proxy/students/{studentID}/payment_plans

Success Response (200 OK) ​

json
{
  "student_id": 1001,
  "payment_plans": [
    {
      "plan_name": "Fall 2024 Payment Plan",
      "total_amount": 15000.00,
      "paid_amount": 7500.00,
      "status": "ACTIVE"
    }
  ]
}

Audit Log ​

List Audit Logs ​

GET /api/v1/proxy/audit-log

Query Parameters ​

ParameterTypeDescription
student_idintegerFilter by student
proxy_person_idstring (UUID)Filter by proxy person
actionstringFilter by action type
orderingstringSort by: -created_at (default)

Success Response (200 OK) ​

json
{
  "count": 50,
  "results": [
    {
      "audit_id": 1,
      "proxy_access_id": 1,
      "student_id": 1001,
      "proxy_person_id": "550e8400-e29b-41d4-a716-446655440000",
      "action": "GRANTED",
      "action_details": "Academic access granted via invitation",
      "performed_by_user_id": 5,
      "ip_address": "192.168.1.1",
      "user_agent": "Mozilla/5.0...",
      "created_at": "2024-09-01T10:00:00Z"
    }
  ]
}

TypeScript Types ​

typescript
interface ProxyAccess {
  proxy_access_id: number
  student_id: number
  proxy_person_id: string
  relationship_type_id: number
  access_type: 'ACADEMIC' | 'FINANCIAL'
  is_active: boolean
  is_currently_active: boolean
  granted_at: string
  expires_at: string | null
  revoked_at: string | null
  revoked_by_user_id: number | null
  created_at: string
  created_by: string | null
  updated_at: string
  updated_by: string | null
  audit_logs?: ProxyAuditLog[]
}

interface ProxyInvitation {
  invitation_id: number
  student_id: number
  invitee_email: string
  invitee_phone: string | null
  invitee_first_name: string
  invitee_last_name: string
  relationship_type_id: number
  grant_academic_access: boolean
  grant_financial_access: boolean
  status: 'PENDING' | 'ACCEPTED' | 'CANCELLED' | 'EXPIRED'
  expires_at: string | null
  email_token_expires_at: string
  proxy_person_id: string | null
  created_at: string
  created_by: string | null
  updated_at: string
  updated_by: string | null
}

interface ProxyAuditLog {
  audit_id: number
  proxy_access_id: number | null
  student_id: number
  proxy_person_id: string | null
  action: string
  action_details: string | null
  performed_by_user_id: number | null
  ip_address: string | null
  user_agent: string | null
  created_at: string
}

interface ProxyStudent {
  student_id: number
  student_name: string
  has_academic_access: boolean
  has_financial_access: boolean
  academic_expires_at: string | null
  financial_expires_at: string | null
  relationship_type_display: string
}



Complete endpoint reference ​

Every route this domain registers, with the permission node that gates it. Generated from the route table, so it is complete by construction — the sections above explain behaviour, this one guarantees nothing is missing.

Paths are relative to /api/v1/proxy. A node in italics is an exemption rather than a grant: selfservice acts only on the caller's own record, public needs no session at all, and custom carries its own wrapper.

MethodEndpointPermission nodeDescription
GET/accessselfserviceGet access
POST/accessPROXY.MANAGECreate access
POST/access/create_invitationselfserviceCreate invitation
GET/access/my_studentsPROXY.DASHBOARDList my students
GET/access/permission_typesselfserviceList permission types
GET/access/relationship_typesselfserviceList relationship types
GET/access/{accessID}selfserviceGet one access
PATCH/access/{accessID}PROXY.MANAGEUpdate a access
POST/access/{accessID}/revokeselfserviceRevoke for a access
GET/admin/accessPROXY.MANAGEList every proxy access grant (staff)
GET/admin/access/{accessID}PROXY.MANAGEGet one proxy access grant (staff)
POST/admin/access/{accessID}/revokePROXY.MANAGERevoke a proxy access grant (staff)
GET/admin/audit-logPROXY.MANAGEProxy access audit log
GET/invitationsselfserviceList invitations
POST/invitationsselfserviceCreate a invitation
POST/invitations/acceptpublicAccept
POST/invitations/{invitationID}/cancelselfserviceCancel for a invitation
POST/invitations/{invitationID}/resendPROXY.MANAGEAdd resend to a invitation
GET/proxy-accessselfserviceGet proxy access
POST/proxy-accessPROXY.MANAGECreate proxy access
POST/proxy-access/create_invitationselfserviceCreate invitation
GET/proxy-access/my_studentsPROXY.DASHBOARDList my students
GET/proxy-access/permission_typesselfserviceList permission types
GET/proxy-access/relationship_typesselfserviceList relationship types
GET/proxy-access/{accessID}selfserviceGet one proxy access
PATCH/proxy-access/{accessID}PROXY.MANAGEUpdate a proxy access
POST/proxy-access/{accessID}/revokeselfserviceRevoke for a proxy access
GET/student/{studentID}/billingPROXY.DASHBOARDGet the student's billing
GET/student/{studentID}/enrollmentsPROXY.DASHBOARDList the student's enrollments
GET/student/{studentID}/gpaPROXY.DASHBOARDGet the student's GPA
GET/student/{studentID}/gradesPROXY.DASHBOARDList the student's grades
GET/student/{studentID}/holdsPROXY.DASHBOARDList the student's holds
GET/student/{studentID}/payment_plansPROXY.DASHBOARDList the student's payment plans
GET/student/{studentID}/schedulePROXY.DASHBOARDGet the student's schedule
GET/student/{studentID}/transcriptPROXY.DASHBOARDGet the student's transcript
GET/students/{studentID}/billingPROXY.DASHBOARDGet the student's billing
GET/students/{studentID}/enrollmentsPROXY.DASHBOARDList the student's enrollments
GET/students/{studentID}/gpaPROXY.DASHBOARDGet the student's GPA
GET/students/{studentID}/gradesPROXY.DASHBOARDList the student's grades
GET/students/{studentID}/holdsPROXY.DASHBOARDList the student's holds
GET/students/{studentID}/payment_plansPROXY.DASHBOARDList the student's payment plans
GET/students/{studentID}/schedulePROXY.DASHBOARDGet the student's schedule
GET/students/{studentID}/transcriptPROXY.DASHBOARDGet the student's transcript

Student Information System Documentation