Course Request API Doesn't provide Required Requests

I'm hoping someone can verify what appears to be a bug in the Course Request API: https://developer.sky.blackbaud.com/api#api=school&operation=V1AcademicsCourserequestsGet

Our registrar confirmed for me that when students are required to take specific courses, they add them through a data import (Core > Data Import) or manually Academic > Scheduling > Requests and schedules > Courses Requests. When they do this, they enter them with a type of "Required".

We switched to this API last year before we did the 26-27 course requests and we have now discovered that all "required" requests are not coming back in the API. We have an example of a course that has 42 rows showing required and 1 row showing pending. The API is only returning the pending status.

@Stephen Boyle say it ain't so??

Answers

  • Stephen Boyle
    Stephen Boyle Blackbaud Employee
    Tenth Anniversary Kudos 5 Facilitator 2 Name Dropper

    Soooo,
    Looking into this more. There are three types of "request": Recommendation, Request and Required

    image.png

    The Required are listed in the same section with Requests - but with no Preference.

    image.png

    The endpoint only returns Type = Request.

    I'll get this updated to return at least Required as well.

  • @Stephen Boyle thanks for the quick response. That would be great if required could be added fairly quickly, though I don't know if that is actually the entire issue.

    I spoke with our Registrar and she imported over 900 rows through the file import as required. She then went back and imported just one student as request and I still don't see the data in the API for the course.

    I submitted support ticket 020978942, but I think there may be another issue as well. For those course requests that are processed through the file import, I've discovered they are not included in the API as well. I proved this out by switching the type to request and trying to reimport a single students course request. It's not showing when I run the API for that specific course.

  • @Stephen Boyle I've been digging into this more with another team member and we did confirm we are getting "required" course requests. We are missing all course requests that are submitted through a file import. I was able to run a SKY list and compare it against the Course Request API, and confirm both of these points.

    I hope this helps and it's a quick fix as we're in the middle of scheduling students in another system and we're reliant on this data. If you think it's going to take some time, I'll start working on another solution.

  • Stephen Boyle
    Stephen Boyle Blackbaud Employee
    Tenth Anniversary Kudos 5 Facilitator 2 Name Dropper

    More research…

    Looks like Required are coming back. The Status of Pending is unrelated to type. In my demo db, I have this:

    image.png

    The API returns both the Required and the Requested courses.

    {
        "id": 28172091,
        "user": {"id": 8591037, "email": "MickeyMouseClub@gmail.com","first_name": "Mickey", "last_name": "Mouse", "maiden_name": "", "middle_name": "", "preferred_name": "", "preferred_last_name": "", "prefix": "", "suffix": ""},
        "course": { "id": 104273, "name": "Concert Band", "course_code": "", "description": "Lorem Ipsum proin .", "length": 2, "credits": 0.0, "school_level": { "id": 453, "abbreviation": "", "name": "Upper School" }, "school_year": "2026 - 2027"},
        "start_term": {"id": 172605,"name": "1st Trimester"},
        "preference": 0,
        "status": "Pending",
        "enrollment_status": "Not enrolled",
        "request_date": "2026-07-22T16:18:16.15+00:00",
        "requested_by": {"id": 2844867, ...},
        "fulfilled_by_alternate": false,
        "note": "",
        "alternates": []
    }, {
        "id": 28172104,
        "user": {"id": 8591037, "email": "MickeyMouseClub@gmail.com","first_name": "Mickey", "last_name": "Mouse", "maiden_name": "", "middle_name": "", "preferred_name": "", "preferred_last_name": "", "prefix": "", "suffix": ""},
        "course": {"id": 128681,"name": "Algebra I","course_code": "MA2303","description": "Advanced Mathmatics","length": 2,"credits": 0.0,"school_level": {"id": 453,"abbreviation": "","name": "Upper School"},"school_year": "2026 - 2027"},
        "start_term": {"id": 172605,"name": "1st Trimester"},
        "preference": 0,
        "status": "Pending",
        "enrollment_status": "Not enrolled",
        "request_date": "2026-07-22T15:08:38.413+00:00",
        "requested_by": {"id": 2844867, ...},
        "fulfilled_by_alternate": false,
        "note": "",
        "alternates": []
    }
    

    So, this may be something related to how they were saved from the Import. Under normal circumstances, both Required and Requested items are returned.

    I'll still update the endpoint to include a type field with an enum for "Required", "Requested" and (maybe) "Recommended". So you can tell the difference.

  • Good morning, @Stephen Boyle we found a few things and a solution that I think will be helpful. I'll include this in my support ticket as well:.

    A team member ran a few import tests yesterday using different scenarios. Here are the results:

    1. Once a course request is imported, subsequent imports do not overwrite the original values, including the request type and dates.
    2. New records imported as Request type are sent to the data warehouse regardless of whether they have an approver. When importing as Request type, there is no need to populate the Required By or Recommended By fields.
    3. New records imported as Required type with only the Required By field populated were not sent to the data warehouse.
    4. New records imported as Required type with both the Required By and Recommended By fields populated were not sent to the data warehouse.
    5. New records imported as Required type with both the Required By and Approved By fields populated were sent to the data warehouse.

    What I found as the solution was going to the students record > course request > manage request. Then clicking the SAVE button in the bottom right hand corner. This now makes the request "eligible" for the API. We're creating a PAD job to run through the 300+ records that this is impacting, but that seems to be the missing link.

  • @Stephen Boyle I wanted to let you know I submitted an additional support ticket on this issue: 020981921.

    As we debugged this, we confirmed there is a pagination issue. Currently, when we run this URL, we loop through 6 times (we have over 23,000 course requests currently). However, during this, it appears that some rows are duplicated while others are opted completely. When I add the "size=3000" to the URL, the number increases regarding the number of rows duplicated verse those that are opted. Is there a sort order on the data returned to ensure that as each page is loaded, it's in the same order? We have now switched to adding the course_id to the parameter, which now goes from making 6 calls to over 900 calls in an attempt to return all course requests in a small body. This seems to resolve the issue but is a massive increase to the number of API calls were using.

Categories