info.version) that it describes.
November 2026
The Scoutworks MCP server, at
https://mcp.scoutworks.app/mcp. Claude Code, Claude Desktop, Cursor, VS Code and other MCP clients can now read your group’s data with an API key. See Connect an AI assistant to your data.- One tool for each read endpoint, with the same parameters and the same JSON. A new read endpoint becomes a tool too.
- The assistant sees only the tools that the key’s scopes open. Each tool call is one API request, and counts against the key’s rate limit.
- The MCP server is read-only. It has no tool for
POST /tasksorPATCH /tasks/{taskId}. - The API itself does not change.
6 November 2026
Tasks, and the first scopes that change data.
GET /task-boardslists your task boards with their columns and labels.GET /taskslists the tasks on them, and takesboardIdandupdatedSince. Both need the new scopetasks:read.POST /tasksadds a task andPATCH /tasks/{taskId}updates one: title, description, priority, due date, column and labels. Both need the new scopetasks:write. To complete a task, move it into its board’s done column.- A key reaches every board in its group, including restricted boards and the trustee duties board. Each board in
GET /task-boardssays itskind. On the trustee duties board every task is a trustee duty: adding one needs adueDate, and creates the duty. - A change is recorded as made by the admin who created the key. In Scoutworks the task shows the key’s name, and when it last changed the task.
- Send an
Idempotency-Keyheader withPOST /tasks, so a retry after a timeout cannot add the task twice. - Writes count towards a second limit of 30 changes a minute for each key. See Rate limits.
- Two new error codes:
subscription_required(402) when the group’s subscription has lapsed, which stops writes but not reads, andconflict(409) while a request with the sameIdempotency-Keyis still being processed. - A task’s description is free text, so the API never returns it.
5 November 2026
A figure that counts each young person once, and a fix to net growth, on
GET /nodes/metrics.- New figure:
young_people_count. It counts each young person with an active membership once, however many groups below your node they belong to.member_countis unchanged: it still counts memberships, so a young person in two groups counts in each. young_people_counthas a row per section. A young person counts once in each age group they are in, so its section rows can add up to more thanall. Never add itsvalueorownValueacross rows: read your own node’s row. It is counted directly each night, so it is neverstale.net_growth_12mchanges value. A young person who joined and left inside the 12 months used to count as one leaver and no joiner, so a group with turnover showed a lower figure than it should. They now count as one joiner and one leaver: no change. Expectnet_growth_12mto rise for groups where young people joined and left within the year.- Nights built before this release have no
young_people_countrows, and keep the oldnet_growth_12m. - See Data definitions for exactly what each figure counts.
5 November 2026
Section figures and the parent on
GET /nodes/metrics.- Each row now has
section.allis the total, as every row was before.member_countandwaiting_countalso have one row per section:squirrels,beavers,cubs,scouts,explorers,network, andunassignedfor those with no section. The sections sum toallexactly.net_growth_12mhasallonly. Nights built before this release haveallrows only, sosection=cubson such adayreturns no rows. - A new query parameter,
section, picks the rows. It defaults toall, so a call that worked before gets the same rows. A row’svaluealready includes everything below it: to total rows yourself, addownValue, nevervalue. Pass a section (section=cubs) for its rows only, orsection=anyfor every row. - Each row now has
parentId: the node directly abovegroupIdon the night the row was built. It keeps that value after a group moves district, so an older night reads as the tree stood then.nullat the top of the tree, under a deleted node, and on every row built before this release: those nights did not record the parent. - Section counts are exact, like the totals.
- Definitions corrected, counts unchanged.
member_countandnet_growth_12mcount memberships, as they always have: a young person in two groups counts once in each, so a district total counts them twice. The descriptions used to say “young people”. Every figure is now defined on one page, Data definitions.
4 November 2026
Keys for districts, counties, regions and the national team, and the node endpoints they read.
- A district or area admin creates a key in the district’s Settings → Integrations. It reads totals, never a person’s record.
GET /nodes/descendantslists the groups and nodes below yours that share data with you, at any depth. It needsnodes:structure:read.GET /nodes/metricslists one night’s totals (member_count,waiting_count,net_growth_12m) for your own node and each group or node below it that shares with you. Each row carriesgroupIdandasOf. Narrow withchildId,metricorday. It needsnodes:metrics:read.- The totals are built each night. A group that stops sharing, or moves district, shows in your totals within 24 hours.
GET /menow carriesgroup.tier:groupfor a group key, the level of the node for a district or area key.- A group key gets
403 insufficient_scopeon/nodes, and a district or area key gets the same on the group endpoints. See Keys for districts and above.
3 November 2026
More member detail under
members.contacts:read, so a new member record can be created complete in another system.gender: as the group recorded it, in lower case (usuallymale,female,otherorprefer_not_to_say), ornull.address: the member’s home address (line1,line2,city,county,postcode), ornull. Scoutworks holds one home address per member, given by the parents or carers, not one per parent.parents[].phone: each parent or carer’s phone number, ornull.- Every key that already holds
members.contacts:readgets these fields from this release. No new scope. A group admin who does not want them shared can remove the scope from a key in Settings → Integrations → API keys.
3 November 2026
The badge catalogue, and a fix to the published type of a badge’s
id.GET /badge-cataloguelists every built-in badge and your group’s own custom badges, with thesectionsthat can earn each one, thestageandseriesof a staged activity badge, and every requirement with a stableid, in the order the badge lists them. Badges of a nation your group hides (by its postcode, or its badge settings) are left out, as in the app. It needsbadges:read.- Every badge now has
key: the catalogue key of a built-in badge, for examplebadge_001, ornullfor a custom badge. Badge records carry it too, insidebadge. Use it to map to another system such as OSM. - A built-in badge’s
keyand its requirement ids do not change between releases. A requirementidis the same one a badge record’srequirementsuses. - Fix: the API reference said a badge’s
idis a UUID. A built-in badge’sidhas always been its catalogue key (badge_001); only a custom badge’s is a UUID. The reference now says it is a string. No value has changed. - A custom badge’s requirement wording is typed by a leader, so the catalogue leaves it out (
descriptionisnull).
3 November 2026
Sync only what changed:
updatedSince on GET /members, /events and /badges.- With
updatedSince, a list returns only the records that changed at or after that time. A change to a member, their membership in your group or a linked parent’s own record counts. So does a change to an event, your group’s place on it, or a new RSVP. A badge record counts as changed when it, its member or its badge changes. - Each page carries
nextUpdatedSince. Pass it asupdatedSincenext time. It is a little before your walk began, so no change is lost. - A sync does not report records that were deleted or left the list, parent links added or removed, or renames. Run a full read at least once a week. Pagination shows the whole loop, and the Sheets, Excel, n8n and Zapier recipes do it.
- Without
updatedSince, nothing changes.
3 November 2026
Requirement progress on badge records.
- Each record from
GET /badgesnow carriesrequirements: every requirement with recorded progress, with itsid,status(not_completed,planned,in_progressorcompleted) andcompletedAt. A requirement not listed has not been started. - A requirement
idcomes from the badge definition, for examplerequirement_056, or for a custom badge it is the id of that badge’s requirement. It does not change between releases, so you can map it to another system. - It needs only
badges:read. Leaders’ notes and sign-off notes are never included.
3 November 2026
A new list:
GET /sections.- It lists your group’s sections and units, with the
id,nameandtype(squirrels,beavers,cubs,scouts,explorersornetwork) of each. An Explorer unit has the typeexplorers. activeisfalsefor a section the group has closed. Closed sections stay in the list, so you can still match an older record that names one.- The
idis the same one that members, events and the waiting list use, so a sync can file each record under the right section. - It needs the
members:readscope. Each member’ssectionsalready shows these ids and names, so existing keys with that scope can read it at once.
24 September 2026
GET /me tells you more on your first call.environmentsays which Scoutworks deployment answered:production,staging,demoordevelopment. Demo holds only made-up data.links.docspoints to these docs, andlinks.trysuggests a first list request that your key’s scopes allow.- The description of
expiresAtnow says thatnullmeans the key never expires. - Browsers can now read the
RateLimit-*andRetry-Afterheaders, so a web page can show how many requests are left. - The developer docs and the Try it playground can call the API from the browser.
- A public sandbox key for the demo group.
Public beta
The first public version of the Scoutworks API.
- Read endpoints:
GET /me,/members,/events,/events/{eventId}/attendees,/badgesand/waiting-list. - Scopes for each area, plus
.contactsscopes that add dates of birth and parent details. - Cursor pagination, a fixed error shape and rate-limit headers.