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.
| Style | Endpoint pattern | Required parameters | Optional parameters | Working example (click to see the JSON) |
|---|---|---|---|---|
| Catalog list | /catalogs/ | None | page-size, page, legacy-id, type, name | /catalogs/?page-size=100&page=1&type=Undergraduate |
| Catalog, one record (no detail route) | /catalogs/ | legacy-id | None | /catalogs/?page-size=100&page=1&legacy-id=41 |
| Course list | /catalog/{catalogId}/courses/ | catalogId | page-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 courseId | None | /catalog/41/course/44779/ |
| Program list | /catalog/{catalogId}/programs/ | catalogId | 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 |
| Program list, code/type disambiguation (one record) | /catalog/{catalogId}/programs/ | catalogId | code, 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 programId | None | /catalog/41/program/5628/ |
| Hierarchy list | /catalog/{catalogId}/hierarchies/ | catalogId | page-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 entityId | None | /catalog/41/hierarchy/1963/ |
| Filter list | /catalog/{catalogId}/filters/ | catalogId | page-size, page, legacy-id, name | /catalog/41/filters/?page-size=100&page=1 |
| Filter list, found by name (one record) | /catalog/{catalogId}/filters/ | catalogId | name | /catalog/41/filters/?page-size=100&page=1&name=Course%20Descriptions |
| Filter detail (one record) | /catalog/{catalogId}/filter/{filterId}/ | catalogId, internal filterId | None | /catalog/41/filter/5344/ |
| Page list | /catalog/{catalogId}/pages/ | catalogId | page-size, page, legacy-id, name | /catalog/41/pages/?page-size=100&page=1 |
| Page list, found by name (one record) | /catalog/{catalogId}/pages/ | catalogId | name | /catalog/41/pages/?page-size=100&page=1&name=Tuition%20%26%20Fees |
| Page detail (one record) | /catalog/{catalogId}/page/{pageId}/ | catalogId, internal pageId | None | /catalog/41/page/5343/ |
| Media detail (one record) | /catalog/{catalogId}/media/{mediaId}/ | catalogId, internal mediaId | None | /catalog/41/media/5054/ |
| Location list | /catalog/{catalogId}/locations/ | catalogId | page-size, page, legacy-id, name | /catalog/41/locations/?page-size=100&page=1 |
| Location detail (one record) | /catalog/{catalogId}/location/{locationId}/ | catalogId, internal locationId | None | /catalog/41/location/66/ |
| Degree planner source | /catalog/{catalogId}/programs/ | catalogId | Same 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:
- 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 singleprogram-listentry hasid: 5628andurl: "/api/winona/catalog/41/program/5628/". - Detail, using that
id:/catalog/41/program/5628/– returns the full record, including the rendereddescriptionHTML thatmajor-map.jsscans 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:
| Option | Applies to | Purpose | Example |
|---|---|---|---|
data | All | Widget family: catalogs, courses, programs, entities, filters, pages, degree_planner, or locations | data-acalog-data="programs" |
gateway | JavaScript configuration | Catalog host used for JSON and public links | gateway: 'https://catalog.winona.edu' |
api | JavaScript configuration | Override the API base when it differs from the gateway | api: 'https://catalog.winona.edu' |
catalogId | All catalog-scoped widgets | Internal catalog ID; fixed-year lookup | data-acalog-catalog-id="41" |
catalogLegacyId, catalogType, catalogName | All catalog-scoped widgets | Resolve the catalog by legacy ID, type, or exact name | data-acalog-catalog-type="Undergraduate" |
display | List/content widgets | dynamic enables show/hide behavior; otherwise links navigate to the catalog | data-acalog-display="dynamic" |
linkText | Link widgets | Override the generated link label | data-acalog-link-text="View program" |
| Element contents | Content/dynamic widgets | Existing 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.