> For the complete documentation index, see [llms.txt](https://guide.fariaedu.com/integrations-portal/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://guide.fariaedu.com/integrations-portal/managebac/public-rest-apis/v2p3/extended-apis.md).

# Extended APIs

These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled.

## Bulk update Students from a Class

> This endpoint updates students belonging to a class as specified by class ID.\
> \
> Each student in the request body is processed individually. The response includes\
> a status for each student indicating whether the update was successful, returned\
> a validation error, or the student was not found in the class.<br>

```json
{"openapi":"3.0.3","info":{"title":"API V2P3","version":"v2p3"},"tags":[{"name":"Classes","description":"Classes are scheduled sessions in which teachers deliver a given curriculum to a group of students."},{"name":"Extended APIs","description":"These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled."}],"servers":[{"url":"https://api.managebac.com","description":"CA ManageBac API server."},{"url":"https://api.managebac.cn","description":"CN ManageBac API server."},{"url":"https://api.us.managebac.com","description":"US1 ManageBac API server."},{"url":"https://api.managebac.us","description":"US2 ManageBac API server."},{"url":"https://api.managebactest.com","description":"UAT ManageBac API server."},{"url":"https://{Host}","variables":{"Host":{"default":"api.devel.managebac.com","enum":["api.devel.managebac.com","api-faria.devel.managebac.com","api.managebac.dev"]}}}],"security":[{"bearerAuth":[]},{"authTokenQuery":[]},{"authTokenHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"OAuth 2.0 Bearer token obtained via client credentials grant. Pass the token in the Authorization header as `Bearer <token>`."},"authTokenQuery":{"type":"apiKey","name":"auth_token","in":"query","description":"Your V2 API authentication token may be passed in the parameters. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."},"authTokenHeader":{"type":"apiKey","name":"auth-token","in":"header","description":"Your V2 API authentication token may be passed in the header. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."}},"schemas":{"AccessDeniedError":{"type":"object","description":"Returned when the API token is missing, invalid, or has been disabled.","properties":{"error":{"type":"string","description":"Unauthorized to perform an action"}}},"NotFound":{"type":"object","description":"Returned when the requested resource cannot be found by the given ID.","properties":{"error":{"type":"string","description":"Record was not found"}}},"BulkUpdateStudents":{"type":"object","required":["students"],"properties":{"students":{"type":"array","description":"An array of student IDs to add or update in the class.","items":{"type":"object","properties":{"id":{"type":"integer","description":"Student ID"},"level":{"type":"string","description":"Student level.","enum":["HL","SL"]}}}}}}}},"paths":{"/v2p3/classes/{class_id}/students":{"patch":{"summary":"Bulk update Students from a Class","operationId":"bulkUpdateStudentsFromClass","tags":["Extended APIs","Classes"],"description":"This endpoint updates students belonging to a class as specified by class ID.\n\nEach student in the request body is processed individually. The response includes\na status for each student indicating whether the update was successful, returned\na validation error, or the student was not found in the class.\n","parameters":[{"name":"class_id","in":"path","description":"Unique identifier for class.","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedError"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFound"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateStudents"}}}}}}}}
```

## Upsert many classes

> Creates and updates multiple classes in a single request. Each entry in the array is\
> processed independently: entries with an \`id\` field are treated as updates, entries\
> without are treated as creates. Returns an indexed array of results with status\
> (\`ok\`, \`unprocessable\_entity\`, or \`not\_found\`) for each entry.<br>

```json
{"openapi":"3.0.3","info":{"title":"API V2P3","version":"v2p3"},"tags":[{"name":"Classes","description":"Classes are scheduled sessions in which teachers deliver a given curriculum to a group of students."},{"name":"Extended APIs","description":"These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled."}],"servers":[{"url":"https://api.managebac.com","description":"CA ManageBac API server."},{"url":"https://api.managebac.cn","description":"CN ManageBac API server."},{"url":"https://api.us.managebac.com","description":"US1 ManageBac API server."},{"url":"https://api.managebac.us","description":"US2 ManageBac API server."},{"url":"https://api.managebactest.com","description":"UAT ManageBac API server."},{"url":"https://{Host}","variables":{"Host":{"default":"api.devel.managebac.com","enum":["api.devel.managebac.com","api-faria.devel.managebac.com","api.managebac.dev"]}}}],"security":[{"bearerAuth":[]},{"authTokenQuery":[]},{"authTokenHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"OAuth 2.0 Bearer token obtained via client credentials grant. Pass the token in the Authorization header as `Bearer <token>`."},"authTokenQuery":{"type":"apiKey","name":"auth_token","in":"query","description":"Your V2 API authentication token may be passed in the parameters. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."},"authTokenHeader":{"type":"apiKey","name":"auth-token","in":"header","description":"Your V2 API authentication token may be passed in the header. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."}},"schemas":{"UpsertClassesResponse":{"type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/UpsertUnprocessableEntityError"},{"$ref":"#/components/schemas/UpsertNotFoundError"},{"type":"object","properties":{"index":{"type":"integer","description":"Positional item index"},"class":{"$ref":"#/components/schemas/Class"},"status":{"type":"string","description":"Status code"}}}]}},"UpsertUnprocessableEntityError":{"type":"object","properties":{"index":{"type":"integer","description":"Positional item index"},"errors":{"type":"object","description":"Validation errors"},"status":{"type":"string","description":"Status code"}}},"UpsertNotFoundError":{"type":"object","properties":{"index":{"type":"integer","description":"Positional item index"},"errors":{"type":"object","properties":{"id":{"type":"array","items":{"type":"string","description":"Not found error description"}}}},"status":{"type":"string","description":"Status code"}}},"Class":{"type":"object","properties":{"id":{"type":"integer","description":"Unique ID in ManageBac."},"name":{"type":"string","description":"Class Name."},"description":{"type":"string","description":"Class description."},"language":{"type":"string","description":"Language of Instruction. Receives a language code."},"uniq_id":{"type":"string","description":"Unique ID in ManageBac."},"class_section":{"type":"string","description":"Identifier for a duplicated class/grade."},"start_term_id":{"type":"integer","description":"Academic term ID."},"end_term_id":{"type":"integer","description":"Academic term ID."},"created_at":{"type":"string","description":"Created date; yyyy-mm-dd."},"updated_at":{"type":"string","description":"Updated date; yyyy-mm-dd."},"grade":{"type":"string","description":"Grade name."},"grade_number":{"type":"integer","description":"Grade number."},"applicable_levels":{"type":"array","description":"Applicable Levels.","items":{"type":"string"}},"program":{"type":"string","description":"Program name."},"program_code":{"type":"string","description":"Program code."},"subject_id":{"type":"integer","description":"Subject’s unique ID."},"subject_name":{"type":"string","description":"Subject Name."},"subject_group":{"type":"string","description":"Subject group."},"subject_option":{"type":"string","description":"Subject option."},"lock_memberships":{"type":"string","description":"Lock Memberships."},"archived":{"type":"boolean","description":"Archive Class."},"subjects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Unique ID in ManageBac."},"name":{"type":"string","description":"Subject Name."},"subject_group_id":{"type":"integer","description":"Unique ID in ManageBac."},"subject_group":{"type":"string","description":"Subject group."}}}},"teachers":{"type":"array","items":{"type":"object","properties":{"teacher_id":{"type":"integer","description":"Uniq ID in ManageBac."},"show_on_reports":{"type":"boolean","description":"Determines if teach should be shown on reports."},"teacher_archived":{"type":"boolean","description":"DDetermines if teacher is archived."}}}}}},"AccessDeniedError":{"type":"object","description":"Returned when the API token is missing, invalid, or has been disabled.","properties":{"error":{"type":"string","description":"Unauthorized to perform an action"}}},"UpsertClasses":{"type":"object","properties":{"classes":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"id":{"type":"integer","description":"Unique ID in ManageBac."},"archived":{"type":"boolean","description":"Archive Class."},"name":{"type":"string","description":"Class Name."},"description":{"type":"string","description":"Class description."},"language":{"type":"string","description":"Language of Instruction. Receives a language code."},"uniq_id":{"type":"string","description":"Unique ID in ManageBac."},"class_section":{"type":"string","description":"Identifier for a duplicated class/grade."},"subject_ids":{"type":"array","description":"Subjects unique IDs.","items":{"type":"integer"}},"sl":{"type":"boolean","description":"SL level"},"hl":{"type":"boolean","description":"HL level"},"subject_option":{"description":"Subject option.","oneOf":[{"type":"string","description":"Allowed for Subject that support language level (e.g. Language and literature)."},{"type":"array","description":"Allowed for Subject that support phases.","items":{"type":"string"}}]},"lock_memberships":{"type":"string","description":"Lock Memberships."}}},{"$ref":"#/components/schemas/CreateClass"}]}}}},"CreateClass":{"type":"object","properties":{"start_term_id":{"type":"integer","description":"Academic term ID."},"end_term_id":{"type":"integer","description":"Academic term ID."},"subject_id":{"type":"integer","description":"Subject’s unique ID."},"program":{"type":"string","description":"Program code."},"grade_number":{"type":"integer","description":"Grade number."},"name":{"type":"string","description":"Class Name."},"description":{"type":"string","description":"Class description."},"language":{"type":"string","description":"Language of Instruction. Receives a language code."},"uniq_id":{"type":"string","description":"Unique ID in ManageBac."},"class_section":{"type":"string","description":"Identifier for a duplicated class/grade."},"subject_ids":{"type":"array","description":"Subjects unique IDs.","items":{"type":"integer"}},"sl":{"type":"boolean","description":"SL level"},"hl":{"type":"boolean","description":"HL level"},"subject_option":{"description":"Subject option.","oneOf":[{"type":"string","description":"Allowed for Subject that support language level (e.g. Language and literature)."},{"type":"array","description":"Allowed for Subject that support phases.","items":{"type":"string"}}]},"lock_memberships":{"type":"string","description":"Lock Memberships."}}}}},"paths":{"/v2p3/classes":{"patch":{"summary":"Upsert many classes","operationId":"upsertClasses","tags":["Extended APIs","Classes"],"description":"Creates and updates multiple classes in a single request. Each entry in the array is\nprocessed independently: entries with an `id` field are treated as updates, entries\nwithout are treated as creates. Returns an indexed array of results with status\n(`ok`, `unprocessable_entity`, or `not_found`) for each entry.\n","parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertClassesResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedError"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertClasses"}}},"required":true}}}}}
```

## Set or Update a Class Attendance for Students

> Creates or updates attendance records for students in a class. Each entry in the payload\
> specifies a student, date, period, and status. If an attendance record already exists for\
> that combination, it is updated; otherwise a new record is created. Returns an indexed\
> array of results with per-entry status (\`ok\`, \`unprocessable\_entity\`, or \`not\_found\`).<br>

```json
{"openapi":"3.0.3","info":{"title":"API V2P3","version":"v2p3"},"tags":[{"name":"Attendance","description":"This group describes all the APIs relating to attendance records"},{"name":"Extended APIs","description":"These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled."}],"servers":[{"url":"https://api.managebac.com","description":"CA ManageBac API server."},{"url":"https://api.managebac.cn","description":"CN ManageBac API server."},{"url":"https://api.us.managebac.com","description":"US1 ManageBac API server."},{"url":"https://api.managebac.us","description":"US2 ManageBac API server."},{"url":"https://api.managebactest.com","description":"UAT ManageBac API server."},{"url":"https://{Host}","variables":{"Host":{"default":"api.devel.managebac.com","enum":["api.devel.managebac.com","api-faria.devel.managebac.com","api.managebac.dev"]}}}],"security":[{"bearerAuth":[]},{"authTokenQuery":[]},{"authTokenHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"OAuth 2.0 Bearer token obtained via client credentials grant. Pass the token in the Authorization header as `Bearer <token>`."},"authTokenQuery":{"type":"apiKey","name":"auth_token","in":"query","description":"Your V2 API authentication token may be passed in the parameters. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."},"authTokenHeader":{"type":"apiKey","name":"auth-token","in":"header","description":"Your V2 API authentication token may be passed in the header. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."}},"schemas":{"AccessDeniedError":{"type":"object","description":"Returned when the API token is missing, invalid, or has been disabled.","properties":{"error":{"type":"string","description":"Unauthorized to perform an action"}}},"NotFound":{"type":"object","description":"Returned when the requested resource cannot be found by the given ID.","properties":{"error":{"type":"string","description":"Record was not found"}}},"BulkUpdateAttendance":{"type":"object","required":["attendances"],"properties":{"attendances":{"type":"array","description":"An array of Attendances data.","items":{"type":"object","properties":{"student_id":{"type":"integer","description":"Student ID."},"date":{"type":"string","format":"date","description":"Date of attendance."},"period":{"type":"integer","description":"Attendance period number."},"status":{"type":"integer","description":"Attendance status ID."},"notes":{"type":"string","description":"Teacher notes."}}}}}}}},"paths":{"/v2p3/classes/{id}/attendance":{"put":{"summary":"Set or Update a Class Attendance for Students","operationId":"setClassAttendanceForStudents","tags":["Extended APIs","Attendance"],"description":"Creates or updates attendance records for students in a class. Each entry in the payload\nspecifies a student, date, period, and status. If an attendance record already exists for\nthat combination, it is updated; otherwise a new record is created. Returns an indexed\narray of results with per-entry status (`ok`, `unprocessable_entity`, or `not_found`).\n","parameters":[{"name":"id","in":"path","description":"Unique identifier for class.","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedError"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFound"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateAttendance"}}},"required":true,"description":"An array of Attendances data"}}}}}
```

## Bulk Enable Subjects

> This endpoint enable school Subjects.

```json
{"openapi":"3.0.3","info":{"title":"API V2P3","version":"v2p3"},"tags":[{"name":"Academics","description":"This group refers to top-level entities such as School, Programs, Subjects, and Academic Years. Programs are curriculum frameworks that ManageBac supports, and a Subject is a collection of delivered curricula. Academic Years define when the school is in session."},{"name":"Extended APIs","description":"These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled."}],"servers":[{"url":"https://api.managebac.com","description":"CA ManageBac API server."},{"url":"https://api.managebac.cn","description":"CN ManageBac API server."},{"url":"https://api.us.managebac.com","description":"US1 ManageBac API server."},{"url":"https://api.managebac.us","description":"US2 ManageBac API server."},{"url":"https://api.managebactest.com","description":"UAT ManageBac API server."},{"url":"https://{Host}","variables":{"Host":{"default":"api.devel.managebac.com","enum":["api.devel.managebac.com","api-faria.devel.managebac.com","api.managebac.dev"]}}}],"security":[{"bearerAuth":[]},{"authTokenQuery":[]},{"authTokenHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"OAuth 2.0 Bearer token obtained via client credentials grant. Pass the token in the Authorization header as `Bearer <token>`."},"authTokenQuery":{"type":"apiKey","name":"auth_token","in":"query","description":"Your V2 API authentication token may be passed in the parameters. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."},"authTokenHeader":{"type":"apiKey","name":"auth-token","in":"header","description":"Your V2 API authentication token may be passed in the header. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."}},"schemas":{"ToggleSchoolSubjectsRequest":{"properties":{"subject_ids":{"type":"array","items":{"type":"integer"}}}}}},"paths":{"/v2p3/school/programs/{program_code}/subjects/bulk-enable":{"post":{"summary":"Bulk Enable Subjects","operationId":"bulkEnableSubjects","tags":["Extended APIs","Academics"],"description":"This endpoint enable school Subjects.","parameters":[{"name":"program_code","in":"path","description":"Program scope","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleSchoolSubjectsRequest"}}}},"422":{"description":"Unprocessable Entity","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"object","properties":{"subject_ids":{"type":"array","items":{"type":"string"}}}}}}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleSchoolSubjectsRequest"}}}}}}}}
```

## Bulk Disable Subjects

> This endpoint disable school Subjects.

```json
{"openapi":"3.0.3","info":{"title":"API V2P3","version":"v2p3"},"tags":[{"name":"Academics","description":"This group refers to top-level entities such as School, Programs, Subjects, and Academic Years. Programs are curriculum frameworks that ManageBac supports, and a Subject is a collection of delivered curricula. Academic Years define when the school is in session."},{"name":"Extended APIs","description":"These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled."}],"servers":[{"url":"https://api.managebac.com","description":"CA ManageBac API server."},{"url":"https://api.managebac.cn","description":"CN ManageBac API server."},{"url":"https://api.us.managebac.com","description":"US1 ManageBac API server."},{"url":"https://api.managebac.us","description":"US2 ManageBac API server."},{"url":"https://api.managebactest.com","description":"UAT ManageBac API server."},{"url":"https://{Host}","variables":{"Host":{"default":"api.devel.managebac.com","enum":["api.devel.managebac.com","api-faria.devel.managebac.com","api.managebac.dev"]}}}],"security":[{"bearerAuth":[]},{"authTokenQuery":[]},{"authTokenHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"OAuth 2.0 Bearer token obtained via client credentials grant. Pass the token in the Authorization header as `Bearer <token>`."},"authTokenQuery":{"type":"apiKey","name":"auth_token","in":"query","description":"Your V2 API authentication token may be passed in the parameters. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."},"authTokenHeader":{"type":"apiKey","name":"auth-token","in":"header","description":"Your V2 API authentication token may be passed in the header. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."}},"schemas":{"ToggleSchoolSubjectsRequest":{"properties":{"subject_ids":{"type":"array","items":{"type":"integer"}}}}}},"paths":{"/v2p3/school/programs/{program_code}/subjects/bulk-disable":{"post":{"summary":"Bulk Disable Subjects","operationId":"bulkDisableSubjects","tags":["Extended APIs","Academics"],"description":"This endpoint disable school Subjects.","parameters":[{"name":"program_code","in":"path","description":"Program scope","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleSchoolSubjectsRequest"}}}},"422":{"description":"Unprocessable Entity","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"object","properties":{"subject_ids":{"type":"array","items":{"type":"string"}}}}}}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleSchoolSubjectsRequest"}}}}}}}}
```

## Delete Excusal for a Student

> Permanently deletes an attendance excusal for a student. Returns the deleted excusal record\
> in the response body. The excusal will no longer appear in any subsequent queries.<br>

```json
{"openapi":"3.0.3","info":{"title":"API V2P3","version":"v2p3"},"tags":[{"name":"Attendance","description":"This group describes all the APIs relating to attendance records"},{"name":"Extended APIs","description":"These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled."}],"servers":[{"url":"https://api.managebac.com","description":"CA ManageBac API server."},{"url":"https://api.managebac.cn","description":"CN ManageBac API server."},{"url":"https://api.us.managebac.com","description":"US1 ManageBac API server."},{"url":"https://api.managebac.us","description":"US2 ManageBac API server."},{"url":"https://api.managebactest.com","description":"UAT ManageBac API server."},{"url":"https://{Host}","variables":{"Host":{"default":"api.devel.managebac.com","enum":["api.devel.managebac.com","api-faria.devel.managebac.com","api.managebac.dev"]}}}],"security":[{"bearerAuth":[]},{"authTokenQuery":[]},{"authTokenHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"OAuth 2.0 Bearer token obtained via client credentials grant. Pass the token in the Authorization header as `Bearer <token>`."},"authTokenQuery":{"type":"apiKey","name":"auth_token","in":"query","description":"Your V2 API authentication token may be passed in the parameters. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."},"authTokenHeader":{"type":"apiKey","name":"auth-token","in":"header","description":"Your V2 API authentication token may be passed in the header. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."}},"schemas":{"AttendanceExcusalsResponse":{"type":"object","properties":{"excusals":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Unique ID for the excusal."},"student_id":{"type":"integer","description":"Unique ID for the student."},"parent_id":{"type":"integer","description":"Unique ID for the parent."},"start_date":{"type":"string","format":"date","description":"Start date of the excusal."},"end_date":{"type":"string","format":"date","description":"End date of the excusal."},"duration":{"type":"integer","description":"Duration of the excusal in days."},"comment":{"type":"string","description":"Comment or reason for the excusal."},"created_at":{"type":"string","description":"Created datetime."},"updated_at":{"type":"string","description":"Updated datetime."}}}}}},"AccessDeniedError":{"type":"object","description":"Returned when the API token is missing, invalid, or has been disabled.","properties":{"error":{"type":"string","description":"Unauthorized to perform an action"}}},"NotFound":{"type":"object","description":"Returned when the requested resource cannot be found by the given ID.","properties":{"error":{"type":"string","description":"Record was not found"}}}}},"paths":{"/v2p3/students/{student_id}/excusals/{id}":{"delete":{"summary":"Delete Excusal for a Student","operationId":"deleteStudentExcusal","tags":["Extended APIs","Attendance"],"description":"Permanently deletes an attendance excusal for a student. Returns the deleted excusal record\nin the response body. The excusal will no longer appear in any subsequent queries.\n","parameters":[{"name":"student_id","in":"path","description":"Unique identifier for a student.","schema":{"type":"integer"},"required":true},{"name":"id","in":"path","description":"Unique identifier for an excusal.","schema":{"type":"integer"},"required":true}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttendanceExcusalsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedError"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFound"}}}}}}}}}
```

## Update Excusal for a Student

> Updates an existing attendance excusal for a student. The end date and comment can be modified.\
> The updated date range must not overlap with any other existing excusal for the same student,\
> and the resulting duration must remain between 1 and 12 days.<br>

```json
{"openapi":"3.0.3","info":{"title":"API V2P3","version":"v2p3"},"tags":[{"name":"Attendance","description":"This group describes all the APIs relating to attendance records"},{"name":"Extended APIs","description":"These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled."}],"servers":[{"url":"https://api.managebac.com","description":"CA ManageBac API server."},{"url":"https://api.managebac.cn","description":"CN ManageBac API server."},{"url":"https://api.us.managebac.com","description":"US1 ManageBac API server."},{"url":"https://api.managebac.us","description":"US2 ManageBac API server."},{"url":"https://api.managebactest.com","description":"UAT ManageBac API server."},{"url":"https://{Host}","variables":{"Host":{"default":"api.devel.managebac.com","enum":["api.devel.managebac.com","api-faria.devel.managebac.com","api.managebac.dev"]}}}],"security":[{"bearerAuth":[]},{"authTokenQuery":[]},{"authTokenHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"OAuth 2.0 Bearer token obtained via client credentials grant. Pass the token in the Authorization header as `Bearer <token>`."},"authTokenQuery":{"type":"apiKey","name":"auth_token","in":"query","description":"Your V2 API authentication token may be passed in the parameters. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."},"authTokenHeader":{"type":"apiKey","name":"auth-token","in":"header","description":"Your V2 API authentication token may be passed in the header. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."}},"schemas":{"AttendanceExcusalsResponse":{"type":"object","properties":{"excusals":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Unique ID for the excusal."},"student_id":{"type":"integer","description":"Unique ID for the student."},"parent_id":{"type":"integer","description":"Unique ID for the parent."},"start_date":{"type":"string","format":"date","description":"Start date of the excusal."},"end_date":{"type":"string","format":"date","description":"End date of the excusal."},"duration":{"type":"integer","description":"Duration of the excusal in days."},"comment":{"type":"string","description":"Comment or reason for the excusal."},"created_at":{"type":"string","description":"Created datetime."},"updated_at":{"type":"string","description":"Updated datetime."}}}}}},"AccessDeniedError":{"type":"object","description":"Returned when the API token is missing, invalid, or has been disabled.","properties":{"error":{"type":"string","description":"Unauthorized to perform an action"}}},"NotFound":{"type":"object","description":"Returned when the requested resource cannot be found by the given ID.","properties":{"error":{"type":"string","description":"Record was not found"}}},"UpdateAttendanceExcusalRequest":{"type":"object","properties":{"excusal":{"type":"object","properties":{"end_date":{"type":"string","format":"date","description":"End date of the excusal."},"comment":{"type":"string","description":"Comment or reason for the excusal."}}}}}}},"paths":{"/v2p3/students/{student_id}/excusals/{id}":{"patch":{"summary":"Update Excusal for a Student","operationId":"updateStudentExcusal","tags":["Extended APIs","Attendance"],"description":"Updates an existing attendance excusal for a student. The end date and comment can be modified.\nThe updated date range must not overlap with any other existing excusal for the same student,\nand the resulting duration must remain between 1 and 12 days.\n","parameters":[{"name":"student_id","in":"path","description":"Unique identifier for a student.","schema":{"type":"integer"},"required":true},{"name":"id","in":"path","description":"Unique identifier for an excusal.","schema":{"type":"integer"},"required":true}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttendanceExcusalsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedError"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFound"}}}},"422":{"description":"Unprocessable entity","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"object","properties":{"duration":{"type":"array","items":{"type":"string"}}}}}}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAttendanceExcusalRequest"}}}}}}}}
```

## Set student homeroom attendance

> Sets a student's homeroom attendance record for a given date. If no attendance record exists for\
> the specified date, a new one is created. If one already exists, it is updated with the new status\
> and notes. The \<code>date\</code> and \<code>status\</code> fields are required. The \<code>notes\</code>\
> field is optional.<br>

```json
{"openapi":"3.0.3","info":{"title":"API V2P3","version":"v2p3"},"tags":[{"name":"Attendance","description":"This group describes all the APIs relating to attendance records"},{"name":"Extended APIs","description":"These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled."}],"servers":[{"url":"https://api.managebac.com","description":"CA ManageBac API server."},{"url":"https://api.managebac.cn","description":"CN ManageBac API server."},{"url":"https://api.us.managebac.com","description":"US1 ManageBac API server."},{"url":"https://api.managebac.us","description":"US2 ManageBac API server."},{"url":"https://api.managebactest.com","description":"UAT ManageBac API server."},{"url":"https://{Host}","variables":{"Host":{"default":"api.devel.managebac.com","enum":["api.devel.managebac.com","api-faria.devel.managebac.com","api.managebac.dev"]}}}],"security":[{"bearerAuth":[]},{"authTokenQuery":[]},{"authTokenHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"OAuth 2.0 Bearer token obtained via client credentials grant. Pass the token in the Authorization header as `Bearer <token>`."},"authTokenQuery":{"type":"apiKey","name":"auth_token","in":"query","description":"Your V2 API authentication token may be passed in the parameters. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."},"authTokenHeader":{"type":"apiKey","name":"auth-token","in":"header","description":"Your V2 API authentication token may be passed in the header. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."}},"schemas":{"AccessDeniedError":{"type":"object","description":"Returned when the API token is missing, invalid, or has been disabled.","properties":{"error":{"type":"string","description":"Unauthorized to perform an action"}}},"NotFound":{"type":"object","description":"Returned when the requested resource cannot be found by the given ID.","properties":{"error":{"type":"string","description":"Record was not found"}}}}},"paths":{"/v2p3/students/{id}/set_homeroom_attendance":{"put":{"summary":"Set student homeroom attendance","operationId":"set_student_homeroom_attendance","tags":["Extended APIs","Attendance"],"description":"Sets a student's homeroom attendance record for a given date. If no attendance record exists for\nthe specified date, a new one is created. If one already exists, it is updated with the new status\nand notes. The <code>date</code> and <code>status</code> fields are required. The <code>notes</code>\nfield is optional.\n","parameters":[{"name":"id","in":"path","description":"Unique identifier for a student.","schema":{"type":"integer"},"required":true}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedError"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFound"}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string","format":"date","description":"Attendance date in yyyy-mm-dd format"},"status":{"type":"integer","enum":[0,1,2,3,4,5,10,11,12,13,14,15,16,17,18],"description":"Available statuses:  \n 0 - Absent  \n1 - Present  \n2 - Late  \n3 - Dress Code  \n4 - Late & Dress Code  \n5 - Dismissed  \n10 - Health  \n11 - Sports  \n12 - Fieldtrip  \n13 - Excused  \n14 - Other  \n15 - Custom 1  \n16 - Custom 2  \n17 - Custom 3  \n18 - Custom 4"},"notes":{"type":"string","description":"Optional free-text notes for the attendance record"}}}}}}}}}}
```

## Update or Create a Grade for a Student for a Task

> Creates or updates a grade for a specific student on a given task.\
> If a grade already exists, it will be updated; otherwise, a new grade will be created.\
> \
> The \<code>Content-Type\</code> header must be set to \<code>application/json\</code>,\
> and the request body should contain the fields you want to update as a JSON payload.\
> \
> For MYP, only integers are allowed (e.g., '1', 1). For non-MYP programs, floats are allowed (e.g., '1.22', 1.22),\
> and if more than two decimal places are provided, the value will be automatically rounded (e.g., 1.448 -> 1.45).<br>

```json
{"openapi":"3.0.3","info":{"title":"API V2P3","version":"v2p3"},"tags":[{"name":"Coursework","description":"This group refers to entities tied to student learning delivery or feedback, such as Tasks and Grades."},{"name":"Extended APIs","description":"These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled."}],"servers":[{"url":"https://api.managebac.com","description":"CA ManageBac API server."},{"url":"https://api.managebac.cn","description":"CN ManageBac API server."},{"url":"https://api.us.managebac.com","description":"US1 ManageBac API server."},{"url":"https://api.managebac.us","description":"US2 ManageBac API server."},{"url":"https://api.managebactest.com","description":"UAT ManageBac API server."},{"url":"https://{Host}","variables":{"Host":{"default":"api.devel.managebac.com","enum":["api.devel.managebac.com","api-faria.devel.managebac.com","api.managebac.dev"]}}}],"security":[{"bearerAuth":[]},{"authTokenQuery":[]},{"authTokenHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"OAuth 2.0 Bearer token obtained via client credentials grant. Pass the token in the Authorization header as `Bearer <token>`."},"authTokenQuery":{"type":"apiKey","name":"auth_token","in":"query","description":"Your V2 API authentication token may be passed in the parameters. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."},"authTokenHeader":{"type":"apiKey","name":"auth-token","in":"header","description":"Your V2 API authentication token may be passed in the header. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."}},"schemas":{"UpdateStudentTaskGrade":{"type":"object","properties":{"author_id":{"type":"integer","description":"Unique identifier for an author in ManageBac"},"points":{"type":"integer","description":"Grade points"},"comment":{"type":"string","description":"Grade comment"},"binary":{"type":"boolean","description":"Determines if task is completed or not"},"criterion_grades":{"type":"array","description":"Optional per-criterion achievement levels for MYP criteria-based tasks (summative, or formative with criteria). Providing it for a non-criteria task returns a 422. A score of -1 marks the criterion as N/A. On the response each entry also includes the criterion name under `criterion`.","items":{"type":"object","properties":{"label":{"type":"string","description":"Criterion letter, e.g. \"A\""},"criterion":{"type":"string","description":"Criterion name (response only), e.g. \"Analysing\""},"score":{"type":"integer","description":"Achievement level for the criterion (-1 marks it N/A)"}}}}}},"StudentAssessPrepTaskGrade":{"type":"object","properties":{"assess_prep_uuid":{"type":"string","description":"Unique AssessPrep task UUID"},"assess_prep_uid":{"type":"string","description":"Unique identifier for an AssessPrep task"},"assessment_file_url":{"type":"string","description":"Submission PDF file"},"submission_id":{"type":"integer","description":"Unique identifier for an AssessPrep Submission"},"author_id":{"type":"integer","description":"Unique identifier for an author in ManageBac"}}},"AccessDeniedError":{"type":"object","description":"Returned when the API token is missing, invalid, or has been disabled.","properties":{"error":{"type":"string","description":"Unauthorized to perform an action"}}},"NotFound":{"type":"object","description":"Returned when the requested resource cannot be found by the given ID.","properties":{"error":{"type":"string","description":"Record was not found"}}},"UpdateStudentAssessPrepTaskGrade":{"type":"object","properties":{"assess_prep_uuid":{"type":"string","description":"Unique AssessPrep task UUID"},"assess_prep_uid":{"type":"string","description":"Unique identifier for an AssessPrep task"},"author_id":{"type":"integer","description":"Unique identifier for an author in ManageBac"},"assessment_file_url":{"type":"string","description":"Submission PDF file"},"points":{"type":"integer","description":"Grade points"},"comment":{"type":"string","description":"Grade comment"},"submission_id":{"type":"integer","description":"Unique identifier for an AssessPrep Submission"},"is_late":{"type":"boolean","description":"Determines if submission is late"}}}}},"paths":{"/v2p3/tasks/{task_id}/students/{student_id}":{"patch":{"summary":"Update or Create a Grade for a Student for a Task","operationId":"UpdateStudentTaskGrades","tags":["Extended APIs","Coursework"],"description":"Creates or updates a grade for a specific student on a given task.\nIf a grade already exists, it will be updated; otherwise, a new grade will be created.\n\nThe <code>Content-Type</code> header must be set to <code>application/json</code>,\nand the request body should contain the fields you want to update as a JSON payload.\n\nFor MYP, only integers are allowed (e.g., '1', 1). For non-MYP programs, floats are allowed (e.g., '1.22', 1.22),\nand if more than two decimal places are provided, the value will be automatically rounded (e.g., 1.448 -> 1.45).\n","parameters":[{"name":"task_id","in":"path","description":"Unique identifier for a task.","schema":{"type":"integer"},"required":true},{"name":"student_id","in":"path","description":"Unique identifier for a student.","schema":{"type":"integer"},"required":true}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/UpdateStudentTaskGrade"},{"$ref":"#/components/schemas/StudentAssessPrepTaskGrade"}]}}}},"401":{"description":"Not Authorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Request forbidden"}}}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFound"}}}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"task_grade":{"oneOf":[{"$ref":"#/components/schemas/UpdateStudentTaskGrade"},{"$ref":"#/components/schemas/UpdateStudentAssessPrepTaskGrade"}]}}}}}}}}}}
```

## Bulk Update or Create Grades for Students for a Task

> Creates or updates grades for many students on a given task.\
> If a grade already exists, it will be updated; otherwise, a new grade will be created.\
> \
> The \<code>Content-Type\</code> header must be set to \<code>application/json\</code>,\
> and the request body should contain the fields you want to update as a JSON payload.\
> \
> For MYP, only integers are allowed (e.g., '1', 1). For non-MYP programs, floats are allowed (e.g., '1.22', 1.22),\
> and if more than two decimal places are provided, the value will be automatically rounded (e.g., 1.448 -> 1.45).<br>

```json
{"openapi":"3.0.3","info":{"title":"API V2P3","version":"v2p3"},"tags":[{"name":"Coursework","description":"This group refers to entities tied to student learning delivery or feedback, such as Tasks and Grades."},{"name":"Extended APIs","description":"These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled."}],"servers":[{"url":"https://api.managebac.com","description":"CA ManageBac API server."},{"url":"https://api.managebac.cn","description":"CN ManageBac API server."},{"url":"https://api.us.managebac.com","description":"US1 ManageBac API server."},{"url":"https://api.managebac.us","description":"US2 ManageBac API server."},{"url":"https://api.managebactest.com","description":"UAT ManageBac API server."},{"url":"https://{Host}","variables":{"Host":{"default":"api.devel.managebac.com","enum":["api.devel.managebac.com","api-faria.devel.managebac.com","api.managebac.dev"]}}}],"security":[{"bearerAuth":[]},{"authTokenQuery":[]},{"authTokenHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"OAuth 2.0 Bearer token obtained via client credentials grant. Pass the token in the Authorization header as `Bearer <token>`."},"authTokenQuery":{"type":"apiKey","name":"auth_token","in":"query","description":"Your V2 API authentication token may be passed in the parameters. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."},"authTokenHeader":{"type":"apiKey","name":"auth-token","in":"header","description":"Your V2 API authentication token may be passed in the header. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."}},"schemas":{"BulkStudentTaskGradeResponse":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Unique identifier for a student in ManageBac"},"status":{"type":"string","description":"Response status for a student"},"error":{"type":"object","description":"Error details if any"}}}},"AccessDeniedError":{"type":"object","description":"Returned when the API token is missing, invalid, or has been disabled.","properties":{"error":{"type":"string","description":"Unauthorized to perform an action"}}},"NotFound":{"type":"object","description":"Returned when the requested resource cannot be found by the given ID.","properties":{"error":{"type":"string","description":"Record was not found"}}},"BulkUpdateStudentTaskGradeRequest":{"type":"object","properties":{"students":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer","description":"Unique identifier for a student in ManageBac"},"task_grade":{"oneOf":[{"$ref":"#/components/schemas/UpdateStudentTaskGrade"},{"$ref":"#/components/schemas/UpdateStudentAssessPrepTaskGrade"}]}}}}}},"UpdateStudentTaskGrade":{"type":"object","properties":{"author_id":{"type":"integer","description":"Unique identifier for an author in ManageBac"},"points":{"type":"integer","description":"Grade points"},"comment":{"type":"string","description":"Grade comment"},"binary":{"type":"boolean","description":"Determines if task is completed or not"},"criterion_grades":{"type":"array","description":"Optional per-criterion achievement levels for MYP criteria-based tasks (summative, or formative with criteria). Providing it for a non-criteria task returns a 422. A score of -1 marks the criterion as N/A. On the response each entry also includes the criterion name under `criterion`.","items":{"type":"object","properties":{"label":{"type":"string","description":"Criterion letter, e.g. \"A\""},"criterion":{"type":"string","description":"Criterion name (response only), e.g. \"Analysing\""},"score":{"type":"integer","description":"Achievement level for the criterion (-1 marks it N/A)"}}}}}},"UpdateStudentAssessPrepTaskGrade":{"type":"object","properties":{"assess_prep_uuid":{"type":"string","description":"Unique AssessPrep task UUID"},"assess_prep_uid":{"type":"string","description":"Unique identifier for an AssessPrep task"},"author_id":{"type":"integer","description":"Unique identifier for an author in ManageBac"},"assessment_file_url":{"type":"string","description":"Submission PDF file"},"points":{"type":"integer","description":"Grade points"},"comment":{"type":"string","description":"Grade comment"},"submission_id":{"type":"integer","description":"Unique identifier for an AssessPrep Submission"},"is_late":{"type":"boolean","description":"Determines if submission is late"}}}}},"paths":{"/v2p3/tasks/{task_id}/students":{"patch":{"summary":"Bulk Update or Create Grades for Students for a Task","operationId":"BulkUpdateStudentTaskGrades","tags":["Extended APIs","Coursework"],"description":"Creates or updates grades for many students on a given task.\nIf a grade already exists, it will be updated; otherwise, a new grade will be created.\n\nThe <code>Content-Type</code> header must be set to <code>application/json</code>,\nand the request body should contain the fields you want to update as a JSON payload.\n\nFor MYP, only integers are allowed (e.g., '1', 1). For non-MYP programs, floats are allowed (e.g., '1.22', 1.22),\nand if more than two decimal places are provided, the value will be automatically rounded (e.g., 1.448 -> 1.45).\n","parameters":[{"name":"task_id","in":"path","description":"Unique identifier for a task.","schema":{"type":"integer"},"required":true}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkStudentTaskGradeResponse"}}}},"401":{"description":"Not Authorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessDeniedError"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Request forbidden"}}}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFound"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateStudentTaskGradeRequest"}}}}}}}}
```

## Set Teacher memberships for a Class

> Completely replaces the teacher memberships for a class with the provided list. Any existing\
> teachers not included in the payload are removed. Sending an empty array removes all teachers.\
> Each entry can optionally set show\_on\_reports to control whether the teacher appears on printed\
> reports. The response includes per-entry status (ok, not\_found, or unprocessable\_entity with errors).<br>

```json
{"openapi":"3.0.3","info":{"title":"API V2P3","version":"v2p3"},"tags":[{"name":"Classes","description":"Classes are scheduled sessions in which teachers deliver a given curriculum to a group of students."},{"name":"Extended APIs","description":"These endpoints are part of the Extended APIs package, which provides advanced capabilities. Access requires the Extended APIs package to be enabled."}],"servers":[{"url":"https://api.managebac.com","description":"CA ManageBac API server."},{"url":"https://api.managebac.cn","description":"CN ManageBac API server."},{"url":"https://api.us.managebac.com","description":"US1 ManageBac API server."},{"url":"https://api.managebac.us","description":"US2 ManageBac API server."},{"url":"https://api.managebactest.com","description":"UAT ManageBac API server."},{"url":"https://{Host}","variables":{"Host":{"default":"api.devel.managebac.com","enum":["api.devel.managebac.com","api-faria.devel.managebac.com","api.managebac.dev"]}}}],"security":[{"bearerAuth":[]},{"authTokenQuery":[]},{"authTokenHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"OAuth 2.0 Bearer token obtained via client credentials grant. Pass the token in the Authorization header as `Bearer <token>`."},"authTokenQuery":{"type":"apiKey","name":"auth_token","in":"query","description":"Your V2 API authentication token may be passed in the parameters. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."},"authTokenHeader":{"type":"apiKey","name":"auth-token","in":"header","description":"Your V2 API authentication token may be passed in the header. To protect your key, use [environment variables](https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key)."}},"schemas":{"BulkUpdateTeachers":{"type":"object","required":["teachers"],"properties":{"teachers":{"type":"array","description":"An array of teacher IDs to add or update in the class.","items":{"type":"object","properties":{"id":{"type":"integer","description":"Teacher ID"},"show_on_reports":{"type":"boolean","description":"Show Teacher on Reports"}}}}}}}},"paths":{"/v2p3/classes/{class_id}/teachers":{"put":{"summary":"Set Teacher memberships for a Class","operationId":"bulkUpdateTeacherMemberships","tags":["Extended APIs","Classes"],"description":"Completely replaces the teacher memberships for a class with the provided list. Any existing\nteachers not included in the payload are removed. Sending an empty array removes all teachers.\nEach entry can optionally set show_on_reports to control whether the teacher appears on printed\nreports. The response includes per-entry status (ok, not_found, or unprocessable_entity with errors).\n","parameters":[{"name":"class_id","in":"path","description":"The unique numeric identifier of the class.","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"400":{"description":"Bad Request","content":{"application/json":{}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateTeachers"}}}}}}}}
```
