Skip to content

Courses

Catalog routes accept an authenticated user identity or a valid clientapisecret. Examples below use the server-side client credential.

GET /blendxapi/discovery/courses/
Query parameterDefaultDescription
limit8Page size, clamped to 1–100.
page11-indexed page number.
searchemptySearch course name, short description, or overview.
orgemptyComma-separated organisation names.
tagsemptyComma-separated tags; a match on any tag is included.
order_bycreated_at.desc{field}.{direction}, for example display_name.asc.
fieldslightlight for cards or full for all supported fields.
Terminal window
curl "https://<LMS_HOST>/blendxapi/discovery/courses/?search=safety&org=Acme&tags=compliance&order_by=display_name.asc" \
-H "clientapisecret: $BLENDX_CLIENT_API_SECRET"

The envelope contains courses, total_count, has_more, limit, page, and offset. If one item cannot be serialized, the request can still succeed and include partial_errors.

The default light fieldset contains every field below.

FieldDescription
idBlendX/Hasura course UUID used by checkout and client enrollment.
openedx_course_idOpen edX course key used by detail, outline, effort, and enrollment-check routes.
display_name, display_image, short_descriptionCourse card content.
price, currency, course_modeLowest visible mode price, currency, and mode.
originalPrice, discountPctOriginal price and applied regional discount.
nativeCurrency, nativeAmountOptional local-currency display hints.
start, endCourse availability dates.
org, org_nameOpen edX organisation key and learner-facing organisation name.
org_logo_url, org_favicon_urlOrganisation branding URLs.
tagsAssigned tag-name array.
is_invite_only, is_publishedCatalog visibility flags.
avg_rating, review_countRating summary.

With fields=full, each list item also contains:

FieldDescription
overviewCourse overview HTML.
effortConfigured course-effort value.
enrollment_start, enrollment_endEnrollment window.
certificate_available_dateCertificate availability date.
has_any_active_web_certificateWhether an active web certificate is configured.
link_to_courseLearner-dashboard course link.
language, self_paced, numberLanguage, pacing flag, and course number.
course_video_urlCourse promotional video URL.
available_course_modesAll visible purchase/enrollment modes.
is_newNew-course status.

Catalog prices are evaluated under each item’s owning organisation policy:

FieldMeaning
pricePrice after the applicable regional discount.
originalPricePrice before that discount.
discountPctApplied discount percentage, or 0.
nativeCurrencyOptional local-currency display hint. Omitted when unavailable.
nativeAmountOptional converted display amount. It is not the settlement amount.

Always use the checkout response as the authoritative amount to charge.

GET /blendxapi/discovery/course/{openedx_course_id}/

The response contains the following fields:

FieldDescription
id, openedx_course_idBlendX UUID and Open edX course key.
display_name, short_description, overviewCourse copy; overview is HTML.
course_image_url, course_video_urlCourse media URLs.
start, start_display, endCourse dates and display-ready start value.
effort, total_minutesConfigured effort and computed content duration.
enrollment_start, enrollment_endEnrollment window.
certificate_available_date, has_any_active_web_certificateCertificate availability.
language, self_pacedLanguage and pacing.
is_invite_only, is_published, is_newCatalog status flags.
price, course_mode, available_course_modesLowest visible offer and all visible modes.
originalPrice, discountPct, nativeCurrency, nativeAmountRegional price fields; native fields are optional.
organisation, organisation_idOrganisation short name and UUID.
organisation_logo_url, organisation_favicon_urlOrganisation branding URLs.
course_structureHierarchical content structure, or null for fields=summary.
avg_rating, reviewsRating and review data.

Each entry in available_course_modes contains modeSlug, minPrice, modeDisplayName, currency, expirationDatetime, visible, description, upsellableCourseModes, and hasCertificate.

Add ?fields=summary to set course_structure to null and skip the effort traversal, so total_minutes is 0:

Terminal window
curl "https://<LMS_HOST>/blendxapi/discovery/course/course-v1%3AAcme%2BSAF101%2B2026_T1/?fields=summary" \
-H "clientapisecret: $BLENDX_CLIENT_API_SECRET"

The course-detail cache defaults to 300 seconds. Regional price fields are applied after the cached base response so one visitor’s location is not reused for another.

GET /blendxapi/discovery/course-outline/{openedx_course_id}/

The top level contains sections, total_sections, total_subsections, and course_info.

  • Each section contains name, usage_key, hide_from_toc, visible_to_staff_only, and subsections.
  • Each subsection contains name, usage_key, inaccessible_after_due, hide_from_toc, visible_to_staff_only, exam, and units.
  • Each unit contains name and usage_key.
  • exam, when present, contains is_practice_exam, is_proctored_enabled, and is_time_limited.
  • course_info contains course_key, title, published_at, published_version, days_early_for_beta, entrance_exam_id, self_paced, and course_visibility.

This is catalog structure, not a learner-specific courseware-access response.

POST /blendxapi/discovery/courses/effort/
Content-Type: application/json
{"course_ids":["course-v1:Acme+SAF101+2026_T1"]}

Returns a map from course key to total_minutes. Up to 50 IDs are processed; results are cached for 1 hour.

POST /blendxapi/discovery/courses/is-new/
Content-Type: application/json
{"course_ids":["course-v1:Acme+SAF101+2026_T1"]}

Returns a map from course key to boolean. Up to 100 IDs are processed.

GET /blendxapi/discovery/check-enrollment/{openedx_course_id}/

With a valid learner session, the response identifies enrollment and the current mode:

{"enrolled": true, "mode": "honor"}

Without a learner identity, the route returns {"enrolled": false} even when the server-side storefront credential is valid.