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
/accessand/proxy-access. Student data routes are available under both/students/{studentID}and/student/{studentID}.
Endpoints Overview
Public
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| POST | /invitations/accept | No | Accept a proxy invitation |
Access Management
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| GET | /access | Yes | List proxy access records |
| POST | /access | Yes | Create proxy access |
| GET | /access/my_students | Yes | List proxy user's students |
| POST | /access/create_invitation | Yes | Create invitation from access view |
| GET | /access/relationship_types | Yes | List relationship type options |
| GET | /access/{accessID} | Yes | Get access details |
| PATCH | /access/{accessID} | Yes | Update access |
| POST | /access/{accessID}/revoke | Yes | Revoke access |
Invitations
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| GET | /invitations | Yes | List invitations |
| POST | /invitations | Yes | Create invitation |
| POST | /invitations/{invitationID}/cancel | Yes | Cancel invitation |
| POST | /invitations/{invitationID}/resend | Yes | Resend invitation email |
Proxy Student Data
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| GET | /students/{studentID}/grades | Yes | Get student grades |
| GET | /students/{studentID}/schedule | Yes | Get student schedule |
| GET | /students/{studentID}/billing | Yes | Get student billing |
| GET | /students/{studentID}/enrollments | Yes | Get student enrollments |
| GET | /students/{studentID}/transcript | Yes | Get student transcript |
| GET | /students/{studentID}/gpa | Yes | Get student GPA |
| GET | /students/{studentID}/holds | Yes | Get student holds |
| GET | /students/{studentID}/payment_plans | Yes | Get student payment plans |
Audit Log
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| GET | /audit-log | Yes | List proxy audit log entries |
Public Endpoints
Accept Invitation
POST /api/v1/proxy/invitations/acceptAccepts a proxy invitation using the email token. No authentication required.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
email_token | string | Yes | Token from the invitation email |
Example Request
{
"email_token": "abc123def456..."
}Success Response (200 OK)
{
"success": true,
"data": {
"proxy_access_id": 10,
"student_id": 1001,
"access_type": "ACADEMIC"
}
}Access Management
List Access Records
GET /api/v1/proxy/accessQuery Parameters
| Parameter | Type | Description |
|---|---|---|
student_id | integer | Filter by student |
proxy_person_id | string (UUID) | Filter by proxy person |
access_type | string | Filter by type: ACADEMIC, FINANCIAL |
is_active | boolean | Filter by active status |
ordering | string | Sort by: -granted_at (default) |
Success Response (200 OK)
{
"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)
{
"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/accessRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
student_id | integer | Yes | Student to grant access to |
proxy_person_id | string (UUID) | Yes | Proxy person ID |
relationship_type_id | integer | Yes | Relationship type lookup ID |
access_type | string | Yes | ACADEMIC or FINANCIAL |
expires_at | string (datetime) | No | Expiration date |
Update Access
PATCH /api/v1/proxy/access/{accessID}Request Body
| Field | Type | Required | Description |
|---|---|---|---|
access_type | string | No | ACADEMIC or FINANCIAL |
is_active | boolean | No | Active status |
expires_at | string (datetime) | No | Expiration date |
Revoke Access
POST /api/v1/proxy/access/{accessID}/revokeRevokes proxy access. Sets is_active to false and records the revocation timestamp.
List My Students
GET /api/v1/proxy/access/my_studentsReturns students accessible to the currently authenticated proxy user, grouped by student with combined access information.
Success Response (200 OK)
{
"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_typesReturns available proxy relationship types for dropdowns.
Success Response (200 OK)
{
"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/invitationsQuery Parameters
| Parameter | Type | Description |
|---|---|---|
student_id | integer | Filter by student |
status | string | Filter by status (PENDING, ACCEPTED, CANCELLED, EXPIRED) |
invitee_email | string | Filter by invitee email |
ordering | string | Sort by: -created_at (default) |
Success Response (200 OK)
{
"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/invitationsAlso available via POST /api/v1/proxy/access/create_invitation.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
student_id | integer | Yes | Student ID |
invitee_email | string | Yes | Invitee email address |
invitee_phone | string | No | Invitee phone (max 30) |
invitee_first_name | string | Yes | First name (max 100) |
invitee_last_name | string | Yes | Last name (max 100) |
relationship_type_id | integer | Yes | Relationship type |
grant_academic_access | boolean | No | Grant academic access |
grant_financial_access | boolean | No | Grant financial access |
expires_at | string (datetime) | No | Access expiration date |
Example Request
{
"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}/cancelCancels a pending invitation. The invitation token will no longer be valid.
Resend Invitation
POST /api/v1/proxy/invitations/{invitationID}/resendResends 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}/gradesSuccess Response (200 OK)
{
"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}/scheduleSuccess Response (200 OK)
{
"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}/billingSuccess Response (200 OK)
{
"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}/enrollmentsSuccess Response (200 OK)
{
"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}/transcriptSuccess Response (200 OK)
{
"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}/gpaSuccess Response (200 OK)
{
"student_id": 1001,
"cumulative_gpa": 3.45,
"term_gpa": 3.67,
"total_credits": 45.0
}Student Holds
GET /api/v1/proxy/students/{studentID}/holdsSuccess Response (200 OK)
{
"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_plansSuccess Response (200 OK)
{
"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-logQuery Parameters
| Parameter | Type | Description |
|---|---|---|
student_id | integer | Filter by student |
proxy_person_id | string (UUID) | Filter by proxy person |
action | string | Filter by action type |
ordering | string | Sort by: -created_at (default) |
Success Response (200 OK)
{
"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
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.
| Method | Endpoint | Permission node | Description |
|---|---|---|---|
| GET | /access | selfservice | Get access |
| POST | /access | PROXY.MANAGE | Create access |
| POST | /access/create_invitation | selfservice | Create invitation |
| GET | /access/my_students | PROXY.DASHBOARD | List my students |
| GET | /access/permission_types | selfservice | List permission types |
| GET | /access/relationship_types | selfservice | List relationship types |
| GET | /access/{accessID} | selfservice | Get one access |
| PATCH | /access/{accessID} | PROXY.MANAGE | Update a access |
| POST | /access/{accessID}/revoke | selfservice | Revoke for a access |
| GET | /admin/access | PROXY.MANAGE | List every proxy access grant (staff) |
| GET | /admin/access/{accessID} | PROXY.MANAGE | Get one proxy access grant (staff) |
| POST | /admin/access/{accessID}/revoke | PROXY.MANAGE | Revoke a proxy access grant (staff) |
| GET | /admin/audit-log | PROXY.MANAGE | Proxy access audit log |
| GET | /invitations | selfservice | List invitations |
| POST | /invitations | selfservice | Create a invitation |
| POST | /invitations/accept | public | Accept |
| POST | /invitations/{invitationID}/cancel | selfservice | Cancel for a invitation |
| POST | /invitations/{invitationID}/resend | PROXY.MANAGE | Add resend to a invitation |
| GET | /proxy-access | selfservice | Get proxy access |
| POST | /proxy-access | PROXY.MANAGE | Create proxy access |
| POST | /proxy-access/create_invitation | selfservice | Create invitation |
| GET | /proxy-access/my_students | PROXY.DASHBOARD | List my students |
| GET | /proxy-access/permission_types | selfservice | List permission types |
| GET | /proxy-access/relationship_types | selfservice | List relationship types |
| GET | /proxy-access/{accessID} | selfservice | Get one proxy access |
| PATCH | /proxy-access/{accessID} | PROXY.MANAGE | Update a proxy access |
| POST | /proxy-access/{accessID}/revoke | selfservice | Revoke for a proxy access |
| GET | /student/{studentID}/billing | PROXY.DASHBOARD | Get the student's billing |
| GET | /student/{studentID}/enrollments | PROXY.DASHBOARD | List the student's enrollments |
| GET | /student/{studentID}/gpa | PROXY.DASHBOARD | Get the student's GPA |
| GET | /student/{studentID}/grades | PROXY.DASHBOARD | List the student's grades |
| GET | /student/{studentID}/holds | PROXY.DASHBOARD | List the student's holds |
| GET | /student/{studentID}/payment_plans | PROXY.DASHBOARD | List the student's payment plans |
| GET | /student/{studentID}/schedule | PROXY.DASHBOARD | Get the student's schedule |
| GET | /student/{studentID}/transcript | PROXY.DASHBOARD | Get the student's transcript |
| GET | /students/{studentID}/billing | PROXY.DASHBOARD | Get the student's billing |
| GET | /students/{studentID}/enrollments | PROXY.DASHBOARD | List the student's enrollments |
| GET | /students/{studentID}/gpa | PROXY.DASHBOARD | Get the student's GPA |
| GET | /students/{studentID}/grades | PROXY.DASHBOARD | List the student's grades |
| GET | /students/{studentID}/holds | PROXY.DASHBOARD | List the student's holds |
| GET | /students/{studentID}/payment_plans | PROXY.DASHBOARD | List the student's payment plans |
| GET | /students/{studentID}/schedule | PROXY.DASHBOARD | Get the student's schedule |
| GET | /students/{studentID}/transcript | PROXY.DASHBOARD | Get the student's transcript |