Study plans define the curriculum structure for each grade level, specifying which subjects are taught, their weekly hours, and whether they are mandatory or elective.
Study Plans
A study plan links subjects from the subject catalog to specific grade levels for a school year, defining the hours and requirements for each subject.
List Study Plans
Filter by grade level (e.g., “9”, “10”, “11”)
Unique identifier for the study plan
ID of the school year this plan applies to
Grade level (e.g., “9”, “10”, “11”, “12”)
ID of the subject in the catalog
Number of hours per week allocated to this subject
Whether this subject is mandatory for students
Status: active or inactive
curl -X GET "https://api.athena-erp.com/academic/study-plans?grade_level=10" \
-H "Authorization: Bearer YOUR_TOKEN"
[
{
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"school_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"school_year_id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
"grade_level": "10",
"subject_catalog_id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"weekly_hours": 5.0,
"mandatory": true,
"status": "active",
"created_at": "2024-01-10T09:00:00Z",
"updated_at": "2024-01-10T09:00:00Z"
},
{
"id": "d4e5f6a7-b8c9-4d0e-a1b2-c3d4e5f6a7b8",
"school_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"school_year_id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
"grade_level": "10",
"subject_catalog_id": "e5f6a7b8-c9d0-4e1f-b2c3-d4e5f6a7b8c9",
"weekly_hours": 4.0,
"mandatory": true,
"status": "active",
"created_at": "2024-01-10T09:05:00Z",
"updated_at": "2024-01-10T09:05:00Z"
},
{
"id": "f6a7b8c9-d0e1-4f2a-c3d4-e5f6a7b8c9d0",
"school_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"school_year_id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
"grade_level": "10",
"subject_catalog_id": "a7b8c9d0-e1f2-4a3b-d4e5-f6a7b8c9d0e1",
"weekly_hours": 2.0,
"mandatory": false,
"status": "active",
"created_at": "2024-01-10T09:10:00Z",
"updated_at": "2024-01-10T09:10:00Z"
}
]
Create Study Plan
Grade level this plan applies to
ID of the subject from the subject catalog
Number of hours per week for this subject (must be greater than 0)
Whether this subject is mandatory for all students
Status: active or inactive
curl -X POST "https://api.athena-erp.com/academic/study-plans" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"school_year_id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
"grade_level": "11",
"subject_catalog_id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"weekly_hours": 4.5,
"mandatory": true,
"status": "active"
}'
{
"id": "b8c9d0e1-f2a3-4b4c-e5f6-a7b8c9d0e1f2",
"school_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"school_year_id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
"grade_level": "11",
"subject_catalog_id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"weekly_hours": 4.5,
"mandatory": true,
"status": "active",
"created_at": "2024-01-25T10:15:00Z",
"updated_at": "2024-01-25T10:15:00Z"
}
Update Study Plan
ID of the study plan to update
New weekly hours allocation
Whether the subject is mandatory
New status: active or inactive
curl -X PATCH "https://api.athena-erp.com/academic/study-plans/b8c9d0e1-f2a3-4b4c-e5f6-a7b8c9d0e1f2" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"weekly_hours": 5.0
}'
{
"id": "b8c9d0e1-f2a3-4b4c-e5f6-a7b8c9d0e1f2",
"school_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"school_year_id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
"grade_level": "11",
"subject_catalog_id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"weekly_hours": 5.0,
"mandatory": true,
"status": "active",
"created_at": "2024-01-25T10:15:00Z",
"updated_at": "2024-01-25T14:30:00Z"
}
Delete Study Plan
ID of the study plan to delete
curl -X DELETE "https://api.athena-erp.com/academic/study-plans/b8c9d0e1-f2a3-4b4c-e5f6-a7b8c9d0e1f2" \
-H "Authorization: Bearer YOUR_TOKEN"
Use Cases
Building a Complete Curriculum
Create a full curriculum for a grade level:
import requests
school_year_id = "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e"
grade_level = "10"
# Define the curriculum
curriculum = [
{"subject_id": "math-uuid", "hours": 5.0, "mandatory": True},
{"subject_id": "spanish-uuid", "hours": 4.0, "mandatory": True},
{"subject_id": "english-uuid", "hours": 4.0, "mandatory": True},
{"subject_id": "science-uuid", "hours": 5.0, "mandatory": True},
{"subject_id": "history-uuid", "hours": 3.0, "mandatory": True},
{"subject_id": "art-uuid", "hours": 2.0, "mandatory": False},
{"subject_id": "music-uuid", "hours": 2.0, "mandatory": False},
]
# Create study plans for each subject
for subject in curriculum:
response = requests.post(
"https://api.athena-erp.com/academic/study-plans",
headers={"Authorization": "Bearer YOUR_TOKEN"},
json={
"school_year_id": school_year_id,
"grade_level": grade_level,
"subject_catalog_id": subject["subject_id"],
"weekly_hours": subject["hours"],
"mandatory": subject["mandatory"],
"status": "active"
}
)
print(f"Created study plan: {response.json()['id']}")
Calculating Total Hours
Calculate total weekly hours for a grade level:
import requests
response = requests.get(
"https://api.athena-erp.com/academic/study-plans",
headers={"Authorization": "Bearer YOUR_TOKEN"},
params={"grade_level": "10"}
)
study_plans = response.json()
# Calculate totals
total_hours = sum(plan["weekly_hours"] for plan in study_plans)
mandatory_hours = sum(
plan["weekly_hours"] for plan in study_plans if plan["mandatory"]
)
elective_hours = sum(
plan["weekly_hours"] for plan in study_plans if not plan["mandatory"]
)
print(f"Total weekly hours: {total_hours}")
print(f"Mandatory hours: {mandatory_hours}")
print(f"Elective hours: {elective_hours}")
print(f"Number of subjects: {len(study_plans)}")
Comparing Year-over-Year Changes
Compare study plans between school years:
import requests
def get_study_plan_summary(school_year_id, grade_level):
response = requests.get(
"https://api.athena-erp.com/academic/study-plans",
headers={"Authorization": "Bearer YOUR_TOKEN"},
params={
"school_year_id": school_year_id,
"grade_level": grade_level
}
)
return response.json()
# Get plans for two different years
plans_2024 = get_study_plan_summary("year-2024-uuid", "10")
plans_2025 = get_study_plan_summary("year-2025-uuid", "10")
print(f"2024: {len(plans_2024)} subjects, {sum(p['weekly_hours'] for p in plans_2024)} hours")
print(f"2025: {len(plans_2025)} subjects, {sum(p['weekly_hours'] for p in plans_2025)} hours")
Relationship to Course Offerings
Study plans define the intended curriculum, while course offerings represent the actual implementation of those subjects for specific class groups. A study plan specifies that “Grade 10 should have 5 hours of Mathematics per week,” while a course offering implements “Mathematics for Grade 10A.”
Permissions
- List study plans: Requires
read:all or read:grades permission
- Create/Update/Delete study plans: Requires
write:all permission
Best Practices
- Plan before school year: Define study plans before the school year starts
- Validate total hours: Ensure total weekly hours don’t exceed available time
- Balance mandatory and elective: Provide flexibility with elective courses
- Version by year: Create new study plans for each school year to track curriculum changes
- Consider resources: Ensure you have teachers and facilities for all planned subjects