Explore the Acalog Widget API!


This template was provided to test any of the Widget API widgets. You can add the code from your own Publisher to this HTML file within this space to try it yourself. The rest of the pages provided in this template are here to serve as examples of what you could do.

Widget Testing

JSON Endpoint Reference

The Widget API uses JSON endpoints behind the widgets. Every link below is live and clickable - click one to see the actual JSON response for catalog 41.

Base URL: https://catalog.winona.edu/widget-api. For list routes, catalogId is the numeric catalog ID in the path. Detail routes use the internal API ID, not the legacy-id; list filters named legacy-id use the vendor's legacy ID. page-size and page are optional, but the widget client sends page-size=100&page=1.

StyleEndpoint patternRequired parametersOptional parametersWorking example (click to see the JSON)
Catalog list/catalogs/Nonepage-size, page, legacy-id, type, name/catalogs/?page-size=100&page=1&type=Undergraduate
Catalog, one record (no detail route)/catalogs/legacy-idNone/catalogs/?page-size=100&page=1&legacy-id=41
Course list/catalog/{catalogId}/courses/catalogIdpage-size, page, legacy-id, type, prefix, code, name/catalog/41/courses/?page-size=100&page=1&prefix=ACCT&code=211
Course detail (one record)/catalog/{catalogId}/course/{courseId}/catalogId, internal courseIdNone/catalog/41/course/44779/
Program list/catalog/{catalogId}/programs/catalogIdpage-size, page, legacy-id, type, degree-type, code, name/catalog/41/programs/?page-size=100&page=1&name=Accounting%20%28ACCT%29%20-%20BS%20Major
Program list, code/type disambiguation (one record)/catalog/{catalogId}/programs/catalogIdcode, type, plus optional page-size and page/catalog/41/programs/?page-size=100&page=1&code=ACCT&type=BS%20Major
Program detail (one record)/catalog/{catalogId}/program/{programId}/catalogId, internal programIdNone/catalog/41/program/5628/
Hierarchy list/catalog/{catalogId}/hierarchies/catalogIdpage-size, page, legacy-id, type, name/catalog/41/hierarchies/?page-size=100&page=1&name=Accounting
Hierarchy detail (one record)/catalog/{catalogId}/hierarchy/{entityId}/catalogId, internal entityIdNone/catalog/41/hierarchy/1963/
Filter list/catalog/{catalogId}/filters/catalogIdpage-size, page, legacy-id, name/catalog/41/filters/?page-size=100&page=1
Filter list, found by name (one record)/catalog/{catalogId}/filters/catalogIdname/catalog/41/filters/?page-size=100&page=1&name=Course%20Descriptions
Filter detail (one record)/catalog/{catalogId}/filter/{filterId}/catalogId, internal filterIdNone/catalog/41/filter/5344/
Page list/catalog/{catalogId}/pages/catalogIdpage-size, page, legacy-id, name/catalog/41/pages/?page-size=100&page=1
Page list, found by name (one record)/catalog/{catalogId}/pages/catalogIdname/catalog/41/pages/?page-size=100&page=1&name=Tuition%20%26%20Fees
Page detail (one record)/catalog/{catalogId}/page/{pageId}/catalogId, internal pageIdNone/catalog/41/page/5343/
Media detail (one record)/catalog/{catalogId}/media/{mediaId}/catalogId, internal mediaIdNone/catalog/41/media/5054/
Location list/catalog/{catalogId}/locations/catalogIdpage-size, page, legacy-id, name/catalog/41/locations/?page-size=100&page=1
Location detail (one record)/catalog/{catalogId}/location/{locationId}/catalogId, internal locationIdNone/catalog/41/location/66/
Degree planner source/catalog/{catalogId}/programs/catalogIdSame program filters: page-size, page, legacy-id, type, degree-type, code, name/catalog/41/programs/?page-size=100&page=1&name=Accounting%20%28ACCT%29%20-%20BS%20Major

Looking up a single record

This is the API call pattern this sample actually relies on (see major-map.js): a list call narrowed until it returns exactly one row, followed by a detail call using the internal id (or the url field) from that one row. Two real, clickable steps for the Accounting major:

  1. List, narrowed to one record by exact name: /catalog/41/programs/?page-size=100&page=1&name=Accounting%20%28ACCT%29%20-%20BS%20Major – the response's single program-list entry has id: 5628 and url: "/api/winona/catalog/41/program/5628/".
  2. Detail, using that id: /catalog/41/program/5628/ – returns the full record, including the rendered description HTML that major-map.js scans for major-map permalinks.

Not every family needs step 1: an exact legacy-id (catalogs) or a code + type pair (programs) can also narrow a list to one row directly, without a follow-up detail call, when the list response already contains everything you need. Use the detail call when you need fields the list response omits (for programs, that is description, which is where major-map links live).

Widget configuration options

Every widget reads options from matching data-acalog-* attributes or from the acalogWidgetize JavaScript object. The shared options are:

OptionApplies toPurposeExample
dataAllWidget family: catalogs, courses, programs, entities, filters, pages, degree_planner, or locationsdata-acalog-data="programs"
gatewayJavaScript configurationCatalog host used for JSON and public linksgateway: 'https://catalog.winona.edu'
apiJavaScript configurationOverride the API base when it differs from the gatewayapi: 'https://catalog.winona.edu'
catalogIdAll catalog-scoped widgetsInternal catalog ID; fixed-year lookupdata-acalog-catalog-id="41"
catalogLegacyId, catalogType, catalogNameAll catalog-scoped widgetsResolve the catalog by legacy ID, type, or exact namedata-acalog-catalog-type="Undergraduate"
displayList/content widgetsdynamic enables show/hide behavior; otherwise links navigate to the catalogdata-acalog-display="dynamic"
linkTextLink widgetsOverride the generated link labeldata-acalog-link-text="View program"
Element contentsContent/dynamic widgetsExisting inner HTML is used as the loading placeholder; text or basic HTML is safest<li>Loading...</li>

Location widgets are supported as list/content widgets. The library does not map locations to an anchor link widget.

For each family-specific filter, see its page. All query values are exact-match filters and should be URL-encoded.

These routes return JSON. The media response supplies the filename and legacy ID; major-map.js uses those values to construct the public /mime/media/view/... PDF URL.

SEO Considerations

Widget content is inserted after JavaScript runs. Modern search engines can often render JavaScript, but crawling and indexing can be delayed or incomplete compared with server-rendered HTML. AI search and answer systems have the same limitation: they may not execute a widget before extracting page content.

Use the widget for current, interactive catalog data, but keep each page's topic, explanatory copy, headings, and a crawlable link to the canonical catalog page in the original HTML. Avoid making the widget the only source of important program, course, or policy content. Use descriptive link text, stable canonical URLs, and maintain an XML sitemap for the host site; validate the rendered result in search-engine webmaster tools after publishing.