Noodle Lifelong Platform API
Course catalogue and shopping cart endpoints for Noodle partner institutions.
Getting started
Introduction
The Noodle Lifelong Platform (NLP) is the system where Noodle’s partner institutions author and manage their course catalogues. This documentation describes the public endpoints available to partners and to developers building on their behalf.
Overview
There are four topics to find here.
The Courses API returns a partner’s course catalogue — every course they offer, with schedules, pricing, instructors, locations, and enrollment dates. It supports search, filtering, and pagination, and it can return a single course by its slug.
The Shopping Cart API lets a website build a cart on a learner’s behalf: create a cart, add and remove courses, and hand the learner over to NLP to complete checkout and enrollment.
The course property reference documents every property returned on a course object, with the type, permitted values, and an example for each.
How Noodle’s own WordPress integration consumes the API. This is worth reading before planning a project that will replace or rebuild an existing Noodle-built marketing site, because some of the information displayed on those sites originates outside the API.
Details
The sections that follow are ordered for a first read: terminology, authentication, environments, and how data moves, then the material specific to each API, and finally the Engage CMS material. Each section opens with a plain-language overview and follows with the technical detail.
How this document is organised
- Glossary, authentication, environments, and data flow — the orientation below, which applies to every endpoint.
- All about the Courses API — the catalogue endpoints, their properties, their access rules, and a sample response.
- All about the Shopping Cart API — the cart endpoints, their properties, their access rules, and a sample response.
- How the Engage CMS integration works — context for projects that replace or extend a Noodle-built marketing site, including the Noodle CMS Connections data those sites hold outside the API.
Glossary
NLP uses a small number of terms in specific ways. Definitions follow Noodle’s platform documentation.
| Term | Definition |
|---|---|
| Instance | A tenant environment containing the branding, content, settings, and policies for one partner or client, reached at its own URL. Sometimes called a Discover Instance. |
| Parent instance | The organisation-level environment — typically the university itself — whose administrators can view and create instances beneath it. |
| Child instance | An instance created beneath a parent, commonly for a specific population such as a school, programme line, corporate partner, or alumni group. |
| Partner ID | The identifier of an instance. It is also the credential this API uses: the Partner ID is supplied as the API key. |
| Private label | The underlying hosting model. Every NLP instance is branded for its partner, which is unrelated to whether the instance is open or invitation-only. |
| Microsite | The public-facing landing and catalogue pages for an instance. This is the surface a partner’s marketing site replaces or supplements. |
| LMS instance | A configuration that connects an NLP instance to an external learning platform such as Canvas or Moodle, so that courses and enrollments can move between the two systems. |
| Shopping cart | The checkout capability that allows a learner to enroll in several courses at once. Enabled per instance. |
| Member | A person who belongs to an instance. |
| Course instance | One enrollable offering of a course. Several instances of the same course may run on different dates and are separate records. |
| Grouping key | A value shared by several course records that belong to the same offering, used to present them together while keeping them separate for enrollment. |
| Engage CMS | Noodle’s WordPress theme and plugin suite, used to build partner marketing sites that display NLP course data. |
Authentication
Overview
Access is granted by a single identifier rather than a login. Noodle issues a Partner ID for an instance, and that value is sent with every request. The response contains that partner’s courses and nothing else.
The shopping cart adds one further identifier. The first cart request returns a session ID that represents one shopper’s cart; sending it back on later requests reaches the same cart.
Details
There is no token exchange and no OAuth handshake.
| Header | Required on | Value |
|---|---|---|
X-Noodle-Partner-Id |
Every endpoint | The Partner ID of an NLP instance, acting as the API key. Scopes every response to that partner. |
X-Noodle-Cart-Session-Id |
Shopping Cart, after the first call | The session_id returned by Get or Create Cart. Identifies one shopper’s cart across requests. |
Establishing a cart session. Call Get or Create Cart with the partner header alone. The response returns a session_id, which represents the shopper, and an id, which identifies the cart itself. Store the session_id — a cookie or local storage is typical — and send it in X-Noodle-Cart-Session-Id on subsequent cart requests. The id is used in the path of the remaining cart endpoints.
Environments and choosing a Partner ID
Overview
NLP runs separate environments for testing and for live traffic, and a partner’s catalogue may be divided across more than one instance. Two configuration choices follow from this: which environment to point at, and which Partner ID to use.
Both endpoints in an integration — the catalogue and the cart — should point at the same environment, and the Partner ID should normally be that of a child instance rather than a parent.
Details
| Environment | Base URL |
|---|---|
| Production | https://services.noodle.com |
| Staging | https://staging2services.noodle.com |
Keeping environments aligned. The catalogue endpoint and the cart endpoint are expected to remain synchronised. Each works independently, so a mismatch can be difficult to identify from behaviour alone; confirming both are configured for the same environment during setup avoids this.
Parent and child instances. NLP instances form a hierarchy. A parent instance is the organisation-level environment; child instances sit beneath it and typically represent a school, programme line, or sponsored population. Courses are associated to child instances for enrollment, so an integration reading a catalogue normally uses a child instance Partner ID. A parent Partner ID may return course records that also exist at the child level, which can surface the same course more than once.
Multiple catalogues on one site. A partner maintaining several child instances will have several Partner IDs, and a single marketing site may present all of them. Each is a separate call; results are combined by the client.
Cart scope. The cart is associated with one Partner ID. Where a site draws on several instances, the behaviour for combining items from different partners into a single cart is not yet defined. Noodle can advise on the current position for integrations that need this.
How data moves
Overview
NLP holds the authoritative record of every course. A website reads that record and displays it; nothing a website does changes the course itself. The exception is the shopping cart, which is genuinely two-way.
Details
Courses are read-only. Courses are authored in NLP, which creates the corresponding course in the connected LMS. A marketing site retrieves the record and renders it. No course attribute is written back through this API.
The cart is bidirectional. Items added through the Shopping Cart API appear in the learner’s NLP cart, and items removed in NLP are reflected back. Checkout and enrollment take place on the NLP domain, behind authentication.
The API exposes a selected set of fields. The properties documented here are those made available over the API, which is a subset of what NLP holds internally. Where a value is visible in the NLP administrative interface but is not present in a response, Noodle can confirm whether it is exposed and advise on alternatives.
Courses API
Endpoints for reading a partner’s course catalogue.
Overview
Two endpoints are available. List Courses returns a partner’s whole catalogue and supports search, filtering, and pagination. Get Course by Slug returns one course by its URL-friendly identifier, optionally with its sections.
Course data is read-only. NLP holds the authoritative record, and nothing is written back through these endpoints.
Details on properties
A course object carries 70 top-level properties. The table below groups them so that the right area can be found quickly; each property’s type, permitted values, nullability, and example are documented in full on the Course schema.
| Group | Properties |
|---|---|
| Identity and naming | id, slug, shortTitle, courseCode, sectionCode, contentType, sys |
| Descriptive content | courseAbout, courseShortDescription, courseObjective, syllabus, prerequisites, notes, terms, cardImage, courseUrl |
| Categorisation and grouping | courseCategories, courseModality, reportingGroup, groupingKey, groupingTitle, courseGroup, mode |
| Class dates and schedule | courseStartDate, courseEndDate, courseStartDateWithTimezone, courseEndDateWithTimezone, courseSchedule, timezone, isSelfPaced |
| Enrollment dates | startDate, endDate, startDateWithTimezone, endDateWithTimezone, enrollmentStartDate, enrollmentEndDate, enrollmentStartDateWithTimezone, enrollmentEndDateWithTimezone |
| Pricing and payment | priceInCents, depositEnabled, depositAmount, depositPercentage, depositPriceId, installmentOption |
| Availability and capacity | isActive, courseAvailability, isPathwayOnly, requiresMembership, isWaitlistEnabled, accept_waitlist_enrollment_only, minNumOfEnrollments, maxNumOfEnrollments, learners_count, creditHours |
| LMS connection | lms, lmsInstance, isLmsHosted, canvasCourseId, moodleCourseId, canvasAuthenticationProviderAssociation, lmsAccessStartDate, lmsAccessEndDate, lmsAccessStartDateWithTimezone, lmsAccessEndDateWithTimezone, lmsIndefiniteAccess |
| Related records | parentCourse, partner, school, instructorsCollection, location |
Property names to note
A few properties carry names that developed before their current meaning settled. They behave consistently and are safe to rely on; the notes below simply describe what each one contains, so that the right property is chosen the first time.
startDate holds the enrollment start date, and endDate the enrollment end date. The first and last days of class are courseStartDate and courseEndDate. Where several sessions of the same course run on different dates, the class dates are what distinguish them.
Timestamps are returned in UTC. NLP administrators enter dates in local time, so a date entered late in the evening can appear as the following calendar day when the UTC value is displayed directly. Each date property has a WithTimezone companion carrying the same instant in the course’s local zone, named by the timezone property.
Some timestamps include fractional seconds and some do not. A parser that accepts both forms will handle every value.
Several properties are arrays assembled from related records — instructorsCollection, location, and the schedule array within courseSchedule. Each carries a selected set of fields from its source record rather than the complete record.
Properties that share a value
Eleven pairs of properties always return the same value. Both members of each pair are documented, and either may be used. Each property’s entry in the reference names its counterpart, so the relationship is visible wherever it is encountered.
| Property | Returns the same value as |
|---|---|
enrollmentStartDate |
startDate |
enrollmentStartDateWithTimezone |
startDateWithTimezone |
enrollmentEndDate |
endDate |
enrollmentEndDateWithTimezone |
endDateWithTimezone |
courseGroup.groupingKey |
groupingKey |
courseGroup.groupingTitle |
groupingTitle |
courseStartDate |
courseSchedule.schedule_start_date |
courseEndDate |
courseSchedule.schedule_end_date |
lmsInstance.lms |
lms |
instructorsCollection.items[].profilePicture.url |
instructorsCollection.items[].profilePictureUrl |
instructorsCollection.items[].sys.id |
instructorsCollection.items[].contentfulId |
Any other access rules not covered above
Overview
Beyond the partner header, a handful of rules govern which courses appear in a response and what may be done with them. They fall into three areas: how a catalogue is scoped, which courses are visible, and how search and filtering combine.
Details
Scope. X-Noodle-Partner-Id is required on both endpoints, and every response is scoped to that instance. A child instance Partner ID is the normal choice, as described under Environments above.
Method. Both endpoints are GET. No course attribute can be created, updated, or deleted through this API.
Visibility. Four properties determine whether a course reaches a learner, and a course may be present in a response while still being unavailable for enrollment:
| Property | Effect |
|---|---|
isActive |
Controls whether the course appears in the API load at all, and therefore on any external site reading the API. |
isPathwayOnly |
When true, the course is available only as a component of a pathway. It is hidden from the learner catalogue and cannot be enrolled in or purchased on its own. |
requiresMembership |
When true, only learners holding at least one matching active membership can enroll in or purchase the course. |
courseAvailability |
Carries the current enrollment state: Open, Upcoming, Waitlisting, Full, or Closed. |
Search. The search parameter is case-insensitive and matches on any of short_title, course_modality, course_categories, grouping_key, and grouping_title.
Filtering. Filters combine with and: a response contains only the courses matching every filter supplied. The available filters are min_start_date, max_start_date, min_end_date, max_end_date, min_price, max_price, content_type, content_title, grouping_key, grouping_title, reporting_group, and is_waitlist_enabled.
Pagination. Pagination is optional. Supply page[size] and page[number] to page through results; meta.count reports the total number of matching courses.
Sections. On Get Course by Slug, include=sections returns the course’s available sections alongside the course itself.
Field coverage. The properties documented here are the subset of NLP’s internal record that is exposed over the API. Where a value is visible in the NLP administrative interface but absent from a response, Noodle can confirm whether it is exposed and advise on alternatives.
Sample data API loads
Overview
A catalogue response returns a data array of course objects and a meta object carrying the result count. The example below shows the shape of a single-result response, abbreviated to the properties most integrations read first.
Details
Complete responses for every search, filter, and pagination case are saved against List Courses and Get Course by Slug.
{
"data": [
{
"id": 1,
"slug": "flavorful-foundations-101",
"shortTitle": "Flavorful Foundations 101",
"priceInCents": 55500,
"isActive": true,
"startDate": "2024-11-22",
"learners_count": 160,
"lms": "moodle",
"mode": ["Audit"],
"cardImage": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/4fGHkzl2qGL5WiwiWE0ieZ/dd27f43874bfb0666c9f8aa4f1db7ebc/spices.jpg"
},
"contentType": null,
"courseModality": null,
"courseCategories": null,
"groupingKey": null,
"groupingTitle": null,
"courseSchedule": null,
"location": null
}
],
"meta": {
"count": 1
}
}
Null values are returned rather than omitted, so a property is always present on the object even where no value is set.
List courses
GET/v2/courses
Gets all courses provided a partner_id header.
Supports optional pagination.
- X-Noodle-Partner-Id header is required to call this endpoint.
Searching
Searches for courses that match the search query (case insensitive) on ANY of the following fields:
-
short_title
-
course_modality
-
course_categories
-
grouping_key
-
grouping_title
Example: GET/v2/courses?search=Online
Filtering
Requires that one or more of the parameters below be specified and will return the courses that match ALL the specified filter conditions.
-
min_start_date (datestring) : This filters based on the course start_date field.
GET/v2/courses?min_start_date=2024-04-20 -
max_start_date (datestring): This filters based on the course start_date field.
GET/v2/courses?max_start_date=2024-05-20 -
min_end_date (datestring) : This filters based on the course end_date field.
GET/v2/courses?min_end_date=2024-04-20 -
max_end_date (datestring): This filters based on the course end_date field.
GET/v2/courses?max_end_date=2024-05-20 -
min_price (number): This filters based on the course price_in_cents field.
GET/v2/courses?min_price=3400 -
max_price (number): This filters based on the course price_in_cents field.
GET/v2/courses?max_price=4055 -
content_type (string): Filters based on the course content_type field.
GET/v2/courses?content_type=Course -
content_title (string): Filters based on the course content_title field.
GET/v2/courses?content_title=test-content-title-1 -
grouping_key (string): Filters based on the course grouping_key field.
GET/v2/courses?grouping_key=intro-to-art -
grouping_title (string): Filters based on the grouping_title field.
GET/v2/courses?grouping_title=Intro to Art -
reporting_group (string): Filters based on the course reporting_group field.
GET/v2/courses?reporting_group=Travel Study -
is_waitlist_enabled (bool): Filters based on the is_waitlist_enabled field.
GET/v2/courses?is_waitlist_enabled=True
Multiple filter parameters example:
GET/v2/courses?min_start_date=2024-04-20&max_start_date=2024-05- 20&min_price=3400&max_price=4055&content_type=Course
Property reference. Every property on a course object, with type, nullability, allowed values and examples, is documented in the collection overview — available in both a nested view and a flat table.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
page[size] | query | integer | Optional | Page size. |
page[number] | query | integer | Optional | Page number. |
search | query | string | Optional | Searches for any matching strings in “short_title”, “course_modality”, “course_categories”, “grouping_key” and “grouping_title” course properties. |
min_start_date | query | string | Optional | Minimum start date of course. |
max_start_date | query | string | Optional | Max start date of course. |
min_end_date | query | string | Optional | Minimum end date of course. |
max_end_date | query | string | Optional | Max end date of course. |
min_price | query | integer | Optional | Minimum course price filter. |
max_price | query | integer | Optional | Max course price filter. |
content_type | query | string | Optional | Returns courses with specified content type. |
content_title | query | string | Optional | Filter based on the course content_title field. |
grouping_key | query | string | Optional | Returns courses matching specified grouping_key. |
grouping_title | query | string | Optional | Returns courses matching specified grouping_title |
reporting_group | query | string | Optional | Returns courses by reporting_group field. |
is_waitlist_enabled | query | boolean | Optional | Returns courses with active waitlist. |
Responses
| Status | Meaning | Returns |
|---|---|---|
200 | The partner’s course catalogue. | CourseListResponse |
Example responses
Get Courses with pagination · 200
{
"data": [
{
"accept_waitlist_enrollment_only": false,
"brightspaceOrgUnitId": null,
"brightspaceUrl": "https://learn.noodle.com/d2l/home/None",
"canvasCourseId": null,
"cardImage": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/4q5cBX0luW5ElN5t43HvMp/17a1940bc00d0738c31fed03da3622ff/5616d013-c1a3-4643-a2a5-c07fa910198d.jpg"
},
"contentType": null,
"courseAbout": "Do you have any idea why this is not working? Type classes first appeared in the Haskell programming language. Haskell features a type system with type inference and lazy evaluation. Initially composing light-hearted and irreverent works, he also wrote serious, sombre and religious pieces beginning in the 1930s.",
"courseCategories": null,
"courseCode": null,
"courseModality": null,
"courseObjective": "In 1989 the building was heavily damaged by fire, but it has since been restored. Where are my pants? Atoms can contain any character if they are enclosed within single quotes and an escape convention exists which allows any character to be used within an atom. Erlang is known for its designs that are well suited for systems.",
"courseSchedule": null,
"courseShortDescription": null,
"courseUrl": "https://learn.noodle.com/course/view.php?id=184&partnerDomain=qa-orzo-university-gnocchiandcompany.noodle.com",
"endDate": null,
"fedNetMoodleId": 184,
"groupingKey": null,
"groupingTitle": null,
"id": 1,
"instructorsCollection": {
"items": [
{
"email": null,
"firstName": "Alix",
"lastName": "Grant",
"middleName": null,
"profilePicture": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/1nlVHYbJDUAihxNKqlGkxr/a2effe53e16733bf21baf89e7ed1141c/ba0c9aea-2389-43bb-9bae-821568ccfe7b.png"
},
"slug": "alix-grant",
"sys": {
"id": "alix-grant",
"publishedAt": "2024-08-28T17:27:46.033Z"
},
"title": "D.Ed."
}
],
"limit": 100,
"total": 1
},
"isActive": true,
"isAddedFromFedNet": true,
"isFedNetCourse": true,
"isWaitlistEnabled": null,
"learners_count": 3,
"lms": "moodle",
"lmsInstance": {
"domain": "https://learn.noodle.com",
"lms": "moodle",
"name": "Noodle Moodle",
"parentAccountId": null,
"partner": {
"auth0ClientId": "pQZxMeGuqM9FYv6fNkFaAoR5wMyEyNJG",
"fromEmail": "noreply@noodle.com",
"frontDomain": "https://www.noodle.com",
"name": "Noodle",
"partnerId": "NOODLE"
},
"sys": {
"id": "7s29UiUkPLXAWBnvN7GHA0",
"publishedAt": "2024-08-08T17:20:23.235Z"
}
},
"location": null,
"maxNumOfEnrollments": null,
"minNumOfEnrollments": null,
"mode": [
"Audit"
],
"moodleCourseId": 184,
"notes": null,
"parentCourse": {
"isActive": true,
"isFedNetCourse": true,
"slug": "goulash-potter-479",
"sys": {
"id": "2EpXOOandfwVkNXhYaIN9F",
"publishedAt": "2024-09-09T21:07:44.773Z"
}
},
"prerequisites": null,
"priceInCents": 74199,
"reportingGroup": null,
"school": {
"shortDescription": "The School of Peaches is all about you!",
"university": {
"logo": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/2JkIf6QniR6WIpNpdjmY9m/d366b6a0ffd4355b922cbc1edb1be502/pessego-1.jpg"
},
"name": "Pici University",
"reverseLogo": null
}
},
"sectionCode": null,
"shortTitle": "Goulash Potter 479",
"slug": "goulash-potter-479",
"startDate": null,Shortened here. The complete payload is in the specification file.
Get Courses with search · 200
{
"data": [
{
"backgroundColor": null,
"brightspaceOrgUnitId": "7164",
"brightspaceUrl": "https://learn.noodle.com/d2l/home/7164",
"canvasCourseId": null,
"cardImage": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/4fGHkzl2qGL5WiwiWE0ieZ/dd27f43874bfb0666c9f8aa4f1db7ebc/spices.jpg"
},
"contentTitle": null,
"contentType": null,
"courseAbout": "Welcome to Flavorful Foundations, a course designed to deepen your understanding and appreciation of flavors in cooking. In this course, you will learn about the building blocks of flavor, how to balance flavors in a dish, and how to enhance and manipulate flavors to create unique and delicious dishes.\n\nBy the end of this course, you will have a deeper understanding and appreciation of the role of flavor in cooking. You will be equipped with the knowledge and skills to balance and manipulate flavors to create delicious and unique dishes. You will also have the ability to create your own recipes using the principles of flavor. Whether you are a beginner or an experienced cook, this course will help you take your culinary skills to the next level.",
"courseCategories": null,
"courseModality": null,
"courseObjective": null,
"courseUrl": "https://learn.noodle.com/course/view.php?id=4&partnerDomain=qa-orzo-university-gnocchiandcompany.noodle.com",
"fedNetMoodleId": null,
"groupingKey": null,
"groupingTitle": null,
"id": 1,
"instructorsCollection": {
"items": [
{
"email": null,
"firstName": "Ronny",
"lastName": "Ravioli",
"profilePicture": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/3WU8riJCo3j1yce96cI2Pk/04ebcb467fe7feb65a5129519b9cbdbb/ronny-ravioli.png"
},
"slug": "ronny-ravioli",
"sys": {
"id": "ronny-ravioli",
"publishedAt": "2024-08-28T17:25:40.227Z"
},
"title": "Mayor of Flavortown"
}
],
"limit": 100,
"total": 1
},
"isActive": true,
"isAddedFromFedNet": false,
"isFedNetCourse": false,
"learners_count": 160,
"lms": "moodle",
"lmsInstance": {
"domain": "https://learn.noodle.com",
"lms": "moodle",
"parentAccountId": null,
"sys": {
"id": "7s29UiUkPLXAWBnvN7GHA0",
"publishedAt": "2024-08-08T17:20:23.235Z"
}
},
"mode": [
"Audit"
],
"moodleCourseId": 4,
"parentCourse": {
"isActive": false,
"isFedNetCourse": true,
"slug": "flavorful-foundations-101",
"sys": {
"id": "7fHKDAJ5iEcI5Bn0ilpzOo",
"publishedAt": "2024-08-08T17:22:24.645Z"
}
},
"priceInCents": 55500,
"school": {
"shortDescription": "Orzo University offers various programs related to culinary arts, including certificate programs, associate degrees, bachelor's degrees, and even graduate-level degrees. Students learn about food science, nutrition, culinary techniques, kitchen management, and other topics related to the culinary industry.",
"university": {
"logo": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/1ZRRFMYiP58FRFNB6LY6O7/92326c97ac18cde2eb16f7b80f925e8e/orzouniversity_logo_small.png"
},
"name": "Orzo University",
"reverseLogo": null
}
},
"shortTitle": "Flavorful Foundations 101",
"slug": "flavorful-foundations-101",
"startDate": "2024-11-22",Shortened here. The complete payload is in the specification file.
Get Courses with start date filters · 200
{
"data": [
{
"backgroundColor": null,
"brightspaceOrgUnitId": null,
"brightspaceUrl": "https://learn.noodle.com/d2l/home/None",
"canvasCourseId": null,
"cardImage": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/5E5lz6kbW5STxOVDRTsp2T/4236df13a4b53b9aa3bdceb7c87287dc/ac-logo.png"
},
"contentTitle": null,
"contentType": null,
"courseAbout": "The A/C school is the most successful part of Greendale. The job placement rate for its students is five times higher than the main schools, and its alumni's donations comprise 80% of Greendale's overall budget.",
"courseCategories": null,
"courseModality": null,
"courseObjective": "Learn how to repair A/Cs",
"courseUrl": "https://learn.noodle.com/course/view.php?id=105&partnerDomain=qa-orzo-university-gnocchiandcompany.noodle.com",
"fedNetMoodleId": 105,
"groupingKey": null,
"groupingTitle": null,
"id": 1,
"instructorsCollection": {
"items": [
{
"email": null,
"firstName": "Troy",
"lastName": "Barnes",
"profilePicture": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/1cI9Zh2rUoJ02E5xY1UzlJ/bde694aa54b74bbacaae0e549de60fe0/Troy_close_up_Season_Five.webp"
},
"slug": "troy-barnes",
"sys": {
"id": "troy-barnes",
"publishedAt": "2024-08-28T17:25:40.227Z"
},
"title": "The Messiah"
}
],
"limit": 100,
"total": 1
},
"isActive": true,
"isAddedFromFedNet": true,
"isFedNetCourse": true,
"learners_count": 31,
"lms": "moodle",
"lmsInstance": {
"domain": "https://learn.noodle.com",
"lms": "moodle",
"parentAccountId": null,
"sys": {
"id": "7s29UiUkPLXAWBnvN7GHA0",
"publishedAt": "2024-08-08T17:20:23.235Z"
}
},
"mode": [
"Audit"
],
"moodleCourseId": 105,
"parentCourse": {
"isActive": true,
"isFedNetCourse": true,
"slug": "ac-repair-101",
"sys": {
"id": "5F5jfiHIGUzko4LJPLQs9I",
"publishedAt": "2024-08-08T17:28:55.716Z"
}
},
"priceInCents": 3454,
"school": {
"shortDescription": "Greendale Community College (GCC) is an open-admissions college located Greendale County, Colorado. Founded back in 1974 by Russell Borchert, it is best known for having amongst its alumni the character actor Luis Guzman. While not as prestigious an academic institution as its rival City College, it's an affordable school which has over 80 different fields of study.",
"university": {
"logo": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/htdfGQiQFeWheKShBG5ya/88d6c7ce85365f03428afbbef882dfa3/greendale_logo_small.png"
},
"name": "Greendale University",
"reverseLogo": null
}
},
"shortTitle": "AC Repair 101",
"slug": "ac-repair-101",
"startDate": "2025-05-20",
"syllabus": "1. Tour\n2. The Sun Chamber",
"sys": {
"id": "iACdwlTdqxq4BGVJkrjju",
"publishedAt": "2024-08-08T20:14:30.859Z"
},
"teacherAssistantsCollection": {
"items": []
}
}
],
"meta": {
"count": 1
}
}Get Courses with price filters · 200
{
"data": [
{
"backgroundColor": null,
"brightspaceOrgUnitId": null,
"brightspaceUrl": "https://learn.noodle.com/d2l/home/None",
"canvasCourseId": null,
"cardImage": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/5E5lz6kbW5STxOVDRTsp2T/4236df13a4b53b9aa3bdceb7c87287dc/ac-logo.png"
},
"contentTitle": null,
"contentType": null,
"courseAbout": "The A/C school is the most successful part of Greendale. The job placement rate for its students is five times higher than the main schools, and its alumni's donations comprise 80% of Greendale's overall budget.",
"courseCategories": null,
"courseModality": null,
"courseObjective": "Learn how to repair A/Cs",
"courseUrl": "https://learn.noodle.com/course/view.php?id=105&partnerDomain=qa-orzo-university-gnocchiandcompany.noodle.com",
"fedNetMoodleId": 105,
"groupingKey": null,
"groupingTitle": null,
"id": 1,
"instructorsCollection": {
"items": [
{
"email": null,
"firstName": "Troy",
"lastName": "Barnes",
"profilePicture": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/1cI9Zh2rUoJ02E5xY1UzlJ/bde694aa54b74bbacaae0e549de60fe0/Troy_close_up_Season_Five.webp"
},
"slug": "troy-barnes",
"sys": {
"id": "troy-barnes",
"publishedAt": "2024-08-28T17:25:40.227Z"
},
"title": "The Messiah"
}
],
"limit": 100,
"total": 1
},
"isActive": true,
"isAddedFromFedNet": true,
"isFedNetCourse": true,
"learners_count": 31,
"lms": "moodle",
"lmsInstance": {
"domain": "https://learn.noodle.com",
"lms": "moodle",
"parentAccountId": null,
"sys": {
"id": "7s29UiUkPLXAWBnvN7GHA0",
"publishedAt": "2024-08-08T17:20:23.235Z"
}
},
"mode": [
"Audit"
],
"moodleCourseId": 105,
"parentCourse": {
"isActive": true,
"isFedNetCourse": true,
"slug": "ac-repair-101",
"sys": {
"id": "5F5jfiHIGUzko4LJPLQs9I",
"publishedAt": "2024-08-08T17:28:55.716Z"
}
},
"priceInCents": 3454,
"school": {
"shortDescription": "Greendale Community College (GCC) is an open-admissions college located Greendale County, Colorado. Founded back in 1974 by Russell Borchert, it is best known for having amongst its alumni the character actor Luis Guzman. While not as prestigious an academic institution as its rival City College, it's an affordable school which has over 80 different fields of study.",
"university": {
"logo": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/htdfGQiQFeWheKShBG5ya/88d6c7ce85365f03428afbbef882dfa3/greendale_logo_small.png"
},
"name": "Greendale University",
"reverseLogo": null
}
},
"shortTitle": "AC Repair 101",
"slug": "ac-repair-101",
"startDate": null,
"syllabus": "1. Tour\n2. The Sun Chamber",
"sys": {
"id": "iACdwlTdqxq4BGVJkrjju",
"publishedAt": "2024-08-08T20:14:30.859Z"
},
"teacherAssistantsCollection": {
"items": []
}
}
],
"meta": {
"count": 1
}
}Get Courses with grouping key filter · 200
{
"data": [
{
"backgroundColor": null,
"brightspaceOrgUnitId": null,
"brightspaceUrl": "https://learn.noodle.com/d2l/home/None",
"canvasCourseId": 1266,
"cardImage": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/h5KY3hYGAIUEIBsc0wfME/d2d4dae09141feaa722dc763cf93e9f3/v1_txt2img_76c80ff7-bb08-4a52-9d92-f56a53afd82f.png"
},
"contentTitle": null,
"contentType": null,
"courseAbout": "Digital Art Fundamentals introduces students to the basic principles and techniques of creating art using digital tools. The course covers a range of topics including digital painting, vector illustration, and graphic design. Students will develop skills in using various software applications to create original digital artworks.",
"courseCategories": null,
"courseModality": null,
"courseObjective": null,
"courseUrl": "https://noodle.instructure.com/login/saml/1234?partnerDomain=qa-orzo-university-gnocchiandcompany.noodle.com&courseId=1266",
"fedNetMoodleId": null,
"groupingKey": "digital-art-fundamentals",
"groupingTitle": "Digital Art Fundamentals",
"id": 1,
"instructorsCollection": {
"items": [
{
"email": null,
"firstName": "Alex",
"lastName": "Morgan",
"profilePicture": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/6G65g3zzhfsFzy12PSqakX/19d1e3f20cae11f5c382d7533e905081/artist.jpg"
},
"slug": "alex-morgan",
"sys": {
"id": "alex-morgan",
"publishedAt": "2024-08-28T17:25:40.227Z"
},
"title": "Head Artist"
}
],
"limit": 100,
"total": 1
},
"isActive": true,
"isAddedFromFedNet": false,
"isFedNetCourse": false,
"learners_count": 0,
"lms": "canvas",
"lmsInstance": {
"domain": "https://noodle.instructure.com",
"lms": "canvas",
"parentAccountId": null,
"sys": {
"id": "6BkzFejxqtdwQQAqz5pXRx",
"publishedAt": "2024-08-08T17:20:25.825Z"
}
},
"mode": [
"Audit"
],
"moodleCourseId": null,
"parentCourse": {
"isActive": true,
"isFedNetCourse": false,
"slug": "digital-art-fundamentals",
"sys": {
"id": "3FcZMZtcgcXuwGk5XFGbH0",
"publishedAt": "2024-08-08T20:15:21.499Z"
}
},
"priceInCents": 0,
"school": {
"shortDescription": "Orzo University offers various programs related to culinary arts, including certificate programs, associate degrees, bachelor's degrees, and even graduate-level degrees. Students learn about food science, nutrition, culinary techniques, kitchen management, and other topics related to the culinary industry.",
"university": {
"logo": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/1ZRRFMYiP58FRFNB6LY6O7/92326c97ac18cde2eb16f7b80f925e8e/orzouniversity_logo_small.png"
},
"name": "Orzo University",
"reverseLogo": null
}
},
"shortTitle": "Digital Art Fundamentals",
"slug": "digital-art-fundamentals",
"startDate": null,Shortened here. The complete payload is in the specification file.
Get Courses with grouping title filter · 200
{
"data": [
{
"backgroundColor": null,
"brightspaceOrgUnitId": null,
"brightspaceUrl": "https://learn.noodle.com/d2l/home/None",
"canvasCourseId": 1266,
"cardImage": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/h5KY3hYGAIUEIBsc0wfME/d2d4dae09141feaa722dc763cf93e9f3/v1_txt2img_76c80ff7-bb08-4a52-9d92-f56a53afd82f.png"
},
"contentTitle": null,
"contentType": null,
"courseAbout": "Digital Art Fundamentals introduces students to the basic principles and techniques of creating art using digital tools. The course covers a range of topics including digital painting, vector illustration, and graphic design. Students will develop skills in using various software applications to create original digital artworks.",
"courseCategories": null,
"courseModality": null,
"courseObjective": null,
"courseUrl": "https://noodle.instructure.com/login/saml/1234?partnerDomain=qa-orzo-university-gnocchiandcompany.noodle.com&courseId=1266",
"fedNetMoodleId": null,
"groupingKey": "digital-art-fundamentals",
"groupingTitle": "Digital Art Fundamentals",
"id": 1,
"instructorsCollection": {
"items": [
{
"email": null,
"firstName": "Alex",
"lastName": "Morgan",
"profilePicture": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/6G65g3zzhfsFzy12PSqakX/19d1e3f20cae11f5c382d7533e905081/artist.jpg"
},
"slug": "alex-morgan",
"sys": {
"id": "alex-morgan",
"publishedAt": "2024-08-28T17:25:40.227Z"
},
"title": "Head Artist"
}
],
"limit": 100,
"total": 1
},
"isActive": true,
"isAddedFromFedNet": false,
"isFedNetCourse": false,
"learners_count": 0,
"lms": "canvas",
"lmsInstance": {
"domain": "https://noodle.instructure.com",
"lms": "canvas",
"parentAccountId": null,
"sys": {
"id": "6BkzFejxqtdwQQAqz5pXRx",
"publishedAt": "2024-08-08T17:20:25.825Z"
}
},
"mode": [
"Audit"
],
"moodleCourseId": null,
"parentCourse": {
"isActive": true,
"isFedNetCourse": false,
"slug": "digital-art-fundamentals",
"sys": {
"id": "3FcZMZtcgcXuwGk5XFGbH0",
"publishedAt": "2024-08-08T20:15:21.499Z"
}
},
"priceInCents": 0,
"school": {
"shortDescription": "Orzo University offers various programs related to culinary arts, including certificate programs, associate degrees, bachelor's degrees, and even graduate-level degrees. Students learn about food science, nutrition, culinary techniques, kitchen management, and other topics related to the culinary industry.",
"university": {
"logo": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/1ZRRFMYiP58FRFNB6LY6O7/92326c97ac18cde2eb16f7b80f925e8e/orzouniversity_logo_small.png"
},
"name": "Orzo University",
"reverseLogo": null
}
},
"shortTitle": "Digital Art Fundamentals",
"slug": "digital-art-fundamentals",
"startDate": null,Shortened here. The complete payload is in the specification file.
Get Courses with multiple filters · 200
{
"data": [
{
"backgroundColor": null,
"brightspaceOrgUnitId": "7164",
"brightspaceUrl": "https://learn.noodle.com/d2l/home/7164",
"canvasCourseId": null,
"cardImage": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/4fGHkzl2qGL5WiwiWE0ieZ/dd27f43874bfb0666c9f8aa4f1db7ebc/spices.jpg"
},
"contentTitle": null,
"contentType": null,
"courseAbout": "Welcome to Flavorful Foundations, a course designed to deepen your understanding and appreciation of flavors in cooking. In this course, you will learn about the building blocks of flavor, how to balance flavors in a dish, and how to enhance and manipulate flavors to create unique and delicious dishes.\n\nBy the end of this course, you will have a deeper understanding and appreciation of the role of flavor in cooking. You will be equipped with the knowledge and skills to balance and manipulate flavors to create delicious and unique dishes. You will also have the ability to create your own recipes using the principles of flavor. Whether you are a beginner or an experienced cook, this course will help you take your culinary skills to the next level.",
"courseCategories": null,
"courseModality": null,
"courseObjective": null,
"courseUrl": "https://learn.noodle.com/course/view.php?id=4&partnerDomain=qa-orzo-university-gnocchiandcompany.noodle.com",
"fedNetMoodleId": null,
"groupingKey": null,
"groupingTitle": null,
"id": 1,
"instructorsCollection": {
"items": [
{
"email": null,
"firstName": "Ronny",
"lastName": "Ravioli",
"profilePicture": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/3WU8riJCo3j1yce96cI2Pk/04ebcb467fe7feb65a5129519b9cbdbb/ronny-ravioli.png"
},
"slug": "ronny-ravioli",
"sys": {
"id": "ronny-ravioli",
"publishedAt": "2024-08-28T17:25:40.227Z"
},
"title": "Mayor of Flavortown"
}
],
"limit": 100,
"total": 1
},
"isActive": true,
"isAddedFromFedNet": false,
"isFedNetCourse": false,
"learners_count": 160,
"lms": "moodle",
"lmsInstance": {
"domain": "https://learn.noodle.com",
"lms": "moodle",
"parentAccountId": null,
"sys": {
"id": "7s29UiUkPLXAWBnvN7GHA0",
"publishedAt": "2024-08-08T17:20:23.235Z"
}
},
"mode": [
"Audit"
],
"moodleCourseId": 4,
"parentCourse": {
"isActive": false,
"isFedNetCourse": true,
"slug": "flavorful-foundations-101",
"sys": {
"id": "7fHKDAJ5iEcI5Bn0ilpzOo",
"publishedAt": "2024-08-08T17:22:24.645Z"
}
},
"priceInCents": 55500,
"school": {
"shortDescription": "Orzo University offers various programs related to culinary arts, including certificate programs, associate degrees, bachelor's degrees, and even graduate-level degrees. Students learn about food science, nutrition, culinary techniques, kitchen management, and other topics related to the culinary industry.",
"university": {
"logo": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/1ZRRFMYiP58FRFNB6LY6O7/92326c97ac18cde2eb16f7b80f925e8e/orzouniversity_logo_small.png"
},
"name": "Orzo University",
"reverseLogo": null
}
},
"shortTitle": "Flavorful Foundations 101",
"slug": "flavorful-foundations-101",
"startDate": "2024-11-22",Shortened here. The complete payload is in the specification file.
Get Courses · 200
{
"data": [
{
"accept_waitlist_enrollment_only": false,
"brightspaceOrgUnitId": "7083",
"brightspaceUrl": "https://learn.noodle.com/d2l/home/7083",
"canvasCourseId": null,
"cardImage": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/p3jjmoFfZr7R1WdO6inoX/f51bc99f613303cf1a43158d3ea2c3bd/vball.webp"
},
"contentType": null,
"courseAbout": "Beach volleyball is a team sport played by two teams of two or more players on a sand court divided by a net. Similar to indoor volleyball, the objective of the game is to send the ball over the net and to ground it on the opponent's side of the court.",
"courseCategories": null,
"courseCode": null,
"courseModality": null,
"courseObjective": null,
"courseSchedule": null,
"courseShortDescription": null,
"courseUrl": "https://learn.noodle.com/course/view.php?id=31&partnerDomain=qa-greendale-acme.noodlealdente.com",
"endDate": null,
"fedNetMoodleId": null,
"groupingKey": null,
"groupingTitle": null,
"id": 1,
"instructorsCollection": {
"items": [
{
"email": null,
"firstName": "Wilson",
"lastName": "Spalding",
"middleName": null,
"profilePicture": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/67PLEkrYS6Al4TA0wiLXFV/053046a1f72e197a660e42fd744cc842/wilson.jpg"
},
"slug": "wilson-spalding",
"sys": {
"id": "wilson-spalding",
"publishedAt": "2024-08-28T17:25:44.237Z"
},
"title": "Head Setter"
}
],
"limit": 100,
"total": 1
},
"isActive": true,
"isAddedFromFedNet": false,
"isFedNetCourse": false,
"isWaitlistEnabled": null,
"learners_count": 38,
"lms": "moodle",
"lmsInstance": {
"domain": "https://learn.noodle.com",
"lms": "moodle",
"name": "Noodle Moodle",
"parentAccountId": null,
"partner": {
"auth0ClientId": "pQZxMeGuqM9FYv6fNkFaAoR5wMyEyNJG",
"fromEmail": "noreply@noodle.com",
"frontDomain": "https://www.noodle.com",
"name": "Noodle",
"partnerId": "NOODLE"
},
"sys": {
"id": "7s29UiUkPLXAWBnvN7GHA0",
"publishedAt": "2024-08-08T17:20:23.235Z"
}
},
"location": null,
"maxNumOfEnrollments": null,
"minNumOfEnrollments": null,
"mode": [
"Audit"
],
"moodleCourseId": 31,
"notes": null,
"parentCourse": {
"isActive": true,
"isFedNetCourse": true,
"slug": "beach-volleyball-101",
"sys": {
"id": "1FTKHLPQ7vM3lwDc4zIY7C",
"publishedAt": "2024-09-09T01:02:34.819Z"
}
},
"prerequisites": null,
"priceInCents": 86388,
"reportingGroup": null,
"school": {
"shortDescription": "Greendale Community College (GCC) is an open-admissions college located Greendale County, Colorado. Founded back in 1974 by Russell Borchert, it is best known for having amongst its alumni the character actor Luis Guzman. While not as prestigious an academic institution as its rival City College, it's an affordable school which has over 80 different fields of study.",
"university": {
"logo": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/htdfGQiQFeWheKShBG5ya/88d6c7ce85365f03428afbbef882dfa3/greendale_logo_small.png"
},
"name": "Greendale University",
"reverseLogo": null
}
},
"sectionCode": null,
"shortTitle": "Beach Volleyball 101",
"slug": "beach-volleyball-101",
"startDate": null,
"syllabus": "1. Peppering\n2. Setting\n3. Jumping\n4. Spiking\n5. Digging",
"sys": {
"id": "V6sXcdio9qoMkZmggpkPD",
"publishedAt": "2024-09-09T02:08:14.391Z"Shortened here. The complete payload is in the specification file.
Get a course by slug
GET/v2/courses/{slug}
Gets a course provided its slug and partner_id header.
Supports optional include parameter to fetch the course’s sections.
- X-Noodle-Partner-Id header is required to call this endpoint.
Property reference. Every property on a course object, with type, nullability, allowed values and examples, is documented in the collection overview — available in both a nested view and a flat table.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
slug | path | string | Required | The course’s URL-friendly identifier. |
include | query | string | Optional | Set to sections to include the course’s available sections. |
Responses
| Status | Meaning | Returns |
|---|---|---|
200 | The requested course. | CourseResponse |
Example responses
Get Course by Slug with sections · 200
{
"data": {
"accept_waitlist_enrollment_only": false,
"brightspaceOrgUnitId": null,
"brightspaceUrl": "https://learn.noodle.com/d2l/home/None",
"canvasCourseId": null,
"cardImage": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/4fGHkzl2qGL5WiwiWE0ieZ/dd27f43874bfb0666c9f8aa4f1db7ebc/spices.jpg"
},
"completion_rate": 0.07,
"contentType": null,
"courseAbout": "Welcome to Flavorful Foundations, a course designed to deepen your understanding and appreciation of flavors in cooking. In this course, you will learn about the building blocks of flavor, how to balance flavors in a dish, and how to enhance and manipulate flavors to create unique and delicious dishes.\n\nBy the end of this course, you will have a deeper understanding and appreciation of the role of flavor in cooking. You will be equipped with the knowledge and skills to balance and manipulate flavors to create delicious and unique dishes. You will also have the ability to create your own recipes using the principles of flavor. Whether you are a beginner or an experienced cook, this course will help you take your culinary skills to the next level.",
"courseCategories": null,
"courseCode": null,
"courseModality": null,
"courseObjective": null,
"courseSchedule": null,
"courseShortDescription": null,
"courseUrl": "https://learn.noodle.com/course/view.php?id=148&partnerDomain=qa-orzo-university-gnocchiandcompany.noodle.com",
"course_status": null,
"endDate": null,
"fedNetMoodleId": 148,
"groupingKey": null,
"groupingTitle": null,
"id": 1,
"instructorsCollection": {
"items": [
{
"email": null,
"firstName": "Ronny",
"lastName": "Ravioli",
"middleName": null,
"profilePicture": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/3WU8riJCo3j1yce96cI2Pk/04ebcb467fe7feb65a5129519b9cbdbb/ronny-ravioli.png"
},
"slug": "ronny-ravioli",
"sys": {
"id": "ronny-ravioli",
"publishedAt": "2024-08-28T17:26:00.878Z"
},
"title": "Mayor of Flavortown"
}
],
"limit": 100,
"total": 1
},
"isActive": false,
"isAddedFromFedNet": true,
"isFedNetCourse": true,
"isWaitlistEnabled": null,
"is_added_to_federated_network": false,
"is_from_federated_network": true,
"learners_count": 161,
"lms": "moodle",
"lmsInstance": {
"domain": "https://learn.noodle.com",
"lms": "moodle",
"parentAccountId": null,
"sys": {
"id": "7s29UiUkPLXAWBnvN7GHA0",
"publishedAt": "2024-08-08T17:20:23.235Z"
}
},
"location": null,
"maxNumOfEnrollments": null,
"minNumOfEnrollments": null,
"mode": [
"Audit"
],
"moodleCourseId": 148,
"notes": null,
"parentCourse": {
"isActive": false,
"isFedNetCourse": true,
"partner": {
"name": "Pici University",
"partnerId": "PICIUNIVERSITY"
},
"slug": "flavorful-foundations-101",
"sys": {
"id": "4reqfxFeCKg6smP7LdnDyr",
"publishedAt": "2024-09-08T00:58:19.356Z"
}
},
"partner": {
"name": "Gnocchi and Co",
"partnerId": "ORZOUNIVERSITY-GNOCCHIANDCO"
},
"percent_course_complete": 0,
"prerequisites": null,
"priceInCents": 0,
"reportingGroup": null,
"school": {
"shortDescription": "The School of Peaches is all about you!",
"university": {
"horizontalLogo": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/2a8K07qURexoxDYiPa7Vol/746b1748b7e9c14fb341f8201ad75e5d/Pici_University-logos_transparent.png"
},
"image": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/2JkIf6QniR6WIpNpdjmY9m/d366b6a0ffd4355b922cbc1edb1be502/pessego-1.jpg"
},
"name": "Pici University",
"reverseLogo": null
}
},
"sectionCode": null,Shortened here. The complete payload is in the specification file.
Shopping Cart API
Endpoints for the anonymous and logged-in shopping cart experience.
Overview
A cart is created on a learner’s behalf, courses are added to it, and the learner is then handed to NLP to complete checkout and enrollment. Cart state is shared with NLP in both directions: items added here appear in the learner’s NLP cart, and items removed in NLP are reflected back.
Get or Create Cart is the entry point. Called with the partner header alone it creates a cart and returns a session_id identifying the shopper and an id identifying the cart. Store the session_id and send it in X-Noodle-Cart-Session-Id on later requests; use the id in the path of the remaining endpoints.
Checkout and enrollment take place on the NLP domain, behind authentication. The cart_url property in the response is where a learner is sent to complete a purchase.
Details on properties
Three objects appear across the cart endpoints.
Cart is the container returned by Get or Create Cart.
| Property | Notes |
|---|---|
id |
The cart’s identifier, used in the path of the remaining cart endpoints. |
session_id |
The shopper’s identifier, sent back in X-Noodle-Cart-Session-Id. |
partner_id |
The instance the cart belongs to. |
cart_url |
The NLP address where the learner completes checkout. |
cart_items |
The items currently in the cart. |
cart_items_count |
The number of items in the cart. |
subtotal |
The cart total, in the same units as priceInCents on a course. |
user_id |
The NLP user once a learner has authenticated; null for an anonymous cart. |
CartItem is one course in a cart.
| Property | Notes |
|---|---|
id |
The cart item’s identifier, used in the path when updating or removing it. |
shopping_cart_id |
The cart the item belongs to. |
course_id |
The database identifier of the course, from id on a course object. |
external_id |
The Contentful identifier of the course, from sys.id on a course object. |
quantity |
Always 1. |
cart_item_metadata |
Free-form key-value data carried with the item, including enrollment options. |
created_at, updated_at |
Timestamps for the item. |
AddCartItemRequest is the body sent when adding an item. Supply either course_id or external_id, together with quantity; cart_item_metadata is optional.
Any other access rules not covered above
Overview
The cart is scoped to a single instance and a single shopper, and a course may be added to it only once. The rules below cover identification, the limits on what a cart may contain, and where the learner is handed over.
Details
Scope. X-Noodle-Partner-Id is required on every cart endpoint. After the first call, X-Noodle-Cart-Session-Id identifies the shopper’s cart. A cart is associated with one Partner ID; where a site draws on several instances, the behaviour for combining items from different partners into one cart is not yet defined, and Noodle can advise on the current position.
Environment alignment. The catalogue endpoint and the cart endpoint should point at the same environment. Each works independently, so a mismatch is difficult to identify from behaviour alone.
Availability. The shopping cart is enabled per instance.
Identifying a course. Either course_id or external_id may be supplied when adding an item. Courses created recently may have no external_id, in which case course_id is used.
One enrollment per course. quantity is always 1, because a course cannot be enrolled in twice. Adding a course already in the cart returns 409 Conflict.
Enrollment type. Passing an enrollment_data.team_id object inside cart_item_metadata enrolls the learner as a team member of the given team. Without it, the learner is enrolled as a solo learner.
Updating an item. The update endpoint is not yet supported. Cart items cannot be modified and their quantity cannot be changed. The endpoint is reserved for future support of cart_item_metadata updates, to allow a learner to switch between team and solo enrollment.
Completing a purchase. Checkout and enrollment happen on the NLP domain, behind authentication. Send the learner to the address in cart_url.
Sample data API loads
Overview
Two payloads cover the common path: the cart returned when a session is established, and the item returned when a course is added to it.
Details
Complete responses for every cart endpoint are saved against the endpoints themselves.
A newly created cart, from Get or Create Cart. Store session_id and id.
{
"data": {
"id": 277,
"session_id": "8124e2e4-c4b8-40e5-a101-4ea0c31ede41",
"partner_id": "ORZOUNIVERSITY-GNOCCHIANDCO",
"cart_url": "https://orzo-university-gnocchiandcompany.noodle.com/cart",
"cart_items": [],
"cart_items_count": 0,
"subtotal": 0,
"user_id": null
}
}
An item added to that cart, from Add Cart Item. Abbreviated: cart_item_metadata.contentful_data carries a copy of the course record at the time of adding.
{
"data": {
"id": 165,
"shopping_cart_id": 277,
"course_id": 1234,
"external_id": "19hcByx0VvmLpnwMK0mHks",
"quantity": 1,
"cart_item_metadata": {
"enrollment_data": {
"team_id": 123
},
"contentful_data": {
"shortTitle": "Beach Volleyball 101",
"slug": "beach-volleyball-101",
"priceInCents": 0,
"isActive": true,
"lms": "moodle",
"mode": ["Audit"]
}
},
"created_at": "2024-07-22T16:28:30.884433+00:00",
"updated_at": "2024-07-22T16:28:30.884438+00:00"
}
}
Get or create a cart
GET/cart
This is the entrypoint of the shopping cart flow, returning the necessary data to interact with the shopping cart.
Creating a Shopping Cart
You just need to call this endpoint with a valid X-Noodle-Partner-Id header and it’ll return the following values that you’ll need to save:
-
session_id: This will be your user’s identifier, you can save this in localStorage or cookies and send it in a
X-Noodle-Cart-Session-Idheader to fetch said user’s cart. -
id: This is the shopping cart’s id, used for calling all other shopping cart endpoints.
Getting a Shopping Cart
You can fetch a user’s shopping cart using the aforementioned session_id. You just need to send the session_id in a X-Noodle-Cart-Session-Id header alongside the correct X-Noodle-Partner-Id header value and it’ll return your user’s shopping cart.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
X-Noodle-Cart-Session-Id | header | string | Optional | An existing shopper session. Omit to create a new cart. |
Responses
| Status | Meaning | Returns |
|---|---|---|
200 | An existing cart. | CartResponse |
201 | A new cart was created. | CartResponse |
Example responses
Create a new cart · 200
{
"data": {
"cart_items": [],
"cart_items_count": 0,
"cart_url": "https://orzo-university-gnocchiandcompany.noodle.com/cart",
"id": 276,
"partner_id": "ORZOUNIVERSITY-GNOCCHIANDCO",
"session_id": "8124e2e4-c4b8-40e5-a101-4ea0c31ede41",
"subtotal": 0,
"user_id": null
}
}Get a cart · 200
{
"data": {
"cart_items": [],
"cart_items_count": 0,
"cart_url": "https://orzo-university-gnocchiandcompany.noodle.com/cart",
"id": 277,
"partner_id": "ORZOUNIVERSITY-GNOCCHIANDCO",
"session_id": "8124e2e4-c4b8-40e5-a101-4ea0c31ede41",
"subtotal": 0,
"user_id": null
}
}Add an item to a cart
POST/cart/{shopping_cart_id}/cart_items
Lets you add a cart item to a shopping cart.
You need to provide the id of the shopping cart that was saved from the Get or Create Cart endpoint.
The body expects:
-
course_id: The database
idof the course you’re trying to add to the shopping cart. This can be found insidecourse.idfrom ourv2/coursesapi. It can be sent instead of external_id. -
external_id: The Contentful
idof the course you’re trying to add to the shopping cart. This can be found insidecourse.sys.idfrom ourv2/coursesapi. New courses won’t have a value in this field, can be replaced by course_id. -
quantity: Should always be 1 for now, as courses cannot be enrolled in twice.
-
cart_item_metadata: Optional key, you can add any key-value pair to this. You can add an
enrollment_data.team_idobject to enroll the user as a team_member in the provided team. Otherwise, they’ll be enrolled as solo-learners by default.
The endpoint will throw a 409 Conflict error if you try to add the same cart item twice as courses cannot be bought/enrolled in twice.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
shopping_cart_id | path | integer | Required | The cart’s id. |
Request body
Sends a AddCartItemRequest object.
Responses
| Status | Meaning | Returns |
|---|---|---|
200 | The cart item that was added. | CartItemResponse |
409 | The course is already in the cart. A course can be purchased once. | — |
Example responses
Add Cart Item to Shopping Cart · 200
{
"data": {
"cart_item_metadata": {
"contentful_data": {
"cardImage": {
"url": "https://assets.noodle.com/yzn2zv0qt1y1/p3jjmoFfZr7R1WdO6inoX/f51bc99f613303cf1a43158d3ea2c3bd/vball.webp"
},
"contentTitle": null,
"contentType": null,
"courseCategory": null,
"courseModality": null,
"fedNetMoodleId": 110,
"isActive": true,
"isAddedFromFedNet": true,
"isFedNetCourse": true,
"lms": "moodle",
"mode": [
"Audit"
],
"moodleCourseId": 110,
"parentCourse": {
"isActive": true,
"isFedNetCourse": true,
"slug": "beach-volleyball-101",
"sys": {
"id": "1FTKHLPQ7vM3lwDc4zIY7C",
"publishedAt": "2024-06-12T15:19:52.389Z"
}
},
"priceInCents": 0,
"shortTitle": "Beach Volleyball 101",
"slug": "beach-volleyball-101",
"startDate": null,
"stripePriceId": "price_1PQsxnPmPdlBDUMHjcJ93SWY",
"stripeProductId": "prod_PgKhb95dWNaqXw",
"sys": {
"id": "19hcByx0VvmLpnwMK0mHks",
"publishedAt": "2024-06-12T15:19:53.267Z"
}
},
"enrollment_data": {
"team_id": 123
}
},
"course_id": 1234,
"created_at": "2024-07-22T16:28:30.884433+00:00",
"external_id": "19hcByx0VvmLpnwMK0mHks",
"id": 165,
"quantity": 1,
"shopping_cart_id": 277,
"updated_at": "2024-07-22T16:28:30.884438+00:00"
}
}Update a cart item
PATCH/cart/{shopping_cart_id}/cart_items/{cart_item_id}
Not supported as of now. Cart Items cannot be modified, nor their quantity changed as courses can only bought and enrolled in once.
This endpoint will be updated to allow card_item_metadata updates in order to change enrollment type between team and solo learning.
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
shopping_cart_id | path | integer | Required | The cart’s id. |
cart_item_id | path | integer | Required | The cart item’s id. |
Responses
| Status | Meaning | Returns |
|---|---|---|
200 | Reserved for future use. | — |
Remove an item from a cart
DELETE/cart/{shopping_cart_id}/cart_items/{cart_item_id}
Lets you delete a cart item from the shopping cart provided the shopping_cart_id and cart_item_id
Parameters
| Name | In | Type | Description | |
|---|---|---|---|---|
shopping_cart_id | path | integer | Required | The cart’s id. |
cart_item_id | path | integer | Required | The cart item’s id. |
Responses
| Status | Meaning | Returns |
|---|---|---|
200 | Confirmation that the item was removed. | DeleteCartItemResponse |
Example responses
Delete Cart Item from Shopping Cart · 200
{
"data": {
"deleted": true,
"id": 165
}
}Course property reference
Every property returned on a course object. 70 top-level properties, plus 38 within nested objects. Use the filter to jump to one.
accept_waitlist_enrollment_onlybooleanIndicates if the course is currently accepting enrollments exclusively through the waitlist. A value of “true” means that regular enrollment is closed, and only waitlist enrollments are being accepted at this time.
canvasAuthenticationProviderAssociationobject or nullStores the Canvas SSO configuration associated with the course, used to route learners to the correct identity provider when they access the course in Canvas. Each entry carries the issuer URL, login path, partner ID, provider ID, and provider type.
Contains
issuerUrlstring or nullSpecifies the identity provider’s issuer URL used to validate authentication assertions for the course’s Canvas authentication provider.
loginPathstringSpecifies the relative Canvas path that initiates the SSO login flow for this provider (e.g., “/login/saml/000”). Appended to the partner’s Canvas instance domain to send learners to the correct login endpoint.
partnerIdstringIdentifies the partner institution whose Canvas authentication provider is associated with the course (e.g., “10”).
providerIdintegerIdentifies the specific authentication provider record configured within the partner’s Canvas instance (e.g., “100”).
providerTypestringSpecifies the authentication protocol used by the Canvas authentication provider (e.g., “AuthProviderTypeEnum.SAML”), indicating how learner identity is asserted at login.
canvasCourseIdinteger or nullThe course’s identifier within Canvas. Populated when lms is “canvas”; returns null otherwise.
cardImageobjectContainer for the course’s representative card image. Holds the image file reference used as the thumbnail or preview image in course listings and promotional cards.
Contains
urlstringStores the URL link for the course’s representative image, typically used as a thumbnail or preview image in course listings or promotional cards. This image enhances visual recognition and provides a quick reference for the course’s content or theme (e.g., “https://example.com/card_image.png”).
contentTypestringCOURSESpecifies the category of educational material, indicating whether the content is a standalone course, a comprehensive program, or another type of learning resource.
courseAboutstringProvides a detailed description of the course, including its objectives, topics covered, and intended audience. This rich text area allows for a comprehensive description to engage prospective learners, highlighting key aspects of the course content, learning outcomes, and any unique features or benefits (e.g., “This course was crafted with you, the learner, at its core…”).
courseAvailabilitystringClosed, Full, Open, Upcoming, WaitlistingIndicates the current enrollment state of the course, selected from “Open” (accepting enrollments), “Waitlisting” (regular enrollment is closed and learners may join the waitlist), and “Closed” (accepting neither enrollments nor waitlist entries).
courseCategoriesarray of stringThe subject areas or disciplines the course belongs to, drawn from a predefined list (e.g., “History”, “Great Books”, “Political Science”).
courseCodestring or nullA unique alphanumeric identifier assigned to the course (e.g., “BASC65133”). This code is used for course cataloging, enrollment, and administrative tracking.
courseEndDatestring or nullThe date and time the course ends (last day of classes), in UTC. Returns the same value as courseSchedule.schedule_end_date.
courseEndDateWithTimezonestring or nullThe date and time the course ends (last day of classes), in the course’s local zone named by timezone.
courseGroupobjectGroups related variations of the same course — different terms, cohorts, or modalities of a single offering — so they can be presented and managed together. Each entry carries the grouping key and grouping title shared across all variations.
Contains
groupingKeystringIdentifier shared by every variation of the same course, used to group them together (e.g., “intro-to-art”). Returns the same value as groupingKey.
groupingTitlestringTitle shared by every variation of the same course, used to group them together (e.g., “Intro to Art”). Returns the same value as groupingTitle.
courseModalityarray of stringThe delivery format of the course. Returns lowercase values: “online”, “in-person”, or “hybrid”.
courseObjectivestring or nullThe primary learning goals and skills a learner gains from the course. May contain links to supplementary resources.
courseScheduleobjectStores the recurring meeting pattern for the course. This container holds one or more schedule entries defining when classes meet.
Contains
schedulearray of objectHolds the individual weekly meeting entries for the course. Each entry specifies a meeting day, a start time, and an end time.
schedule_end_datestring or nullThe date and time the course ends (last day of classes), in UTC. Returns the same value as courseEndDate.
schedule_start_datestring or nullThe date and time the course begins (first day of classes), in UTC. Returns the same value as courseStartDate.
courseShortDescriptionstring or nullProvides a concise overview of the course, highlighting its main focus and topics. This brief summary is ideal for quick reference in course listings.
courseStartDatestring or nullThe date and time the course begins (first day of classes), in UTC. Returns the same value as courseSchedule.schedule_start_date.
courseStartDateWithTimezonestring or nullThe date and time the course begins (first day of classes), in the course’s local zone named by timezone.
courseUrlstring or nullSpecifies the direct link to access the course on the learning management system. This URL directs learners to the course’s login or access page.
creditHoursnumber or nullSpecifies the number of academic credit hours awarded for successful completion of the course (e.g., “1.0”).
depositAmountinteger or nullThis sets the deposit amount to a fixed amount.
depositEnabledbooleanThis determines whether the learner must submit an initial deposit and then separately pay for the remainder of the course price.
depositPercentagenumber or nullThis sets the deposit amount as a percentage of the course’s price.
depositPriceIdstring or nullStores the identifier of the Stripe Price object representing the course deposit (e.g., “price_2DCxx54gG2GGz4bA1hjdhsu1”). Populated only when Deposit Enablement Status is enabled.
endDatestring or nullThe date and time public enrollment closes, in UTC. Returns the same value as enrollmentEndDate.
endDateWithTimezonestring or nullThe date and time public enrollment closes, in the course’s local zone named by timezone. Returns the same value as enrollmentEndDateWithTimezone.
enrollmentEndDatestring or nullThe date and time public enrollment closes, in UTC. Returns the same value as endDate.
enrollmentEndDateWithTimezonestring or nullThe date and time public enrollment closes, in the course’s local zone named by timezone. Returns the same value as endDateWithTimezone.
enrollmentStartDatestringThe date and time public enrollment opens, in UTC. Returns the same value as startDate.
enrollmentStartDateWithTimezonestringThe date and time public enrollment opens, in the course’s local zone named by timezone. Returns the same value as startDateWithTimezone.
groupingKeystringIdentifier shared by every variation of the same course, used to group them together (e.g., “intro-to-art”). Returns the same value as courseGroup.groupingKey.
groupingTitlestringTitle shared by every variation of the same course, used to group them together (e.g., “Intro to Art”). Returns the same value as courseGroup.groupingTitle.
idintegerThe record ID within the NLP system; also this is the ID used for the shopping cart.
installmentOptionobjectContainer for the course’s installment payment configuration. Holds whether an installment plan is offered, how many installments it comprises, the per-installment amount, and the remaining balance.
Contains
installmentAmountCentsintegerSpecifies the amount of each single installment payment for the course, expressed in cents (e.g., “25000” for $250.00).
numberOfInstallmentsintegerSpecifies how many separate payments make up the course’s installment plan (e.g., “4”).
remainingBalanceCentsintegerSpecifies the portion of the course price still to be collected across the remaining installment payments, expressed in cents (e.g., “100000” for $1,000.00).
instructorsCollectionobjectIndicates one or more instructors who are leading the course.
Contains
itemsarray of objectHolds the individual instructor records associated with the course. Each entry carries that instructor’s name, contact details, biography, address, profile picture, and system metadata.
isActivebooleanIndicates if the course is visible in the API load. This controls whether the course appears on any external marketing website using the API.
isLmsHostedbooleanIndicates whether or not the course appears within a Learning Management System. Some courses, regardless of modality, have no corresponding LMS experience.
isPathwayOnlybooleanIndicates whether the course is available only as a component of a pathway. A value of “true” means the course is hidden from the learner catalogue and cannot be independently enrolled in or purchased on its own.
isSelfPacedbooleanThis indicates whether the course is self-paced (asynchronous) or if it is synchronous (with set class meeting times).
isWaitlistEnabledbooleanIndicates whether a waitlist option is available for the course. A value of “true” means students can join a waitlist if the course reaches full capacity, allowing them to be notified if spots open up.
learners_countintegerThe number of learners currently enrolled in the course.
lmsstring or nullmoodle, brightspace, canvas, NoneThe learning management system hosting the course: “canvas” or “moodle”. Returns the same value as lmsInstance.lms.
lmsAccessEndDatestring or nullThis is the last day that a learner can access the course within the LMS.
lmsAccessEndDateWithTimezonestring or nullThis is the last day that a learner can access the course within the LMS.
lmsAccessStartDatestring or nullThis is the first day that a learner can access the course within the LMS.
lmsAccessStartDateWithTimezonestring or nullThis is the first day that a learner can access the course within the LMS.
lmsIndefiniteAccessbooleanSpecifies whether learners will have unrestricted access to the course within the LMS with no set end date.
lmsInstanceobject or nullReferences the LMS instance that hosts the course. Each entry carries the instance’s domain, LMS platform, record ID, and system metadata.
Contains
domainstringThe base URL of the LMS instance hosting the course.
lmsstringcanvas, moodleThe learning management system the instance runs: “canvas” or “moodle”. Determines how the course is provisioned and how learners are launched into it. Returns the same value as lms.
idintegerThe system-generated unique identifier for the LMS instance record, used to link the course to its hosting platform.
sysobjectSystem metadata for the LMS instance record. Contains a single identifier property.
Contains
idstring or nullThe system-generated identifier for the LMS instance record as held in its system metadata block.
locationobject or nullReferences a location record which indicates the premises where any in-person elements of the course are held.
Contains
administrativeAreastring or nullThe administrative region for the course location, such as a state, province, or city district (e.g., “Arizona”).
countryCodestring or nullThe ISO 3166-2 country code for the course location (e.g., “US”).
localitystring or nullThe locality or city area for the course location (e.g., “Manhattan”).
namestringThe name of the venue or building where the course is held (e.g., “Pharos Hall”).
postalCodestring or nullThe postal or ZIP code for the course location (e.g., “10003”).
premisesstring or nullThe suite, room, lecture hall, or other specific area within a building where the course is held (e.g., “Suite 6020”).
streetstring or nullThe street name of the course venue (e.g., “Chelsea Piers”). Combine with streetNumber for the full address.
streetNumberstring or nullThe street number of the course venue (e.g., “60”). Combine with street for the full address.
subPremisesstring or nullAdditional detail within a building or suite, such as a floor or section (e.g., “Floor 3”).
maxNumOfEnrollmentsinteger or nullSpecifies the maximum number of learners allowed to enroll in the course (e.g., 18). This numeric limit ensures class size management and helps control course capacity.
minNumOfEnrollmentsinteger or nullDefines the minimum number of learners required for the course to proceed (e.g., 10). This numeric threshold ensures viability and helps determine if the course will be offered.
modearray of stringEnrollment mode for the course. Currently always returns “AUDIT”.
moodleCourseIdinteger or nullThe course’s identifier within Moodle. Populated when lms is “moodle”; returns null otherwise.
notesstring or nullAdditional course information such as registration deadlines, platform instructions, or special notices. Returns HTML markup and must be sanitised before rendering.
parentCourseobject or nullThe parent course record this course derives from, carrying the parent’s active status, slug, and system metadata. Returns null for courses that do not derive from a parent.
Contains
isActivebooleanIndicates whether the parent course record that this instance derives from is currently active.
slugstringA URL-friendly identifier for the parent course record, used in web links that reference the parent rather than a specific course instance.
sysobjectSystem metadata for the parent course record. Contains a single identifier property.
Contains
idstring or nullThe system-generated identifier of the parent course record from which this course instance derives.
partnerobjectThe client partner organization that owns the course. Carries the partner’s display name, its identifier, and the currency its courses are priced in.
Contains
currencystringSpecifies the currency in which the partner’s courses are priced and transacted. This governs how course price values are interpreted and displayed at checkout.
namestringSpecifies the display name of the client partner organization that owns the course.
partnerIdstringThe unique identifier of the client partner organization that owns the course. Every course in a single response carries the same value, matching the partner identified by the X-Noodle-Partner-Id request header.
prerequisitesstring or nullLists any requirements or recommended knowledge and skills students should have before enrolling in the course. This text area allows for a detailed explanation of prerequisites to help prospective learners assess their preparedness for the course.
priceInCentsintegerThe total price of the course in cents.
reportingGroupstring or nullIdentifies the designated reporting group for the course (e.g., “Basic Program Open to All”). This grouping is used for analytics and reporting purposes, categorizing courses based on specific criteria or program access levels.
requiresMembershipbooleanIndicates whether enrollment in the course is restricted to learners holding an active membership. A value of “true” means only learners with at least one matching active membership can enroll in or purchase the course.
schoolobjectReferences the school or content provider within the partner organization that offers the course. Each entry carries the school’s descriptive text, logo variants, tags, and associated university.
Contains
shortDescriptionstring or nullA brief description of the associated school, which may highlight the academic mission or key value propositions.
universityobjectReferences the university associated with the school that offers the course. Each entry carries the university’s name and its logo variants.
Contains
horizontalLogoobjectContainer for the university’s horizontal logo. Holds the image file reference used where a wide, horizontal lockup of the logo is required.
Contains
urlstringThis is the version of the image to be used in a horizontal context.
logoobjectContainer for the university’s standard logo. Holds the image file reference used as the default logo lockup.
Contains
urlstringThis is the standard version of the image.
namestringThis is the name of the university associated with the school that offers the course.
sectionCodestring or nullIdentifies the specific section of the course, typically used to distinguish different offerings of the same course within a term (e.g., “25S2”). This code helps in organizing and tracking individual course sections.
shortTitlestringThe course’s title.
slugstringA URL-friendly identifier for the course (e.g., “cyber-ms-01”), used in web links for easy navigation to the course page. This slug ensures a consistent and accessible reference to the course online.
In the example provided:
“nlpc” is an abbreviation set by the school — in this case it stands for noodle learning platform course “84011” is the number of the course within the school’s course catalogue–in this case, it is a 5-character string, but theoretically could be longer or shorter. “-” the dash separates the course code from the section code “26” is the year the section is offered, in this case “2026” “w” is the term the section is offered, in this case “winter” “1” is the way to number different sections in the same term. In this case, it indicates that this is the first section offered in winter 2026.
startDatestringThe date and time public enrollment opens, in UTC. Returns the same value as enrollmentStartDate.
startDateWithTimezonestringThe date and time public enrollment opens, in the course’s local zone named by timezone. Returns the same value as enrollmentStartDateWithTimezone.
syllabusstring or nullProvides a detailed outline of course content, required readings, and other essential resources (e.g., “Shakespeare, King Henry V. Edited by T.W. Craik…”). This rich text area allows for a comprehensive syllabus description to help students understand course expectations and materials.
sysobjectSystem metadata for the course record. Contains a single identifier property.
Contains
idstring or nullThe system-generated identifier for the course record as held in its system metadata block.
termsstring or nullIndicates the academic term during which the course is offered, selected from predefined options (e.g., “Spring 2025”). This single-select field helps specify the scheduled timing for course availability.
timezonestringAmerica/Anchorage, America/Phoenix, America/Chicago, America/New_York, Pacific/Honolulu, America/Denver, America/Los_Angeles, UTCThe academic term during which the course is offered (e.g., “Spring 2025”).
Other objects
CourseListResponse
| Property | Type | Description |
|---|---|---|
data | array | The matching course records. |
meta | object | — |
CourseResponse
| Property | Type | Description |
|---|---|---|
data | object | — |
ResponseMeta
| Property | Type | Description |
|---|---|---|
count | integer | The number of records in data. When paginating, this is the size of the page returned rather than the total across all pages. |
CartResponse
| Property | Type | Description |
|---|---|---|
data | object | — |
Cart
| Property | Type | Description |
|---|---|---|
cart_items | array | The courses currently in the cart. |
cart_items_count | integer | The number of items in the cart. |
cart_url | string | Where to send the learner to complete checkout on the NLP domain. |
id | integer | The cart’s identifier, used in the path of the other cart endpoints. |
partner_id | string | The Partner ID the cart belongs to. |
session_id | string | Identifies the shopper. Send this in X-Noodle-Cart-Session-Id to reach the same cart again. |
subtotal | integer | The cart total in cents. |
user_id | integer or null | The signed-in learner, where the cart belongs to one. |
CartItem
| Property | Type | Description |
|---|---|---|
id | integer | The cart item’s identifier. |
shopping_cart_id | integer | The cart this item belongs to. |
course_id | integer | The course’s id from the Courses API. |
external_id | string or null | The course’s sys.id from the Courses API, where present. |
quantity | integer | Always 1. A course can be enrolled in once. |
cart_item_metadata | object | Free-form data stored with the item, including any enrollment details supplied when it was added. |
created_at | string | — |
updated_at | string | — |
CartItemResponse
| Property | Type | Description |
|---|---|---|
data | object | — |
AddCartItemRequest
Supply either `course_id` or `external_id` to identify the course.
| Property | Type | Description |
|---|---|---|
course_id | integer | The course’s id from the Courses API. |
external_id | string | The course’s sys.id from the Courses API. Courses created more recently may not carry one, in which case use course_id. |
quantity | integer | Always 1. A course can be enrolled in once. |
item_type | string | — |
cart_item_metadata | object | Optional. Any key-value data to store with the item. Supply enrollment_data.team_id to enroll the learner as a member of that team; otherwise they are enrolled individually. |
DeleteCartItemResponse
| Property | Type | Description |
|---|---|---|
data | object | — |
WordPress integration
How Noodle’s own WordPress marketing sites consume this API, and what those sites hold outside it.
Overview
Three plugins connect an Engage CMS site to NLP. One retrieves and stores course data, one renders it on the page, and one adds the shopping cart. Together they produce a partner-branded marketing site whose course information stays aligned with NLP.
This section describes their behaviour so that an integration can reproduce it where needed. It is written for projects that will replace or rebuild an existing Noodle-built marketing site.
Noodle CMS Connections – Data held outside the API
Overview
Noodle builds partner marketing sites on Engage CMS, a WordPress theme and plugin suite that reads this API. Those sites display a combination of API data and information maintained locally in the CMS.
This distinction matters most when planning a project that will rebuild such a site against the API directly. Content that a site currently displays may originate in the CMS rather than in NLP, and would need an equivalent home in the new architecture. Establishing the proportion early is the single most useful input to an estimate.
Details
Three categories of data appear on a course record in the CMS:
- API-sourced — retrieved from NLP and normalised. Available to any client calling the API.
- Locally overridden — an administrator has replaced an NLP value for marketing purposes. NLP remains authoritative; the override exists only in the CMS.
- CMS-only — no NLP equivalent. These fields were introduced where partner marketing requirements moved ahead of the platform.
An integration reading the API directly receives category 1. Categories 2 and 3 are held in the CMS and would need to be reproduced.
Properties with no API equivalent
| Field | Type or values | Notes |
|---|---|---|
| Format | Asynchronous, Synchronous | Maintained in the CMS as a filter criterion. Related to but distinct from the API’s isSelfPaced property, from which a Format label can be derived. |
| Credit eligibility | Yes, No | Indicates whether a course may count toward degree options. |
| Partner | Text or select | Maintained in the CMS. It does not correspond to school.university.name, which describes something different. |
| CEU credits | Numeric, decimals supported | NLP does not model credits. Held as CMS metadata and displayed with a configurable label. |
| Hide from results | Boolean | A display control. Removes a course from carousels and filtered results while leaving it published and reachable by direct URL. |
| Image alt text and ARIA labels | Text | Images retrieved from the API arrive without alt text, caption, or description. Accessibility metadata is authored in the CMS. |
| Administrator-defined fields | Single-select or multi-select | Site administrators can add categorisations for faceted search. The set varies by site. |
| Course hours | Numeric | Held in CMS course settings. |
| Duration | Free text | A CMS marketing field. |
| Continuing education fields | Numeric or yes/no | Held in the CMS; related to but separate from CEU credits. |
API properties commonly overridden locally
These carry API values by default, which a CMS administrator may replace.
| Field | API property | Behaviour |
|---|---|---|
| Title | shortTitle |
The CMS value controls card and page display. |
| Featured image | cardImage.url |
The API image is the default; a CMS featured image takes precedence. |
| Categories | courseCategories |
Combined. The API supplies a defined list; administrators may add site-specific values. |
| Modality | courseModality |
The API returns online, in-person, and hybrid. CMS filter lists may differ. |
| Price | priceInCents |
A CMS-editable starting price is available, used chiefly for manually created cards. |
| Short description | courseShortDescription |
CMS-editable. Nothing is rendered when the API value is empty. |
| Prerequisites | prerequisites |
The API value is used first, with the CMS value as a fallback. |
| Course URL | courseUrl |
Overridable per course. Implementations may append enroll=true to direct learners into the NLP enrollment flow. |
| Course description | courseAbout |
Overridable per course. |
How local edits are preserved
A record-level flag marks a course as locally edited, and the scheduled sync leaves those values in place. Two related behaviours follow from it:
- Manually created course records are exempt from the rule that removes courses no longer present in the API.
- When a course is deleted in NLP, the corresponding CMS record is removed.
The wider design principle is worth carrying into any reimplementation: record ownership is most reliable when stored explicitly rather than inferred from whether a record appears in an API response.
Details
NLP Courses is the data layer. It calls the API, retrieves course objects, and stores them as WordPress records alongside instructors and schools. It provides the administrative tools for configuration, refresh scheduling, and the local overrides described above.
Engage NLP is the presentation layer, supplying the page blocks that render course data. It expects data already retrieved by NLP Courses.
NLP Courses Shopping Cart adds the cart experience to the marketing site and keeps it aligned with NLP.
Normalisation
Retrieved values are mapped to stable internal names before rendering. This keeps display code independent of API naming conventions, which vary between properties, and confines any future API change to a single mapping layer. Some values are derived during this step, such as generating several image sizes from one source image.
Grouping courses
Courses carry a grouping key and grouping title, which relate several course records that should be presented together while remaining separate for enrollment. A programme running several sessions is the common case.
The grouping key determines which page layout applies:
- A single-course page presents one enrollable course. It applies where a course carries no grouping key, or is the only active record with its key.
- A grouped page presents several sessions on one page, typically one panel per session. It applies where several records share a grouping key.
Where a grouped page exists, the individual sessions are usually suppressed from catalogue listings so that the group is presented once. Two controls do this: a per-course setting that hides a course from listings while keeping its page reachable, and a per-block setting that suppresses a whole grouping key. The per-course setting takes precedence.
Automatic page creation
An administrator designates an existing page as a template. When the sync encounters a new course, it creates a page from that template, associates it with the course, and publishes it at an indexable address. New pages are not added to navigation menus; they are reached through catalogue listings and direct links, and can be edited afterwards.
The benefit of retaining this behaviour in a rebuild is that a change made in NLP reaches the site without a second edit. An approach based on manual entry or file import introduces that second step for every change, not only for new courses.
Refresh scheduling
Refresh runs on a per-site schedule — Never, Hourly, Twice daily, Daily, or Weekly — following the site’s timezone, and can also be triggered manually to pick up a change immediately.
Records are processed in batches of up to fifty, with progress reported by data source. Selecting Never is a practical way to hold a site’s content steady while a large set of changes is made in NLP.
Conditional rendering
Blocks display a column, field, or section only where a value is present. Enabling a field in a block does not cause it to appear if the underlying value is empty. This behaviour appears throughout the block library and is worth reproducing in any equivalent implementation.
Search indexing
Faceted filtering is provided by an indexing plugin, and some values are copied into separate fields so they can be indexed. Reindexing runs automatically after a sync and is also required after a change to the facet configuration. Any field added to a filter carries this indexing step with it, and sorting chronologically requires the relevant date to be exposed as an indexed value.