REST can be somewhat of a religion. In “pure” REST thinking, you design granular APIs that map cleanly to resources—potentially down to the table or even field level. This works beautifully when you have a bespoke application that you’ve designed from the ground up with APIs in mind. This results in API clients being able to interact with individual resources directly, using HTTP verbs like GET, POST, PUT, and DELETE in a straightforward manner. However, it can lead to complex designs with many endpoints and an API client having to manage multiple calls to achieve a single business operation.
However, when you’re exposing delivered PeopleSoft functionality as REST services, you cannot apply this pure REST thinking. Let me explain why.
In the purest form of REST, your API design follows these principles:
/courses/101, /courses/101/attributes/5)This model makes perfect sense for modern applications that were designed with a “backend for frontend” architecture or built specifically as API-first systems. Many cloud-native applications work this way.
PeopleSoft was NOT designed this way.
If you understand how PeopleSoft is structured, everything revolves around the data entry component. (A component means something very specific on the PeopleSoft development platform. Do not apply a generic understanding of that term from other contexts.) This is driven by the User Interface that the developers created to maintain data.
That component encapsulates the database commit, business logic, contains several parent-child relationships bundled together.
Key points about this architecture:
Let’s take real example of a data entry component in PeopleSoft Campus Solutions where you define the Course Catalog. This component allows users to create and maintain course records, including attributes, topics, equivalents, and other related data. This component is effective dated and has multiple child tables.
Curriculum Management → Course Catalog → Course Catalog
The tables behind this component have this parent-child relationship:
If you were to design pure REST APIs for this component, you might think to create endpoints like:- GET /courses/{course_id}
POST /courses/{course_id}/attributesDELETE /courses/{course_id}/attributes/{attribute_id}PUT /courses/{course_id}/topics/{topic_id}DELETE /courses/{course_id}/equivalents/{equiv_id}However, this approach runs into several problems:
In PeopleSoft, child records are often effective-dated, and the effective date typically lives on a parent record. You can’t simply issue a DELETE to remove a course attribute because:
What seems like it should be a simple DELETE /courses/101/attributes/5 actually requires a POST to the parent with the full context of what you’re changing.
The component controls when and how data commits to the database. If you have a component with three levels of parent-child relationships, the business logic at the higher levels may prevent you from making certain changes at the lower levels.
Creating an API to delete a third-level child record doesn’t really make sense because the PeopleSoft component might have validation or business rules at the first or second level that would prevent that commit. The component is designed to enforce data integrity across all its records together.
There’s a lot of nuance here, and you have to have a true understanding of working with PeopleSoft to appreciate it. Most of PeopleSoft was not really designed to be integrated with—it wasn’t originally built with external systems in mind.
Technologies were introduced later to allow integration (like Component Interfaces and Integration Broker), but as soon as you start trying to apply enterprise integration patterns that you might see in modern systems, you’ll run into problems. PeopleSoft was designed as a monolith with the PeopleSoft UI being front and center in controlling all database transactions and data integrity. You have to meet PeopleSoft where it is, not where you want it to be.
So what should you do instead? Structure your APIs around the data entry component that’s backing the functionality.
My recommendation is to have one API per user interface component. This means:
Yes, the payloads will be larger than pure REST would suggest. But that’s how PeopleSoft commits data—the entire component’s data is part of one transaction.
| Instead of this (Pure REST) | Do this (PeopleSoft-aligned) |
|---|---|
/courses/{id}/attributes/{attr_id} DELETE |
/courses/{id} POST with attributes in payload |
| Separate endpoints per child table | Single endpoint per component |
| Granular field-level updates | Component-level updates with all relevant data |
A strict definition of REST is not a good fit for PeopleSoft because of how the system is architected. Instead of fighting the architecture:
The sooner you accept that PeopleSoft REST services won’t look like textbook REST examples, the more successful your integrations will be.
Chris Malek s a PeopleTools® Technical Consultant with over two decades of experience working on PeopleSoft enterprise software projects. He is available for consulting engagements.
Work with ChrisIntroducing a small but powerful PeopleSoft bolt-on that makes web services very easy. If you have a SQL statement, you can turn that into a web service in PeopleSoft in a few minutes.