Modern TypeScript client for the Online Scout Manager (OSM) API.
- TypeScript-first — full type definitions for all API responses
- Zero dependencies — uses native
fetch(Node 18+) - Instance-based — no global state, supports multiple clients
- ESM + CJS — works everywhere
npm install onlinescoutmanager
import { OSMClient } from "onlinescoutmanager"; const osm = new OSMClient({ apiId: "your-api-id", // Obtain from OSM Support token: "your-api-token", }); // Authorize with your OSM credentials await osm.authorize("you@example.com", "your-password"); // Now use any resource const members = await osm.members.list("sectionId", "termId");
| Option | Type | Required | Description |
|---|---|---|---|
apiId |
string |
✅ | Your OSM API ID |
token |
string |
✅ | Your OSM API token |
baseUrl |
string |
— | Override the API base URL (advanced) |
Authenticates with OSM. Must be called before any other API method.
await osm.authorize("leader@scouts.org.uk", "password"); console.log(osm.isAuthorized); // true
// List all members in a section/term const members = await osm.members.list(sectionId, termId); // Get individual member details const member = await osm.members.get(sectionId, scoutId); // Get member transfers const transfers = await osm.members.getTransfers(sectionId); // Get patrols with members const patrols = await osm.members.getPatrols(sectionId, termId); // Get census details const census = await osm.members.getCensus(sectionId, termId); // Get flexi-records (pass true for archived) const records = await osm.members.getFlexiRecords(sectionId); // Get deletable members const deletable = await osm.members.getDeletable(sectionId);
// Get attendance records const attendance = await osm.attendance.get(sectionId, termId, "cubs"); // Get badge requirements for a meeting date const badges = await osm.attendance.getBadgeRequirements(sectionId, "cubs", "2026-01-14"); // Update attendance await osm.attendance.update({ sectionId: "100", termId: "200", scoutIds: [3008213], selectedDate: "2026-01-14", present: "Yes", section: "cubs", });
// Get programme summary for a term const summary = await osm.programme.getSummary(sectionId, termId); // Get detailed programme for a meeting const details = await osm.programme.getDetails(sectionId, eveningId); // Get parent rota members const rota = await osm.programme.getParentRotaMembers(sectionId, eveningId); // Get programme attachments const attachments = await osm.programme.getAttachments(sectionId, eveningId); // Update a meeting await osm.programme.updateMeeting(sectionId, eveningId, { title: "New Title" });
const sections = await osm.sections.list(); const terms = await osm.sections.getTerms();
const cloud = await osm.badges.getTagCloud(sectionId, termId, "cubs");
const dashboard = await osm.dashboard.getNextThings(sectionId, termId, "cubs");
// Get custom data for a member const data = await osm.customData.get(sectionId, memberId); // Update custom data await osm.customData.update(sectionId, memberId, groupId, { firstname: "Updated", });
// Get email contacts const contacts = await osm.email.getContacts(sectionId); // Send an email template await osm.email.sendTemplate(sectionId, "Subject", emailsObj, editsObj);
import { OSMError, OSMAuthError } from "onlinescoutmanager"; try { await osm.members.list("1", "2"); } catch (err) { if (err instanceof OSMAuthError) { // Not authorized — call osm.authorize() first } if (err instanceof OSMError) { console.error(err.status); // HTTP status code console.error(err.body); // Raw response body } }
- Node.js 18+
ISC © Daniel J. Pomfret