ControlMap API – Objective Editing, Risk Detail & Health History
Summary
This release opens up objective editing and crosswalks, adds daily history to client health metrics, and returns much richer risk detail — full impact/likelihood scoring, mappings, and tags — with a matching set of new risk filters. Every {client_id} path now accepts your own tenant_id as well as the ScalePad client UUID, so you can call ControlMap with the identifier you already have.
It also restores several contracts that the 2026-08-04 release removed: the deprecated DELETE routes for evidence schedules and assessment-question unmapping work again, the evidence-mappings refresh response returns client_id again, and the Remediation in progress risk status is accepted again. Each is kept for backward compatibility and marked deprecated — see Deprecated below for the replacements.
Two breaking changes remain: the create-action-item response changes shape, and terminal pagination returns next_cursor: null again instead of omitting the field on the client health, evidence, and framework-objectives lists — a reversal of the 2026-08-04 behaviour that breaks loops written against it. Review both before upgrading. The major version stays v1, and the regional server list is unchanged.
Changes
New endpoints
Objectives
-
PATCH
/controlmap/v1/clients/{client_id}/frameworks/{framework_id}/objectives/{objective_id}- N/A → Available
- Type: addition
- Notes: Update an objective in place. Send only the fields you want to change:
status,target_maturity,current_maturity(nameplus a requiredobservation),implementation_details,in_scope,description, orremarks. When you send bothin_scopeandstatus,statusis applied last and may adjust the final scope.
-
POST
/controlmap/v1/clients/{client_id}/frameworks/{framework_id}/objectives/{objective_id}/mappings- N/A → Available
- Type: addition
- Notes: Map an objective to crosswalk objectives, supplied as objective codes grouped by compliance program name. Returns
204.
-
POST
/controlmap/v1/clients/{client_id}/frameworks/{framework_id}/objectives/{objective_id}/mappings/bulk-delete- N/A → Available
- Type: addition
- Notes: Remove crosswalk mappings from an objective, using the same program-scoped body shape. Empty lists result in no changes.
Risks
- GET
/controlmap/v1/clients/{client_id}/risks/categories- N/A → Available
- Type: addition
- Notes: List the risk categories configured for a client, with an optional
searchterm (case-insensitive, minimum 3 characters) to filter by name. Use it to populate category pickers and to resolve therisk_category_idvalues now accepted by risk search.
Client identifiers
{client_id}accepts your tenant ID- UUID only → UUID or
tenant_id - Type: addition
- Notes: Every ControlMap endpoint with a
{client_id}path segment now accepts either the ScalePad client UUID or that client'stenant_id. Existing calls that pass a UUID are unaffected.
- UUID only → UUID or
Client health
- GET
/controlmap/v1/clients/{client_id}/health- N/A → Available
- Type: addition
- Notes: The single-client health snapshot can now return daily history. Pass
include_history(any ofcompliance_score,risk_score,frameworks,evidence,controls,action_items,assessments,documents, orwork_progressto cover all five nested work-progress sections at once) plus an optionalstart_date/end_daterange inyyyy-MM-dd. The selected sections return ametric_historyarray of dated snapshots, andcompliance_scorealso returnstrend_datawith a daily 0–10 score.include_historydefaults tocompliance_score; the default window is the previous 7 days.
Risks
-
Richer risk detail on read
- N/A → Available
- Type: addition
- Notes: Risk responses now include
status_id,department_id,risk_category_id, andtreatment_codealongside their existing name fields, plus fullinherent_risk,current_risk, andtarget_riskobjects (impact and likelihood values with their option IDs and labels, the calculated score, a risk label, and a score colour). Each risk also returnsmappings— the compact code/name/type of every entity linked to it — andtags.
-
POST
/controlmap/v1/clients/{client_id}/risks/search- Filters and sorting expanded
- Type: addition
- Notes: Risk search accepts a
searchterm (case-insensitive across risk name and code) and new filters forid,name,status_id,owner.id,owner.name,department,department_id,risk_category,risk_category_id, the inherent/current/target impact and likelihood option IDs,current_risk_label, andtag. Sorting addscode,status,treatment,department, andrisk_category. All new filters and sorting options are optional, and an existing{}request remains valid.
Objectives
-
POST
/controlmap/v1/clients/{client_id}/frameworks/{framework_id}/objectives/search- Filters and sorting expanded
- Type: addition
- Notes: Objective search accepts a
searchterm across objective name and code, plusscope_id,level1_id, andlevel2_idfilters for implementation scope and hierarchy. Sorting addsid,sort_order, andstatus. Document mappings are now returned once per managed document and carry adocument_typeofpolicy,procedure, orgovernanceso you can resolve the correct destination.
-
remarksandobservationon objective detail- N/A → Available
- Type: addition
- Notes: Objective detail responses now return
remarksand the current assessmentobservation, matching the fields you can set through the newPATCHendpoint.
Action items
-
POST
/controlmap/v1/clients/{client_id}/action-items- Response shape changed
- Type: breaking change
- Notes: The create response is now a create-specific object rather than the full action item.
parent_entity_idis returned again; the date, effort, and milestone fields use the create naming (planned_end_date,actual_end_date,efforts,change_in_milestone);responsible_personis a string;costis an integer; and the linked collections returned byGET— documents, controls, risks, objectives, requirements, assessment questions, assets, and programs — along withcreated_at,created_by,updated_at,type, andsource_of_weakness, are not part of the create response. Read the created item back withGET /controlmap/v1/clients/{client_id}/action-items/{action_item_id}if you need those fields.
-
POA&M flag
- N/A → Available
- Type: addition
- Notes: Action item responses return
is_poam, indicating whether the item is included in the Plan of Action and Milestones, and the partial-update endpoint accepts it. Partial update also acceptsresponsible_department_idfor setting the responsible department by ID.
-
GET
/controlmap/v1/clients/action-items-summary- Generic envelope → documented response
- Type: improvement
- Notes: The response is now fully documented: each
dataentry pairs aclientwith itsaction_summaryprogress metrics. The wire format is unchanged.
Assessments
- Previous answer on question responses
- N/A → Available
- Type: addition
- Notes: Assessment question responses now include
past_answered_atandpast_answered_by, so you can show when a question was last answered and by whom.
Evidence
-
Program-scoped objective mapping
- N/A → Available
- Type: addition
- Notes: Evidence mapping requests accept an
objectivesarray of objective codes grouped byprogram_name, which resolves codes within a single compliance program instead of tenant-wide. The tenant-wideobjective_codesarray still works but is deprecated.
-
POST
/controlmap/v1/clients/{client_id}/evidence-mappings/refreshclientId→client_id- Type: improvement
- Notes: The refresh response returns
client_idagain, reversing the rename in the 2026-08-04 release.clientIdis still returned as a deprecated alias, so integrations written against either name keep working.
Pagination
next_cursoris always present- Field omitted →
nullon the last page - Type: breaking change
- Notes: On the client compliance-health, evidence, and framework-objectives list responses,
next_cursoris always returned and isnullon the last page, reversing the omit-on-last-page behaviour described in the 2026-08-04 release. Loops that test for a missing key should test fornullinstead.
- Field omitted →
Deprecated
-
DELETE
/controlmap/v1/clients/{client_id}/evidences/{evidence_id}/schedule- Removed → Available (deprecated)
- Type: deprecation
- Notes: This route works again after being removed in the 2026-08-04 release, so existing integrations are unblocked. It takes the same required
schedule_actionquery parameter as before. Migrate toPOST /controlmap/v1/clients/{client_id}/evidences/{evidence_id}/schedule/delete, a direct replacement, before the next major version.
-
DELETE
/controlmap/v1/clients/{client_id}/assessments/common/questions/{question_code}/mappings- Removed → Available (deprecated)
- Type: deprecation
- Notes: This route works again after being removed in the 2026-08-04 release. Migrate to
POST /controlmap/v1/clients/{client_id}/assessments/common/questions/{question_code}/mappings/bulk-delete, which takes the same body shape, before the next major version.
-
Risk status
Remediation in progress- Rejected → Accepted (deprecated)
- Type: deprecation
- Notes: Creating or updating a risk with
Remediation in progressis accepted again for backward compatibility after being rejected in the 2026-08-04 release.Needs Remediationis the current value; migrate to it before the next major version.
-
objective_codeson evidence mapping requests- Available → Deprecated
- Type: deprecation
- Notes: Use the program-scoped
objectivesarray instead, which resolves objective codes within a named compliance program.
-
clientIdon the evidence-mappings refresh response- Available → Deprecated
- Type: deprecation
- Notes: Read
client_idinstead. The camelCase alias remains for now and will be removed in a future version.
Dates
- Effective: [2026-09-22]
