PowerSchool SIS REST API

The PowerSchool SIS REST API provides programmatic access to student information system data including student demographics, enrollment records, grades, attendance, master scheduling, and district reporting. The API uses OAuth 2.0 client credentials for authentication and returns data in JSON format. Endpoints follow the /ws/v1/ path convention and support GET, POST, PUT, and DELETE HTTP methods for full CRUD operations on supported resources.

OpenAPI Specification

powerschool-powerschool-sis-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: PowerSchool SIS REST API
  description: >-
    The PowerSchool SIS REST API provides programmatic access to student
    information system data including student demographics, enrollment records,
    grades, attendance, master scheduling, and district reporting. The API uses
    OAuth 2.0 client credentials for authentication and returns data in JSON
    format. Endpoints follow the /ws/v1/ path convention and support GET, POST,
    PUT, and DELETE HTTP methods for full CRUD operations on supported
    resources. Authentication tokens are obtained via /oauth/access_token/ using
    Basic auth with client credentials provisioned through the PowerSchool
    Plugin Management Dashboard.
  version: 1.0.0
  contact:
    name: PowerSchool Developer Support
    url: https://help.powerschool.com/
  termsOfService: https://www.powerschool.com/legal/
servers:
  - url: https://{district}.powerschool.com
    description: District PowerSchool instance
    variables:
      district:
        description: The subdomain of the school district's PowerSchool installation
        default: demo
security:
  - BearerAuth: []
tags:
  - name: Authentication
    description: OAuth 2.0 token operations
  - name: District
    description: District-level resources
  - name: Schools
    description: School information and management
  - name: Students
    description: Student demographics, enrollment, and records
  - name: Sections
    description: Course sections and scheduling
  - name: Courses
    description: Course catalog information
  - name: Attendance
    description: Attendance records
  - name: Grades
    description: Grade and assignment data
  - name: Metadata
    description: System metadata and configuration
  - name: PowerQuery
    description: Named PowerQuery endpoints for complex data retrieval
