BSI Group APIbsigroup.com ↗
Search BSI Group training courses, qualifications, schedules, and categories. Filter by topic, standard, level, or delivery format via 9 structured endpoints.
What is the BSI Group API?
The BSI Group API provides 9 endpoints for querying training courses, qualifications, and scheduled sessions from bsigroup.com. Use search_training_courses to find courses by keyword, topic ID, or ISO standard ID, or call get_course_detail to retrieve full course metadata including duration, learning outcomes, course code, and a direct booking link. list_course_categories exposes the full taxonomy of topics, standards, levels, and delivery formats needed to drive other filters.
curl -X GET 'https://api.parse.bot/scraper/10a3ec1c-75a0-4c4b-82d3-dad846bc39fe/search_training_courses?page=1&query=ISO+9001&topics=1&standards=3' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace bsigroup-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""BSI Group Training API - discover courses, get details, check schedules."""
from parse_apis.bsi_group_training_api import (
BSITraining, CourseLevel, DeliveryFormat, CourseNotFound
)
client = BSITraining()
# List available categories to discover topic/standard IDs for filtering.
categories = client.categorylists.list()
print(categories.topics[0].id, categories.topics[0].name)
# Search for ISO 9001 courses — limit caps total items fetched.
for course in client.coursesummaries.search(query="ISO 9001", limit=3):
print(course.title, course.price, course.url)
# Filter by level using the enum, then drill into the first result.
course_summary = client.coursesummaries.by_level(
level=CourseLevel.LEAD_AUDITOR, limit=1
).first()
if course_summary:
# Navigate from summary to full detail (separate fetch).
detail = course_summary.details()
print(detail.title, detail.duration, detail.course_code)
# From the detail, fetch the schedule of available sessions.
sched = detail.schedule()
for entry in sched.schedules[:3]:
print(entry.date, entry.venue, entry.price, entry.availability)
# Typed error handling: attempt to fetch a non-existent course.
try:
client.courses.get(url="/en-GB/training-courses/does-not-exist-course/")
except CourseNotFound as exc:
print(f"Course not found: {exc.url}")
print("Exercised: categorylists.list, coursesummaries.search, by_level, details, schedule, courses.get")
Full-text search over BSI training courses with optional topic and standard filters. Returns paginated results ordered by relevance. Paginates via integer page counter. Each item is a lightweight summary; use get_course_detail for full information.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| query | string | Search keyword to filter courses. |
| topics | string | Comma-separated topic IDs to filter by (e.g. '37' for Risk Management). IDs available from list_course_categories. |
| standards | string | Comma-separated standard IDs to filter by (e.g. '16' for ISO 9001). IDs available from list_course_categories. |
{
"type": "object",
"fields": {
"items": "array of course summary objects with title, url, industry, topic, and price",
"pages": "integer total number of pages",
"total": "integer total number of matching courses",
"current_page": "integer current page number"
},
"sample": {
"data": {
"items": [
{
"url": "https://www.bsigroup.com/en-GB/training-courses/iso-9001-2026-transition-training-course/",
"price": "From £799",
"title": "ISO/FDIS 9001:2026 Transition Training Course",
"topic": "Quality Management",
"industry": "Multiple industries"
}
],
"pages": 4,
"total": 31,
"current_page": 1
},
"status": "success"
}
}About the BSI Group API
Course Search and Filtering
The search_training_courses and search_qualifications endpoints accept optional query, topics, and standards parameters and return paginated arrays of course objects. Each item includes title, url, industry, topic, and price. Pagination is controlled via the page parameter; the response includes pages, total, and current_page so you can walk the full result set. Topic and standard IDs used in filters are not arbitrary — they must come from list_course_categories, which returns structured arrays of topics, standards, levels, and delivery formats with their respective IDs and names.
Course Detail and Schedule Data
get_course_detail takes a course URL path or full URL and returns a rich object: title, duration, course_code, description, booking_link (pointing to the Salesforce booking page), whats_included, learning_outcomes, and who_should_attend. The course_code (e.g. QMS08001ENUK) is the key input for get_course_schedule, which returns an array of schedule objects each containing date, venue, language, price, and availability, along with a salesforce_url for the schedule page.
Browsing by Taxonomy
Three dedicated list endpoints let you browse courses by a single dimension without a text query. list_courses_by_topic accepts a topic_id from list_course_categories. list_courses_by_standard accepts a standard_id (e.g. '19' for ISO 9001). list_courses_by_level accepts a level name string such as 'lead auditor' or 'internal auditor'. list_courses_by_delivery_format filters by format strings including 'classroom-based', 'live online', 'on-demand elearning', and 'in-house'. All four return the same paginated course object shape.
The BSI Group API is a managed, monitored endpoint for bsigroup.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when bsigroup.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official bsigroup.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a course comparison tool that pulls schedules and pricing for multiple BSI ISO audit courses via
get_course_schedule. - Aggregate all BSI qualifications related to ISO 9001 by passing standard ID
'19'tolist_courses_by_standard. - Populate a learning management system with BSI course metadata including learning outcomes and target audience from
get_course_detail. - Generate a filterable directory of BSI courses grouped by delivery format using
list_courses_by_delivery_format. - Monitor seat availability for specific scheduled courses by polling
get_course_scheduleon a recurring basis. - Map BSI training offerings to job role requirements by filtering courses by level (e.g.
'lead auditor') usinglist_courses_by_level. - Sync a corporate training catalogue with current BSI course titles, prices, and booking links for internal procurement tooling.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does BSI Group have an official public developer API?+
What does `list_course_categories` return and why do I need it?+
list_course_categories returns four arrays: topics (with Id and Name), standards (with Id and Name), levels (with id and name), and delivery_formats (with id and name). The numeric IDs from topics and standards are required inputs for the topics and standards filter parameters in search_training_courses, search_qualifications, list_courses_by_topic, and list_courses_by_standard. Without calling this endpoint first, those filter values are not reliably known.Does `get_course_schedule` require a course code, or can I pass a URL?+
url, the endpoint resolves the course code from the course detail page and then fetches the schedule. If you already have the course_code from a prior get_course_detail call, you can pass it directly and skip the extra lookup. The response always includes the resolved course_code alongside the schedules array.Does the API cover BSI certification audits, standards documents, or membership data?+
Are course results available for regions outside the UK?+
en-GB locale path. Courses available in other regional storefronts (e.g. US, Asia-Pacific) are not currently covered. You can fork this API on Parse and revise it to target BSI's regional URL variants.