paths:
  /oauth/access_token/:
    post:
      operationId: getAccessToken
      summary: Obtain OAuth 2.0 access token
      description: >-
        Exchange client credentials for a Bearer access token using the OAuth
        2.0 client credentials grant type. The client_id and client_secret are
        provisioned through the PowerSchool Plugin Management Dashboard.
        Credentials must be Base64-encoded in the Authorization header as
        Basic {base64(client_id:client_secret)}.
      tags:
        - Authentication
      security:
        - BasicAuth: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              required:
                - grant_type
              properties:
                grant_type:
                  type: string
                  enum:
                    - client_credentials
                  description: Must be "client_credentials"
      responses:
        '200':
          description: Access token issued successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Token'
        '401':
          description: Invalid client credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/v1/metadata:
    get:
      operationId: getMetadata
      summary: Get system metadata
      description: >-
        Returns system-level metadata including version information, page size
        limits, plugin ID, and server uptime details.
      tags:
        - Metadata
      responses:
        '200':
          description: System metadata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Metadata'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/v1/district/school:
    get:
      operationId: getSchools
      summary: List all schools in district
      description: >-
        Returns all schools in the current district, sorted by name. Supports
        pagination via pagesize and page query parameters.
      tags:
        - Schools
        - District
      parameters:
        - $ref: '#/components/parameters/PageSize'
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/Query'
        - $ref: '#/components/parameters/Projection'
      responses:
        '200':
          description: List of schools
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SchoolsResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/v1/district/school/count:
    get:
      operationId: getSchoolsCount
      summary: Count schools in district
      description: Returns the total count of schools in the current district.
      tags:
        - Schools
        - District
      responses:
        '200':
          description: Count of schools
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceCount'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/v1/district/student:
    get:
      operationId: getStudentsInDistrict
      summary: List all students in district
      description: >-
        Returns all students enrolled in the current district. Supports
        pagination via pagesize and page query parameters, and filtering via
        the q parameter (e.g., q=id=ge=10000).
      tags:
        - Students
        - District
      parameters:
        - $ref: '#/components/parameters/PageSize'
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/Query'
        - $ref: '#/components/parameters/Projection'
      responses:
        '200':
          description: List of students
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StudentsResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/v1/district/student/count:
    get:
      operationId: getStudentsInDistrictCount
      summary: Count students in district
      description: Returns the total count of students enrolled in the current district.
      tags:
        - Students
        - District
      responses:
        '200':
          description: Count of students
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceCount'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/v1/district/student/{studentDcid}:
    get:
      operationId: getStudent
      summary: Get a specific student
      description: Returns a single student record by their DCID (district-level unique identifier).
      tags:
        - Students
      parameters:
        - name: studentDcid
          in: path
          required: true
          schema:
            type: integer
          description: The student's DCID (not student ID or student number)
        - $ref: '#/components/parameters/Projection'
      responses:
        '200':
          description: Student record
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StudentResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Student not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/v1/school/{schoolDcid}:
    get:
      operationId: getSchool
      summary: Get a specific school
      description: Returns a single school record by its DCID.
      tags:
        - Schools
      parameters:
        - name: schoolDcid
          in: path
          required: true
          schema:
            type: integer
          description: The school's DCID (not school number)
      responses:
        '200':
          description: School record
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SchoolResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: School not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/v1/school/{schoolDcid}/course:
    get:
      operationId: getCoursesForSchool
      summary: List courses for a school
      description: >-
        Returns all courses available at the given school for the current
        school year. The schoolDcid is the school's DCID, not its ID or
        school number.
      tags:
        - Courses
      parameters:
        - name: schoolDcid
          in: path
          required: true
          schema:
            type: integer
          description: The school's DCID (not school number or ID)
        - $ref: '#/components/parameters/PageSize'
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/Query'
      responses:
        '200':
          description: List of courses
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CoursesResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/v1/school/{schoolDcid}/course/count:
    get:
      operationId: getCoursesCountForSchool
      summary: Count courses for a school
      description: Returns the count of courses for the given school.
      tags:
        - Courses
      parameters:
        - name: schoolDcid
          in: path
          required: true
          schema:
            type: integer
          description: The school's DCID
      responses:
        '200':
          description: Count of courses
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceCount'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/v1/school/{schoolDcid}/section:
    get:
      operationId: getSectionsForSchool
      summary: List sections for a school
      description: >-
        Returns all course sections at the given school for the current
        school year. The schoolDcid is the school's DCID, not its ID or
        school number.
      tags:
        - Sections
      parameters:
        - name: schoolDcid
          in: path
          required: true
          schema:
            type: integer
          description: The school's DCID (not school number or ID)
        - $ref: '#/components/parameters/PageSize'
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/Query'
      responses:
        '200':
          description: List of sections
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SectionsResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/v1/school/{schoolDcid}/section/count:
    get:
      operationId: getSectionsCountForSchool
      summary: Count sections for a school
      description: Returns the count of sections for the given school.
      tags:
        - Sections
      parameters:
        - name: schoolDcid
          in: path
          required: true
          schema:
            type: integer
          description: The school's DCID
      responses:
        '200':
          description: Count of sections
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceCount'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/schema/query/{queryName}:
    post:
      operationId: executePowerQuery
      summary: Execute a named PowerQuery
      description: >-
        Executes a named PowerQuery to retrieve complex data sets. PowerQueries
        are predefined server-side queries identified by a dotted namespace
        string (e.g., com.pearson.core.teachers.sectionEnrollments). The
        request body provides filter parameters specific to each query.
      tags:
        - PowerQuery
      parameters:
        - name: queryName
          in: path
          required: true
          schema:
            type: string
          description: >-
            The fully-qualified PowerQuery name
            (e.g., com.pearson.core.teachers.sectionEnrollments)
          example: com.pearson.core.teachers.sectionEnrollments
        - $ref: '#/components/parameters/PageSize'
        - $ref: '#/components/parameters/Page'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              description: >-
                Query-specific parameters. For example, sectionEnrollments
                accepts section_dcid as an array of section DCIDs.
              additionalProperties: true
              example:
                section_dcid:
                  - "12345"
                  - "67890"
      responses:
        '200':
          description: PowerQuery results
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PowerQueryResponse'
        '400':
          description: Invalid query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: PowerQuery not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/schema/table/{tableName}:
    get:
      operationId: getSchemaTable
      summary: Query a schema table
      description: >-
        Returns records from a named schema table. Supports filtering via q
        parameter and pagination. Common tables include students, schools,
        sections, cc (current courses), attendance, and more.
      tags:
        - District
      parameters:
        - name: tableName
          in: path
          required: true
          schema:
            type: string
          description: The name of the schema table (e.g., schools, students, sections)
          example: schools
        - $ref: '#/components/parameters/PageSize'
        - $ref: '#/components/parameters/Page'
        - $ref: '#/components/parameters/Query'
        - $ref: '#/components/parameters/Projection'
      responses:
        '200':
          description: Table records
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SchemaTableResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Table not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /ws/schema/table/{tableName}/count:
    get:
      operationId: getSchemaTableCount
      summary: Count records in a schema table
      description: Returns the count of records in a named schema table.
      tags:
        - District
      parameters:
        - name: tableName
          in: path
          required: true
          schema:
            type: string
          description: The name of the schema table
      responses:
        '200':
          description: Record count
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceCount'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Bearer token obtained from /oauth/access_token/ using client
        credentials. Tokens expire and must be refreshed.
    BasicAuth:
      type: http
      scheme: basic
      description: >-
        Basic auth with Base64-encoded client_id:client_secret for the
        token endpoint only.
  parameters:
    PageSize:
      name: pagesize
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 1000
        default: 100
      description: Number of records to return per page.
    Page:
      name: page
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        default: 1
      description: Page number for paginated results (1-indexed).
    Query:
      name: q
      in: query
      required: false
      schema:
        type: string
      description: >-
        Filter expression using FIQL-like syntax. Example: id=ge=10000
        to filter records with id >= 10000.
      example: id=ge=10000
    Projection:
      name: projection
      in: query
      required: false
      schema:
        type: string
      description: >-
        Comma-separated list of fields to include in the response.
        Omit to return all fields.
      example: id,name,school_number
  schemas:
    Token:
      type: object
      description: OAuth 2.0 access token response
      required:
        - access_token
        - token_type
        - expires_in
      properties:
        access_token:
          type: string
          description: The Bearer access token value
        token_type:
          type: string
          description: Token type, typically "Bearer"
          example: Bearer
        expires_in:
          type: string
          description: Token lifetime in seconds (returned as string)
          example: "3600"
    Metadata:
      type: object
      description: System-level metadata and configuration limits
      properties:
        course_max_page_size:
          type: integer
          description: Maximum page size for course queries
        machine_uptime:
          type: string
          description: Server uptime duration
        mobile_api_version:
          type: string
          description: Mobile API version string
        plugin_id:
          type: integer
          description: Plugin identifier
        powerschool_uptime:
          type: string
          description: PowerSchool application uptime
        powerschool_version:
          type: string
          description: PowerSchool version string
        powerteacher_version:
          type: string
          description: PowerTeacher version string
        school_max_page_size:
          type: integer
          description: Maximum page size for school queries
        schema_table_query_max_page_size:
          type: integer
          description: Maximum page size for schema table queries
        section_max_page_size:
          type: integer
          description: Maximum page size for section queries
        section_enrollment_max_page_size:
          type: integer
          description: Maximum page size for section enrollment queries
        state_reporting_version:
          type: string
          description: State reporting module version
        staff_max_page_size:
          type: integer
          description: Maximum page size for staff queries
        state:
          type: string
          description: US state or province code for this installation
        student_max_page_size:
          type: integer
          description: Maximum page size for student queries
        term_max_page_size:
          type: integer
          description: Maximum page size for term queries
    ResourceCount:
      type: object
      description: Count of a resource collection
      properties:
        resource:
          type: object
          properties:
            count:
              type: integer
              description: Total number of records in the resource collection
    Address:
      type: object
      description: A mailing or physical address
      properties:
        city:
          type: string
          description: City name
        postal_code:
          type: integer
          description: ZIP or postal code
        state_province:
          type: string
          description: State or province abbreviation
        street:
          type: string
          description: Street address line
    Addresses:
      type: object
      description: Collection of address types for a person or school
      properties:
        home:
          $ref: '#/components/schemas/Address'
        mailing:
          $ref: '#/components/schemas/Address'
        physical:
          $ref: '#/components/schemas/Address'
    PhoneNumber:
      type: object
      properties:
        number:
          type: string
          description: Phone number string
    Phones:
      type: object
      description: Phone numbers for a person or school
      properties:
        fax:
          $ref: '#/components/schemas/PhoneNumber'
        home_phone:
          $ref: '#/components/schemas/PhoneNumber'
        main:
          $ref: '#/components/schemas/PhoneNumber'
    Name:
      type: object
      description: A person's name parts
      properties:
        first_name:
          type: string
          description: Given name
        middle_name:
          type: string
          description: Middle name
        last_name:
          type: string
          description: Surname / family name
    Demographics:
      type: object
      description: Demographic information for a student
      properties:
        birth_date:
          type: string
          format: date
          description: Student's date of birth (YYYY-MM-DD)
        district_entry_date:
          type: string
          format: date
          description: Date the student entered the district
        gender:
          type: string
          description: Gender identifier as defined by the school/district
        projected_graduation_year:
          type: integer
          description: Projected graduation year
    Student:
      type: object
      description: A student record with demographics and contact information
      required:
        - id
      properties:
        id:
          type: integer
          description: Student DCID (district-level unique identifier)
        local_id:
          type: integer
          description: Student number (local identifier within district)
        student_username:
          type: string
          description: Student's portal username
        name:
          $ref: '#/components/schemas/Name'
        demographics:
          $ref: '#/components/schemas/Demographics'
        addresses:
          $ref: '#/components/schemas/Addresses'
        phones:
          $ref: '#/components/schemas/Phones'
    StudentsResponse:
      type: object
      description: Paginated list of student records
      properties:
        students:
          type: object
          properties:
            student:
              oneOf:
                - $ref: '#/components/schemas/Student'
                - type: array
                  items:
                    $ref: '#/components/schemas/Student'
              description: >-
                Single student object or array of student objects depending
                on result count
    StudentResponse:
      type: object
      description: Single student record response
      properties:
        student:
          $ref: '#/components/schemas/Student'
    SchoolPrincipal:
      type: object
      description: Principal or assistant principal contact info
      properties:
        email:
          type: string
          format: email
          description: Principal's email address
        name:
          $ref: '#/components/schemas/Name'
    School:
      type: object
      description: A school within a district
      required:
        - id
      properties:
        id:
          type: integer
          description: School DCID (district-level unique identifier)
        school_number:
          type: integer
          description: School number (local identifier)
        name:
          type: string
          description: Full name of the school
        state_province_id:
          type: string
          description: State or province identifier
        low_grade:
          type: integer
          description: Lowest grade level served (e.g., -2 for pre-K, 0 for K, 1-12)
        high_grade:
          type: integer
          description: Highest grade level served
        alternate_school_number:
          type: integer
          description: Alternate school number if applicable
        addresses:
          $ref: '#/components/schemas/Addresses'
        phones:
          $ref: '#/components/schemas/Phones'
        principal:
          $ref: '#/components/schemas/SchoolPrincipal'
        assistant_principal:
          $ref: '#/components/schemas/SchoolPrincipal'
    SchoolsResponse:
      type: object
      description: Paginated list of school records
      properties:
        schools:
          type: object
          properties:
            school:
              oneOf:
                - $ref: '#/components/schemas/School'
                - type: array
                  items:
                    $ref: '#/components/schemas/School'
              description: Single school or array of schools
    SchoolResponse:
      type: object
      description: Single school record response
      properties:
        school:
          $ref: '#/components/schemas/School'
    Course:
      type: object
      description: A course in the district course catalog
      properties:
        id:
          type: integer
          description: Course DCID
        course_number:
          type: string
          description: Course code / number (e.g., "MATH101")
        course_name:
          type: string
          description: Full name of the course
    CoursesResponse:
      type: object
      description: Paginated list of course records
      properties:
        courses:
          type: object
          properties:
            course:
              oneOf:
                - $ref: '#/components/schemas/Course'
                - type: array
                  items:
                    $ref: '#/components/schemas/Course'
    Section:
      type: object
      description: A course section (a specific offering of a course in a given period and room)
      properties:
        id:
          type: integer
          description: Section DCID
        course_id:
          type: integer
          description: The DCID of the associated course
        section_number:
          type: integer
          description: Section number
        expression:
          type: string
          description: Period expression string (e.g., "1(A)")
        external_expression:
          type: string
          description: External period expression for display
        gradebooktype:
          type: string
          description: Gradebook type identifier
        school_id:
          type: integer
          description: DCID of the school this section belongs to
        staff_id:
          type: integer
          description: DCID of the teacher assigned to this section
        term_id:
          type: integer
          description: DCID of the term this section is offered in
    SectionsResponse:
      type: object
      description: Paginated list of section records
      properties:
        sections:
          type: object
          properties:
            section:
              oneOf:
                - $ref: '#/components/schemas/Section'
                - type: array
                  items:
                    $ref: '#/components/schemas/Section'
    StudentItem:
      type: object
      description: Student enrollment record returned by PowerQuery
      properties:
        dcid:
          type: string
          description: Student DCID (returned as string in PowerQuery results)
        first_name:
          type: string
          description: Student's given name
        last_name:
          type: string
          description: Student's surname
        lastfirst:
          type: string
          description: Combined "Last, First" display name
        grade_level:
          type: string
          description: Current grade level (returned as string)
        gender:
          type: string
          description: Gender identifier
        id:
          type: string
          description: Student ID (returned as string)
        student_number:
          type: string
          description: Student number (returned as string)
    PowerQueryResponse:
      type: object
      description: Results from a named PowerQuery execution
      properties:
        record:
          type: array
          description: Array of result records; structure varies by query
          items:
            type: object
            additionalProperties: true
    SchemaTableResponse:
      type: object
      description: Records from a schema table query
      properties:
        record:
          type: array
          items:
            type: object
            additionalProperties: true
          description: >-
            Array of records from the table; field names match column names
            in the schema table
    Error:
      type: object
      description: API error response
      properties:
        message:
          type: string
          description: Human-readable error description
        error:
          type: string
          description: Error code or type
        status:
          type: integer
          description: HTTP status code