ScalePad Tools
Written By Christopher Scaminaci
Last updated 7 days ago
ScalePad Tools
scalepad_ · 384 tools · Free 182 · Pro 202
Five separately-subscribed ScalePad products behind one personal API key: Core, Lifecycle Manager, ControlMap, Quoter and Backup Radar. The region is stored as a code - US, EU, Canada or Australia. ControlMap is served in all four and Backup Radar in the US and EU, while Core, Lifecycle Manager and Quoter are US-only and stay on the US gateway whatever region is stored. Paging is uniform: a page size of 1 to 200 with an opaque cursor. Filters use the vendor's field, operator and value grammar and are passed as one filters argument, because Core alone documents around 130 filter keys. The rate limit is 50 requests per 5 seconds per key. A 402 means that product is not subscribed - Lifecycle Manager needs LM Pro or higher and Backup Radar its own subscription - and a 401 can mean the key's owning user was deactivated or lost Administrator permission. Lifecycle Manager exports return a short-lived link to a PDF, CSV or spreadsheet.
All connector tools · ScalePad setup guide
ScalePad tool groups
- Backup Radar — 3 tools
- Backup Radar (classic) — 7 tools
- ControlMap Action Items — 10 tools
- ControlMap Assessments — 11 tools
- ControlMap Controls — 11 tools
- ControlMap Documents — 4 tools
- ControlMap Evidence — 13 tools
- ControlMap Evidence Requests — 5 tools
- ControlMap Frameworks — 4 tools
- ControlMap Governance — 8 tools
- ControlMap Health — 2 tools
- ControlMap Policies — 10 tools
- ControlMap Procedures — 8 tools
- ControlMap Reports — 2 tools
- ControlMap Risks — 10 tools
- Core Clients — 2 tools
- Core Contacts & Members — 4 tools
- Core Hardware Assets — 2 tools
- Core Integrations — 2 tools
- Core Opportunities — 2 tools
- Core Product Catalog — 2 tools
- Core SaaS Assets — 4 tools
- Core Service Contracts & Tickets — 4 tools
- Core Sites — 2 tools
- LM Account & Insights — 6 tools
- LM Action Items — 17 tools
- LM Assessment Templates — 5 tools
- LM Assessments — 10 tools
- LM Budget & Forecast — 8 tools
- LM Client Groups — 5 tools
- LM Clients — 4 tools
- LM Contacts — 5 tools
- LM Contracts — 7 tools
- LM Deliverable Templates — 10 tools
- LM Deliverables — 20 tools
- LM Goal Templates — 5 tools
- LM Goals — 20 tools
- LM Hardware Lifecycles — 7 tools
- LM Initiative Templates — 6 tools
- LM Initiatives — 30 tools
- LM Meeting Types — 4 tools
- LM Meetings — 10 tools
- LM Notes — 6 tools
- LM Opportunities — 2 tools
- LM Roadmap Exports — 3 tools
- LM SaaS Management — 2 tools
- LM Tickets — 1 tool
- Quoter Categories — 5 tools
- Quoter Contacts — 4 tools
- Quoter Item Groups — 9 tools
- Quoter Item Options — 10 tools
- Quoter Item Tiers — 5 tools
- Quoter Items — 5 tools
- Quoter Manufacturers — 5 tools
- Quoter SupplierSync Datafeeds — 1 tool
- Quoter Suppliers — 6 tools
- Quotes & Authoring — 9 tools
Backup Radar
scalepad_br_get_client_health details
scalepad_br_get_client_health details
[ScalePad] Get the daily backup-health history for ONE ScalePad client. Returns {client:{name, client_id}, data:[...]} — note the array is named 'data' here, whereas scalepad_br_list_clients_health names the same per-day array 'history'. Each entry carries date and a compliance object (pending_count, at_risk_count, in_compliance_count, out_of_compliance_count, out_of_compliance_no_results_count). Pass the ScalePad client_id returned by scalepad_br_list_clients_health or scalepad_core_list_clients — NOT a Backup Radar company identifier. This operation documents no 404: an unknown, inaccessible, or missing client surfaces as a 400 alongside genuine validation failures, so read the vendor error detail instead of inferring not-found from the status. Requires an ACTIVE Backup Radar product subscription of its own (HTTP 402 PRODUCT_SUBSCRIPTION_REQUIRED otherwise), and is served only from the US and EU ScalePad gateways.
scalepad_br_list_clients_devices details
scalepad_br_list_clients_devices details
[ScalePad] List monitored backup devices with their most recent result and daily SLA history. Cursor-paginated: data[], total_count, next_cursor. Each device carries br_device_id (the encrypted URL-safe Backup Radar identity — always present, and the reliable key to deduplicate on), br_job_name, br_device_name, br_backup_classification (Primary Backup | Primary Verification | Primary Boot Verification | Replication | System Alert), client (ScalePad name/client_id plus br_company_name, all nullable), last_result[] ({status: success|warning|error, date} — an empty array means no result has arrived yet, and several entries can share a timestamp when one result raised multiple flags), and history[] (most-recent-first, each {date, sla_status} where sla_status is Pending | At Risk | In Compliance | Out Of Compliance | Out Of Compliance - No Results; history is null when there is no linked backup plan or the row is a system alert). Devices are returned whether or not their Backup Radar company is mapped to a ScalePad company — the ScalePad-side fields device_id and device_name are NULL on unmapped rows. Requires an ACTIVE Backup Radar product subscription of its own (HTTP 402 PRODUCT_SUBSCRIPTION_REQUIRED otherwise), and is served only from the US and EU ScalePad gateways.
scalepad_br_list_clients_health details
scalepad_br_list_clients_health details
[ScalePad] List ScalePad clients with their daily backup-health history from Backup Radar. Cursor-paginated: returns data[] (each entry is {client:{name, client_id}, history:[...]}), total_count, and next_cursor (null on the last page). Each history entry carries date (yyyy-MM-ddTHH:mm:ssZ) and a compliance object of five integer counts — pending_count, at_risk_count, in_compliance_count, out_of_compliance_count, out_of_compliance_no_results_count (the last two are distinct states; do not collapse them). History ends on the tenant's current LOCAL date, not the caller's timezone. Pass a returned client.client_id to scalepad_br_get_client_health for one client's detail. Requires an ACTIVE Backup Radar product subscription of its own — any other ScalePad subscription is not enough and the call returns HTTP 402 (PRODUCT_SUBSCRIPTION_REQUIRED). Backup Radar is served only from the US and EU ScalePad gateways.
Backup Radar (classic)
scalepad_br_get_backup details
scalepad_br_get_backup details
[ScalePad] Get one Backup Radar backup's detail from the classic API. Returns a single object with the same shape as an entry of scalepad_br_list_backups (backupId, companyName, deviceName, deviceType, jobName, methodName, backupType, status, daysInStatus, isVerified, lastResult, lastSuccess, ticketCount, failureThreshold, treatWarningAsSuccess, note, dayStartHour, tags, standalone, ticketingCompany, history). This operation documents no 404 — an unknown or inaccessible backupId surfaces as a 400 alongside genuine validation failures, so read the vendor error detail rather than inferring not-found from the status. Requires an active Backup Radar subscription, and is served from the US and EU only.
scalepad_br_get_backup_results details
scalepad_br_get_backup_results details
[ScalePad] Get the individual backup RESULTS (the parsed status emails) for one Backup Radar backup. Page/size shaped like the lists: {Total, Page, PageSize, TotalPages, Results:[...]}, where each result carries dateTime, resultId, and the four independent flags success, warning, failure and manual — they are separate booleans, not one status field, and more than one can be true on the same result. Use scalepad_br_get_backup for the backup's rolled-up status instead. Requires an active Backup Radar subscription, and is served from the US and EU only.
scalepad_br_get_backups_overview details
scalepad_br_get_backups_overview details
[ScalePad] Get Backup Radar's overview counts — the tenant-wide totals behind the portal's header. Takes no arguments. Returns six integers: backups, office365, workstations, activePolicies, inactivePolicies, retiredPolicies. The cheapest call on this API, so it is the natural first read to confirm the Backup Radar key and region are right before paging any list. Requires an active Backup Radar subscription, and is served from the US and EU only.
scalepad_br_list_backup_filters details
scalepad_br_list_backup_filters details
[ScalePad] List the filter values this Backup Radar tenant actually has — the companies, tags, backup methods, device types, statuses and policy types that scalepad_br_list_backups accepts in its filtersJson list filters. Takes no arguments. Call this FIRST when filtering by any of those: the vendor ignores a value it does not recognize, so a guessed company or status name comes back as a full unfiltered page rather than an error. Requires an active Backup Radar subscription, and is served from the US and EU only.
scalepad_br_list_backups details
scalepad_br_list_backups details
[ScalePad] List monitored backups from Backup Radar's classic API. Page/size paginated: returns {Total, Page, PageSize, TotalPages, Results:[...]}. Each result carries backupId (int64 — pass it to scalepad_br_get_backup and scalepad_br_get_backup_results), companyName, deviceName, deviceType, jobName, methodName, backupType {id,name}, status {id,name}, daysInStatus, isVerified, lastResult and lastSuccess timestamps, ticketCount, failureThreshold, treatWarningAsSuccess, note, dayStartHour, tags[], standalone, ticketingCompany, and history[] when HistoryDays was requested (each entry: date, status, lastResultDate, isScheduled, daysInStatus, countSuccess/countWarning/countFailure/countNoResult, daysSinceLastResult, daysSinceLastGoodResult, resultsCount). This is Backup Radar's OWN API, not ScalePad's Backup Radar surface — for client-level backup-health rollups use scalepad_br_list_clients_health instead. Requires an active Backup Radar subscription, and is served from the US and EU only.
scalepad_br_list_inactive_backups details
scalepad_br_list_inactive_backups details
[ScalePad] List INACTIVE backups — jobs Backup Radar has stopped receiving results for. Page/size paginated: {Total, Page, PageSize, TotalPages, Results:[...]}, each carrying backupId, companyName, deviceName, deviceType, jobName, methodName, backupType {id,name}, emailFrom (the address the status emails arrived from) and lastReceived. Note the narrower shape: an inactive row carries NO status, history, tags or ticket counts — read scalepad_br_get_backup with its backupId for those. Inactive is not retired; retired jobs are a separate list (scalepad_br_list_retired_backups). Requires an active Backup Radar subscription, and is served from the US and EU only.
scalepad_br_list_retired_backups details
scalepad_br_list_retired_backups details
[ScalePad] List RETIRED backups — jobs someone deliberately retired in Backup Radar, as opposed to jobs that merely went quiet (scalepad_br_list_inactive_backups). Page/size paginated: {Total, Page, PageSize, TotalPages, Results:[...]} with the same narrow row shape as the inactive list (backupId, companyName, deviceName, deviceType, jobName, methodName, backupType, emailFrom, lastReceived). Requires an active Backup Radar subscription, and is served from the US and EU only.
ControlMap Action Items
scalepad_cm_create_client_action_item details
scalepad_cm_create_client_action_item details
[ScalePad] Create a remediation action item for a client. Returns 201 with the created record (id, code, parent_entity_id, status, weakness_name, weakness_description, corrective_action, responsible_person, responsible_department, roadmap, dates, currency, priority, cost, milestones, change_in_milestone). Only three properties are schema-required: weakness_name, priority and currency. ScalePad resolves responsible_person and responsible_department against existing users/departments and returns INVALID_RESPONSIBLE_PERSON / INVALID_DEPARTMENT when they do not exist. There is no documented idempotency key, so never blind-retry this call — re-check with scalepad_cm_search_client_action_items first. Map the new item to objectives, controls, risks or questions afterwards with scalepad_cm_map_client_action_item; the create body takes no mappings.
scalepad_cm_create_client_action_item_document details
scalepad_cm_create_client_action_item_document details
[ScalePad] Attach ONE document you already hold to an action item, uploading it through ScalePad in a single call (vendor multipart/form-data operation, one binary 'file' part). Returns the vendor's declared 200 with {id, code, documents[{file_name, document_id}]}. The vendor caps each upload at 10 MB; because MCP has no binary parameter type the content is passed here as base64 and decoded into a real binary part before sending, so the base64 text is roughly a third larger than the file itself. Use THIS tool for a single modest file whose bytes you have. Use scalepad_cm_create_client_action_item_document_signed_url instead when you have several files, a large file, or a file the end user will upload themselves — that tool returns pre-signed URLs and the bytes never pass through StackJack.
scalepad_cm_create_client_action_item_document_signed_url details
scalepad_cm_create_client_action_item_document_signed_url details
[ScalePad] Register one or more documents against an action item and get back vendor-minted pre-signed UPLOAD urls — an ordinary JSON POST, not a file transfer. Returns 201 with {id, code, documents[{file_name, document_id, signed_url, expires_in_seconds}]} (300 seconds in the vendor example). You then send each file's bytes yourself to its signed_url using the method the response names, before it expires; that URL is already authorized, so do NOT attach the ScalePad x-api-key to the storage request. ScalePad does not publish required storage headers, checksums, a maximum batch size or a completion callback — honor whatever the runtime response returns and invent nothing. Choose this over scalepad_cm_create_client_action_item_document for batches, for files near or above the 10 MB direct-upload cap, or when a human will do the uploading.
scalepad_cm_delete_client_action_item details
scalepad_cm_delete_client_action_item details
[ScalePad] PERMANENTLY delete an action item. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the item is not found. ScalePad's own changelog states that action-item deletion removes the record AND all associated data — its documents, mappings and history go with it — and documents no soft delete, restore or undo. Confirm the exact client and the exact item (read it back with scalepad_cm_get_client_action_item first) before calling, and prefer setting status to Not Applicable via scalepad_cm_update_client_action_item when the goal is only to take an item out of the active workload.
scalepad_cm_get_client_action_item details
scalepad_cm_get_client_action_item details
[ScalePad] Get one action item in full for a client. Adds to the search-row fields the complete relationship set: documents[] {id, file_name}, objectives[] {id, name, code, program_name}, controls[] {id, name, code}, risks[] {id, name, code} and assessment_questions[] {id, name, code} — the codes in those arrays are exactly the values scalepad_cm_map_client_action_item and scalepad_cm_unmap_client_action_item accept. Dates come back as planned_start_date / planned_end_date / actual_start_date / actual_end_date here (the search rows use the *_completion_date spelling for the same two fields).
scalepad_cm_list_clients_action_items_summary details
scalepad_cm_list_clients_action_items_summary details
[ScalePad] Across EVERY client of the MSP — takes NO client id. Cursor-paginated remediation roll-up for the whole client base: returns {data[], total_count, next_cursor} where each row is {client {id, name, tenant_id}, action_summary {completed, review, in_progress, not_started, not_applicable, total, completion_percentage}}. Keep paging until next_cursor is null. This tool returns COUNTS ONLY — it never lists individual action items; use scalepad_cm_search_client_action_items with a client id for the item rows.
scalepad_cm_map_client_action_item details
scalepad_cm_map_client_action_item details
[ScalePad] LINK an action item to the compliance entities it remediates. For an action item the linkable entities are framework objectives (requirements), assessment questions, risks, controls, assets and asset types — each identified by its BUSINESS CODE (or, for asset types, by name), never by numeric id. Succeeds with HTTP 204 and no body (this tool returns ). Only the non-empty arrays you send are applied; empty or omitted arrays are ignored, so a body with no codes is accepted but does nothing — send at least one populated array. Mapping is additive: it never removes existing links (use scalepad_cm_unmap_client_action_item for that). Read current links from the objectives[] / assessment_questions[] / risks[] / controls[] arrays of scalepad_cm_get_client_action_item.
scalepad_cm_search_client_action_items details
scalepad_cm_search_client_action_items details
[ScalePad] For ONE client, by client id: search that client's remediation action items. This is a READ despite using HTTP POST — the verb only carries the query body and nothing is persisted (vendor operationId a_actionitem); it replaced the retired GET /action-items list route. Returns client {id, name, tenant_id}, action_summary {completed, review, in_progress, not_started, not_applicable, total, completion_percentage}, and action_items {total_count, next_cursor, data[]}. Each row carries id, code (e.g. AI-9), weakness_name, weakness_description, status, priority, created_by and responsible_person (each {id, name, email}), responsible_department, corrective_action, milestones, changes_to_milestones, source_of_weakness, currency, cost, roadmap, effort_in_hours, requirements[] and timestamps. Beware one vendor inconsistency: search rows spell the end dates planned_completion_date / actual_completion_date while scalepad_cm_get_client_action_item returns planned_end_date / actual_end_date for the same values.
scalepad_cm_unmap_client_action_item details
scalepad_cm_unmap_client_action_item details
[ScalePad] UNLINK an action item from objectives, assessment questions, risks, controls, assets or asset types. The codes you send identify only the LINKS to remove — neither the action item nor the mapped entities are deleted — but the relationship removal is a real state change with no undo, so echo the exact action item and every code back to the user before calling. Succeeds with HTTP 204 and no body (this tool returns ); empty or omitted arrays make no changes. Despite the HTTP POST verb this is a removal: the vendor path is .../mappings/bulk-delete.
scalepad_cm_update_client_action_item details
scalepad_cm_update_client_action_item details
[ScalePad] Partially update an action item (HTTP PATCH). Only the properties you send change; everything else is left alone. Returns 200 with the patched record. Every property is optional here — including the three the create call requires — but weakness_name, if present, must not be empty. This is the tool for status transitions and for recording actual start/end dates as remediation progresses. To change an item's LINKS to objectives, controls, risks or questions use scalepad_cm_map_client_action_item / scalepad_cm_unmap_client_action_item instead; relationships are not patchable here.
ControlMap Assessments
scalepad_cm_create_client_assessment_question_response details
scalepad_cm_create_client_assessment_question_response details
[ScalePad] Add a RESPONSE — a free-text entry on an assessment question's note thread. This does NOT set or change the question's answer (use scalepad_cm_update_client_assessment_question_answer for that). Returns 201 with {id, question_code, response, provided_by, created_at, updated_at, created_by {id, full_name}}; keep the returned id, because editing the note later requires it in the request body. A question can carry many responses — each call appends a new one rather than replacing the last.
scalepad_cm_delete_client_assessment_question_answer details
scalepad_cm_delete_client_assessment_question_answer details
[ScalePad] CLEAR the saved ANSWER on an assessment question, returning it to unanswered. Succeeds with HTTP 204 and no body (this tool returns ). Scope is deliberately narrow and worth stating to the user: this removes only the answer selection — the question itself, its note-thread responses, and its mappings to evidence/action items/policies/procedures all survive. It is still a real data loss (the previous selection and its answered_by/answered_at attribution are gone) and it lowers the client's assessment completion figures. To DELETE a note instead, use scalepad_cm_delete_client_assessment_question_response.
scalepad_cm_delete_client_assessment_question_response details
scalepad_cm_delete_client_assessment_question_response details
[ScalePad] PERMANENTLY delete ONE response (note) from an assessment question's thread. Succeeds with HTTP 204 and no body (this tool returns ). Here the response id is a PATH parameter, unlike the edit tool which carries it in the body. The question, its answer and its other responses are untouched, but the deleted note and its author attribution are unrecoverable — ScalePad documents no soft delete or restore. Confirm the exact note (read responses[] from scalepad_cm_search_client_assessment_questions) before calling. Do not use this to clear the question's ANSWER — that is scalepad_cm_delete_client_assessment_question_answer.
scalepad_cm_get_client_assessment_question details
scalepad_cm_get_client_assessment_question details
[ScalePad] Get one assessment question in full, addressed by its question CODE (not its numeric id). Returns id, code, question, owner {id, full_name}, status, auditor_status, answer_options[] {id, answer, order} — the authoritative list of values the answer write will accept for THIS question — plus the linked action_items[] {id, title, code, description, due_at}, objectives[] {id, code, name, program_name}, delegated_to and assessment_status. Read answer_options before calling scalepad_cm_update_client_assessment_question_answer. This fragment declares no 400, so a bad code may surface as 404.
scalepad_cm_get_client_assessment_summary details
scalepad_cm_get_client_assessment_summary details
[ScalePad] For ONE client, by client id: that client's assessment completion summary. Returns answering_progress {total_questions, answered_questions, answered_questions_percentage, yes, no, partially, na}, assessment_score_percentage, and question_group_progress[] {name, count, answered, not_answered, yes, no, partially, na}. Setting includeFrameworkAssessmentStats adds frameworks_count and frameworks[] {framework_id, framework_name, answering_progress, assessment_score_percentage}. There is no pagination envelope. Field-name caveat: the vendor's prose describes the default payload as assessment_question_groups / grades / assessment_stats while its schema and examples use the names listed above — trust the returned JSON. For every client at once use scalepad_cm_list_clients_assessment_summary.
scalepad_cm_list_clients_assessment_summary details
scalepad_cm_list_clients_assessment_summary details
[ScalePad] Across EVERY client of the MSP — takes NO client id. Cursor-paginated assessment completeness for the whole client base, for partner-level dashboards: returns {data[], total_count, next_cursor} where each row is {client {id, name, tenant_id}, assessment_summary {yes, no, partially, not_answered, not_applicable, answering_percentage, total}}. Keep paging until next_cursor is null. This roll-up is counts only and has no per-framework breakdown — call scalepad_cm_get_client_assessment_summary with includeFrameworkAssessmentStats for that, one client at a time.
scalepad_cm_map_client_assessment_question details
scalepad_cm_map_client_assessment_question details
[ScalePad] LINK an assessment question to the records that substantiate its answer. For a question the linkable entities are evidence records, action items, policies and procedures — each by BUSINESS CODE (evidence and action-item codes resolve against their task definitions; policy and procedure codes against document codes). Note this set is narrower than a control's or an action item's: there are no risk, objective or asset arrays here. Succeeds with HTTP 204 and no body (this tool returns ). Only non-empty arrays are applied and empty/omitted ones are ignored, so send at least one populated array. Mapping is additive; it never removes an existing link.
scalepad_cm_search_client_assessment_questions details
scalepad_cm_search_client_assessment_questions details
[ScalePad] For ONE client, by client id: search that client's common-assessment questions. This is a READ despite using HTTP POST — the verb only carries the query body and nothing is persisted (vendor operationId assessmentQuestionsSearchByClient). Note the path is .../assessments/common/questions with NO /search suffix; an older changelog documents a /search path that the current contract does not have. Returns {data[], total_count, next_cursor} where each question carries id, code (the question_code every other tool here takes), question, guidance, group_name, question_area, answer, past_answer, answered_at, frameworks[{id, name}], responses[{id, response, created_at, updated_at, created_by {id, full_name, email}}] and timestamps.
scalepad_cm_unmap_client_assessment_question details
scalepad_cm_unmap_client_assessment_question details
[ScalePad] UNLINK an assessment question from evidence records, action items, policies or procedures. This is ControlMap's ONLY unmap that uses the HTTP DELETE verb rather than a .../mappings/bulk-delete POST, and consequently the ONLY operation in the whole ScalePad connector whose DELETE carries a request body — the codes to unlink go in the BODY, not the URL. Succeeds with HTTP 204 and no body (this tool returns ); empty lists make no changes. Removal is limited to the relationships: neither the question nor any mapped record is deleted. It still destroys compliance traceability with no undo, so echo the exact question code and every code being detached back to the user first.
scalepad_cm_update_client_assessment_question_answer details
scalepad_cm_update_client_assessment_question_answer details
[ScalePad] Save the ANSWER to an assessment question — the questionnaire selection itself, not a note. Upsert semantics (HTTP PUT): it creates the answer if there is none and overwrites it if there is, with no read-modify-write step and no previous value returned other than through the question's past_answer field. Returns 200 with {question_code, answer, answered_by {id, name}, reset_answer, answered_at}. The value must be one of the question's valid options — Yes, No, Partially or NA — so check answer_options via scalepad_cm_get_client_assessment_question if unsure; an invalid value returns 400. To add commentary instead of changing the selection use scalepad_cm_create_client_assessment_question_response.
scalepad_cm_update_client_assessment_question_responses details
scalepad_cm_update_client_assessment_question_responses details
[ScalePad] Edit an existing RESPONSE (a note on an assessment question's thread) — again, not the question's answer. The vendor's HTTP PATCH targets the responses COLLECTION, so the note being edited is identified by an id INSIDE the request body, not in the URL. Returns 200 with the updated note. One documented contradiction: the operation text says you may update either or both of response and provided_by, while the schema marks id and response as required — so always send id and response, and add provided_by only when it changes. This edits one note per call; it never rewrites the whole thread.
ControlMap Controls
scalepad_cm_create_client_control details
scalepad_cm_create_client_control details
[ScalePad] Create a control for a client. Returns 201 with the created record (id, the ScalePad-assigned code, name, description, implementation_notes, control_set_name, control_family_name, owner, created_by, timestamps). The authenticated API-key user becomes the control's owner and creator unless owner_email names someone else. Two contract details matter: UNKNOWN JSON properties are REJECTED, so send only the documented fields; and the fragment publishes no formal required array even though type, name, description, control_set_name and control_family_name all carry minLength 1 — send a real value for each rather than an empty string. No idempotency key is documented, so never blind-retry; re-check with scalepad_cm_search_client_controls. Relationships are not part of the create body — use scalepad_cm_map_client_control afterwards.
scalepad_cm_delete_client_control details
scalepad_cm_delete_client_control details
[ScalePad] PERMANENTLY delete a control. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the control is not found. ScalePad documents no soft delete, restore, undo, or dependency-conflict status for control deletion, and a control is the hub every objective, policy, procedure, evidence record, risk and action item maps to — read scalepad_cm_get_client_control first, show the user the policies/procedures/evidences/objectives/risks/action_items arrays that will lose their link, and confirm the exact client and control before calling. When the intent is only to stop tracking, patch status instead.
scalepad_cm_get_client_control details
scalepad_cm_get_client_control details
[ScalePad] Get one control in full for a client. Adds to the search-row fields (id, code, name, description, implementation_notes, status, compliant, control_set, control_family, owner) the audit trail — created_by, created_at, updated_at — and the complete relationship set: policies[], procedures[], evidences[], action_items[], objectives[], risks[], documents[] and audit_tests[]. Those arrays are the authoritative view of what is currently mapped; their codes are what scalepad_cm_map_client_control and scalepad_cm_unmap_client_control accept.
scalepad_cm_get_client_controls_summary details
scalepad_cm_get_client_controls_summary details
[ScalePad] For ONE client, by client id: that client's control implementation roll-up. Takes no query parameters. The vendor returns the same paginated envelope as the cross-client tool but with exactly one row — {data:[{client {id, name, tenant_id}, control_summary {completed, review, in_progress, not_started, not_applicable, total, completion_percentage}}], total_count: 1, next_cursor: null} — so read data[0], and do not try to page it. Use scalepad_cm_list_clients_controls_summary instead for the same roll-up across every client.
scalepad_cm_list_client_control_families details
scalepad_cm_list_client_control_families details
[ScalePad] List the control FAMILIES available to one client — the groupings inside a control set (e.g. "Human Resources Management" with code HRM, "Common Criteria Related"). Cursor-paginated: returns {data[], total_count, next_cursor}. Each row is deliberately thin: id, name, code, the creating user and created_at only — no controls are included. Use the family NAME as control_family_name when creating or patching a control; a family name is not necessarily unique across sets, so send control_set_name alongside it when disambiguating. This endpoint accepts no sort parameter.
scalepad_cm_list_client_control_sets details
scalepad_cm_list_client_control_sets details
[ScalePad] List the control SETS available to one client — the control libraries themselves (e.g. "Controlmap Baseline Controls" with code CBC, "SOC 2"). Cursor-paginated: returns {data[], total_count, next_cursor} with the same thin row shape as control families — id, name, code, creating user and created_at only. Use the set NAME as control_set_name when creating or patching a control; when a patch changes both catalog fields, ScalePad resolves the control SET first and then the family within it. This endpoint accepts no sort parameter.
scalepad_cm_list_clients_controls_summary details
scalepad_cm_list_clients_controls_summary details
[ScalePad] Across EVERY client of the MSP — takes NO client id. Cursor-paginated control implementation roll-up for the whole client base: returns {data[], total_count, next_cursor} where each row is {client {id, name, tenant_id}, control_summary {completed, review, in_progress, not_started, not_applicable, total, completion_percentage}}. Keep paging until next_cursor is null. Counts only — for the control rows themselves call scalepad_cm_search_client_controls with a client id.
scalepad_cm_map_client_control details
scalepad_cm_map_client_control details
[ScalePad] LINK a control to the compliance entities that evidence or depend on it. For a control the linkable entities are framework objectives (requirements), evidence records, policies, procedures, governance documents, risks and action items. Objectives are special: they use an objectives[] array of {program_name, codes[]} because a requirement code is only unique WITHIN its compliance program; everything else uses a flat array of business codes. Succeeds with HTTP 204 and no body (this tool returns ). Only non-empty arrays are applied and empty/omitted ones are ignored, so send at least one populated array. Mapping is additive and never removes an existing link — use scalepad_cm_unmap_client_control for that.
scalepad_cm_search_client_controls details
scalepad_cm_search_client_controls details
[ScalePad] For ONE client, by client id: search that client's controls. This is a READ despite using HTTP POST — the verb only carries the query body and nothing is persisted (vendor operationId openControlsSearch). Returns client {id, tenant_id, name}, control_summary {completed, review, in_progress, not_started, not_applicable, total, completion_percentage}, and controls {total_count, next_cursor, data[]}. Each control row carries id, code (the display code, e.g. CC6.1), name, description, implementation_notes, status, compliant (boolean), control_set {id, name}, control_family {id, name} and owner {id, name}. Use the row id with scalepad_cm_get_client_control for full relationships, and the row code as a control_codes value in every mapping body across ControlMap.
scalepad_cm_unmap_client_control details
scalepad_cm_unmap_client_control details
[ScalePad] UNLINK a control from objectives, evidence, policies, procedures, governance documents, risks or action items. The codes you send identify only the LINKS to remove — neither the control nor the mapped records are deleted — but this breaks compliance traceability with no undo, so echo the exact control and every code back to the user before calling. Succeeds with HTTP 204 and no body (this tool returns ); empty or omitted arrays make no changes. Despite the HTTP POST verb this is a removal: the vendor path is .../mappings/bulk-delete.
scalepad_cm_update_client_control details
scalepad_cm_update_client_control details
[ScalePad] Partially update a control (HTTP PATCH). Only the properties you send change. Returns 200 with the updated record plus a message naming exactly which fields were applied (e.g. "Successfully patched: name, status."), which is the field to check rather than assuming the whole body took effect. Ordering is defined by the vendor: status is applied AFTER the other scalar changes, and when control_set_name and control_family_name are sent together the set is resolved before the family. Two replacement semantics to be careful with: tags and contributors REPLACE the current lists rather than appending, and an empty array clears them. Note the response echoes priority as a NUMBER even though the request takes the string enum.
ControlMap Documents
scalepad_cm_create_client_evidence_document_signed_url details
scalepad_cm_create_client_evidence_document_signed_url details
[ScalePad] Register one or more documents against an EVIDENCE DEFINITION and get back vendor-minted pre-signed UPLOAD urls — an ordinary JSON POST, not a file transfer. SIDE EFFECT: because the target is the evidence rather than a specific request, ScalePad ALSO CREATES A NEW EVIDENCE REQUEST to hold the documents; the response's evidence_request_id is that new request. Returns 201 with {evidence_request_id, documents[{file_name, document_id, method, signed_url, expires_in_seconds}]} (300 seconds in the vendor example — note the relative expires_in_seconds here, versus the absolute expires_at on the DOWNLOAD tool). You then send each file's bytes yourself to its signed_url using the method the response names, before it expires; that URL is already authorized, so do NOT attach the ScalePad x-api-key to the storage request. ScalePad does not publish required storage headers, MIME restrictions, checksums, a maximum batch size or a completion callback — honor whatever the runtime response returns and invent nothing. Choose this over scalepad_cm_create_client_evidence_document for batches, for files near or above the 10 MB direct-upload cap, or when a human will do the uploading. To register against an EXISTING request instead, use scalepad_cm_create_client_evidence_request_document_signed_url.
scalepad_cm_create_client_evidence_request_document_signed_url details
scalepad_cm_create_client_evidence_request_document_signed_url details
[ScalePad] Register one or more documents against an EXISTING evidence request and get back vendor-minted pre-signed UPLOAD urls — an ordinary JSON POST, not a file transfer. Unlike the evidence-level variant this creates NO new request; the documents attach to the request you name. Returns 201 with {evidence_request_id, evidence_request_code, documents[{file_name, document_id, method, signed_url, expires_in_seconds}]} (300 seconds in the vendor example — a relative expiry, versus the absolute expires_at on the DOWNLOAD tool). You then send each file's bytes yourself to its signed_url using the method the response names, before it expires; that URL is already authorized, so do NOT attach the ScalePad x-api-key to the storage request. ScalePad does not publish required storage headers, MIME restrictions, checksums, a maximum batch size or a completion callback — honor whatever the runtime response returns and invent nothing. Choose this over scalepad_cm_create_client_evidence_request_document for batches, for files near or above the 10 MB direct-upload cap, or when a human will do the uploading.
scalepad_cm_delete_client_document details
scalepad_cm_delete_client_document details
[ScalePad] PERMANENTLY delete ONE stored document from a client's compliance record — the file itself, wherever it was attached (an evidence request, a policy, a procedure, a governance document or an action item). Succeeds with HTTP 204 and no body (this tool returns ); 404 if the document is not found. The parent record survives with the document removed from its documents[] array; ScalePad documents no soft delete, restore or undo, and this is the only ControlMap operation that removes a file without removing its parent. Confirm the exact client and the exact document with the user before calling — resolve the file NAME first, either from the parent record's documents[] array or from scalepad_cm_get_client_document_signed_url, so the user is confirming a filename rather than a bare integer.
scalepad_cm_get_client_document_signed_url details
scalepad_cm_get_client_document_signed_url details
[ScalePad] Get a short-lived DOWNLOAD url for ONE stored document belonging to ONE client. Returns the DocumentResponse as JSON — {document_id, file_name, signed_url, expires_at} — not the file bytes, and no StackJack blob storage is involved: signed_url points at ScalePad's own storage and expires_at is the vendor's absolute expiry timestamp (note the field name is expires_at here, whereas the UPLOAD signed-url tools return a relative expires_in_seconds). Fetch the file from signed_url before that time; the URL is already authorized, so do NOT attach the ScalePad x-api-key to the storage request. Document ids come from the documents[] arrays on the compliance records — scalepad_cm_list_client_evidence_requests, scalepad_cm_get_client_policy, scalepad_cm_get_client_procedure, scalepad_cm_get_client_governance and scalepad_cm_get_client_action_item all carry them.
ControlMap Evidence
scalepad_cm_create_client_evidence details
scalepad_cm_create_client_evidence details
[ScalePad] Create an evidence definition for ONE client. Returns 201 with EvidenceCreatedIdsResponse — just {id, evidence_request_id} — because creating an evidence also opens its first evidence request; read the full record back with scalepad_cm_get_client_evidence. An evidence can have only ONE schedule, and the PATCH tool cannot modify an existing one (it returns 409), so get the schedule right here or plan to delete and re-add it. There is no documented idempotency key, so never blind-retry this call — re-check with scalepad_cm_search_client_evidences first.
scalepad_cm_create_client_evidence_document details
scalepad_cm_create_client_evidence_document details
[ScalePad] Attach ONE document you already hold to an EVIDENCE DEFINITION, uploading it through ScalePad in a single call (vendor multipart/form-data operation, one binary 'file' part). SIDE EFFECT: because the target is the evidence rather than a specific request, ScalePad CREATES A NEW EVIDENCE REQUEST and attaches the document to it — returns 201 with {evidence_request_id, documents[{file_name, document_id}]}. To attach to an EXISTING request instead, use scalepad_cm_create_client_evidence_request_document. The vendor caps each upload at 10 MB; because MCP has no binary parameter type the content is passed here as base64 and decoded into a real binary part before sending, so the base64 text is roughly a third larger than the file itself. Use THIS tool for a single modest file whose bytes you have; use scalepad_cm_create_client_evidence_document_signed_url instead for several files, a large file, or a file the end user will upload themselves — that tool returns pre-signed URLs and the bytes never pass through StackJack.
scalepad_cm_create_client_evidence_request details
scalepad_cm_create_client_evidence_request details
[ScalePad] Open a NEW evidence request against an existing evidence definition — an out-of-cycle ask for proof, on top of whatever the recurrence schedule generates. This operation takes NO request body at all: the client id and evidence id in the path are the entire input. Returns 201 with the created request's id (EvidenceResponse, e.g. {"id":101}); read the row back with scalepad_cm_list_client_evidence_requests for its code, status, owner and due date, then set assignee/status/due_date/notes with scalepad_cm_update_client_evidence_request. There is no documented idempotency key and nothing distinguishes two identical calls, so never blind-retry — a repeat creates a SECOND request.
scalepad_cm_delete_client_evidence details
scalepad_cm_delete_client_evidence details
[ScalePad] PERMANENTLY delete an evidence definition. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the evidence is not found. This removes the standing definition together with everything hanging off it — its recurrence schedule, every evidence request raised against it, and its mappings to objectives, controls and assessment questions — and ScalePad documents no soft delete, restore or undo. Confirm the exact client and the exact evidence (read it back with scalepad_cm_get_client_evidence, and check how many requests exist with scalepad_cm_list_client_evidence_requests) before calling. If the goal is only to stop FUTURE collection, use scalepad_cm_delete_client_evidence_schedule instead, which keeps the evidence record.
scalepad_cm_delete_client_evidence_schedule details
scalepad_cm_delete_client_evidence_schedule details
[ScalePad] Remove the RECURRING COLLECTION SCHEDULE from an evidence record — the evidence itself survives, but its recurrence configuration (frequency, interval, days, start/end) is gone and ScalePad will raise no further evidence requests from it. Succeeds with HTTP 204 and no body (this tool returns ). The required scheduleAction argument decides how far the deletion reaches, and one of its two values ALSO DELETES existing incomplete evidence requests, taking any partial collection work with them — always read the exact value back to the user before calling. There is no restore: re-establishing recurrence means PATCHing a fresh schedule with scalepad_cm_update_client_evidence (which is also the only way to CHANGE a schedule, since PATCH returns 409 while one still exists).
scalepad_cm_get_client_evidence details
scalepad_cm_get_client_evidence details
[ScalePad] Get ONE evidence definition in full for ONE client. Returns the EvidenceDetailResponse shape: id, code (e.g. EV-1), title, description, repeats, created_by and owner (each {id, name}), schedule, refresh_status, created_at/updated_at, plus the complete relationship set — controls[{id, code, title}], assessments[{id, code, question}] and objectives[{id, code, name, program_name}]. The codes in those arrays are exactly the values scalepad_cm_map_client_evidence and scalepad_cm_unmap_client_evidence accept (objective_codes, control_codes and assessment_question_codes respectively). To see the collection cycles instead of the definition, call scalepad_cm_list_client_evidence_requests.
scalepad_cm_list_client_evidence_requests details
scalepad_cm_list_client_evidence_requests details
[ScalePad] List every evidence REQUEST raised against ONE evidence definition for ONE client — the individual collection cycles behind an EV-nn record. Returns {client {id, name, tenant_id}, evidence_id, data[]} where each row is {id, code (e.g. EV-2-1), status, created_by, owner, documents[{id, file_name}], due_date, implementation_notes, created_at, updated_at}. This endpoint takes NO paging, sort or filter parameters at all — the full set for that evidence comes back in one response. The row id is the evidence_request_id the ControlMap Evidence Requests tools and the evidence-request signed-URL tool take.
scalepad_cm_list_clients_evidences_summary details
scalepad_cm_list_clients_evidences_summary details
[ScalePad] Across EVERY client of the MSP — takes NO client id. Cursor-paginated evidence-collection roll-up for the whole client base: returns {data[], total_count, next_cursor} where each row is {client {id, name, tenant_id}, evidence_summary {completed, review, in_progress, not_started, not_applicable, total, completion_percentage}}. Keep paging until next_cursor is null. This tool returns COUNTS ONLY — it never lists individual evidence records; use scalepad_cm_search_client_evidences with a client id for the evidence rows.
scalepad_cm_map_client_evidence details
scalepad_cm_map_client_evidence details
[ScalePad] LINK an evidence definition to the compliance entities it proves. For evidence the linkable entities are exactly three kinds: framework objectives (requirements), controls and assessment questions — each identified by its BUSINESS CODE, never by numeric id, and resolved server-side (objective_codes to requirement.reqid, control_codes to control.display_code, assessment_question_codes to the assessment question's external id). Succeeds with HTTP 204 and no body (this tool returns ). Only the non-empty arrays you send are applied; empty or omitted arrays are ignored, so a body with no codes is accepted but does nothing — send at least one populated array. Mapping is additive: it never removes existing links (use scalepad_cm_unmap_client_evidence for that). Read current links from the objectives[], controls[] and assessments[] arrays of scalepad_cm_get_client_evidence. This tool sets EXPLICIT links; scalepad_cm_refresh_client_evidence_mappings re-derives the AUTOMATED ones.
scalepad_cm_refresh_client_evidence_mappings details
scalepad_cm_refresh_client_evidence_mappings details
[ScalePad] Re-evaluate ALL automated evidence mappings for ONE client — a command, not a query, and it acts on the whole client at once rather than a single evidence record. It takes NO request body: the client id in the path is the entire input. ScalePad uses it to re-sync mappings after configuration changes, pull updated mapping definitions and recompute mapping relationships for compliance workflows. Returns 200 with {status, code, clientId, message}, e.g. {"status":"SUCCESS","code":"EVIDENCE_MAPPINGS_REFRESHED","clientId":"...","message":"Evidence mappings refreshed successfully."}; note the response spells the client key clientId in camelCase, unlike the client_id path parameter. It recomputes DERIVED mappings — it does not add or remove the explicit links you set with scalepad_cm_map_client_evidence, and it is not needed after a manual map/unmap. Unusually for this connector the operation declares no 404, so a bad client id surfaces as 400 INVALID_CLIENT.
scalepad_cm_search_client_evidences details
scalepad_cm_search_client_evidences details
[ScalePad] For ONE client, by client id: search that client's evidence definitions. This is a READ despite using HTTP POST — the verb only carries the query body and nothing is persisted; it replaced the retired GET /evidences list route. Returns client {id, name, tenant_id}, evidence_summary {completed, review, in_progress, not_started, not_applicable, total, completion_percentage}, and evidences {total_count, next_cursor, data[]}. Each row carries id, code (e.g. EV-1), title, description, repeats, created_by and owner, schedule, refresh_status (e.g. Current, Somewhat Current), created_date/updated_date, an evidence_request_summary keyed by status, and — when the evidence_request flag is on — an evidence_requests[] array of {id, code, title, description, status, created_by, owner, documents[], due_date, implementation_notes, timestamps}. For the whole client base use scalepad_cm_list_clients_evidences_summary instead, which takes NO client id.
scalepad_cm_unmap_client_evidence details
scalepad_cm_unmap_client_evidence details
[ScalePad] UNLINK an evidence definition from objectives, controls or assessment questions. The codes you send identify only the LINKS to remove — neither the evidence nor the mapped entities are deleted — but the relationship removal is a real state change with no undo, and dropping a link can leave a requirement showing as unevidenced, so echo the exact evidence and every code back to the user before calling. Succeeds with HTTP 204 and no body (this tool returns ); empty or omitted arrays make no changes, so reject an all-empty request rather than sending it. Despite the HTTP POST verb this is a removal: the vendor path is .../mappings/bulk-delete.
scalepad_cm_update_client_evidence details
scalepad_cm_update_client_evidence details
[ScalePad] Partially update an evidence definition (HTTP PATCH). Only the properties you send change; everything else is left alone. Unusually for a PATCH this returns HTTP 204 with NO body (this tool returns ) — read the result back with scalepad_cm_get_client_evidence if you need the updated record. IMPORTANT: an evidence can have only ONE schedule and this call CANNOT modify an existing one — sending a schedule for an evidence that already has one returns the declared 409 conflict. To change a recurrence, first remove the old schedule with scalepad_cm_delete_client_evidence_schedule and then PATCH the new one. To change the evidence's LINKS to objectives, controls or assessment questions use scalepad_cm_map_client_evidence / scalepad_cm_unmap_client_evidence; relationships are not patchable here.
ControlMap Evidence Requests
scalepad_cm_archive_client_evidence_request details
scalepad_cm_archive_client_evidence_request details
[ScalePad] ARCHIVE ONE evidence request — a ONE-WAY transition that removes it from the active collection workflow. ScalePad publishes no unarchive or restore operation on this API, so the request stops appearing as outstanding work and cannot be returned to the active queue through the API; that irreversibility is why this is treated as destructive even though nothing is deleted (the request, its documents and its history remain readable). This operation takes NO request body: the client id and request id in the path are the entire input. Returns 200 with {id, code, status, message}, e.g. {"id":102,"code":1,"status":true,"message":"Evidence request archived successfully."}. Archiving an already-archived request is a no-op in effect, though the vendor still records audit metadata for the call — so it is safe to retry, unlike the create. Prefer setting status to Completed or Not Applicable with scalepad_cm_update_client_evidence_request when the request should stay in the workflow.
scalepad_cm_create_client_evidence_request_document details
scalepad_cm_create_client_evidence_request_document details
[ScalePad] Attach ONE document you already hold to an EXISTING evidence request, uploading it through ScalePad in a single call (vendor multipart/form-data operation, one binary 'file' part). Unlike the evidence-level upload this creates NO new request — the document lands on the request you name. Returns 201 with {evidence_request_id, evidence_request_code, documents[{file_name, document_id}]}. The vendor caps each upload at 10 MB; because MCP has no binary parameter type the content is passed here as base64 and decoded into a real binary part before sending, so the base64 text is roughly a third larger than the file itself. Use THIS tool for a single modest file whose bytes you have. Use scalepad_cm_create_client_evidence_request_document_signed_url instead when you have several files, a large file, or a file the end user will upload themselves — that tool returns pre-signed URLs and the bytes never pass through StackJack. For a link rather than a file, use scalepad_cm_create_client_evidence_requests_links.
scalepad_cm_create_client_evidence_requests_links details
scalepad_cm_create_client_evidence_requests_links details
[ScalePad] Attach a HYPERLINK to an evidence request instead of uploading a file — for proof that lives elsewhere (a shared drive folder, a dashboard, a ticket). Returns 201 with a ResourceIdResponse (the new link's id). Note the path shape: this operation is scoped to the CLIENT, not to a request, so the target evidence request is identified by evidence_request_id INSIDE the body rather than in the URL. There is no documented idempotency key, so never blind-retry — a repeat adds a SECOND link. ScalePad publishes no update or delete operation for an evidence-request link on this API, so add them deliberately.
scalepad_cm_delete_client_evidence_request details
scalepad_cm_delete_client_evidence_request details
[ScalePad] PERMANENTLY delete ONE evidence request. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the request is not found. The parent evidence definition survives, but this request's status, due date, reviewer notes, uploaded documents and hyperlinks go with it, and ScalePad documents no soft delete, restore or undo. Confirm the exact client and the exact request (read the row back with scalepad_cm_list_client_evidence_requests, including its documents[] array) before calling. If the goal is only to take a request out of the active workflow while keeping its history, use scalepad_cm_archive_client_evidence_request instead; to mark it as not required, set status to Not Applicable with scalepad_cm_update_client_evidence_request.
scalepad_cm_update_client_evidence_request details
scalepad_cm_update_client_evidence_request details
[ScalePad] Partially update ONE evidence request for ONE client (HTTP PATCH). Only the properties you send change; everything else is left alone. Unusually for a PATCH this returns HTTP 204 with NO body (this tool returns ) — read the result back with scalepad_cm_list_client_evidence_requests if you need the updated row. This is the tool for reassigning a request, moving it through its status workflow, shifting its due date and recording reviewer notes. It does NOT attach evidence: use scalepad_cm_create_client_evidence_request_document (or the signed-URL sibling) for a file, or scalepad_cm_create_client_evidence_requests_links for a hyperlink.
ControlMap Frameworks
scalepad_cm_get_client_framework_objective details
scalepad_cm_get_client_framework_objective details
[ScalePad] Get one framework objective (requirement) in full, for a single client and framework. Returns id, code, name, description (HTML), status, level1_code/level1_name and level2_code/level2_name (the requirement's place in the framework hierarchy), in_scope, type (clauses or controls), implementation_details (HTML), automated_test and automated_tested_on, current_maturity and target_maturity (each {id, name, description, score}), assessment_questions[] {id, code, title, answer}, audit_tests[] (each audit_name plus its evidence_requests[] with audit_result and a detailed_evaluation breakdown), plus created_at/updated_at. This fragment does not declare a 400, so an unknown id may surface as 404.
scalepad_cm_get_client_framework_objectives_summary details
scalepad_cm_get_client_framework_objectives_summary details
[ScalePad] For ONE client, by client id: the objective compliance roll-up for every framework that client has enabled. Returns client {id, name, tenant_id} and framework_stats[] where each entry is {id, name, objective_summary {compliant, not_compliant, partially_compliant, not_assessed, in_review, not_applicable, total, complaint_percentage}} — complaint_percentage is the vendor's own misspelling of compliant. There is no pagination envelope and no query surface. This is the tool that gives you the framework ids for scalepad_cm_search_client_framework_objectives. Use scalepad_cm_list_clients_framework_objectives_summary instead when you want the same roll-up for every client at once.
scalepad_cm_list_clients_framework_objectives_summary details
scalepad_cm_list_clients_framework_objectives_summary details
[ScalePad] Across EVERY client of the MSP — takes NO client id. Cursor-paginated objective roll-up for the whole client base, for partner-level compliance dashboards. Returns {data[], total_count, next_cursor} where each row is {client {id, name, tenant_id}, framework_stats[] {id, name, objective_summary {compliant, not_compliant, partially_compliant, not_assessed, in_review, not_applicable, total, complaint_percentage}}}. Keep paging until next_cursor is null. For one client only, call scalepad_cm_get_client_framework_objectives_summary — it needs no paging.
scalepad_cm_search_client_framework_objectives details
scalepad_cm_search_client_framework_objectives details
[ScalePad] For ONE client and ONE framework: search that framework's objectives (requirements). This is a READ despite using HTTP POST — the verb only carries the query body and nothing is persisted (vendor operationId 01_searchClientObjectives). Returns client {id, name, tenant_id}, framework {id, name}, objective_summary {compliant, not_compliant, partially_compliant, not_assessed, in_review, not_applicable, total, complaint_percentage — the misspelling is the vendor's own field name}, and objectives {total_count, next_cursor, data[]}. Each objective row carries id, code, name, description (HTML), status, level1_code/level1_name, level2_code/level2_name, in_scope, type (clauses or controls), created_at, updated_at and the linked documents/evidences. Use the row id with scalepad_cm_get_client_framework_objective for the full detail, and the row code as an objective_codes / objectives.codes value when mapping controls, policies, procedures, risks or action items.
ControlMap Governance
scalepad_cm_create_client_governance details
scalepad_cm_create_client_governance details
[ScalePad] Create a governance document for ONE client. Returns 201 with the full ProcedureDetailResponse. ScalePad assigns the authenticated API user as both owner and creator, starts the document in status In Review, and sets the default review date one week after creation — you cannot override those in the create body; adjust them afterwards with scalepad_cm_update_client_governance. There is no documented idempotency key, so never blind-retry this call — re-check with scalepad_cm_search_client_governance first. The create body takes no mappings you can rely on; link objectives, policies and controls afterwards with scalepad_cm_map_client_governance.
scalepad_cm_delete_client_governance details
scalepad_cm_delete_client_governance details
[ScalePad] PERMANENTLY delete a governance document. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the document is not found. ScalePad documents no soft delete, restore or undo for compliance documents, and the document's HTML body, attached files, hyperlinks, tags and its mappings to objectives/policies/controls go with it. Confirm the exact client and the exact document (read it back with scalepad_cm_get_client_governance first) before calling, and prefer moving it to a Draft status via scalepad_cm_update_client_governance when the goal is only to take it out of the active review workflow.
scalepad_cm_get_client_governance details
scalepad_cm_get_client_governance details
[ScalePad] Get ONE governance document in full for ONE client. Returns the ProcedureDetailResponse shape: id, code, title, description (the document's HTML body), source, status, frequency, owner and last_approved_by (each {id, name}), contributors[], data_classification, review_date, last_approved_date, created_at/updated_at, documents[{id, filename, signed_url, expires_at}], hyperlinks[{name, hyperlink}], tags[], controls[] and objectives[{id, title, code, program_name}]. The codes in controls[] and objectives[] are exactly the values scalepad_cm_map_client_governance and scalepad_cm_unmap_client_governance accept. Unlike policies there is NO sections[] array — a governance document's body is the single description field.
scalepad_cm_list_clients_governance_summary details
scalepad_cm_list_clients_governance_summary details
[ScalePad] Across EVERY client of the MSP — takes NO client id. Cursor-paginated governance-document roll-up for the whole client base: returns {data[], total_count, next_cursor} where each row is {client {id, name, tenant_id}, documents_summary {approved, in_review, ready_for_approval, in_progress, draft, approved_percentage, total}}. Keep paging until next_cursor is null. This tool returns COUNTS ONLY — it never lists individual governance documents; use scalepad_cm_search_client_governance with a client id for the document rows.
scalepad_cm_map_client_governance details
scalepad_cm_map_client_governance details
[ScalePad] LINK a governance document to the compliance entities it governs. For a governance document the linkable entities are framework objectives (requirements, scoped by compliance program), policies and controls — each identified by its BUSINESS CODE, never by numeric id, and resolved server-side. Succeeds with HTTP 204 and no body (this tool returns ). Only the non-empty arrays you send are applied; empty or omitted arrays are ignored, so a body with no codes is accepted but does nothing — send at least one populated array. Mapping is additive: it never removes existing links (use scalepad_cm_unmap_client_governance for that). Read current links from the controls[] and objectives[] arrays of scalepad_cm_get_client_governance.
scalepad_cm_search_client_governance details
scalepad_cm_search_client_governance details
[ScalePad] For ONE client, by client id: search that client's governance documents. This is a READ despite using HTTP POST — the verb only carries the query body and nothing is persisted. Returns client {id, name, tenant_id}, documents_summary {approved, in_review, ready_for_approval, in_progress, draft, approved_percentage, total}, and governance {total_count, next_cursor, data[]}. Each row carries id, code (e.g. GOV-1), title, owner and created_by (each {id, name, email}), status, source (e.g. "html"), frequency, contributors[], data_classification, tags[], controls[{id, title, code}] and objectives[{id, title, code, program_name}]. For the whole client base use scalepad_cm_list_clients_governance_summary instead, which takes NO client id.
scalepad_cm_unmap_client_governance details
scalepad_cm_unmap_client_governance details
[ScalePad] UNLINK a governance document from objectives, policies or controls. The codes you send identify only the LINKS to remove — neither the governance document nor the mapped entities are deleted — but the relationship removal is a real state change with no undo, so echo the exact document and every code back to the user before calling. Succeeds with HTTP 204 and no body (this tool returns ); empty or omitted arrays make no changes, so reject an all-empty request rather than sending it. Despite the HTTP POST verb this is a removal: the vendor path is .../mappings/bulk-delete.
scalepad_cm_update_client_governance details
scalepad_cm_update_client_governance details
[ScalePad] Partially update a governance document (HTTP PATCH). Only the properties you send change; everything else is left alone. Returns 200 with the patched record (id, code, name, description, status, source, data_classification, frequency, owner and the rest of the document metadata). At least one field is required. When status is included the vendor applies it AFTER the other fields in the same request. tags and contributors REPLACE the current lists rather than appending — send an empty array to clear one. This is the tool for status transitions and for editing the HTML body. To change the document's LINKS to objectives, policies or controls use scalepad_cm_map_client_governance / scalepad_cm_unmap_client_governance instead; relationships are not patchable here.
ControlMap Health
scalepad_cm_get_client_health details
scalepad_cm_get_client_health details
[ScalePad] For ONE client, by client id: the full ControlMap compliance health snapshot. Returns a single object (no pagination envelope) carrying client {id, name, tenant_id}, compliance_score {overall_score, score_label, updated_at, trend {last_30_days, last_60_days, last_90_days}}, risk_score {overall_score, risk_level, updated_at, risk_breakdown {severe, high, medium, low}}, frameworks[] (each with framework_id, framework_name, compliance_score, score_label, compliance_breakdown {compliant, in_review, not_applicable, not_assessed, not_compliant, partially_compliant, compliance_achieved_percentage, total} and assessment_breakdown {yes, no, partially, not_answered, not_applicable, answering_percentage, total}), and work_progress {evidence {completed, review, in_progress, not_started, not_applicable, completion_percentage, total}, updated_at}. All scores reflect the most recently computed values, not a live recalculation. Use this when you need one client's complete snapshot; for several clients at once, scalepad_cm_list_clients_health with its fields parameter set returns the same components in a single paginated pass.
scalepad_cm_list_clients_health details
scalepad_cm_list_clients_health details
[ScalePad] Across EVERY client of the MSP — takes NO client id. Cursor-paginated compliance health for the whole client base: returns {data[], total_count, next_cursor} where next_cursor is null on the final page (keep paging until it is null, not until a page looks short). Each row carries client {id, name, tenant_id} plus that client's health metrics, and the client.id values are exactly what you pass to scalepad_cm_get_client_health and to every other per-client ControlMap tool. IMPORTANT: by default a row carries the client's OVERALL compliance health ONLY — the richer compliance_score, risk_score, frameworks and work_progress components are additive and must be requested through the fields parameter. Use fields to pull the metrics you need for the whole client base in one pass, rather than calling scalepad_cm_get_client_health once per client.
ControlMap Policies
scalepad_cm_create_client_policy details
scalepad_cm_create_client_policy details
[ScalePad] Create a policy for ONE client, optionally with its initial sections in order. Returns 201 with the full PolicyDetailResponse. ScalePad assigns the authenticated API user as both owner and creator, starts the policy in status In Review, and sets the default review date one week after creation — you cannot override those in the create body; adjust them afterwards with scalepad_cm_update_client_policy. There is no documented idempotency key, so never blind-retry this call — re-check with scalepad_cm_search_client_policies first. Link objectives and controls afterwards with scalepad_cm_map_client_policy; the create body takes no mappings.
scalepad_cm_delete_client_policy details
scalepad_cm_delete_client_policy details
[ScalePad] PERMANENTLY delete an entire policy, including ALL of its sections. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the policy is not found. ScalePad documents no soft delete, restore or undo for compliance documents, and the policy's sections, version history, attached files, hyperlinks, tags and its mappings to objectives/controls go with it. Confirm the exact client and the exact policy (read it back with scalepad_cm_get_client_policy first) before calling. If you only need to remove one part of the body use scalepad_cm_delete_client_policy_section instead; if you only need it out of the active review workflow, move it to a Draft status with scalepad_cm_update_client_policy.
scalepad_cm_delete_client_policy_section details
scalepad_cm_delete_client_policy_section details
[ScalePad] PERMANENTLY delete ONE section of a policy — the section's title and its entire HTML body are lost. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the policy or section is not found. The policy itself and its other sections survive; ScalePad documents no restore or undo for a deleted section, so read the section back with scalepad_cm_get_client_policy and echo its title (and, if the user may want it later, its description) before calling. To reword a section instead of losing it, update it in place with scalepad_cm_update_client_policy_sections.
scalepad_cm_get_client_policy details
scalepad_cm_get_client_policy details
[ScalePad] Get ONE policy in full for ONE client. Returns the PolicyDetailResponse shape: id, code, title, status, source, frequency, owner and last_approved_by (each {id, name}), policy_contributors[], data_classification, review_date, last_approved_date, created_at/updated_at, documents[{id, filename, signed_url, expires_at}], hyperlinks[{name, hyperlink}], tags[], versions[{major_version, minor_version}] plus the current major_version/minor_version, is_published, controls[{id, title, code}], objectives[{id, title, code, program_name}] and — uniquely for policies — sections[{id, title, description, section_order, created_at, updated_at}] holding the HTML body in order. sections[].id is the value scalepad_cm_update_client_policy_sections uses to update a section and scalepad_cm_delete_client_policy_section uses to remove one; the control and objective codes are what the mapping tools accept.
scalepad_cm_list_clients_policies_summary details
scalepad_cm_list_clients_policies_summary details
[ScalePad] Across EVERY client of the MSP — takes NO client id. Cursor-paginated policy roll-up for the whole client base: returns {data[], total_count, next_cursor} where each row is {client {id, name, tenant_id}, documents_summary {approved, in_review, ready_for_approval, in_progress, draft, approved_percentage, total}}. Keep paging until next_cursor is null. This tool returns COUNTS ONLY — it never lists individual policies; use scalepad_cm_search_client_policies with a client id for the document rows.
scalepad_cm_map_client_policy details
scalepad_cm_map_client_policy details
[ScalePad] LINK a policy to the compliance entities it satisfies. For a policy the linkable entities are exactly TWO kinds: framework objectives (requirements, scoped by compliance program) and controls — identified by BUSINESS CODE, never by numeric id, and resolved server-side. There is deliberately no policy_codes array here (policies do not map to other policies) even though the procedure and governance mapping bodies have one. Succeeds with HTTP 204 and no body (this tool returns ). Only the non-empty arrays you send are applied; empty or omitted arrays are ignored, so a body with no codes is accepted but does nothing — send at least one populated array. Mapping is additive: it never removes existing links (use scalepad_cm_unmap_client_policy for that). Read current links from the controls[] and objectives[] arrays of scalepad_cm_get_client_policy.
scalepad_cm_search_client_policies details
scalepad_cm_search_client_policies details
[ScalePad] For ONE client, by client id: search that client's policies. This is a READ despite using HTTP POST — the verb only carries the query body and nothing is persisted. Returns client {id, name, tenant_id}, documents_summary {approved, in_review, ready_for_approval, in_progress, draft, approved_percentage, total}, and policies {total_count, next_cursor, data[]}. Each row carries id, code (e.g. POL-1), title, owner and created_by (each {id, name, email}), status, source (e.g. "html"), frequency, contributors[], data_classification, tags[], controls[{id, title, code}] and objectives[{id, title, code, program_name}]. The search rows do NOT include sections — fetch a single policy with scalepad_cm_get_client_policy for its section bodies. For the whole client base use scalepad_cm_list_clients_policies_summary instead, which takes NO client id.
scalepad_cm_unmap_client_policy details
scalepad_cm_unmap_client_policy details
[ScalePad] UNLINK a policy from objectives or controls. The codes you send identify only the LINKS to remove — neither the policy nor the mapped objectives/controls are deleted — but the relationship removal is a real state change with no undo, so echo the exact policy and every code back to the user before calling. Succeeds with HTTP 204 and no body (this tool returns ); empty or omitted arrays make no changes, so reject an all-empty request rather than sending it. Despite the HTTP POST verb this is a removal: the vendor path is .../mappings/bulk-delete.
scalepad_cm_update_client_policy details
scalepad_cm_update_client_policy details
[ScalePad] Partially update a policy's METADATA (HTTP PATCH). Only the properties you send change; everything else is left alone. Returns 200 with the patched record (id, code, name, status, source, data_classification, frequency, owner and the rest of the document metadata). When status is included the vendor applies it AFTER the other fields in the same request. tags and contributors REPLACE the current lists rather than appending — send an empty array to clear one. IMPORTANT: unlike procedures and governance documents the policy PATCH schema has NO description field — a policy's prose lives in its sections, so use scalepad_cm_update_client_policy_sections to change the body. Relationships are likewise not patchable here; use scalepad_cm_map_client_policy / scalepad_cm_unmap_client_policy.
scalepad_cm_update_client_policy_sections details
scalepad_cm_update_client_policy_sections details
[ScalePad] Create OR update a single section of a policy — an upsert (HTTP PUT on the sections collection), and the ONLY way to edit a policy's prose, because the policy PATCH schema has no description field. Which operation happens is decided by whether the body carries an id: omit id to CREATE a new section (returns 201) and include id to UPDATE an existing one (returns 200). Either way the response is the PolicySectionDetail for that one section (id, title, description, section_order, created_at, updated_at). Sections are the only sectioned record type in ControlMap — procedures and governance documents have none. This tool handles ONE section per call; loop for several. Read the current sections, their ids and their section_order from scalepad_cm_get_client_policy.
ControlMap Procedures
scalepad_cm_create_client_procedure details
scalepad_cm_create_client_procedure details
[ScalePad] Create a procedure for ONE client. Returns 201 with the full ProcedureDetailResponse. ScalePad assigns the authenticated API user as both owner and creator, starts the document in status In Review, and sets the default review date one week after creation — you cannot override those in the create body; adjust them afterwards with scalepad_cm_update_client_procedure. There is no documented idempotency key, so never blind-retry this call — re-check with scalepad_cm_search_client_procedures first. Link objectives, policies and controls afterwards with scalepad_cm_map_client_procedure rather than trying to embed them here.
scalepad_cm_delete_client_procedure details
scalepad_cm_delete_client_procedure details
[ScalePad] PERMANENTLY delete a procedure. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the procedure is not found. ScalePad documents no soft delete, restore or undo for compliance documents, and the procedure's HTML body, attached files, hyperlinks, tags and its mappings to objectives/policies/controls go with it. Confirm the exact client and the exact procedure (read it back with scalepad_cm_get_client_procedure first) before calling, and prefer moving it to a Draft status via scalepad_cm_update_client_procedure when the goal is only to take it out of the active review workflow.
scalepad_cm_get_client_procedure details
scalepad_cm_get_client_procedure details
[ScalePad] Get ONE procedure in full for ONE client. Returns the ProcedureDetailResponse shape: id, code, title, description (the procedure's HTML body), source, status, frequency, owner and last_approved_by (each {id, name}), contributors[], data_classification, review_date, last_approved_date, created_at/updated_at, documents[{id, filename, signed_url, expires_at}], hyperlinks[{name, hyperlink}], tags[], controls[] and objectives[{id, title, code, program_name}]. The codes in controls[] and objectives[] are exactly the values scalepad_cm_map_client_procedure and scalepad_cm_unmap_client_procedure accept. Unlike policies there is NO sections[] array — a procedure's body is the single description field.
scalepad_cm_list_clients_procedures_summary details
scalepad_cm_list_clients_procedures_summary details
[ScalePad] Across EVERY client of the MSP — takes NO client id. Cursor-paginated procedure roll-up for the whole client base: returns {data[], total_count, next_cursor} where each row is {client {id, name, tenant_id}, documents_summary {approved, in_review, ready_for_approval, in_progress, draft, approved_percentage, total}}. Keep paging until next_cursor is null. This tool returns COUNTS ONLY — it never lists individual procedures; use scalepad_cm_search_client_procedures with a client id for the document rows.
scalepad_cm_map_client_procedure details
scalepad_cm_map_client_procedure details
[ScalePad] LINK a procedure to the compliance entities it implements. For a procedure the linkable entities are framework objectives (requirements, scoped by compliance program), policies and controls — each identified by its BUSINESS CODE, never by numeric id, and resolved server-side. Succeeds with HTTP 204 and no body (this tool returns ). Only the non-empty arrays you send are applied; empty or omitted arrays are ignored, so a body with no codes is accepted but does nothing — send at least one populated array. Mapping is additive: it never removes existing links (use scalepad_cm_unmap_client_procedure for that). Read current links from the controls[] and objectives[] arrays of scalepad_cm_get_client_procedure.
scalepad_cm_search_client_procedures details
scalepad_cm_search_client_procedures details
[ScalePad] For ONE client, by client id: search that client's procedures. This is a READ despite using HTTP POST — the verb only carries the query body and nothing is persisted. Returns client {id, name, tenant_id}, documents_summary {approved, in_review, ready_for_approval, in_progress, draft, approved_percentage, total}, and procedures {total_count, next_cursor, data[]}. Each row carries id, code (e.g. PRO-1), title, owner and created_by (each {id, name, email}), status, source (e.g. "html"), frequency, contributors[], data_classification, tags[], controls[{id, title, code}] and objectives[{id, title, code, program_name}]. For the whole client base use scalepad_cm_list_clients_procedures_summary instead, which takes NO client id.
scalepad_cm_unmap_client_procedure details
scalepad_cm_unmap_client_procedure details
[ScalePad] UNLINK a procedure from objectives, policies or controls. The codes you send identify only the LINKS to remove — neither the procedure nor the mapped entities are deleted — but the relationship removal is a real state change with no undo, so echo the exact procedure and every code back to the user before calling. Succeeds with HTTP 204 and no body (this tool returns ); empty or omitted arrays make no changes, so reject an all-empty request rather than sending it. Despite the HTTP POST verb this is a removal: the vendor path is .../mappings/bulk-delete.
scalepad_cm_update_client_procedure details
scalepad_cm_update_client_procedure details
[ScalePad] Partially update a procedure (HTTP PATCH). Only the properties you send change; everything else is left alone. Returns 200 with the patched record (id, code, name, description, status, source, data_classification, frequency, owner and the rest of the document metadata). When status is included the vendor applies it AFTER the other fields in the same request. tags and contributors REPLACE the current lists rather than appending — send an empty array to clear one. This is the tool for status transitions and for editing the HTML body. To change the procedure's LINKS to objectives, policies or controls use scalepad_cm_map_client_procedure / scalepad_cm_unmap_client_procedure instead; relationships are not patchable here.
ControlMap Reports
scalepad_cm_get_client_report_signed_url details
scalepad_cm_get_client_report_signed_url details
[ScalePad] Mint a short-lived DOWNLOAD url for one finished ControlMap report. Returns JSON only — {id, name, signed_url, expires_in_seconds} (3600 in the vendor example) — never the file bytes, and no StackJack blob storage is involved anywhere in ControlMap. Fetch signed_url directly before expires_in_seconds elapses; it is already authorized, so do NOT attach the ScalePad x-api-key to that request. The URL is single-purpose and time-limited: re-run this tool for a fresh one rather than caching it. A report still in Progress or Fail status has no downloadable document.
scalepad_cm_list_client_reports details
scalepad_cm_list_client_reports details
[ScalePad] For ONE client, by client id: list that client's generated ControlMap reports. This is a READ despite using HTTP POST — the verb only exists to carry the filter/paging body, and nothing is created (vendor operationId 01_listClientReports). Returns client {id, name, tenant_id}, report_summary {total, progress, completed, failed}, and reports {total_count, next_cursor, data[]} where each row carries id, report_name, program, created_by {id, name, email}, created_at and status. The row id is the report_id you pass to scalepad_cm_get_client_report_signed_url to obtain a download link.
ControlMap Risks
scalepad_cm_create_client_risk details
scalepad_cm_create_client_risk details
[ScalePad] Create a risk in ONE client's register. Returns 201 with the full RiskResponse, including the code ScalePad assigns (RSK-nn) and the inherent/current/target scores it derives from impact and likelihood. name is the ONLY schema-required property. Watch the field vocabulary: create uses name and risk_category, whereas scalepad_cm_update_client_risk uses title and category for the same two values — do not carry names across. There is no documented idempotency key, so never blind-retry this call — re-check with scalepad_cm_search_client_risks first. Link assets, threats, vulnerabilities, vendors, objectives, controls or action items afterwards with scalepad_cm_map_client_risk; the create body takes no mappings.
scalepad_cm_delete_client_risk details
scalepad_cm_delete_client_risk details
[ScalePad] PERMANENTLY delete a risk from a client's register. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the risk is not found. ScalePad's own changelog states that risk deletion removes the record AND all associated data — its mappings to assets, threats, vulnerabilities, vendors, objectives, controls and action items go with it — and documents no soft delete, restore or undo. Confirm the exact client and the exact risk (read it back with scalepad_cm_get_client_risk first) before calling, and prefer setting status to Closed via scalepad_cm_update_client_risk when the goal is only to retire the risk while keeping its history.
scalepad_cm_get_client_risk details
scalepad_cm_get_client_risk details
[ScalePad] Get ONE risk in full for ONE client. Returns the RiskResponse shape: id, code (e.g. RSK-1), name, description, owner and created_by (each {id, name}), status, department, risk_category, treatment, business_impact, inherent_risk_score and inherent_risk_label, current_risk_score and current_risk_label, target_risk_score and target_risk_label, created_at and updated_at. The score labels are ControlMap's own bands (e.g. Severe, High, Medium, Low) derived from impact × likelihood — they are computed, not settable directly.
scalepad_cm_get_client_risk_category details
scalepad_cm_get_client_risk_category details
[ScalePad] Get ONE risk category by id for ONE client. Returns a minimal RiskCategoryResponse — exactly {id, name}, e.g. {"id":35,"name":"Access Control"} — and 404 NOT_FOUND ("No risk category exists with ID ...") when the id is unknown. ScalePad publishes NO list-categories endpoint on this API, so the only way to discover a category id is from a risk that already uses it: the risk_category NAME appears on every row of scalepad_cm_search_client_risks. Use this tool to resolve a category id you already hold back to its display name.
scalepad_cm_list_client_risks_departments details
scalepad_cm_list_client_risks_departments details
[ScalePad] For ONE client, by client id: list the departments available for risk assignment. Returns a bare JSON ARRAY of {id, name} objects (e.g. [{"id":1,"name":"IT"},{"id":2,"name":"Sales"}]) — not a paginated envelope, and this endpoint takes no page_size, cursor, sort or filter parameters at all. Call this first to get the exact department NAME string to send in the department field of scalepad_cm_create_client_risk or scalepad_cm_update_client_risk; ScalePad resolves that field by name, so a typo is rejected rather than created.
scalepad_cm_list_clients_risks_summary details
scalepad_cm_list_clients_risks_summary details
[ScalePad] Across EVERY client of the MSP — takes NO client id. Cursor-paginated risk-posture roll-up for the whole client base: returns {data[], total_count, next_cursor} where each row is {client {id, name, tenant_id}, risk_summary {overall_score, risk_level, updated_at, risk_breakdown {severe, high, medium, low}}}. Keep paging until next_cursor is null. This tool returns SCORES AND COUNTS ONLY — it never lists individual risks; use scalepad_cm_search_client_risks with a client id for the risk rows.
scalepad_cm_map_client_risk details
scalepad_cm_map_client_risk details
[ScalePad] LINK a risk to the entities that expose it or mitigate it. A risk has the widest set of linkable entities in ControlMap — eight arrays: assets and asset types, threats, vulnerabilities, vendors, framework objectives (requirements), controls and action items — each identified by its BUSINESS CODE (asset types by NAME), never by numeric id, and resolved server-side. Succeeds with HTTP 204 and no body (this tool returns ). Only the non-empty arrays you send are applied; empty or omitted arrays are ignored, so a body with no codes is accepted but does nothing — send at least one populated array. Mapping is additive: it never removes existing links (use scalepad_cm_unmap_client_risk for that).
scalepad_cm_search_client_risks details
scalepad_cm_search_client_risks details
[ScalePad] For ONE client, by client id: search that client's risk register. This is a READ despite using HTTP POST — the verb only carries the query body and nothing is persisted; it replaced the retired GET /risks list route. Returns client {id, name, tenant_id}, an aggregate risk_summary {overall_score, risk_level, updated_at, risk_breakdown {severe, high, medium, low}}, and risks {total_count, next_cursor, data[]}. Each row carries id, code (e.g. RSK-1), name, description, owner and created_by (each {id, name, email}), status, department, risk_category, treatment, business_impact, inherent_risk_score/label, current_risk_score/label, target_risk_score/label and timestamps. For the whole client base use scalepad_cm_list_clients_risks_summary instead, which takes NO client id.
scalepad_cm_unmap_client_risk details
scalepad_cm_unmap_client_risk details
[ScalePad] UNLINK a risk from assets, asset types, threats, vulnerabilities, vendors, objectives, controls or action items. The codes you send identify only the LINKS to remove — neither the risk nor the mapped entities are deleted — but the relationship removal is a real state change with no undo, so echo the exact risk and every code back to the user before calling. Succeeds with HTTP 204 and no body (this tool returns ); empty or omitted arrays make no changes, so reject an all-empty request rather than sending it. Despite the HTTP POST verb this is a removal: the vendor path is .../mappings/bulk-delete.
scalepad_cm_update_client_risk details
scalepad_cm_update_client_risk details
[ScalePad] Partially update a risk (HTTP PATCH). Only the properties you send change; everything else is left alone. Returns 200 with the patched RiskResponse. Every property is optional here — including name/title, which create requires. Watch the field vocabulary: PATCH spells the risk title title and the category category, whereas scalepad_cm_create_client_risk spells the same two values name and risk_category. The PATCH schema does NOT expose impact, likelihood, treatment or business_impact, so the derived risk scores cannot be changed through this tool. To change a risk's LINKS to assets, threats, vulnerabilities, vendors, objectives, controls or action items use scalepad_cm_map_client_risk / scalepad_cm_unmap_client_risk instead; relationships are not patchable here.
Core Clients
scalepad_core_get_client details
scalepad_core_get_client details
[ScalePad] Get one client organization by its ScalePad id (from scalepad_core_list_clients). Returns id, name, lifecycle, primary_domain, num_contacts, num_hardware_assets, address (ISO-standardized country/state plus geo-spatial coordinates where available), record_lineage[], record_created_at, and record_updated_at. A 404 means the normalized record is missing or inaccessible — it does not by itself distinguish a source-system deletion from integration sync lag.
scalepad_core_list_clients details
scalepad_core_list_clients details
[ScalePad] List the MSP's active client organizations. Cursor-paginated: returns data[], total_count, and next_cursor (present and null on the final page — keep paging until it is null, not until a page is short). Each client carries id, name, lifecycle, primary_domain (derived from its contacts), num_contacts, num_hardware_assets, address, record_lineage[] (the source PSA/RMM integration and source_record_id behind the normalized record), record_created_at, and record_updated_at. The returned id is the value you pass to scalepad_core_get_client and to filter[client.id] on nearly every other Core list tool (hardware assets, SaaS assets, contacts, tickets, contracts, sites, opportunities).
Core Contacts & Members
scalepad_core_get_contact details
scalepad_core_get_contact details
[ScalePad] Get one client contact by its ScalePad id (from scalepad_core_list_contacts). Returns id, client (the owning client organization), title, contact_info (primary communication details), name, record_lineage[], record_created_at, and record_updated_at. A 404 means the normalized record is missing or inaccessible.
scalepad_core_get_member details
scalepad_core_get_member details
[ScalePad] Get one MSP member by its ScalePad id (from scalepad_core_list_members). Returns id, name, hired_at, title, is_scalepad_user, contact_info, reports_to_member (including their email), work_roles[], hourly_cost, daily_capacity, address, record_lineage[], record_created_at, and record_updated_at. A 404 means the normalized record is missing or inaccessible.
scalepad_core_list_contacts details
scalepad_core_list_contacts details
[ScalePad] Search the active contacts (individuals) at the MSP's client organizations. The HTTP verb is POST, but this is a SEARCH and changes nothing — ScalePad uses a request body only so the PII-sensitive filters stay out of the query string. Cursor-paginated: returns data[], total_count, and next_cursor (null on the final page). Each contact carries id, client, title, contact_info, name, record_lineage[], record_created_at, and record_updated_at. Pass a returned id to scalepad_core_get_contact, or use it as filter[contact.id] on hardware assets, SaaS users, tickets, contracts, and opportunities.
scalepad_core_list_members details
scalepad_core_list_members details
[ScalePad] Search the MSP's own active members — employees, contractors, downstream IT. The HTTP verb is POST, but this is a SEARCH and changes nothing: ScalePad uses a request body only so the PII-sensitive filters (email, phone, full name, manager email) stay out of the query string. Cursor-paginated: returns data[], total_count, and next_cursor. Each member carries id, name, hired_at, title, is_scalepad_user (whether they are a ScalePad platform user), contact_info, reports_to_member, work_roles[], hourly_cost (the member's default cost per hour to the MSP), daily_capacity (available working hours per day), address, record_lineage[], record_created_at, and record_updated_at. Pass a returned id to scalepad_core_get_member, or use it as filter[owner_member.id] / filter[responsible_member.id] on tickets and opportunities.
Core Hardware Assets
scalepad_core_get_hardware_asset details
scalepad_core_get_hardware_asset details
[ScalePad] Get one hardware asset by its ScalePad id (from scalepad_core_list_hardware_assets). Returns the full record: name, client, contact, manufacturer, model, serial_number, type, last_login_user, location_name, mac_addresses[], configuration (cpu / ram_bytes / disks), software (operating_system, antivirus_info, office_suite_info), address (ISO-standardized country/state plus geo-spatial coordinates where available), record_lineage[], record_created_at, and record_updated_at. A 404 means the normalized record is missing or inaccessible.
scalepad_core_list_hardware_assets details
scalepad_core_list_hardware_assets details
[ScalePad] List active hardware assets across the MSP's clients. Cursor-paginated: returns data[], total_count, and next_cursor (null on the final page). Each asset carries id, name, client, contact (the assigned user), manufacturer (ScalePad-standardized), model, serial_number, type (WORKSTATION | IMAGING | SERVER | NETWORK | MOBILE | VIRTUAL), last_login_user, location_name, mac_addresses[], configuration (cpu name/manufacturer, ram_bytes, disks total_bytes/used_bytes), software (operating_system, antivirus_info status + definition_status, office_suite_info name/version), address, record_lineage[], record_created_at, and record_updated_at. Use filter[client.id] with an id from scalepad_core_list_clients to scope to one client; pass a returned asset id to scalepad_core_get_hardware_asset.
Core Integrations
scalepad_core_list_integration_configurations details
scalepad_core_list_integration_configurations details
[ScalePad] List the MSP's configured integration instances — one entry per connected PSA/RMM/SaaS setup. Each carries id, vendor (the integration vendor it belongs to), nickname (the operator-facing label that distinguishes multiple instances of the same vendor), and primary[] (the datatypes for which this instance is the primary integration; empty when it is not primary for anything). The id here is what appears as record_lineage.integration_configuration.id on client, contact, asset, ticket, contract and site records, and is the value to pass as filter[record_lineage.integration_configuration.id] on those list tools. ScalePad documents NO parameters on this operation — no pagination, filtering or sorting — so it returns the full set in one response.
scalepad_core_list_integration_vendors details
scalepad_core_list_integration_vendors details
[ScalePad] List the catalogue of third-party vendors and platforms ScalePad can integrate with — the lookup behind record_lineage.integration_configuration.vendor on every Core record. Unlike the other Core list operations this one returns a BARE JSON ARRAY of vendors rather than the {data, total_count, next_cursor} envelope, so there is no cursor to follow even though page_size and cursor are accepted. Vendors are grouped by category: PSA, RMM, SaaS, Network, Documentation, Backup, Customer Satisfaction, Cybersecurity, PSA & RMM. Note that ScalePad removed filter[data_types_supported] in the 2026-07-21 Core release while keeping the response field — filter on it and expect a 400/422. This operation can return 422 for a semantically invalid filter in addition to the usual 400.
Core Opportunities
scalepad_core_get_opportunity details
scalepad_core_get_opportunity details
[ScalePad] Get one sales opportunity by its ScalePad id (from scalepad_core_list_opportunities). Returns id, title, description, source_status, source_stage, is_active, probability (0-100), client, contact, responsible_member, record_lineage[], record_created_at, and record_updated_at. A 404 means the normalized record is missing or inaccessible.
scalepad_core_list_opportunities details
scalepad_core_list_opportunities details
[ScalePad] List sales opportunities for the MSP's active clients. Cursor-paginated: returns data[], total_count, and next_cursor (null on the final page). Each opportunity carries id, title, description, source_status and source_stage (the ORIGINAL values from the source system, before any ScalePad standardization — so the valid values depend on the connected PSA/CRM), is_active, probability (percent 0-100 that it closes won), client, contact, responsible_member (the MSP member accountable for it), record_lineage[], record_created_at, and record_updated_at. Use filter[client.id] with an id from scalepad_core_list_clients, or filter[responsible_member.id] with an id from scalepad_core_list_members.
Core Product Catalog
scalepad_core_get_product_catalog_item details
scalepad_core_get_product_catalog_item details
[ScalePad] Get one product catalog record by its ScalePad id (from scalepad_core_list_product_catalog). Returns id, source_system, source_product_id, source_product_identifier, name, description, category, subcategory, product_type, product_class, manufacturer_name, unit_cost, unit_price, is_active, updated_at, record_lineage[], record_created_at, and record_updated_at. Every field except id and source_system is nullable — PSAs expose different subsets. A 404 means the normalized record is missing or inaccessible.
scalepad_core_list_product_catalog details
scalepad_core_list_product_catalog details
[ScalePad] List the product catalog records exported from the MSP's PSA integrations. Cursor-paginated: returns data[], total_count, and next_cursor (null on the final page). Each record carries id, source_system (the PSA that supplied it), source_product_id, source_product_identifier (the human-facing product code/SKU, used to match related source records such as PSA contract additions), name, description, category, subcategory, product_type, product_class, manufacturer_name, unit_cost, unit_price, is_active, updated_at (the SOURCE product's last-updated timestamp, distinct from ScalePad's own record_updated_at), record_lineage[], record_created_at, and record_updated_at. The id is what appears as contract_pricings.items.product.id on contracts — see scalepad_core_list_contracts.
Core SaaS Assets
scalepad_core_get_saas_asset details
scalepad_core_get_saas_asset details
[ScalePad] Get one SaaS asset by its ScalePad id (from scalepad_core_list_saas_assets). Returns id, client, product, status, tenant_domain, term, subscriptions[], pool (type / capacity / utilized / suspended / grace_period_warning), record_lineage[], record_created_at, and record_updated_at. A 404 means the normalized record is missing or inaccessible.
scalepad_core_get_saas_user details
scalepad_core_get_saas_user details
[ScalePad] Get one SaaS user by its ScalePad id (from scalepad_core_list_saas_users). Returns id, client, contact, asset, product, term, subscription, activity (last_active_at, is_active), authentication (is_mfa_enabled, default_mfa_method), is_admin, record_lineage[], record_created_at, and record_updated_at. Activity fields are only populated when the SaaS vendor supplies them. A 404 means the normalized record is missing or inaccessible.
scalepad_core_list_saas_assets details
scalepad_core_list_saas_assets details
[ScalePad] List the SaaS assets (cloud subscriptions and licence pools) tracked for the MSP's clients. Cursor-paginated: returns data[], total_count, and next_cursor (null on the final page). Each asset carries id, client, product (manufacturer, name, category, manufacturer_sku), status (the raw source lifecycle/availability value), tenant_domain (the Microsoft 365 tenant's default verified domain), term (starts_at / ends_at / is_auto_renewed), subscriptions[] (per-subscription id, commerce_subscription_id, status, type, license_count, billing_cycle_name, friendly_name, provider_name, partner_tier, csp_tier and its own term), pool (type SEAT, capacity, utilized, suspended, grace_period_warning), record_lineage[], record_created_at, and record_updated_at. Note pool.active was REMOVED from the response, filters and sorting in the 2026-07-21 Core release. Pass a returned id to scalepad_core_get_saas_asset, or use it as filter[asset.id] on scalepad_core_list_saas_users to see who holds the licences.
scalepad_core_list_saas_users details
scalepad_core_list_saas_users details
[ScalePad] List the SaaS users — the individuals at client organizations who hold an assigned SaaS licence. Cursor-paginated: returns data[], total_count, and next_cursor (null on the final page). Each user carries id, client, contact (the Core contact they map to), asset (id + status of the SaaS asset the licence belongs to), product, term, subscription (the selected Microsoft subscription for this SKU row), activity (last_active_at, is_active — only when the vendor supplies it), authentication (is_mfa_enabled, default_mfa_method), is_admin, record_lineage[], record_created_at, and record_updated_at. This is the surface for licence-waste and MFA-gap reporting: combine filter[activity.is_active]=eq:false with filter[asset.id], or filter[authentication.is_mfa_enabled]=eq:false with filter[is_admin]=eq:true.
Core Service Contracts & Tickets
scalepad_core_get_contract details
scalepad_core_get_contract details
[ScalePad] Get one service contract by its ScalePad id (from scalepad_core_list_contracts). Returns the full record including term, status, type, total_price / total_cost, pricing_item_total_price / pricing_item_total_cost, and contract_pricings[] with each line's product, term, unit_cost, unit_price, total_cost and total_price — ACTIVE pricing lines only. total_cost and is_addendum are populated only for ConnectWise-sourced contracts. A 404 means the normalized record is missing or inaccessible.
scalepad_core_get_ticket details
scalepad_core_get_ticket details
[ScalePad] Get one service ticket by its ScalePad id (from scalepad_core_list_tickets). Returns the full record including owner_member, responsible_member, client, contact, contract, board, summary, source, category, is_child_ticket, is_long_ticket, timeline, duration (per-stage minutes, excluding time-off / non-working days / wait time), sla, status (current plus transition history), priority (current plus change history with timestamps), impact, severity, num_notes, record_lineage[], record_created_at, and record_updated_at. Ticket note bodies are not part of this response — only num_notes. A 404 means the normalized record is missing or inaccessible.
scalepad_core_list_contracts details
scalepad_core_list_contracts details
[ScalePad] List the service contracts between the MSP and its active clients. Cursor-paginated: returns data[], total_count, and next_cursor (null on the final page). Each contract carries id, name, description, client, contact, is_recurring, type (MANAGED_SERVICES | BLOCK | 3RD_PARTY | UNASSIGNED), term (starts_at, ends_at, is_auto_renew, billing_period: NOT_BILLED | ONE_TIME | ANNUAL | SEMI_ANNUAL | QUARTERLY | BI_MONTHLY | MONTHLY | BI_WEEKLY | WEEKLY | OTHER), source_type (the raw pre-standardization type), is_addendum, parent_contract, status (SUSPENDED | EXPIRED | ACTIVE | DRAFT | SENT | SIGNED | NOT_EXECUTED | CANCELLED), total_price, total_cost, is_billable, pricing_item_total_price, pricing_item_total_cost, contract_pricings[] (ACTIVE pricing lines only — expired lines are not returned), record_lineage[], record_created_at, and record_updated_at. Vendor-specific caveats: for ConnectWise total_price is the Bill Amount plus Additions, and total_cost / is_addendum are supported ONLY by ConnectWise (null for every other source system). Pass a returned id to scalepad_core_get_contract, or use it as filter[contract.id] on scalepad_core_list_tickets.
scalepad_core_list_tickets details
scalepad_core_list_tickets details
[ScalePad] List normalized service tickets across the MSP's clients. Cursor-paginated: returns data[], total_count, and next_cursor (null on the final page). Each ticket carries id, owner_member (accountable) and responsible_member (who resolved it), client, contact, contract, board (the workflow queue), summary, source (the channel it came in on), category (a large ScalePad-standardized enum spanning the INCIDENT and SERVICE_REQUEST families plus IT_MANAGEMENT, CYBERSECURITY_MANAGEMENT, DISASTER_RECOVERY, DOCUMENTATION_TRAINING, USER_MANAGEMENT, AUDIT and GENERAL_MANAGEMENT groups, falling back to the MSP's own unmapped categories and UNASSIGNED), is_child_ticket, is_long_ticket (resolved in more than one standard deviation above the account/category baseline), timeline (created_at, updated_at, responded_at, planned_at, resolved_at, closed_at), duration (per-stage metrics in MINUTES, already adjusted to exclude account time-off, non-working days and wait time), sla (is_response_in_sla, is_plan_in_sla, is_resolution_in_sla), status (current plus a full transition history), priority (current plus history), impact, severity, num_notes, record_lineage[], record_created_at, and record_updated_at.
Core Sites
scalepad_core_get_site details
scalepad_core_get_site details
[ScalePad] Get one client site by its ScalePad id (from scalepad_core_list_sites). Returns id, name, client, address, and record_lineage[] — a site record carries no created/updated timestamps. A 404 means the normalized record is missing or inaccessible.
scalepad_core_list_sites details
scalepad_core_list_sites details
[ScalePad] List client sites materialized from the source PSA's location data. Cursor-paginated: returns data[], total_count, and next_cursor (null on the final page). Each site carries only id, name, client (the owning client organization), address (the site's postal address), and record_lineage[] — unlike every other Core resource there are NO record_created_at / record_updated_at timestamps on a site, so incremental polling by timestamp is not possible here. Use filter[client.id] with an id from scalepad_core_list_clients to return one client's sites; pass a returned site id to scalepad_core_get_site. This operation documents no sort parameter.
LM Account & Insights
scalepad_lm_get_user_identity details
scalepad_lm_get_user_identity details
[ScalePad] Get the AUTHENTICATED user behind the API key, together with that user's feature access and permissions — the practical way to find out what this credential can actually do before attempting a write. Takes no parameters. Returns {user, feature_access[], feature_permissions[]}: user is {id, label, email, is_deleted}; each feature_access entry is a discriminated union on its type field — NoAccess and FullAccess and LimitedAccess — carrying feature_key, is_feature_released, plus licensed_clients[] {id, label} on FullAccess or feature_access_client, number_of_unlocks, max_number_of_unlocks and action_needed_for_full_access on LimitedAccess. feature_permissions[] mirrors that union but renames the two leading fields: feature_permission_key and has_permission instead of feature_key and is_feature_released — read each array with its own field names. The public schema does not name granular roles, so treat a runtime 403 as authoritative rather than inferring permissions from UI role names.
scalepad_lm_get_user_ui_state details
scalepad_lm_get_user_ui_state details
[ScalePad] Read back one blob of persisted UI preferences for the AUTHENTICATED user, scoped to the current account, under a caller-chosen state key. This is opaque per-user interface state — column widths, collapsed groups, a saved roadmap layout — not business data and not shared with anyone else: it tells you nothing about clients, assets or entitlements. Returns {payload, updated_at}, where payload is the JSON document previously stored as a STRING. Alone among the responses in this pack this schema declares NO required fields, so treat both payload and updated_at as possibly absent; the vendor does not document how an unset key behaves, so handle an empty response and a 404 as equally plausible rather than assuming one. Written by scalepad_lm_set_user_ui_state.
scalepad_lm_get_warranty_pricing details
scalepad_lm_get_warranty_pricing details
[ScalePad] List ONE client's renewable warranty assets and the monthly pricing options available for each. Cursor-paginated: returns {data[], total_count, next_cursor}. Each row is {id, client {id, label}, hardware_asset_id, name, warranty_type, device_type, manufacturer, model, serial_number, is_warranty_information_blurred, warranty_expiration_date, age_in_years, renewal_start_date, is_continuous_renewal_policy_applied, pricing_options[]}, and each pricing option is {id, name, monthly_unit_price_usd_subunits, dynamic_monthly_unit_prices_by_total_coverage_years, is_preferred}. Two things to get right when quoting these numbers: prices are in US-dollar SUBUNITS, so 825 means $8.25 per month, and dynamic_monthly_unit_prices_by_total_coverage_years is a map from total coverage years to that same subunit price (e.g. {"1":825,"2":742,"3":658}); and for assets whose device_type is Server the vendor states the price is an ESTIMATE, not a firm quote. is_preferred marks the option matching the client's preferred service level for that device type, and is_warranty_information_blurred means the date and age fields are withheld for that asset.
scalepad_lm_list_active_users details
scalepad_lm_list_active_users details
[ScalePad] List the users belonging to the authenticated ScalePad account — the MSP's own staff, not client contacts (for those see scalepad_lm_list_contacts). Takes no parameters and returns {data[]} only: no paging envelope, no filters, no sort. Each user is {user_id, first_name, last_name, email, is_email_bouncing, status}, where the schema's documented status values are Confirmed, Invited, SignedUp, Disabled, Deleted and Canceled — note the vendor calls this the ACTIVE users list yet declares those inactive states on the field, so read status rather than assuming every row is usable. This is the lookup for any user_id a write needs: notably evaluate_user_id on scalepad_lm_create_assessment and scalepad_lm_update_assessment, and the assignee ids/emails on scalepad_lm_create_action_item and scalepad_lm_update_action_item.
scalepad_lm_list_insights details
scalepad_lm_list_insights details
[ScalePad] List the whole insights board for the account — every insight applicable to the caller, FLATTENED across its categories (the vendor names High-risk, Hardware modernization, Software modernization, Warranty coverage, Backup monitoring, Windows 11 upgrades, Security, and user-defined). Takes no parameters and returns {data[]} only: no total_count, no next_cursor, no filters, no sort. Each entry is {insight_id, title, description, affected_count, trend_value, risk_level, category, category_label, asset_scope, state, is_pro_insight}. affected_count is the current broken-asset count and trend_value the 30-day change in it — trend_value is NULL when trend data is unavailable OR the caller's plan does not include trend access, so a null there is not necessarily 'no change'. risk_level and category are documented only by example (risk_level e.g. High or Low; category e.g. HighRisk or HardwareModernization, with category_label the display form), as is asset_scope (e.g. Hardware, Software, Contact, DeviceBackup); state is explicitly one of normal, success, prerequisite or initializing. is_pro_insight flags an insight that requires a Pro plan. Do not treat the example values as a closed enum.
scalepad_lm_set_user_ui_state details
scalepad_lm_set_user_ui_state details
[ScalePad] Persist one blob of UI preferences for the AUTHENTICATED user under a state key, scoped to the current account. This stores opaque per-user interface state only — the vendor's example is a saved roadmap layout — and changes no business data whatsoever: it does not affect clients, assets, initiatives, permissions or what any other user sees. The PUT REPLACES any prior payload for the same key; it is not a merge, so read the current value with scalepad_lm_get_user_ui_state and resend the parts that should survive. Succeeds with HTTP 204 and no body (this tool returns ). ScalePad publishes no way to list or delete keys, so a key written with a typo is effectively permanent clutter — reuse a key you have already read back.
LM Action Items
scalepad_lm_attach_goal_action_item details
scalepad_lm_attach_goal_action_item details
[ScalePad] LINK an existing ACTION ITEM to a GOAL, so the task counts toward that objective's progress. Parent = the goal; child = the action item. Both must already exist — this creates no records — and the action item MUST belong to the SAME CLIENT as the goal or the call is rejected. Succeeds with HTTP 200 and no body (this tool returns ). Confirm the resulting link with scalepad_lm_list_goal_action_items, and see the action item's own goal_links[] via scalepad_lm_get_action_item. This is the GOAL attach: use scalepad_lm_attach_initiative_action_item for an initiative and scalepad_lm_attach_meeting_action_item for a meeting.
scalepad_lm_attach_initiative_action_item details
scalepad_lm_attach_initiative_action_item details
[ScalePad] LINK an existing ACTION ITEM to an INITIATIVE, aligning the task with that implementation effort. Parent = the initiative; child = the action item. Both must already exist, and the action item should belong to the SAME CLIENT as the initiative. Succeeds with HTTP 200 and no body (this tool returns ). Verify with scalepad_lm_list_initiative_action_items; the action item's own view of the link is its initiative_links field on scalepad_lm_get_action_item — note that field is a single nullable object, not an array. This is the INITIATIVE attach: use scalepad_lm_attach_goal_action_item for a goal and scalepad_lm_attach_meeting_action_item for a meeting.
scalepad_lm_attach_meeting_action_item details
scalepad_lm_attach_meeting_action_item details
[ScalePad] LINK an existing ACTION ITEM to a MEETING, so the task appears as a discussion topic or tracked deliverable of that meeting. Parent = the meeting; child = the action item. Both must already exist, and the action item MUST belong to the SAME CLIENT as the meeting. Succeeds with HTTP 200 and no body (this tool returns ). Verify with scalepad_lm_list_meeting_action_items, or read the action item's meeting_links[] via scalepad_lm_get_action_item. This is the MEETING attach: use scalepad_lm_attach_goal_action_item for a goal and scalepad_lm_attach_initiative_action_item for an initiative.
scalepad_lm_create_action_item details
scalepad_lm_create_action_item details
[ScalePad] Create a new Lifecycle Manager action item for a client. Returns HTTP 200 with — that id is the same value the read tools expose as engagement_action_id. The create body takes NO link fields: to tie the new task to a goal, an initiative or a meeting, call scalepad_lm_attach_goal_action_item / _attach_initiative_action_item / _attach_meeting_action_item afterwards. ScalePad documents no idempotency-key header for this operation, so never blind-retry it — re-check with scalepad_lm_list_action_items filtered on the client first.
scalepad_lm_delete_action_item details
scalepad_lm_delete_action_item details
[ScalePad] PERMANENTLY delete an action item that is no longer relevant. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the item is missing or inaccessible. ScalePad documents no soft delete, restore or undo for this operation, so resolve and echo the exact item back to the user first — read it with scalepad_lm_get_action_item. When the intent is only to take a task out of the active workload, prefer scalepad_lm_update_action_item_completion_status with is_completed true, which keeps the record and its history. To break a task's link to a goal, initiative or meeting WITHOUT destroying the task, use the matching detach tool instead — those leave the action item intact.
scalepad_lm_detach_goal_action_item details
scalepad_lm_detach_goal_action_item details
[ScalePad] UNLINK an ACTION ITEM from a GOAL. This removes only the LINK — neither the goal nor the action item is deleted, and the action item stays in the system (it simply no longer appears under that goal). There is no undo for the relationship removal, so echo the exact goal and action item back to the user first; read the current links with scalepad_lm_list_goal_action_items. Succeeds with HTTP 204 and no body (this tool returns ). If the goal is that the TASK should cease to exist, that is scalepad_lm_delete_action_item, not this tool.
scalepad_lm_detach_initiative_action_item details
scalepad_lm_detach_initiative_action_item details
[ScalePad] UNLINK an ACTION ITEM from an INITIATIVE. This removes only the LINK — neither the initiative nor the action item is deleted, and the action item remains in the system, just no longer aligned to that initiative. The relationship removal has no undo, so echo the exact initiative and action item back to the user first; read the current links with scalepad_lm_list_initiative_action_items. Succeeds with HTTP 204 and no body (this tool returns ). To destroy the TASK itself use scalepad_lm_delete_action_item instead.
scalepad_lm_detach_meeting_action_item details
scalepad_lm_detach_meeting_action_item details
[ScalePad] UNLINK an ACTION ITEM from a MEETING. This removes only the LINK — neither the meeting nor the action item is deleted; the task continues to exist independently of the meeting. The relationship removal has no undo, so echo the exact meeting and action item back to the user first; read the current links with scalepad_lm_list_meeting_action_items. Succeeds with HTTP 204 and no body (this tool returns ). To destroy the TASK itself use scalepad_lm_delete_action_item; to remove a PERSON from the meeting use scalepad_lm_delete_meeting_attendee_contacts.
scalepad_lm_get_action_item details
scalepad_lm_get_action_item details
[ScalePad] Get ONE Lifecycle Manager action item in full by its id, including its linked entities. Returns the same record shape as scalepad_lm_list_action_items: client {id, label}, engagement_action_id, description, description_json, due_at, is_completed, is_pinned, created_at, completed_at, assigned_user_ids (user-id strings), ticket_link_state ({ticket_link_id, type} where type is Created | Pending | Error, plus ticket_link {ticket_number, external_url} once Created), initiative_links (one nullable object, not an array), meeting_links[] {meeting_link_id, meeting_id, meeting_title}, goal_links[] {link_id, goal_id, title, period, status}, created_by_user_id and sort_rank. Use this to hydrate the bare ids returned by scalepad_lm_list_goal_action_items, scalepad_lm_list_initiative_action_items and scalepad_lm_list_meeting_action_items.
scalepad_lm_list_action_items details
scalepad_lm_list_action_items details
[ScalePad] List Lifecycle Manager action items across every client the caller can access. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page is short. Each row carries client {id, label}, engagement_action_id, description, description_json (the ProseMirror rich-text document), due_at, is_completed, is_pinned, created_at, completed_at, assigned_user_ids, ticket_link_state, initiative_links, meeting_links[], goal_links[], created_by_user_id and sort_rank. Two vendor shapes to expect: assigned_user_ids is an array of plain user-id STRINGS on read (the create body reuses that name for an array of {id|email} objects), and initiative_links is a SINGLE nullable OBJECT {initiative_link_id, initiative_id, initiative_name} despite its plural name, while meeting_links[] and goal_links[] are real arrays. The id to pass to scalepad_lm_get_action_item / update / delete is engagement_action_id (the create call, confusingly, returns it as ). This is the only action-item read that returns full records: the goal/initiative/meeting list tools return ids only.
scalepad_lm_list_goal_action_items details
scalepad_lm_list_goal_action_items details
[ScalePad] For ONE GOAL, list the ACTION ITEMS linked to it — the tasks that contribute toward achieving that objective. Takes a GOAL id, not an initiative or meeting id. Returns {action_item_ids: [...]} — bare ids ONLY, with no titles, assignees, due dates or paging envelope; hydrate each one with scalepad_lm_get_action_item, or list full records for the whole client with scalepad_lm_list_action_items. This is the goal family: the initiative and meeting equivalents are scalepad_lm_list_initiative_action_items and scalepad_lm_list_meeting_action_items.
scalepad_lm_list_initiative_action_items details
scalepad_lm_list_initiative_action_items details
[ScalePad] For ONE INITIATIVE, list the ACTION ITEMS aligned to it — the tasks required to carry that implementation effort out. Takes an INITIATIVE id, not a goal or meeting id. Returns {action_item_ids: [...]} — bare ids ONLY, no records and no paging envelope; hydrate each with scalepad_lm_get_action_item. This is the initiative family: the goal and meeting equivalents are scalepad_lm_list_goal_action_items and scalepad_lm_list_meeting_action_items.
scalepad_lm_list_meeting_action_items details
scalepad_lm_list_meeting_action_items details
[ScalePad] For ONE MEETING, list the ACTION ITEMS created during or linked to it — the follow-ups arising from that client discussion. Takes a MEETING id, not a goal or initiative id. Returns {action_item_ids: [...]} — bare ids ONLY, no records and no paging envelope; hydrate each with scalepad_lm_get_action_item. This is the meeting family: the goal and initiative equivalents are scalepad_lm_list_goal_action_items and scalepad_lm_list_initiative_action_items. (Meeting ATTENDEES are a different resource — see scalepad_lm_add_meeting_attendee_contacts.)
scalepad_lm_pin_action_item details
scalepad_lm_pin_action_item details
[ScalePad] Pin or unpin ONE action item so it sorts above the other open action items in task lists. Purely a presentation/priority flag — it does not complete, reschedule or reassign anything, and it is independent of the manual drag order managed by scalepad_lm_reposition_action_item. The current state is the is_pinned field on scalepad_lm_get_action_item. Succeeds with HTTP 204 and no body (this tool returns ).
scalepad_lm_reposition_action_item details
scalepad_lm_reposition_action_item details
[ScalePad] Move ONE action item within the account's MANUAL sort order (the sort_rank field, and the sort=sort_rank ordering on scalepad_lm_list_action_items). Position is expressed by naming the dragged item's new neighbours, and the vendor's convention is easy to invert — reproduce it exactly: before_id is the action item the dragged item should land BEFORE, i.e. the neighbour that ends up immediately BELOW it in the final list; after_id is the one it should land AFTER, i.e. the neighbour that ends up immediately ABOVE it. Succeeds with HTTP 201 and no body (this tool returns ). This changes only ordering — nothing about assignment, dates or completion.
scalepad_lm_update_action_item details
scalepad_lm_update_action_item details
[ScalePad] Update an existing action item's core fields — description, rich text, due date and assignees. The vendor calls the payload "replacement action item fields", so treat it as a REPLACEMENT rather than a merge: read the current record with scalepad_lm_get_action_item first and resend what should survive, in particular the nullable due_at. One documented exception to that rule: when description_json is omitted the server DERIVES the rich-text document from the plain description rather than clearing it. Succeeds with HTTP 204 and no body (this tool returns ) — call scalepad_lm_get_action_item to see the result. Completion, pin state and sort position are NOT editable here: use scalepad_lm_update_action_item_completion_status, scalepad_lm_pin_action_item and scalepad_lm_reposition_action_item. Links are not editable here either — use the attach/detach tools.
scalepad_lm_update_action_item_completion_status details
scalepad_lm_update_action_item_completion_status details
[ScalePad] Mark ONE action item complete or incomplete. This is the only way to move an action item's is_completed flag — scalepad_lm_update_action_item cannot touch it. Setting is_completed true is what populates the record's completed_at timestamp; sending false reopens the task. Succeeds with HTTP 204 and no body (this tool returns ). Not to be confused with the assessment-level scalepad_lm_update_assessment_completion_status, which is a different resource entirely.
LM Assessment Templates
scalepad_lm_create_assessment_template details
scalepad_lm_create_assessment_template details
[ScalePad] Create a new account-owned assessment template with its own categories, questions and criteria. Returns HTTP 200 with — note the vendor names the key assessment_template_id here, while scalepad_lm_create_assessment returns a bare . The whole structure goes in one body; there is no per-category or per-question create endpoint. ScalePad documents no idempotency-key header, so never blind-retry — re-check with scalepad_lm_list_assessment_templates first. Instantiate the finished template for a client with scalepad_lm_create_assessment.
scalepad_lm_delete_assessment_template details
scalepad_lm_delete_assessment_template details
[ScalePad] PERMANENTLY remove an assessment template that is no longer needed, along with its categories, questions and criteria. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the template is missing or inaccessible. ScalePad documents no soft delete, restore or undo — read the template with scalepad_lm_get_assessment_template first, check its is_in_use flag, and echo the exact title and id back to the user before calling. This deletes the reusable BLUEPRINT, not the client assessments created from it; to delete one filled-in assessment use scalepad_lm_delete_assessment. The vendor does not document what happens to existing assessments that reference a deleted template, so do not assume they are unaffected.
scalepad_lm_get_assessment_template details
scalepad_lm_get_assessment_template details
[ScalePad] Get ONE assessment template in full — every category, question and criterion. Returns {assessment_template, should_promote_control_map} (the second flag is a vendor upsell hint for ScalePad ControlMap, not part of the template). The template carries assessment_template_id, scope, title, description, created_at, updated_at, is_in_use, is_category_weight_evenly_distributed and categories[]. Each category is {assessment_template_category_id, title, description, is_question_weight_evenly_distributed, weight_in_percentage, questions[]}; each question is {assessment_template_question_id, title, description, remediation_tips, scoring_instructions, criterion_label_type_enum, weight_in_percentage, criteria[]}; each criterion is {assessment_template_criterion_id, label_enum, description}. Note two asymmetries: the read does NOT return the per-question tag_ids that create and update require, and the criterion is label_enum here while a filled-in assessment's criterion exposes label_key plus display_label. Check is_in_use before deleting, and use this response as the starting point for scalepad_lm_update_assessment_template, which replaces the whole structure.
scalepad_lm_list_assessment_templates details
scalepad_lm_list_assessment_templates details
[ScalePad] List every assessment template OVERVIEW visible to the account. Unusually for this API the operation declares NO parameters at all — no page_size, no cursor, no sort, no filters — and returns {data[]} with no total_count or next_cursor, i.e. the complete set in one unpaginated response. Each row is {assessment_template_id, scope, title, description, created_at, updated_at}; the vendor documents scope only by example ("Application") and publishes no value list, so treat it as an opaque string. Overviews carry no categories, questions or criteria — call scalepad_lm_get_assessment_template for the structure. The assessment_template_id here is what scalepad_lm_create_assessment instantiates and what filter[assessment_template_id] on scalepad_lm_list_assessments accepts.
scalepad_lm_update_assessment_template details
scalepad_lm_update_assessment_template details
[ScalePad] Modify an existing assessment template, including its structure — categories, questions and criteria. Treat it as a STRUCTURAL REPLACEMENT rather than a patch: the body carries the entire template, and each category/question you want to keep must be resent WITH its existing id (an id updates that child, null creates a new one), so always start from scalepad_lm_get_assessment_template and edit that structure. The vendor does not document what happens to an existing category or question you leave out of the body, so never rely on omission to remove one — and never omit a child you intend to keep. Succeeds with HTTP 204 and no body (this tool returns ); read the result back with scalepad_lm_get_assessment_template. Changing a template that is already in use (is_in_use on the read) alters the blueprint for future assessments — it is not a way to retro-edit assessments already created from it.
LM Assessments
scalepad_lm_create_assessment details
scalepad_lm_create_assessment details
[ScalePad] Create a new assessment for a client FROM an existing assessment template — the template supplies the categories, questions and criteria, so there is no way to create a free-form assessment here. Returns HTTP 200 with . Answer the questions afterwards with scalepad_lm_evaluate_assessment. Pick the template with scalepad_lm_list_assessment_templates and the evaluating user with scalepad_lm_list_active_users. ScalePad documents no idempotency-key header, so never blind-retry — re-check with scalepad_lm_list_assessments filtered on the client and template first.
scalepad_lm_delete_assessment details
scalepad_lm_delete_assessment details
[ScalePad] PERMANENTLY delete an assessment that is no longer relevant. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the assessment is missing or inaccessible. ScalePad documents no soft delete, restore or undo, and the assessment carries its whole evaluation — answers, scores, and both the internal and public commentary — so resolve and echo the exact assessment back to the user first with scalepad_lm_get_assessment. This deletes ONE completed/in-progress assessment, not the reusable template it came from: for that, see scalepad_lm_delete_assessment_template.
scalepad_lm_evaluate_assessment details
scalepad_lm_evaluate_assessment details
[ScalePad] ANSWER an assessment: submit the criterion selected for each question, which is what makes ScalePad RECOMPUTE the assessment's scores (overall_score and each category_score). Send one entry per question you are answering — the batch is the unit of work. This is NOT the same as scalepad_lm_update_assessment_completion_status, which only flips the complete/incomplete flag and recomputes nothing. Succeeds with HTTP 204 and no body (this tool returns ); read the new scores back with scalepad_lm_get_assessment. Note the response field is_previously_selected on each criterion, which shows what the prior answer was.
scalepad_lm_get_assessment details
scalepad_lm_get_assessment details
[ScalePad] Get ONE assessment in full, including its evaluation. Returns where the assessment carries id, assessment_template_id, client {id, label}, title, description, internal_comment (the MSP-private assessment-level note), evaluate_user_id, record_created_at, evaluated_at, updated_at, status, overall_score and category_list[]. Each category is {assessment_category_id, assessment_template_category_id, title, description, category_score, question_list[]}; each question is {assessment_question_id, assessment_template_question_id, title, description, remediation_tips, scoring_instructions, criteria_list[], public_comment, internal_comments}; each criterion is {assessment_criterion_id, assessment_template_criterion_id, label_key, display_label, description, is_selected, is_previously_selected}. Two vendor shapes to expect: public_comment is SINGULAR while internal_comments is PLURAL, yet both are a single comment object of the same schema {assessment_question_comment_id, assessment_question_id, comment_plain_text, comment_json, record_created_at, updated_user_id, updated_at}; and comment_json arrives here as a nested ProseMirror OBJECT even though the write tools take it as a JSON-encoded STRING. The assessment_question_id values in question_list are exactly what scalepad_lm_evaluate_assessment and the two question-comment tools accept, and the assessment_criterion_id values are what evaluate selects.
scalepad_lm_list_assessments details
scalepad_lm_list_assessments details
[ScalePad] List assessment OVERVIEWS across the account. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page is short. Each overview row carries id, assessment_template_id, client {id, label}, title, description, evaluate_user_id, record_created_at, evaluated_at, updated_at, status, overall_score, question_count and question_answered_count. Overviews do NOT include the questions, criteria or comments — call scalepad_lm_get_assessment for the full nested structure. This endpoint documents page_size and cursor but NO sort parameter, so results come back in the server's own order.
scalepad_lm_update_assessment details
scalepad_lm_update_assessment details
[ScalePad] Update an assessment's header fields — title, evaluating user and evaluation date-time. All three are required by the schema, so this is a replacement of that trio rather than a patch: read the current values with scalepad_lm_get_assessment and resend the ones that should not change. Succeeds with HTTP 204 and no body (this tool returns ). This tool cannot change answers (that is scalepad_lm_evaluate_assessment), the completion flag (scalepad_lm_update_assessment_completion_status), the internal comment (scalepad_lm_upsert_assessment_internal_comment), or the client and template the assessment was created from.
scalepad_lm_update_assessment_completion_status details
scalepad_lm_update_assessment_completion_status details
[ScalePad] Toggle ONE assessment between complete and incomplete. This changes only the completion flag — it does NOT score anything, does not answer any question, and does not validate that every question has been answered; scoring is scalepad_lm_evaluate_assessment. Succeeds with HTTP 204 and no body (this tool returns ); the resulting state shows up as the status field on scalepad_lm_list_assessments / scalepad_lm_get_assessment (documented values Completed and InProgress). Distinct from scalepad_lm_update_action_item_completion_status, which is a different resource.
scalepad_lm_upsert_assessment_internal_comment details
scalepad_lm_upsert_assessment_internal_comment details
[ScalePad] Create or replace the ASSESSMENT-LEVEL INTERNAL comment — the vendor states these are private notes visible ONLY to the MSP, never to the client. Scope and format both differ from the question-level tools: this one covers the whole assessment (not a single question) and takes a required PLAIN-TEXT string, with no ProseMirror rich-text field at all. It is an upsert, so the value REPLACES any previous internal comment; read the current text from the assessment's internal_comment field via scalepad_lm_get_assessment before overwriting. Succeeds with HTTP 204 and no body (this tool returns ). For a client-visible note use scalepad_lm_upsert_assessment_question_comment_public — never this tool.
scalepad_lm_upsert_assessment_question_comment_internal details
scalepad_lm_upsert_assessment_question_comment_internal details
[ScalePad] Create or replace the INTERNAL comment on ONE QUESTION of an assessment — staff-only commentary that is NOT client-visible (vendor path .../questions//comment/internal). This is the per-question sibling of the assessment-wide scalepad_lm_upsert_assessment_internal_comment, and the internal counterpart of scalepad_lm_upsert_assessment_question_comment_public: the two question tools take identical bodies and differ ONLY in the final path segment, so confirm you want internal before calling — sending staff notes to the public endpoint exposes them to the client. Upsert semantics: the value REPLACES the question's existing internal comment. Succeeds with HTTP 204 and no body (this tool returns ); the stored result appears as internal_comments (the vendor's plural name for a single object) on the question in scalepad_lm_get_assessment.
scalepad_lm_upsert_assessment_question_comment_public details
scalepad_lm_upsert_assessment_question_comment_public details
[ScalePad] Create or replace the PUBLIC comment on ONE QUESTION of an assessment (vendor path .../questions//comment/public). This is the ONLY comment tool in this group whose content is CLIENT-VISIBLE — it is the narrative the client reads next to that question, so write it for that audience and never put staff-only notes here. The internal counterpart is scalepad_lm_upsert_assessment_question_comment_internal, which takes an identical body and differs only in the final path segment. Upsert semantics: the value REPLACES the question's existing public comment. Succeeds with HTTP 204 and no body (this tool returns ); the stored result appears as public_comment on the question in scalepad_lm_get_assessment.
LM Budget & Forecast
scalepad_lm_download_budget_forecast_csv details
scalepad_lm_download_budget_forecast_csv details
[ScalePad] Export ONE client's budget forecast as a CSV file. Binary and text/csv cannot cross MCP's JSON tool surface, so this tool does NOT return the file contents: StackJack downloads the CSV, stores it, and returns a JSON envelope with a short-lived READ-ONLY download URL — {SasUrl, ContentType, SuggestedFilename, SizeBytes, ExpiresAt}. The URL is valid for about 30 minutes and then stops working, so fetch it or hand it off promptly; re-run this tool to mint a fresh one. If you want the numbers IN the conversation rather than a file, use scalepad_lm_get_budget_summary (totals) or scalepad_lm_list_budget_contracts / scalepad_lm_list_budget_it_debt (rows) instead. Unlike the two PDF exports, this endpoint documents no include_chart option.
scalepad_lm_download_budget_forecast_detail_pdf details
scalepad_lm_download_budget_forecast_detail_pdf details
[ScalePad] Export ONE client's budget forecast as the DETAILED PDF — the line-item document behind the overview. Binary cannot cross MCP's JSON tool surface, so this tool does NOT return the file bytes: StackJack downloads the PDF, stores it, and returns a JSON envelope with a short-lived READ-ONLY download URL — {SasUrl, ContentType, SuggestedFilename, SizeBytes, ExpiresAt}, valid for about 30 minutes. This is the only export that accepts a group option, and ScalePad currently implements exactly one value for it: "Period". For the shorter client-facing summary use scalepad_lm_download_budget_forecast_pdf. Generating an export changes nothing in ScalePad.
scalepad_lm_download_budget_forecast_pdf details
scalepad_lm_download_budget_forecast_pdf details
[ScalePad] Export ONE client's budget forecast as the OVERVIEW PDF — the client-facing summary document. Binary cannot cross MCP's JSON tool surface, so this tool does NOT return the file bytes: StackJack downloads the PDF, stores it, and returns a JSON envelope with a short-lived READ-ONLY download URL — {SasUrl, ContentType, SuggestedFilename, SizeBytes, ExpiresAt}. The URL is valid for about 30 minutes and then stops working; re-run this tool to mint a fresh one. This is the OVERVIEW; for the per-period breakdown document use scalepad_lm_download_budget_forecast_detail_pdf, which additionally supports a group option. Generating an export changes nothing in ScalePad.
scalepad_lm_get_budget_summary details
scalepad_lm_get_budget_summary details
[ScalePad] Get the AGGREGATE per-type totals for one client's budget forecast across the requested period window. Returns {data, column_keys, currency_code} — read column_keys to know which period each figure in a data row belongs to, and currency_code to label the amounts. NOT paginated: this endpoint documents no page_size and no cursor, so one call returns the whole summary. It accepts the WIDEST filter set in the budget family (type, status, asset_type.id, is_third_party, name) plus the it_debt_group_by_asset_type option, which the vendor documents only here — the per-row lists accept narrower sets, so do not copy filters between them. For the underlying rows behind these totals, use scalepad_lm_list_budget_contracts and scalepad_lm_list_budget_it_debt.
scalepad_lm_list_budget_availabilities details
scalepad_lm_list_budget_availabilities details
[ScalePad] Get the OPTION LISTS used to construct valid Budget API queries for ONE client — returns . Call this FIRST when building any budget query: it is how you discover the real asset-type ids, statuses and other values that the filters on scalepad_lm_get_budget_summary, scalepad_lm_list_budget_contracts and scalepad_lm_list_budget_it_debt will accept, rather than guessing them. It takes no window options and no filters of its own — client_id is its only parameter — and returns no paging envelope.
scalepad_lm_list_budget_contracts details
scalepad_lm_list_budget_contracts details
[ScalePad] List ONE client's contracts with their PER-PERIOD forecast amounts — the contract rows behind the totals in scalepad_lm_get_budget_summary. Cursor-paginated: returns {data[], total_count, next_cursor} — page until next_cursor is null. Only TWO filters are documented here: is_third_party (eq only) and name (cont|eq); the summary's type, status and asset_type.id filters do NOT apply to this endpoint, so do not copy a filter set across. Note this is the BUDGET view of contracts (forecast amounts per period), not the contract records themselves — for titles, billing cycles and costs use scalepad_lm_list_contracts, whose filters are different again (filter[client.id] and filter[expiry_status]).
scalepad_lm_list_budget_initiatives details
scalepad_lm_list_budget_initiatives details
[ScalePad] List ONE client's Lifecycle Manager initiatives with their PER-PERIOD forecast amounts — the budgeting view of the roadmap, as opposed to scalepad_lm_list_initiatives_v2, which returns the same records with their roadmap detail and no forecast figures. Requires a client id in the path, so it is always single-client. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page is short, and deduplicate because cursor scans are not atomic. Note this endpoint's filter vocabulary is NOT the initiative list's: only status and name are documented here (no client.id filter — the client is in the path — and no priority, scheduled or date filters). Amounts follow the connector's convention of integer subunits in the account's currency.
scalepad_lm_list_budget_it_debt details
scalepad_lm_list_budget_it_debt details
[ScalePad] List ONE client's IT DEBT assets with their PER-PERIOD forecast amounts — the aging hardware whose replacement cost the forecast is carrying, and the row-level detail behind the IT_DEBT totals in scalepad_lm_get_budget_summary. Cursor-paginated: returns {data[], total_count, next_cursor} — page until next_cursor is null. Only TWO filters are documented here: asset_type.id (eq|in, DOTTED) and name (cont|eq); the summary's type, status and is_third_party filters do NOT apply. Resolve real asset-type ids with scalepad_lm_list_budget_availabilities rather than guessing them. Note that it_debt_group_by_asset_type is a SUMMARY option and is not documented for this endpoint — these rows are already per asset.
LM Client Groups
scalepad_lm_assign_client_group_assignments details
scalepad_lm_assign_client_group_assignments details
[ScalePad] ASSIGN clients and/or users to a client group. Additive: it adds the members named in the body and leaves the group's existing membership alone, so this is not a replace-the-roster call. Because client groups gate visibility, assigning a USER GRANTS that user access to every client in the group — treat it as a permission change and confirm the intended people, not just the intended clients. Succeeds with HTTP 204 and no body (this tool returns ); verify with scalepad_lm_get_client_group. The exact reverse is scalepad_lm_unassign_client_group_assignments, which takes an identical body — the only difference between the two calls is the tool you pick, so re-read the name before sending.
scalepad_lm_get_client_group details
scalepad_lm_get_client_group details
[ScalePad] Get ONE client group in full, including its assigned users and clients. The record is wrapped in a single-key envelope — {client_group: } — not returned bare, so read through client_group rather than expecting the fields at the top level. This is the read to run BEFORE scalepad_lm_unassign_client_group_assignments so the exact membership being removed can be echoed back to the user, and AFTER an assign to confirm the change landed. It answers 'who is in this group'; for 'which groups is this client in', call scalepad_lm_search_clients_client_groups.
scalepad_lm_list_client_groups details
scalepad_lm_list_client_groups details
[ScalePad] List every client group on the authenticated partner account. Returns {data[]} — a bare array with NO paging envelope: this endpoint declares no page_size, no cursor, no sort and no filters at all, so one call returns the complete set and there is nothing to page through. Use it to resolve a group NAME into the client_group_id that the get/assign/unassign tools require. For the membership of a single group (its assigned clients and users) call scalepad_lm_get_client_group; to ask the inverse question — which groups a given client belongs to — call scalepad_lm_search_clients_client_groups.
scalepad_lm_search_clients_client_groups details
scalepad_lm_search_clients_client_groups details
[ScalePad] List the client groups that ONE client is assigned to. This is a POST that only READS — it takes a body instead of a query string (the client key is PII-ish, so ScalePad moved it out of the URL) and changes nothing, despite the vendor's own OpenAPI labelling the operation 'write — update/state change'. That label is a vendor misclassification, recorded rather than followed; the operationId is ApiPublicV1ClientsClientGroupsList and the documented purpose is 'List the client groups assigned to a specific client'. Returns {data[]} with no paging envelope. This is the inverse of scalepad_lm_get_client_group, which lists the members OF a group.
scalepad_lm_unassign_client_group_assignments details
scalepad_lm_unassign_client_group_assignments details
[ScalePad] UNASSIGN clients and/or users from a client group — a relationship REMOVAL, and the reason this tool is destructive even though the HTTP verb is POST: the vendor expresses the removal as POST to the '/assignments/unassign' path rather than as a DELETE, so the verb alone understates what it does. Nothing is deleted (neither the group, the clients, nor the users) but visibility IS revoked: unassigning a user removes that user's access to the group's clients, which can hide data from someone mid-work. There is no undo and no partial report, so read the current membership with scalepad_lm_get_client_group first and echo the exact clients and users back to the user before calling. Succeeds with HTTP 200 and NO response body (note: 200, not the 204 its assign counterpart returns) — this tool returns either way. The additive counterpart is scalepad_lm_assign_client_group_assignments, whose body is identical.
LM Clients
scalepad_lm_list_clients details
scalepad_lm_list_clients details
[ScalePad] List the Lifecycle Manager clients the caller can access, as full client-console rows. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page looks short, and deduplicate by client id because cursor scans are not atomic. This is the roster read: prefer it over scalepad_lm_search_clients when enumerating an account, because that tool returns only {id, label} pairs and silently narrows to the caller's most recently visited clients when no search term is supplied. ScalePad documents NO filter parameters on this endpoint — only free-text search, sort, page_size and cursor — so narrowing to one client is done with search, not with a filter[...] key.
scalepad_lm_search_client_contacts details
scalepad_lm_search_client_contacts details
[ScalePad] Search the PSA CONTACTS (people at the client) belonging to ONE client, by name. Returns {data[]} of id/name/email tuples — no paging envelope, no cursor, no total_count. Intended for resolving a person into the reference a Lifecycle Manager opportunity or meeting attendee expects. Two things to respect: the search term must be at least TWO characters (a shorter or empty term returns NO results rather than everything, so this cannot be used to enumerate a client's contacts), and this reads from the PSA rather than from Lifecycle Manager's own contact records — for those, including hidden status, use scalepad_lm_list_contacts. The sibling scalepad_lm_search_client_members searches PSA STAFF instead of client people.
scalepad_lm_search_client_members details
scalepad_lm_search_client_members details
[ScalePad] Search the PSA MEMBERS (staff and resources, not client-side people) associated with ONE client, by name. Returns {data[]} of id/name/email tuples — no paging envelope and no cursor. Used to resolve the internal person an opportunity or assignment should reference. As with the contacts lookup, the search term must be at least TWO characters and a shorter or empty term returns NO results, so this is a resolver rather than a way to enumerate members. For the client's own people use scalepad_lm_search_client_contacts.
scalepad_lm_search_clients details
scalepad_lm_search_clients details
[ScalePad] Search clients by name for a PICKER, returning lightweight {id, label} pairs scoped to the caller's client-group access. Cursor-paginated as {data[], total_count, next_cursor}. Use this to resolve a client NAME the user typed into the client id that every other Lifecycle Manager tool wants. One behavior that makes it unsuitable for inventory work: when search is OMITTED this endpoint returns the caller's MOST RECENTLY VISITED clients, not all clients — so an empty-search call that returns five rows does not mean the account has five clients. Use scalepad_lm_list_clients for the full roster and for the complete client record.
LM Contacts
scalepad_lm_add_meeting_attendee_contacts details
scalepad_lm_add_meeting_attendee_contacts details
[ScalePad] ADD one or more CLIENT CONTACTS as attendees of a meeting. The path id is the MEETING, and the body names the contacts. Returns HTTP 201 with — the ids that are now attendees. This tool handles the client side only: the MSP's own user attendees are a separate meetings-surface resource, so an internal user cannot be added here. Remove attendees again with scalepad_lm_delete_meeting_attendee_contacts.
scalepad_lm_delete_meeting_attendee_contacts details
scalepad_lm_delete_meeting_attendee_contacts details
[ScalePad] REMOVE client contacts from a meeting's attendee list — plainly, it takes those people off the meeting. Despite the HTTP POST verb this is a removal: the vendor expresses it as a POST to .../attendees/contacts/delete (the older DELETE-on-collection form is retired and no longer available). It removes only the ATTENDANCE record; the contacts themselves and the meeting both survive, but the removal is a real state change with no undo, so echo the exact meeting and every contact back to the user before calling. Succeeds with HTTP 200 and no body (this tool returns ). This is the client-side attendee list only — MSP user attendees are removed through the separate meetings-surface user-attendee operation. To detach a TASK rather than a person, use scalepad_lm_detach_meeting_action_item.
scalepad_lm_get_contact details
scalepad_lm_get_contact details
[ScalePad] Get ONE Lifecycle Manager contact by its public id. Returns with the same record shape as scalepad_lm_list_contacts: contact_id, client_id, client_name, first_name, last_name, display_name, email_address, title, is_hidden, can_unhide, is_manually_created, record_lineage[], licenses[], posture and sat. Unlike the list — which hides hidden contacts unless you ask for them — this read resolves HIDDEN contacts too, and it accepts EITHER the Core API contact id OR the temporary Lifecycle Manager contact id.
scalepad_lm_list_contacts details
scalepad_lm_list_contacts details
[ScalePad] List Lifecycle Manager contacts for every client the caller can access. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page is short. Each row carries contact_id, client_id, client_name, first_name, last_name, display_name, email_address, title, is_hidden, can_unhide, is_manually_created, record_lineage[] (source_record_id plus the integration_configuration and vendor behind the synced record), licenses[] (SaaS license assignments: assignment_id, asset_id, sku_id, sku_name, category, status, is_trial_free — an empty array when none are linked), posture (is_active, is_mfa_enabled, mfa_methods[], last_active_at, derived from SaaS data) and sat (security-awareness training: training_completed_count, training_available_count, phishing_emails_sent_count, phishing_emails_failed_count). contact_id is the Core API contact id when available, otherwise a TEMPORARY Lifecycle Manager id while the contact is still processing. IMPORTANT default: with no filter[is_hidden] the response contains VISIBLE contacts only.
LM Contracts
scalepad_lm_attach_contract_assets details
scalepad_lm_attach_contract_assets details
[ScalePad] ATTACH one or more hardware assets to an agreement (contract), by hardware identifier. Additive — it adds the named assets and leaves any already-attached hardware alone; nothing is created or deleted. Sent as a PUT (its detach counterpart is a POST), and succeeds with HTTP 204 and no body (this tool returns ). Verify the result from the asset side with scalepad_lm_search_hardware_attached_agreements, which returns {contract_ids: [...]} for a given hardware key. The exact reverse is scalepad_lm_bulk_delete_contract_assets, which takes an identical hardware_keys body.
scalepad_lm_bulk_delete_contract_assets details
scalepad_lm_bulk_delete_contract_assets details
[ScalePad] DETACH one or more hardware assets from an agreement (contract) in bulk. This is destructive despite the POST verb and the create-like operationId: the vendor expresses the removal as POST to the '/assets/delete' path, so neither the method nor the name signals what it does. It removes only the LINK — neither the contract nor the hardware assets are deleted, and both continue to exist independently — but the agreement stops covering that hardware, which changes warranty and coverage reporting. There is no undo and no partial report, so echo the exact contract and asset set back to the user first; read the current links from the asset side with scalepad_lm_search_hardware_attached_agreements. Succeeds with HTTP 204 and no body (this tool returns ). To destroy the AGREEMENT itself use scalepad_lm_delete_contract; the additive counterpart is scalepad_lm_attach_contract_assets.
scalepad_lm_create_contract details
scalepad_lm_create_contract details
[ScalePad] Create a new contract (agreement) for a client. Returns HTTP 200 with . Costs are integer currency SUBUNITS — $100.00 USD is 10000 — so a major-unit value understates the contract 100-fold and corrupts the client's budget forecast. The body carries NO asset links: to attach hardware, call scalepad_lm_attach_contract_assets afterwards. ScalePad documents no idempotency-key header for this operation, so never blind-retry it — re-check with scalepad_lm_list_contracts filtered on filter[client.id] first. Note the create body names the client as a client_key OBJECT while the update body names it as a flat client_id STRING; that asymmetry is the vendor's.
scalepad_lm_delete_contract details
scalepad_lm_delete_contract details
[ScalePad] PERMANENTLY delete a contract that is no longer relevant to business operations. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the contract is missing or inaccessible. ScalePad documents no soft delete, restore or undo, and deleting an agreement REMOVES ITS COST FROM THE CLIENT'S BUDGET FORECAST — so resolve and echo the exact contract back to the user first with scalepad_lm_get_contract. When the intent is only to stop an agreement going forward, prefer scalepad_lm_update_contract with status Inactive (or an end_at date), which keeps the record and its forecast history. To remove only the HARDWARE attached to an agreement, use scalepad_lm_bulk_delete_contract_assets — that leaves the contract intact.
scalepad_lm_get_contract details
scalepad_lm_get_contract details
[ScalePad] Get ONE contract in full by its id. The record is wrapped in a single-key envelope — {contract: } — not returned bare, so read through contract rather than expecting fields at the top level. Run this BEFORE scalepad_lm_update_contract: that call replaces the whole payload rather than merging, so the current values are what you need in order to resend everything that should survive. Run it before scalepad_lm_delete_contract too, so the exact agreement can be echoed back to the user. Costs come back in integer currency SUBUNITS (10000 = $100.00).
scalepad_lm_list_contracts details
scalepad_lm_list_contracts details
[ScalePad] List contracts (agreements) as overview rows, across every client the caller can access. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page looks short, and deduplicate by contract id because cursor scans are not atomic. Exactly TWO filter fields are documented here and each accepts ONLY the eq operator: client.id (note the DOT — this endpoint spells it client.id, whereas the hardware dashboard and hardware lifecycles endpoints spell the same concept with an UNDERSCORE as client_id, and the hardware asset list takes client_id as a plain query parameter rather than a filter; a wrong spelling is silently ignored and returns unfiltered or empty results rather than an error) and expiry_status, whose only documented values are Expires90Days and Expired. No sort parameter is documented for this endpoint.
scalepad_lm_update_contract details
scalepad_lm_update_contract details
[ScalePad] Update an existing contract with FULL details. The payload is a REPLACEMENT, not a merge — read the current record with scalepad_lm_get_contract and resend every field that should survive, or an omitted nullable (end_at, description, per-seat cost, seat count) is cleared. Costs are integer currency SUBUNITS (10000 = $100.00); a major-unit value silently rewrites the client's forecast. Succeeds with HTTP 204 and no body (this tool returns ) — re-read with scalepad_lm_get_contract to see the result. Attached hardware is NOT editable here: use scalepad_lm_attach_contract_assets and scalepad_lm_bulk_delete_contract_assets. Note the update body names the client as a flat client_id STRING while the create body uses a client_key OBJECT — the vendor's own asymmetry, so do not carry the create shape over.
LM Deliverable Templates
scalepad_lm_create_deliverable_template details
scalepad_lm_create_deliverable_template details
[ScalePad] Create a new deliverable template for the ACCOUNT from scratch, defining its sections and components yourself. Returns HTTP 201 with , the full new template. This is the only one of the three template-creating tools that accepts a body — the other two copy a source and derive the name. Two template-vs-deliverable differences to get right in the body: a section's summary is PLAIN TEXT here (the deliverable equivalent, summary_json, takes a ProseMirror document), and template sections have NO include_cover_page or include_exec_summary fields, because those PDF controls exist only on deliverables. Call scalepad_lm_list_deliverable_template_catalog_components first for the legal component values. ScalePad documents no idempotency-key header, so never blind-retry — re-check with scalepad_lm_list_deliverable_templates first.
scalepad_lm_create_deliverable_template_from_deliverable details
scalepad_lm_create_deliverable_template_from_deliverable details
[ScalePad] PROMOTE an existing client DELIVERABLE into a new reusable account template, extracting its section and component structure. Takes a DELIVERABLE id, not a template id — this is the tool that turns a document you liked into a pattern, and it is the natural thing to run BEFORE deleting a good deliverable so its structure survives. Returns HTTP 201 with . There is NO request body, so you cannot name the new template in this call — rename it afterwards with scalepad_lm_update_deliverable_template. Expect a lossy conversion at the rich-text boundary: deliverable sections carry ProseMirror summary_json while template sections carry a plain-text summary, so formatting in section summaries can be flattened. The source deliverable is unchanged. To copy a template rather than a deliverable, use scalepad_lm_create_deliverable_template_from_template.
scalepad_lm_create_deliverable_template_from_template details
scalepad_lm_create_deliverable_template_from_template details
[ScalePad] COPY an existing template into a new account template — template in, template out. The source may be a ScalePad-provided template (available to every account) or one of your own custom templates, which makes this the standard way to get an editable copy of a ScalePad template you are not allowed to modify in place. Returns HTTP 201 with . There is NO request body, so the new template's name is derived rather than chosen; rename it with scalepad_lm_update_deliverable_template. The source template is unchanged. Do not confuse the three neighbours: this one copies a TEMPLATE to a TEMPLATE, scalepad_lm_create_deliverable_template_from_deliverable promotes a DELIVERABLE to a template, and scalepad_lm_create_deliverable_from_template instantiates a template as a CLIENT's deliverable (the only one of the three that takes a client id).
scalepad_lm_delete_deliverable_template details
scalepad_lm_delete_deliverable_template details
[ScalePad] PERMANENTLY delete a deliverable template, along with its sections and components. Succeeds with HTTP 204 and no body (this tool returns ); 404 if it is missing or inaccessible. ScalePad documents no soft delete, restore or undo, so resolve and echo the exact template back to the user first — read it with scalepad_lm_get_deliverable_template. This is ACCOUNT-WIDE: the template disappears for every user, so anyone who builds QBRs from it loses that starting point. ScalePad does NOT document what happens to deliverables previously created from this template, so do not promise the user those documents are unaffected — treat it as unverified. Deliverables are separate records created by copy, so they are unlikely to vanish, but say so as an expectation rather than a fact.
scalepad_lm_delete_deliverable_template_section details
scalepad_lm_delete_deliverable_template_section details
[ScalePad] PERMANENTLY delete ONE section from a deliverable template, along with the components inside it. The template itself and its other sections survive. Succeeds with HTTP 204 and no body (this tool returns ). No undo, so echo the exact section back to the user first — list the current sections with scalepad_lm_get_deliverable_template. Note that scalepad_lm_update_deliverable_template canNOT do this: omitting a section from that patch leaves it unchanged rather than removing it, which is why this tool exists. This edits the TEMPLATE, so it changes what FUTURE deliverables built from it will contain; deliverables already created from the template are separate records and are not being edited here. To remove one component instead, use scalepad_lm_delete_deliverable_template_section_component.
scalepad_lm_delete_deliverable_template_section_component details
scalepad_lm_delete_deliverable_template_section_component details
[ScalePad] PERMANENTLY delete ONE component from one section of a deliverable template — the narrowest deletion in the template family. The section and the rest of the template survive. Succeeds with HTTP 204 and no body (this tool returns ); no undo, so echo the exact component back to the user first. The three ids are hierarchical and must be passed in DESCENDING order: TEMPLATE, then the section inside it, then the component inside that section — all three come from scalepad_lm_get_deliverable_template, and a component id belonging to a different section will not resolve. The first id is a template id, NOT a deliverable id: the identically-shaped deliverable tool is scalepad_lm_delete_deliverable_section_component, and passing one family's ids to the other is the mistake to avoid here. This changes what FUTURE deliverables built from the template contain, not existing ones.
scalepad_lm_get_deliverable_template details
scalepad_lm_get_deliverable_template details
[ScalePad] Get ONE deliverable template in full by its id, including all of its sections and the components inside them. The response is WRAPPED as {"deliverable_template": } — note the key is deliverable_template, not the deliverable key that the deliverable read returns, so a caller reusing the deliverable parsing path will find nothing. Works for both ScalePad-provided and custom templates. This is the read to call before scalepad_lm_update_deliverable_template, whose upsert semantics need the existing section and component ids to edit them rather than duplicate them, and before either delete-section tool.
scalepad_lm_list_deliverable_template_catalog_components details
scalepad_lm_list_deliverable_template_catalog_components details
[ScalePad] List the deliverable catalog components available for use in TEMPLATES, account-wide. Returns {data: [...]}, no paging envelope, no arguments. This is the template-authoring counterpart of scalepad_lm_list_client_deliverable_components, and the distinction matters: this list is account-wide and takes no client id, whereas the client version reflects what one specific client's vendor integrations make available. Because a template is not bound to a client, a component that is legal in a template can still be unavailable when that template is instantiated for a client whose integrations do not include it — so check the client list too before promising a client-specific result. Use this to pick legal component_key and component_type_configuration values for scalepad_lm_create_deliverable_template and scalepad_lm_update_deliverable_template.
scalepad_lm_list_deliverable_templates details
scalepad_lm_list_deliverable_templates details
[ScalePad] List every deliverable template available to the account — BOTH the ScalePad-provided templates that ship to all accounts AND the custom templates this account owns, in one combined response. Returns {data: [...]} with no paging envelope (no total_count, no next_cursor) and takes no arguments, so one call returns the complete set. Use this to find the templateId for scalepad_lm_create_deliverable_from_template (build a client's document) or scalepad_lm_create_deliverable_template_from_template (copy the template itself). The response mixes the two kinds together, so check a template's ownership before offering to edit or delete it — a ScalePad-provided template is not yours to change.
scalepad_lm_update_deliverable_template details
scalepad_lm_update_deliverable_template details
[ScalePad] Partially update a deliverable template — rename it, and upsert its sections and components. Returns HTTP 200 with , the updated template. This is a true PATCH with UPSERT semantics, not a replacement: only the fields you send are touched, an element WITH an id is updated, an element WITHOUT an id is CREATED, and anything omitted is left unchanged. So this is the only way to ADD a section or component to a template, and omission never removes one — deletion is scalepad_lm_delete_deliverable_template_section / _component. Read the template first with scalepad_lm_get_deliverable_template so you send existing ids and edit rather than duplicate. This is also the rename step after either create-from tool, since neither accepts a name. ScalePad does not document whether a ScalePad-provided template can be patched, so expect an error on one and prefer copying it first with scalepad_lm_create_deliverable_template_from_template.
LM Deliverables
scalepad_lm_create_client_deliverable details
scalepad_lm_create_client_deliverable details
[ScalePad] Create a NEW deliverable from scratch for one client, specifying its sections and components yourself. Returns HTTP 201 with (containing the new deliverable's id, sections and components). Use this when there is no suitable template; to build from a template instead — far less body to get right — use scalepad_lm_create_deliverable_from_template, and to turn a deliverable you already like into a reusable template afterwards use scalepad_lm_create_deliverable_template_from_deliverable. Discover the legal component_key / component_type_configuration values for THIS client first with scalepad_lm_list_client_deliverable_components, since a client's available components depend on which vendor integrations are set up for it. ScalePad documents no idempotency key for this operation, so never blind-retry it — re-check with scalepad_lm_list_client_deliverables first.
scalepad_lm_create_deliverable_from_template details
scalepad_lm_create_deliverable_from_template details
[ScalePad] Create a new DELIVERABLE for one client by copying a TEMPLATE — client-scoped, and the easiest way to start a document: the template supplies the whole section/component structure so the body only needs an optional name. Returns HTTP 201 with . The source may be a ScalePad-provided template (available to every account) or a custom template your account owns; list both with scalepad_lm_list_deliverable_templates. Do not confuse this with the two template-producing tools that read the other direction: scalepad_lm_create_deliverable_template_from_deliverable promotes an existing DELIVERABLE into a template, and scalepad_lm_create_deliverable_template_from_template copies a TEMPLATE into another template. This tool is the only one of the three that takes a client id, and the only one of the three that accepts a request body.
scalepad_lm_create_deliverable_share_general_link details
scalepad_lm_create_deliverable_share_general_link details
scalepad_lm_delete_deliverable details
scalepad_lm_delete_deliverable details
[ScalePad] PERMANENTLY delete an entire deliverable, INCLUDING every section and every component inside it. This is the widest destructive action in the deliverables family — it destroys the whole document, not one part of it. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the deliverable is missing or inaccessible. ScalePad documents no soft delete, restore or undo, so read the document with scalepad_lm_get_deliverable and echo its name and client back to the user for explicit confirmation first. If the real intent is narrower, prefer the narrower tool: remove one part with scalepad_lm_delete_deliverable_section or scalepad_lm_delete_deliverable_section_component, take it out of the client's hands with scalepad_lm_revoke_deliverable_share_general_link, or simply set status back to Draft with scalepad_lm_update_deliverable. Preserve the structure for reuse with scalepad_lm_create_deliverable_template_from_deliverable BEFORE deleting.
scalepad_lm_delete_deliverable_section details
scalepad_lm_delete_deliverable_section details
[ScalePad] PERMANENTLY delete ONE SECTION of a deliverable, INCLUDING every component inside that section. The rest of the deliverable survives. Succeeds with HTTP 204 and no body (this tool returns ); 404 if either id is missing or inaccessible. There is no undo, so read the document with scalepad_lm_get_deliverable first and echo the section's name back to the user for confirmation — section ids are opaque and a wrong-but-valid id destroys the wrong section silently. If the data is merely out of date rather than unwanted, refresh it with scalepad_lm_refresh_deliverable_section instead of deleting. To drop a single block and keep the section, use scalepad_lm_delete_deliverable_section_component; to destroy the whole document, scalepad_lm_delete_deliverable.
scalepad_lm_delete_deliverable_section_component details
scalepad_lm_delete_deliverable_section_component details
[ScalePad] PERMANENTLY delete ONE COMPONENT from one section of a deliverable — the narrowest destructive action here: the section and its other components survive. Succeeds with HTTP 204 and no body (this tool returns ); 404 if any id is missing or inaccessible. No undo, so read the document with scalepad_lm_get_deliverable first and confirm the exact block with the user. All three ids must belong to the same document in the order deliverable → section → component: transposing a section id and a component id can still resolve and delete something you did not mean to. If the block is only stale, refresh it with scalepad_lm_refresh_deliverable_section_component instead. To remove the whole section use scalepad_lm_delete_deliverable_section.
scalepad_lm_download_deliverable_pdf details
scalepad_lm_download_deliverable_pdf details
[ScalePad] Export ONE deliverable as the client-facing PDF that ScalePad renders server-side. Binary cannot cross MCP's JSON tool surface, so this tool does NOT return the file bytes: StackJack downloads the PDF, stores it, and returns a JSON envelope with a short-lived READ-ONLY download URL — {SasUrl, ContentType, SuggestedFilename, SizeBytes, ExpiresAt}. The URL is valid for about 30 minutes and then stops working, so fetch or hand it off promptly rather than saving it for later; re-run this tool to mint a fresh one. SuggestedFilename comes from the filename ScalePad supplies with the attachment. Note this is the MSP-side export of the document itself; it is unrelated to the client-facing share link (scalepad_lm_get_deliverable_share_general_link), and it does not publish, refresh or otherwise change the deliverable.
scalepad_lm_get_deliverable details
scalepad_lm_get_deliverable details
[ScalePad] Get ONE deliverable in full by its id, INCLUDING all of its sections and every component inside them — this is the tool that shows you the document's structure, and therefore the tool that gives you the section ids and component ids the delete/refresh tools require. Returns . A deliverable's status is documented as 'Draft' or 'Published' on the write side; the vendor also documents that a PUBLISHED deliverable is automatically moved back to 'Draft' whenever one of its components requires a new snapshot. For the render-ready view (client name, MSP branding, component output only) use scalepad_lm_get_deliverable_presentation; for the client-facing PDF use scalepad_lm_download_deliverable_pdf.
scalepad_lm_get_deliverable_presentation details
scalepad_lm_get_deliverable_presentation details
[ScalePad] Get a deliverable in its PRESENTATION form — the trimmed, render-ready view used to display it to a client. This returns JSON, NOT a file: the response is {deliverable, branding}, where deliverable carries only what a renderer needs (deliverable name, client name, sections with their components' rendered output) and branding carries the MSP's own branding for the presentation header. It is deliberately narrower than scalepad_lm_get_deliverable, which returns the full editable structure including the configuration of every component. If you want the client-facing PDF file, that is scalepad_lm_download_deliverable_pdf — this tool never returns bytes or a download URL.
scalepad_lm_get_deliverable_share_general_link details
scalepad_lm_get_deliverable_share_general_link details
scalepad_lm_list_client_deliverable_components details
scalepad_lm_list_client_deliverable_components details
[ScalePad] List the catalog COMPONENTS available to ONE specific client — the blocks you may place in a new or existing deliverable for that client. CLIENT-SCOPED on purpose: the result covers both the built-in Lifecycle Manager components and any vendor-integration components that have been set up FOR THIS CLIENT, so two clients legitimately return different catalogs. Call this before scalepad_lm_create_client_deliverable or scalepad_lm_update_deliverable to learn the component_key and component_type_configuration values that will actually be accepted for that client. Returns {data: [...]} with no paging envelope. The TEMPLATE equivalent is account-wide, not client-scoped: scalepad_lm_list_deliverable_template_catalog_components.
scalepad_lm_list_client_deliverable_integrations details
scalepad_lm_list_client_deliverable_integrations details
[ScalePad] List the vendor integrations ALREADY INTEGRATED for ONE specific client, with each one's configuration, status and vendor details. This is the client-scoped 'what is actually wired up here' read — contrast scalepad_lm_list_deliverable_catalog_integrations, which takes no id and lists every integration the account COULD configure. Use this to explain why a component the account supports is unavailable for a particular client, or to check an integration's status before relying on its data in a deliverable. Returns {data: [...]} with no paging envelope. For the client's usable component blocks (rather than the integrations behind them) use scalepad_lm_list_client_deliverable_components.
scalepad_lm_list_client_deliverables details
scalepad_lm_list_client_deliverables details
[ScalePad] List the deliverables belonging to ONE specific client, identified by the client id in the path. This is the per-CLIENT list — for every deliverable in the account regardless of client, use scalepad_lm_list_deliverables_by_account instead, which takes no id. Returns {data: [...]} and NOTHING else: this envelope has no total_count and no next_cursor, unlike the account-wide list, so there is nothing to page through. NOTE: the vendor marks this operation DEPRECATED and names the account-wide list as its replacement; it still works, but prefer scalepad_lm_list_deliverables_by_account with filter[client.id] for new work — that route also pages and sorts, which this one cannot — and be aware ScalePad may retire this path. One difference that matters if you compare results between the two: this legacy route returns the RAW status values 'Draft' and 'Published', whereas the account-wide route maps a stored 'Draft' to 'Unpublished' in both its output and its filter[status] vocabulary. The same deliverable therefore reports a different status string depending on which list you asked. Hydrate any row with scalepad_lm_get_deliverable to see its sections and components.
scalepad_lm_list_deliverable_catalog_integrations details
scalepad_lm_list_deliverable_catalog_integrations details
[ScalePad] List every deliverable integration available in the catalog ACCOUNT-WIDE — the vendor integrations that CAN be configured for clients. Takes no id: this is the whole menu, not the subset in use. To see what is actually wired up for one client (with configuration, status and vendor details) use the client-scoped scalepad_lm_list_client_deliverable_integrations; to see the component blocks a specific client can place in a document use scalepad_lm_list_client_deliverable_components. Returns {data: [...]} with no paging envelope.
scalepad_lm_list_deliverables_by_account details
scalepad_lm_list_deliverables_by_account details
[ScalePad] List deliverables across the WHOLE account, every client together. Takes no client id in the path — that is the difference from scalepad_lm_list_client_deliverables, which is scoped to one client — and it is the vendor's stated replacement for that now-DEPRECATED per-client operation, so prefer this tool and narrow with filter[client.id] instead. Cursor-paginated: returns {data, total_count, next_cursor} — keep paging until next_cursor is null rather than until a page looks short, and deduplicate by deliverable id, since cursor scans are not atomic. Rows are BASIC info (name, status, client, updated_at), not the full document — hydrate one with scalepad_lm_get_deliverable to see its sections and components. VENDOR STATUS VOCABULARY SPLIT, recorded rather than normalized: filter[status] on THIS route takes Published or Unpublished, because the account-wide route maps a stored 'Draft' to 'Unpublished'; the legacy client-scoped route returns raw 'Draft'/'Published', and the write side (scalepad_lm_update_deliverable) accepts only 'Draft' or 'Published'. Filter with the route's own vocabulary, not the one you would write.
scalepad_lm_refresh_deliverable_section details
scalepad_lm_refresh_deliverable_section details
[ScalePad] Re-pull live data into ONE SECTION of a deliverable — this refreshes the data of ALL components under that section at once, replacing each one's stored snapshot with current values from its source. Use it when the underlying account data has moved on since the document was built and the whole section is stale. Succeeds with HTTP 204 and no body (this tool returns ); read the new values back with scalepad_lm_get_deliverable or scalepad_lm_get_deliverable_presentation. This does NOT delete anything and does not change the document's structure — only the data inside it. For a single stale block, use the narrower scalepad_lm_refresh_deliverable_section_component. Note that ScalePad documents a published deliverable returning to 'Draft' status when a component requires a new snapshot, so check status afterwards before assuming the client-facing view is still published.
scalepad_lm_refresh_deliverable_section_component details
scalepad_lm_refresh_deliverable_section_component details
[ScalePad] Re-pull live data into ONE COMPONENT of one section of a deliverable — the narrowest refresh available: it replaces just that component's stored snapshot with current values from its source, leaving the section's other components untouched. Succeeds with HTTP 204 and no body (this tool returns ); read the new values back with scalepad_lm_get_deliverable. This changes the data inside the block only — it deletes nothing and alters no structure. To refresh every component in the section in one call, use scalepad_lm_refresh_deliverable_section. All three path ids must belong to the same document, in the order deliverable → section → component; a wrong-but-valid id silently targets a different block. Note ScalePad documents a published deliverable moving back to 'Draft' when a component requires a new snapshot.
scalepad_lm_regenerate_deliverable_share_general_link details
scalepad_lm_regenerate_deliverable_share_general_link details
scalepad_lm_revoke_deliverable_share_general_link details
scalepad_lm_revoke_deliverable_share_general_link details
scalepad_lm_update_deliverable details
scalepad_lm_update_deliverable details
[ScalePad] Patch an existing deliverable — rename it, move it between Draft and Published, and upsert its sections and components. Returns HTTP 200 with the updated . This is a true PARTIAL update with UPSERT semantics, so it behaves unlike most StackJack update tools: only the fields you send are touched, a section or component sent WITH an id is updated, one sent WITHOUT an id is CREATED, and anything you omit entirely is left unchanged. That means omission never deletes — to remove a section or component you must call scalepad_lm_delete_deliverable_section or scalepad_lm_delete_deliverable_section_component. Two status vocabularies coexist in the vendor's own docs and neither is a transcription error: THIS body accepts only 'Draft' or 'Published', while the account-wide list's filter[status] documents Published and Unpublished. ScalePad also documents that a published deliverable moves itself back to 'Draft' when one of its components requires a new snapshot, so a status you set can legitimately change on its own.
LM Goal Templates
scalepad_lm_create_goal_template details
scalepad_lm_create_goal_template details
[ScalePad] Create a new account-scoped Lifecycle Manager goal template. Succeeds with HTTP 200 and — that id is what scalepad_lm_get_goal_template and scalepad_lm_create_goal_from_template take. The template is account-owned, so it becomes available to every client engagement in the account, not just one. ScalePad documents no idempotency-key header here, so never blind-retry — re-check with scalepad_lm_list_goal_templates first.
scalepad_lm_delete_goal_template details
scalepad_lm_delete_goal_template details
[ScalePad] PERMANENTLY delete an account-owned Lifecycle Manager goal template. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the template is missing or is a platform-provided template the account cannot delete. ScalePad documents no soft delete, restore or undo, so resolve and echo the exact template back to the user first — read it with scalepad_lm_get_goal_template. This destroys the BLUEPRINT only: goals already created from the template are separate records and are not affected, and the initiative templates it referenced are not deleted either.
scalepad_lm_get_goal_template details
scalepad_lm_get_goal_template details
[ScalePad] Get ONE Lifecycle Manager goal template in full by its id. Returns {goal_template: } — a single wrapped object, not a bare record and not an array. Use it to read the template's title, description, categories and its attached initiative_template_ids before creating a goal from it with scalepad_lm_create_goal_from_template, or before rewriting it with scalepad_lm_update_goal_template (which is a full replacement and needs the current values).
scalepad_lm_list_goal_templates details
scalepad_lm_list_goal_templates details
[ScalePad] List every Lifecycle Manager goal template visible to the account, optionally narrowed by a title search. Returns {data: [...]} — note this list has NO cursor envelope: unlike most ScalePad lists there is no total_count and no next_cursor, because the vendor declares no page_size and no cursor on this endpoint, so one call returns the whole matching set. There is no sort parameter either. Each row is a goal template: its id, title, reusable description, categories and attached initiative_template_ids. Hydrate one with scalepad_lm_get_goal_template, or create a goal from one with scalepad_lm_create_goal_from_template.
scalepad_lm_update_goal_template details
scalepad_lm_update_goal_template details
[ScalePad] Update an existing account-owned goal template. Only account-scoped templates can be updated — ScalePad's own platform-provided templates are read-only. Treat the payload as a REPLACEMENT, not a merge: read the current template with scalepad_lm_get_goal_template first and resend everything that should survive, because title and initiative_template_ids are both required on every call. Succeeds with HTTP 204 and no body (this tool returns ) — re-read the template to confirm. Editing a template does NOT retroactively change goals already created from it.
LM Goals
scalepad_lm_attach_goal_initiative details
scalepad_lm_attach_goal_initiative details
[ScalePad] LINK an existing INITIATIVE to a GOAL so the project counts toward that objective. PARENT = the GOAL (first path segment); CHILD = the INITIATIVE. Both must already exist — this creates no records — and the initiative MUST belong to the SAME CLIENT as the goal or the call is rejected. Succeeds with HTTP 200 and no body (this tool returns ). ScalePad exposes this same link from the other end as scalepad_lm_attach_initiative_goal (POST initiatives//goals/), which takes the two ids in the OPPOSITE order and has the identical effect — pick whichever matches the id you already hold, but do not transpose the arguments. Verify with scalepad_lm_list_goal_initiatives.
scalepad_lm_attach_goal_meeting details
scalepad_lm_attach_goal_meeting details
[ScalePad] LINK an existing MEETING to a GOAL, establishing that the objective will be discussed or reviewed at that meeting. PARENT = the GOAL (first path segment); CHILD = the MEETING. Both must already exist, and the meeting MUST belong to the SAME CLIENT as the goal. Succeeds with HTTP 200 and no body (this tool returns ). ScalePad exposes the same link from the other end as scalepad_lm_attach_meeting_goal (POST meetings//goals/), which takes the ids in the OPPOSITE order and has the identical effect. Verify with scalepad_lm_list_goal_meetings.
scalepad_lm_attach_initiative_goal details
scalepad_lm_attach_initiative_goal details
[ScalePad] LINK an existing GOAL to an INITIATIVE, aligning the project with the objective it supports. PARENT = the INITIATIVE (first path segment); CHILD = the GOAL. Both must already exist, and the goal should belong to the SAME CLIENT as the initiative. Succeeds with HTTP 200 and no body (this tool returns ). This is the MIRROR of scalepad_lm_attach_goal_initiative (POST goals//initiatives/): the two are distinct vendor endpoints with the identical effect and the ids in the OPPOSITE order — here the INITIATIVE comes first. Verify with scalepad_lm_list_initiative_goals.
scalepad_lm_attach_meeting_goal details
scalepad_lm_attach_meeting_goal details
[ScalePad] LINK an existing GOAL to a MEETING, adding the objective to that meeting's agenda as a discussion topic. PARENT = the MEETING (first path segment); CHILD = the GOAL. Both must already exist, and the goal MUST belong to the SAME CLIENT as the meeting. Succeeds with HTTP 200 and no body (this tool returns ). This is the MIRROR of scalepad_lm_attach_goal_meeting (POST goals//meetings/): two distinct vendor endpoints, identical effect, ids in the OPPOSITE order — here the MEETING comes first. Verify with scalepad_lm_list_meeting_goals.
scalepad_lm_create_goal details
scalepad_lm_create_goal details
[ScalePad] Create a new Lifecycle Manager goal for a client from scratch. Returns HTTP 200 with — that id is what every other goal tool takes. Only client_key is required; title, status and target_period are all optional, and status defaults to OnTrack when omitted. Note the vendor gap: this create body accepts only the plain-text description — there is NO description_json field here, unlike scalepad_lm_update_goal — so to give a new goal rich text, create it and then call scalepad_lm_update_goal with description_json. The body also takes NO link fields: attach initiatives and meetings afterwards with scalepad_lm_attach_goal_initiative / scalepad_lm_attach_goal_meeting. To start from a reusable template instead, use scalepad_lm_create_goal_from_template. ScalePad documents no idempotency key for this operation, so never blind-retry it — re-check with scalepad_lm_list_goals filtered on the client and title first.
scalepad_lm_create_goal_from_template details
scalepad_lm_create_goal_from_template details
[ScalePad] Create a NEW goal for a client from an existing GOAL TEMPLATE, inheriting the template's description and its attached initiative templates. Takes a goal_template_id (from scalepad_lm_list_goal_templates) plus the target client, and returns HTTP 201 with — note the response key is goal_id here, while the from-scratch scalepad_lm_create_goal returns . Three neighbouring tools are easy to confuse: THIS one creates a GOAL from a GOAL template; scalepad_lm_apply_initiative_template applies an INITIATIVE template's contents onto an EXISTING initiative (replacing its budget, recurring costs and action items); scalepad_lm_duplicate_initiative_template merely copies a template to a new template. Not idempotent and no idempotency key is documented — do not blind-retry.
scalepad_lm_delete_goal details
scalepad_lm_delete_goal details
[ScalePad] PERMANENTLY delete a Lifecycle Manager goal that is no longer relevant. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the goal is missing or inaccessible. ScalePad documents no soft delete, restore or undo, so resolve and echo the exact goal back to the user first — read it with scalepad_lm_get_goal. When the intent is only to close the objective out, prefer scalepad_lm_update_goal_status with status Complete, which keeps the record and its history. To break a goal's link to an initiative or meeting WITHOUT destroying the goal, use scalepad_lm_detach_goal_initiative / scalepad_lm_detach_goal_meeting — those leave both records intact.
scalepad_lm_detach_goal_initiative details
scalepad_lm_detach_goal_initiative details
[ScalePad] UNLINK an INITIATIVE from a GOAL. PARENT = the GOAL (first path segment); CHILD = the INITIATIVE. This removes only the LINK — neither the goal nor the initiative is deleted, and the initiative continues to exist, just no longer contributing to that objective. Succeeds with HTTP 204 and no body (this tool returns ). The relationship removal has no undo, so echo the exact goal and initiative back to the user first; read the current links with scalepad_lm_list_goal_initiatives. The same unlink is available from the other end as scalepad_lm_detach_initiative_goal (DELETE initiatives//goals/), with the ids in the opposite order. If the intent is that the PROJECT should cease to exist, that is scalepad_lm_delete_initiative, not this tool.
scalepad_lm_detach_goal_meeting details
scalepad_lm_detach_goal_meeting details
[ScalePad] UNLINK a MEETING from a GOAL, removing the objective from that meeting's agenda. PARENT = the GOAL (first path segment); CHILD = the MEETING. This removes only the LINK — neither the goal nor the meeting is deleted, and the meeting continues to exist. Succeeds with HTTP 204 and no body (this tool returns ). The relationship removal has no undo, so echo the exact goal and meeting back to the user first; read the current links with scalepad_lm_list_goal_meetings. The same unlink is available from the other end as scalepad_lm_detach_meeting_goal (DELETE meetings//goals/), with the ids in the opposite order.
scalepad_lm_detach_initiative_goal details
scalepad_lm_detach_initiative_goal details
[ScalePad] UNLINK a GOAL from an INITIATIVE. PARENT = the INITIATIVE (first path segment); CHILD = the GOAL. This removes only the LINK — neither entity is deleted, and the goal remains in the system, just no longer supported by that initiative. Succeeds with HTTP 204 and no body (this tool returns ). The relationship removal has no undo, so echo the exact initiative and goal back to the user first; read the current links with scalepad_lm_list_initiative_goals. This is the MIRROR of scalepad_lm_detach_goal_initiative (DELETE goals//initiatives/) — same effect, ids in the opposite order. To destroy the OBJECTIVE itself use scalepad_lm_delete_goal.
scalepad_lm_detach_meeting_goal details
scalepad_lm_detach_meeting_goal details
[ScalePad] UNLINK a GOAL from a MEETING, removing the objective from that meeting's agenda. PARENT = the MEETING (first path segment); CHILD = the GOAL. This removes only the LINK — neither the meeting nor the goal is deleted, and the goal continues to exist independently of the meeting. Succeeds with HTTP 204 and no body (this tool returns ). The relationship removal has no undo, so echo the exact meeting and goal back to the user first; read the current links with scalepad_lm_list_meeting_goals. This is the MIRROR of scalepad_lm_detach_goal_meeting (DELETE goals//meetings/) — same effect, ids in the opposite order. To destroy the OBJECTIVE itself use scalepad_lm_delete_goal.
scalepad_lm_get_goal details
scalepad_lm_get_goal details
[ScalePad] Get ONE Lifecycle Manager goal in full by its id. Returns the same record shape as scalepad_lm_list_goals — client {id, label}, id, title, description (deprecated plain text), description_json (ProseMirror document), status, period (the {type, year, half?, quarter?} discriminated object), record_created_at, record_updated_at, created_by, updated_by — but unwrapped, with no paging envelope. Use this to hydrate the bare ids returned by scalepad_lm_list_initiative_goals and scalepad_lm_list_meeting_goals, and to read the current title/status/target_period before calling scalepad_lm_update_goal (which is a replacement, not a merge).
scalepad_lm_list_goal_initiatives details
scalepad_lm_list_goal_initiatives details
[ScalePad] For ONE GOAL, list the INITIATIVES aligned to it — the projects that contribute to achieving that objective. Takes a GOAL id (the parent) and returns {initiative_ids: [...]} — bare ids ONLY, with no names, statuses, budgets or paging envelope; hydrate each with scalepad_lm_get_initiative. This is the goal-side view: scalepad_lm_list_initiative_goals is the SAME relationship read from the initiative side and returns {goal_ids: [...]} instead.
scalepad_lm_list_goal_meetings details
scalepad_lm_list_goal_meetings details
[ScalePad] For ONE GOAL, list the MEETINGS aligned to it — the client discussions where that objective is reviewed. Takes a GOAL id (the parent) and returns {meeting_ids: [...]} — bare ids ONLY, with no titles, dates or paging envelope; hydrate each with the Lifecycle Manager meeting read tools. This is the goal-side view: scalepad_lm_list_meeting_goals is the SAME relationship read from the meeting side and returns {goal_ids: [...]} instead.
scalepad_lm_list_goals details
scalepad_lm_list_goals details
[ScalePad] List Lifecycle Manager goals across every client the caller can access. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page looks short, and deduplicate by id because cursor scans are not atomic. Each row carries client {id, label}, id, title, description (plain text, DEPRECATED — a projection of the rich text), description_json (the ProseMirror rich-text document), status (OnTrack | AtRisk | OffTrack | OnHold | Complete), period (a discriminated object: {type:"PeriodYear",year} or {type:"PeriodHalf",year,half} or {type:"PeriodQuarter",year,quarter}), record_created_at, record_updated_at, created_by and updated_by. Two vendor spellings to expect: the goal timestamps are record_created_at / record_updated_at (NOT created_at / updated_at, which is what initiatives use), and created_by / updated_by are plain nullable user-id STRINGS, not objects. Use scalepad_lm_get_goal for one goal by id.
scalepad_lm_list_initiative_goals details
scalepad_lm_list_initiative_goals details
[ScalePad] For ONE INITIATIVE, list the GOALS it is aligned to — the broader objectives that project supports. Takes an INITIATIVE id (the parent) and returns {goal_ids: [...]} — bare ids ONLY, with no titles, statuses, periods or paging envelope; hydrate each with scalepad_lm_get_goal. This is the initiative-side view of the same relationship scalepad_lm_list_goal_initiatives reads from the goal side (which returns {initiative_ids: [...]} instead).
scalepad_lm_list_meeting_goals details
scalepad_lm_list_meeting_goals details
[ScalePad] For ONE MEETING, list the GOALS on its agenda — the business objectives to be discussed or reviewed at that meeting. Takes a MEETING id (the parent) and returns {goal_ids: [...]} — bare ids ONLY, with no titles, statuses or paging envelope; hydrate each with scalepad_lm_get_goal. This is the meeting-side view of the same relationship scalepad_lm_list_goal_meetings reads from the goal side (which returns {meeting_ids: [...]} instead). For the INITIATIVES on the same meeting's agenda use scalepad_lm_list_meeting_initiatives.
scalepad_lm_update_goal details
scalepad_lm_update_goal details
[ScalePad] Update a goal's core fields — title, description/rich text, status and target period — in one call. This is a REPLACEMENT, not a merge: title, status and target_period are all REQUIRED by the vendor schema, so read the current record with scalepad_lm_get_goal first and resend what should survive, or you will overwrite it. Succeeds with HTTP 204 and no body (this tool returns ); call scalepad_lm_get_goal to see the result. Prefer the narrow updaters when only one field changes: scalepad_lm_update_goal_status for status alone and scalepad_lm_update_goal_schedule for the target period alone (that one can also CLEAR the period, which this tool cannot — target_period is required here). Links are not editable here; use the attach/detach tools.
scalepad_lm_update_goal_schedule details
scalepad_lm_update_goal_schedule details
[ScalePad] Re-target ONLY a goal's period — the year, half-year or quarter by which it should be achieved — leaving title, status and description untouched. This is also the ONLY way to CLEAR a goal's target period: target_period is nullable here, while scalepad_lm_update_goal requires it. Succeeds with HTTP 204 and no body (this tool returns ); the new value appears as the period field on scalepad_lm_get_goal. Note the goal 'schedule' is a planning period only — it is not a fiscal quarter in the initiative sense; scalepad_lm_update_initiative_schedule takes a different body shape ({fiscal_quarter:{year,quarter}}).
scalepad_lm_update_goal_status details
scalepad_lm_update_goal_status details
[ScalePad] Change ONLY a goal's workflow status, leaving its title, description, rich text and target period untouched. This is the narrow alternative to scalepad_lm_update_goal, whose body requires title and target_period as well and would overwrite them. Succeeds with HTTP 204 and no body (this tool returns ); read the new value back as the status field on scalepad_lm_get_goal. Not to be confused with scalepad_lm_update_initiative_status, whose status vocabulary is completely different (New/Proposed/Approved/InProgress/OnHold/Declined/Completed).
LM Hardware Lifecycles
scalepad_lm_get_hardware_dashboard details
scalepad_lm_get_hardware_dashboard details
[ScalePad] Get the hardware dashboard rollup: {scope, as_of, total_assets, replacement_due, warranty_expired} — the counts of assets due (and soon due) for replacement and with expired (and soon expiring) warranties. Scope is ACCOUNT-WIDE when no client filter is supplied, and the returned scope field tells you which you got, so read it rather than assuming. The only documented filter is filter[client_id] — UNDERSCORED, eq-only, and note that the contracts and notes lists spell the same concept as dotted filter[client.id] while the hardware ASSET list uses a plain client_id query parameter; a wrong spelling here silently yields the account-wide numbers instead of one client's. Aggregate counts only — for the underlying devices use scalepad_lm_list_hardware_assets or scalepad_lm_list_hardware_lifecycles.
scalepad_lm_get_hardware_overview details
scalepad_lm_get_hardware_overview details
[ScalePad] Get the full overview of ONE hardware asset: display_title, category, client, location_name, os_version, cpu_model, ram, coverage_status, hardware_purchase_age, hardware_purchase_date, warranty_expiration_date, warranty_expires_in, the can_renew_hardware / can_link_to_initiative / can_link_to_agreement capability flags, data_sources, unique_key and asset_reference_id. This is a POST that only READS — the asset is identified by a body rather than a path id — and changes nothing, despite the vendor's own OpenAPI labelling the operation 'write — update/state change'; that label is a vendor misclassification, recorded rather than followed (the operationId is ApiPublicV1AssetsHardwareOverview and the documented purpose is 'Retrieve a hardware asset overview'). Unlike scalepad_lm_search_hardware_attached_agreements, whose body is otherwise identical, this operation ALSO accepts an optional client_id in the body to scope key resolution.
scalepad_lm_get_hardware_replacement_settings details
scalepad_lm_get_hardware_replacement_settings details
[ScalePad] Get the hardware replacement BUDGET DEFAULTS by report asset type — returns {currency, values}, the per-asset-type replacement amounts that feed budget forecasting. These are configuration defaults, not per-device data. Client scoping uses the plain client_id QUERY PARAMETER (this tool's clientId argument), not a filter[...] key: supply it for one client's overrides, and OMIT it to get the ACCOUNT defaults — the two are different answers, so pass it deliberately. The forecast figures these defaults produce are read through the LM Budget & Forecast tools.
scalepad_lm_list_hardware_assets details
scalepad_lm_list_hardware_assets details
[ScalePad] List hardware assets with client ownership and basic device fields — the broad, heavily filterable asset read. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page looks short, and deduplicate because cursor scans are not atomic. Scoping to one client here uses the plain client_id QUERY PARAMETER (this tool's clientId argument), NOT filter[client_id] and NOT filter[client.id] — this endpoint is the odd one out, and a filter-shaped attempt is silently ignored. Sixteen filter fields are documented and most of their names are SEPARATOR-FREE (assignedenduser, hasscalepadwarranty, installedsoftware, installedsoftwarecategory, integrationsources, unsupportedoperatingsystem, windows11cpucompatibility, warrantycoverage, initiativecount) while manufacturer.name on the same endpoint is dotted; use the exact spellings listed on the filtersJson argument, because a misspelled key returns unfiltered results rather than an error. For purchase and warranty DATES per device, use scalepad_lm_list_hardware_lifecycles instead.
scalepad_lm_list_hardware_lifecycles details
scalepad_lm_list_hardware_lifecycles details
[ScalePad] List the ACTIVE hardware lifecycle records — basic device information (model, serial number) plus the purchase-date and warranty-expiry metadata that replacement planning runs on. Cursor-paginated: returns {data[], total_count, next_cursor} — page until next_cursor is null. Only TWO filters are documented and both are eq-ONLY: filter[client_id] (UNDERSCORED here — the contracts and notes lists spell the same concept as the dotted filter[client.id], and the hardware ASSET list takes client_id as a plain query parameter instead; a wrong spelling silently returns unscoped results) and filter[serial_number]. No sort parameter is documented. This read returns only ACTIVE lifecycle records, so a device absent here is not necessarily absent from scalepad_lm_list_hardware_assets, which is the wider inventory read.
scalepad_lm_search_hardware_attached_agreements details
scalepad_lm_search_hardware_attached_agreements details
[ScalePad] For ONE hardware asset, look up the AGREEMENTS (contracts) attached to it. Returns {contract_ids: [...]} — bare ids ONLY, with no titles, costs or paging envelope; hydrate each one with scalepad_lm_get_contract. This is a POST that only READS (the asset is identified by a body rather than a path id) and changes nothing, despite the vendor's OpenAPI labelling the operation 'write — update/state change' — a vendor misclassification, recorded rather than followed. Unlike scalepad_lm_get_hardware_overview, this operation does NOT accept a client_id in the body: the hardware_key is all it takes. To change these links, use scalepad_lm_attach_contract_assets and scalepad_lm_bulk_delete_contract_assets, which work from the contract side. The initiative equivalent is scalepad_lm_search_hardware_attached_initiatives.
scalepad_lm_search_hardware_attached_initiatives details
scalepad_lm_search_hardware_attached_initiatives details
[ScalePad] Look up which Lifecycle Manager INITIATIVES a single HARDWARE ASSET is attached to — the reverse of scalepad_lm_attach_initiative_assets. Returns {initiative_ids: [...]} — bare ids ONLY, with no names, statuses or paging envelope; hydrate each with scalepad_lm_get_initiative. Use it before retiring or replacing a device, to see which roadmap items already have it in scope. This is a READ despite being an HTTP POST: the vendor's own safety class says "write — update/state change" while its operation id and description say "Retrieve the initiatives attached to a hardware asset" — nothing is created or modified, and the POST body exists only because a hardware identifier is too structured for a query string. It takes exactly ONE asset per call (hardware_key, singular), so loop for a fleet.
LM Initiative Templates
scalepad_lm_create_initiative_template details
scalepad_lm_create_initiative_template details
[ScalePad] Create a new account-scoped Lifecycle Manager initiative template with its budget, recurring costs and action-item checklist. Succeeds with HTTP 200 and . The template is account-owned, so it becomes available across every client engagement. ScalePad documents no idempotency-key header here, so never blind-retry — re-check with scalepad_lm_list_initiative_templates first. One asymmetry worth knowing before you build a workflow on it: tag_ids can be set HERE at creation but the vendor's update contract has no tag_ids field, so tags cannot be changed later through scalepad_lm_update_initiative_template.
scalepad_lm_delete_initiative_template details
scalepad_lm_delete_initiative_template details
[ScalePad] PERMANENTLY delete an account-scoped Lifecycle Manager initiative template. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the template is missing or is a platform-provided template the account cannot delete. ScalePad documents no soft delete, restore or undo, so resolve and echo the exact template back to the user first — read it with scalepad_lm_get_initiative_template. This destroys the BLUEPRINT only: initiatives already created from it, or already updated by scalepad_lm_apply_initiative_template, keep their budget, recurring costs and action items. Goal templates that referenced this template through their initiative_template_ids are a separate resource and are not deleted — check scalepad_lm_list_goal_templates for dangling references.
scalepad_lm_duplicate_initiative_template details
scalepad_lm_duplicate_initiative_template details
[ScalePad] Duplicate an initiative template into a NEW editable account-scoped copy. Succeeds with HTTP 201 and — the id of the COPY, not the source. This is the intended way to get an editable version of one of ScalePad's platform-provided templates, which cannot be updated in place. The source template is left untouched, and the copy is independent from then on. The operation takes no body: the copy's name and contents come from the source, so rename it afterwards with scalepad_lm_update_initiative_template. Calling this twice creates TWO copies — there is no idempotency key, so check scalepad_lm_list_initiative_templates before retrying.
scalepad_lm_get_initiative_template details
scalepad_lm_get_initiative_template details
[ScalePad] Get ONE Lifecycle Manager initiative template in full by its id. Returns {initiative_template: } — a single wrapped object, not a bare record. Read it before scalepad_lm_update_initiative_template (which replaces the budget, recurring and action-item sets wholesale and therefore needs the current values) or before scalepad_lm_apply_initiative_template, so the user can see exactly what will be pushed onto the live initiative. All money is integer cost_subunits in the currency's minor unit.
scalepad_lm_list_initiative_templates details
scalepad_lm_list_initiative_templates details
[ScalePad] List every Lifecycle Manager initiative template available to the account — both ScalePad's platform-provided templates and the account's own, which the response distinguishes. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page is short, and deduplicate because cursor scans are not atomic and can skip or repeat records if templates change mid-walk. The vendor documents NO filters and NO sort on this endpoint, so paging is the only query surface; narrow the results client-side. Each row carries the template's name, executive summary, budget and recurring line items and action-item checklist; hydrate one with scalepad_lm_get_initiative_template.
scalepad_lm_update_initiative_template details
scalepad_lm_update_initiative_template details
[ScalePad] Update an account-scoped Lifecycle Manager initiative template's name, executive summary, budget, recurring costs and action items. Only account-scoped templates can be updated — a platform-provided template is read-only, so duplicate it first with scalepad_lm_duplicate_initiative_template. This is a REPLACEMENT, not a merge: name, budget_line_items, recurring_line_items and action_items are all required on every call, and each collection replaces the stored set entirely (an empty array clears it). Read the current template with scalepad_lm_get_initiative_template first and resend what should survive. Succeeds with HTTP 204 and no body (this tool returns ). Editing a template does NOT retroactively change initiatives already created from or applied with it. Note the vendor's update contract has NO tag_ids field, so tags set at creation cannot be changed here.
LM Initiatives
scalepad_lm_apply_initiative_template details
scalepad_lm_apply_initiative_template details
[ScalePad] Push an initiative TEMPLATE's contents onto an EXISTING initiative. The vendor's own description is explicit that this REPLACES the initiative's budget, recurring costs and action items with the template's — so any one-time lines, recurring lines or action items already on the target that the template does not contain are lost, and there is no undo. Read both sides first (scalepad_lm_get_initiative and scalepad_lm_get_initiative_template) and echo what will change before calling. Parent = the initiative being changed (the first path segment); the template is the source and is not modified. Succeeds with HTTP 200 and no body (this tool returns ) — re-read the initiative to see the result. This tool takes no body: everything applied comes from the template.
scalepad_lm_attach_initiative_assets details
scalepad_lm_attach_initiative_assets details
[ScalePad] LINK one or more HARDWARE ASSETS to an initiative, putting those devices in scope for the work (which is also what makes a PerAsset cost line scale). Note the vendor uses PUT here, while the matching detach is a POST to a /detach path. Succeeds with HTTP 204 and no body (this tool returns ). To see which initiatives a given device is already attached to, use scalepad_lm_search_hardware_attached_initiatives. Unlink with scalepad_lm_detach_initiative_assets — that removes the link only and never deletes the asset.
scalepad_lm_attach_initiative_meeting details
scalepad_lm_attach_initiative_meeting details
[ScalePad] LINK an existing MEETING to an INITIATIVE, aligning a client discussion with the implementation effort. Parent = the initiative; child = the meeting. Both must already exist — this creates no records. The vendor uses PUT for this direction and returns HTTP 204 with no body (this tool returns ), whereas the mirror tool scalepad_lm_attach_meeting_initiative is a POST returning 200; both produce the SAME relationship, so use whichever side you already hold the parent id for and do not call both. Verify with scalepad_lm_list_initiative_meetings.
scalepad_lm_attach_initiative_opportunity details
scalepad_lm_attach_initiative_opportunity details
[ScalePad] LINK an EXISTING PSA opportunity to an initiative, connecting the roadmap item to revenue work already tracked in the PSA. This creates nothing in the PSA — both records must already exist. Its sibling scalepad_lm_create_initiative_opportunity does the opposite and creates a NEW opportunity; the two differ upstream by a single path segment (plural /opportunities/ here versus singular /opportunity there), so confirm which one the user means. Parent = the initiative (first path segment); child = the opportunity. Succeeds with HTTP 200 and no body (this tool returns ) — confirm with scalepad_lm_get_initiative_opportunity.
scalepad_lm_attach_meeting_initiative details
scalepad_lm_attach_meeting_initiative details
[ScalePad] LINK an existing INITIATIVE to a MEETING, putting the roadmap item on that meeting's agenda as a discussion topic. Parent = the meeting; child = the initiative. Both must already exist, and the vendor requires the initiative to belong to the SAME CLIENT as the meeting. This direction is a POST returning HTTP 200 with no body (this tool returns ), whereas the mirror tool scalepad_lm_attach_initiative_meeting is a PUT returning 204; both produce the SAME relationship, so call only one. Verify with scalepad_lm_list_meeting_initiatives.
scalepad_lm_create_initiative details
scalepad_lm_create_initiative details
[ScalePad] Create a new Lifecycle Manager initiative for a client — a program, project or operational effort on that client's roadmap. Succeeds with HTTP 200 and . The create body carries only the client, the name and the executive summary: status, priority, schedule, budget, recurring costs, assigned user, assets and every link are set AFTERWARDS through their own tools (scalepad_lm_update_initiative_status, _priority, _schedule, _budget, _recurring, _assigned_user, scalepad_lm_attach_initiative_assets, and the attach tools). To start from a blueprint instead, create the initiative here and then push a template onto it with scalepad_lm_apply_initiative_template. ScalePad documents no idempotency-key header, so never blind-retry — re-check with scalepad_lm_list_initiatives_v2 filtered on the client first.
scalepad_lm_create_initiative_opportunity details
scalepad_lm_create_initiative_opportunity details
[ScalePad] Create a BRAND NEW opportunity in the connected PSA and link it to this initiative. Read that twice before calling: to link an opportunity that ALREADY EXISTS in the PSA, the tool is scalepad_lm_attach_initiative_opportunity — the two differ upstream by one path segment (singular /opportunity here versus plural /opportunities/ there), and choosing wrong creates a duplicate revenue record in the customer's PSA. Creation is QUEUED: this returns HTTP 202 Accepted with in a Pending state, not a finished record — poll scalepad_lm_get_initiative_opportunity until it reaches a terminal state. Never blind-retry a 202; re-read the link first, because a retry can create a second opportunity.
scalepad_lm_create_initiative_ticket details
scalepad_lm_create_initiative_ticket details
[ScalePad] Create a ticket in the connected PSA and link it to this initiative. Creation is QUEUED, so this returns HTTP 202 Accepted with in a Pending state rather than a finished ticket — poll scalepad_lm_get_initiative_ticket until the state reaches Created or Error. A 409 Conflict is a documented BUSINESS-STATE outcome here (surface it as such, not as a validation error): the usual cause is that the initiative already has a linked ticket, since it can hold only one. Never blind-retry a 202 or a 409 — read the link state first, because a retry can raise a second ticket in the customer's PSA.
scalepad_lm_delete_initiative details
scalepad_lm_delete_initiative details
[ScalePad] PERMANENTLY delete a Lifecycle Manager initiative that is no longer relevant. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the initiative is missing or inaccessible. ScalePad documents no soft delete, restore or undo, so resolve and echo the exact initiative back to the user first — read it with scalepad_lm_get_initiative. This takes the initiative's budget, recurring costs and roadmap position with it. When the intent is only to take the work off the active roadmap, prefer scalepad_lm_update_initiative_status with Declined or Completed, which keeps the record and its history. To break a single relationship without destroying the initiative, use the matching detach tool instead.
scalepad_lm_delete_initiative_opportunity details
scalepad_lm_delete_initiative_opportunity details
[ScalePad] DETACH the PSA opportunity linked to an initiative. Despite the tool's 'delete' name and the DELETE verb, the vendor is explicit that the PSA opportunity itself is NOT deleted — only the Lifecycle-Manager-side LINK is removed, and the revenue record stays in the customer's PSA. Still treated as destructive because the relationship removal has no undo and the initiative loses its revenue attribution: echo the exact initiative and the linked opportunity back to the user first, reading it with scalepad_lm_get_initiative_opportunity. Succeeds with HTTP 204 and no body (this tool returns ); a 404 means nothing was linked. To relink later use scalepad_lm_attach_initiative_opportunity with the same opportunity id — do NOT use scalepad_lm_create_initiative_opportunity, which would create a duplicate.
scalepad_lm_delete_initiative_ticket details
scalepad_lm_delete_initiative_ticket details
[ScalePad] DETACH the PSA ticket linked to an initiative. Despite the tool's 'delete' name and the DELETE verb, the vendor is explicit that the ticket itself is NOT deleted from the external PSA — only the Lifecycle-Manager-side LINK is removed. It does have one further side effect the vendor calls out: any PENDING create job for the link is CANCELLED, so calling this while scalepad_lm_create_initiative_ticket is still Pending abandons that in-flight creation. Treated as destructive because neither the unlink nor the cancellation can be undone: echo the exact initiative and its ticket state back to the user first, reading it with scalepad_lm_get_initiative_ticket. Succeeds with HTTP 204 and no body (this tool returns ); a 404 means no ticket was linked.
scalepad_lm_detach_initiative_assets details
scalepad_lm_detach_initiative_assets details
[ScalePad] UNLINK one or more HARDWARE ASSETS from an initiative, taking those devices out of scope for the work. DESTRUCTIVE despite the POST verb and the additive-sounding path: the vendor expresses this removal as POST /initiatives//assets/detach, and it removes a whole SET of relationships in one call with no undo — echo the exact initiative and the exact device list back to the user first, and read the current scope with scalepad_lm_get_initiative. Only the LINKS are removed: every asset survives untouched in inventory, and the initiative itself survives too. Detaching assets can change what a PerAsset cost line totals. Succeeds with HTTP 200 and no body (this tool returns ).
scalepad_lm_detach_initiative_meeting details
scalepad_lm_detach_initiative_meeting details
[ScalePad] UNLINK a MEETING from an INITIATIVE. This removes only the LINK — neither the meeting nor the initiative is deleted, and both keep existing independently. The relationship removal has no undo, so echo the exact initiative and meeting back to the user first; read the current links with scalepad_lm_list_initiative_meetings. Succeeds with HTTP 204 and no body (this tool returns ). scalepad_lm_detach_meeting_initiative is the mirror of this tool and removes the SAME relationship from the meeting side — calling one is enough. To destroy the INITIATIVE itself use scalepad_lm_delete_initiative.
scalepad_lm_detach_meeting_initiative details
scalepad_lm_detach_meeting_initiative details
[ScalePad] UNLINK an INITIATIVE from a MEETING, taking the roadmap item off that meeting's agenda. This removes only the LINK — the initiative continues to exist and keeps its budget, status and every other relationship; the meeting survives too. The relationship removal has no undo, so echo the exact meeting and initiative back to the user first; read the current links with scalepad_lm_list_meeting_initiatives. Succeeds with HTTP 204 and no body (this tool returns ). scalepad_lm_detach_initiative_meeting is the mirror of this tool and removes the SAME relationship from the initiative side — calling one is enough. To destroy the INITIATIVE itself use scalepad_lm_delete_initiative.
scalepad_lm_download_initiative_pdf details
scalepad_lm_download_initiative_pdf details
[ScalePad] Export ONE initiative as the client-facing PDF that ScalePad renders server-side, including its executive summary, budget, recurring costs and action items. Binary cannot cross MCP's JSON tool surface, so this tool does NOT return the file bytes: StackJack downloads the PDF, stores it, and returns a JSON envelope with a short-lived READ-ONLY download URL — {SasUrl, ContentType, SuggestedFilename, SizeBytes, ExpiresAt}. The URL is valid for about 30 minutes and then stops working, so fetch it or hand it off promptly rather than saving it for later; re-run this tool to mint a fresh one. This is the ONLY tool in this group that does not pass raw JSON straight through. It is a pure read: it renders a document and changes nothing about the initiative — it does not publish, share or alter status. For the whole client's roadmap rather than a single initiative, use the roadmap export tools instead.
scalepad_lm_get_initiative details
scalepad_lm_get_initiative details
[ScalePad] Get ONE Lifecycle Manager initiative in full by its id, including its budget, recurring costs, status, priority, schedule and associated resources. Returns {initiative: } — a single wrapped object, not a bare record. Read this before any update: scalepad_lm_update_initiative replaces name plus executive summary, and the budget and recurring endpoints replace their whole line-item sets, so you need the current values to avoid dropping fields. All money is integer cost_subunits in the currency's minor unit (cents for USD).
scalepad_lm_get_initiative_opportunity details
scalepad_lm_get_initiative_opportunity details
[ScalePad] Get the PSA OPPORTUNITY linked to an initiative. Returns {opportunity: }, and its state is what you POLL after scalepad_lm_create_initiative_opportunity: that create returns 202 Accepted with a Pending state, and this read reports Pending while the external PSA is still creating the record, then a terminal state once creation completes. A 404 here means NO opportunity is currently linked — that is the normal 'none yet' answer, not an error to retry. An initiative holds at most one linked opportunity, which is why the path is singular.
scalepad_lm_get_initiative_ticket details
scalepad_lm_get_initiative_ticket details
[ScalePad] Get the state of the PSA TICKET linked to an initiative. Returns — and this is the POLLING endpoint for scalepad_lm_create_initiative_ticket, which returns 202 Accepted with a Pending state: the vendor documents Pending while the ticket is still being created in the external PSA, then Created or Error as the terminal states. A 404 here means NO ticket is currently linked, which is the normal 'none yet' answer rather than a failure. An initiative holds at most one linked ticket, hence the singular path.
scalepad_lm_list_initiative_meetings details
scalepad_lm_list_initiative_meetings details
[ScalePad] For ONE INITIATIVE, list the MEETINGS aligned to it — the client discussions and reviews where that work is covered. Takes an INITIATIVE id, not a meeting id. Returns {meeting_ids: [...]} — bare ids ONLY, with no titles, dates or paging envelope; hydrate each one through the Lifecycle Manager meeting tools. This is the initiative side of the pair: the mirror view, listing the initiatives on one meeting's agenda, is scalepad_lm_list_meeting_initiatives.
scalepad_lm_list_initiative_quotes details
scalepad_lm_list_initiative_quotes details
[ScalePad] For ONE INITIATIVE, list the QUOTES linked to it. Returns three top-level fields, all of them required by the vendor's schema: data[] (the linked quotes), status_availabilities (the status display metadata the UI renders quote states with) and has_quoter (a boolean telling you whether the ACCOUNT has ScalePad Quoter enabled at all). Read has_quoter before concluding anything from an empty data[] — with Quoter disabled, no quotes can exist regardless of the initiative. There is no paging envelope on this response. The quotes themselves live in the Quoter surface (scalepad_quoter_* tools); this tool only reports the linkage from the initiative's side.
scalepad_lm_list_initiatives details
scalepad_lm_list_initiatives details
[ScalePad] List Lifecycle Manager initiatives across every client the caller can access. DEPRECATED BY THE VENDOR and scheduled for removal on March 1, 2027 — prefer scalepad_lm_list_initiatives_v2 unless you specifically need a field v2 dropped. The two versions differ in CONTENT, not just shape: v2 DROPS executive_summary, executive_summary_json and created_by_user_id, and ADDS task_count, goal_count, meeting_count, ticket_link_state, has_opportunity and has_quote. So this v1 list is the only list that carries the executive summary inline (v2 callers read it per-initiative via scalepad_lm_get_initiative), while v2 is the only one with the rollup counts and link flags. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page is short, and deduplicate by initiative id because cursor scans are not atomic. Filters are ANDed and every one requires an explicit operator prefix. NO SORTING: the vendor documents no sort parameter on this endpoint (unlike the goals list and scalepad_lm_list_budget_initiatives, which do), so results come back in the server's own order — sort client-side.
scalepad_lm_list_initiatives_v2 details
scalepad_lm_list_initiatives_v2 details
[ScalePad] List Lifecycle Manager initiatives across every client the caller can access — the CURRENT v2 endpoint, and the one to use for new work (the v1 scalepad_lm_list_initiatives is deprecated for removal on March 1, 2027). v2 takes the SAME filter and paging surface as v1, but the RECORD CONTENT differs in both directions, so check what you need before choosing: v2 ADDS task_count, goal_count, meeting_count, ticket_link_state, has_opportunity and has_quote (rollups and link flags v1 has no equivalent for), and v2 DROPS executive_summary, executive_summary_json and created_by_user_id. If you need the executive summary, read it per-initiative with scalepad_lm_get_initiative rather than falling back to the deprecated v1 list. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page is short, and deduplicate by initiative id because cursor scans are not atomic. NO SORTING: the vendor documents no sort parameter on this endpoint (unlike the goals list and scalepad_lm_list_budget_initiatives, which do), so results come back in the server's own order — sort client-side.
scalepad_lm_list_meeting_initiatives details
scalepad_lm_list_meeting_initiatives details
[ScalePad] For ONE MEETING, list the INITIATIVES attached to it — the roadmap items on that meeting's agenda. Takes a MEETING id, not an initiative id. Returns {initiative_ids: [...]} — bare ids ONLY, with no names, statuses or paging envelope; hydrate each with scalepad_lm_get_initiative. This is the meeting side of the pair: the mirror view, listing the meetings aligned to one initiative, is scalepad_lm_list_initiative_meetings.
scalepad_lm_update_initiative details
scalepad_lm_update_initiative details
[ScalePad] Update an initiative's NAME and EXECUTIVE SUMMARY — and nothing else. This endpoint cannot touch status, priority, schedule, budget, recurring investments, assigned user, assets or links; each of those has its own tool (scalepad_lm_update_initiative_status, _priority, _schedule, _budget, _recurring, _assigned_user, and the attach/detach tools). name is required on every call, so read the current record with scalepad_lm_get_initiative first rather than sending a partial payload. Succeeds with HTTP 204 and no body (this tool returns ) — re-read the initiative to confirm.
scalepad_lm_update_initiative_assigned_user details
scalepad_lm_update_initiative_assigned_user details
[ScalePad] Set the ScalePad user who OWNS an initiative. This is the only way to change the assignee — scalepad_lm_update_initiative cannot touch it. Note the identifier is a ScalePad HUB USER id (an internal MSP staff member), not a client CONTACT id and not an email address. Succeeds with HTTP 204 and no body (this tool returns ). The vendor's contract marks assigned_user_id as required with no documented null form, so it does not describe a way to UNASSIGN an initiative through this endpoint. assigned_user_id is filterable on scalepad_lm_list_initiatives_v2.
scalepad_lm_update_initiative_budget details
scalepad_lm_update_initiative_budget details
[ScalePad] Replace an initiative's ONE-TIME investment plan — the budget_line_items set. This is a WHOLESALE REPLACEMENT of every one-time line, not an append: read the current lines with scalepad_lm_get_initiative and resend the ones that should survive, or you will silently drop them. An empty array clears all one-time items. Ongoing costs are a separate set with a separate tool: scalepad_lm_update_initiative_recurring. Succeeds with HTTP 204 and no body (this tool returns ). All amounts are integer subunits, so a decimal like 1250.00 is wrong — send 125000 for $1,250.00.
scalepad_lm_update_initiative_priority details
scalepad_lm_update_initiative_priority details
[ScalePad] Set ONE initiative's business priority, reflecting its strategic importance on the client's roadmap. This is the only way to change priority — scalepad_lm_update_initiative cannot touch it. Purely a ranking signal: it does not schedule, approve or fund anything. Succeeds with HTTP 204 and no body (this tool returns ). The current value is the priority field on scalepad_lm_get_initiative, and priority is filterable on scalepad_lm_list_initiatives_v2.
scalepad_lm_update_initiative_recurring details
scalepad_lm_update_initiative_recurring details
[ScalePad] Replace an initiative's RECURRING investment plan — the recurring_line_items set of monthly or yearly ongoing commitments. This is a WHOLESALE REPLACEMENT of every recurring line, not an append: read the current lines with scalepad_lm_get_initiative and resend the ones that should survive. An empty array clears all recurring items. One-time costs are a separate set with a separate tool: scalepad_lm_update_initiative_budget. Succeeds with HTTP 204 and no body (this tool returns ). All amounts are integer subunits, so send 4900 for $49.00.
scalepad_lm_update_initiative_schedule details
scalepad_lm_update_initiative_schedule details
[ScalePad] Set the FISCAL QUARTER in which an initiative's resources are planned — the field that drives budget forecasting and the roadmap timeline. This is the only way to change the schedule; scalepad_lm_update_initiative cannot touch it. Succeeds with HTTP 204 and no body (this tool returns ). Sending fiscal_quarter as null UNSCHEDULES the initiative, which is what moves it into the not-scheduled bucket that budget forecasts count separately (see the include_not_scheduled option on scalepad_lm_list_budget_initiatives). The quarter is a FISCAL quarter under the account's own fiscal calendar, so quarter 1 is not necessarily January-March.
scalepad_lm_update_initiative_status details
scalepad_lm_update_initiative_status details
[ScalePad] Move ONE initiative through its business workflow by setting its status. This is the only way to change status — scalepad_lm_update_initiative cannot touch it. Succeeds with HTTP 204 and no body (this tool returns ). Setting Declined or Completed is the reversible alternative to scalepad_lm_delete_initiative when work should leave the active roadmap but the record and its history should survive.
LM Meeting Types
scalepad_lm_create_meeting_type details
scalepad_lm_create_meeting_type details
[ScalePad] Create a new meeting type for the ACCOUNT — available to every client in it, not scoped to one. Returns HTTP 200 with ; note the key is meeting_type_id, NOT the bare that the meeting create calls return, so do not read this response with the same field name. That value is what you pass as type to scalepad_lm_create_meeting_v2 / scalepad_lm_update_meeting_v2. Check scalepad_lm_list_meeting_types first — ScalePad documents no uniqueness constraint on the label and no idempotency-key header, so a blind retry can leave two identically-named types that are indistinguishable to a user picking one.
scalepad_lm_delete_meeting_type details
scalepad_lm_delete_meeting_type details
[ScalePad] PERMANENTLY delete a meeting type from the ACCOUNT. Succeeds with HTTP 204 and no body (this tool returns ); 404 if it is missing or inaccessible. This is account-wide and irreversible — ScalePad documents no soft delete, restore or undo — and the vendor does NOT document what happens to existing meetings that still reference the deleted type, so treat the effect on historical meetings as unknown rather than assuming they are left alone. Echo the exact type back to the user first, read the current set with scalepad_lm_list_meeting_types, and prefer scalepad_lm_update_meeting_type when the goal is merely to correct a name.
scalepad_lm_list_meeting_types details
scalepad_lm_list_meeting_types details
[ScalePad] List every meeting type currently defined for the account. Returns {data: [...]} — a plain array with NO paging envelope at all (no total_count, no next_cursor) and no filter, sort or page-size parameters, so a single call returns the complete set. This is the lookup that turns a human meeting-type name into the id that scalepad_lm_create_meeting_v2 and scalepad_lm_update_meeting_v2 require in their type field; call it before either of those. The deprecated v1 meeting tools do NOT use these ids — they take a fixed built-in enum instead.
scalepad_lm_update_meeting_type details
scalepad_lm_update_meeting_type details
[ScalePad] Rename a meeting type. Only its label is editable — there is no other field, so this is purely a rename and existing meetings keep pointing at the same type id. Succeeds with HTTP 204 and no body (this tool returns ); confirm with scalepad_lm_list_meeting_types. Two account-wide consequences worth stating to the user first: the new label appears on EVERY client's meetings of this type, and the DEPRECATED v1 meeting update reacts badly to renames — the vendor documents that if a meeting type was renamed, a v1 update silently defaults that meeting to the account's FIRST meeting type instead of failing. Prefer scalepad_lm_update_meeting_v2 after any rename.
LM Meetings
scalepad_lm_add_meeting_attendee_users details
scalepad_lm_add_meeting_attendee_users details
[ScalePad] Add internal USERS (your own staff — technicians, account managers) as attendees of a meeting. This is the STAFF side of attendance: to add a client-side person, use scalepad_lm_add_meeting_attendee_contacts instead, which takes contacts rather than users. Additive — existing attendees are untouched. Succeeds with HTTP 201 and returns , the ids of the users now attending. Each entry in the body identifies a user by id OR email, so you can add someone by work email without looking their id up first.
scalepad_lm_create_meeting details
scalepad_lm_create_meeting details
[ScalePad] DEPRECATED v1 meeting create (POST /v1/meetings) — the vendor has scheduled it for removal on March 1, 2027. Use scalepad_lm_create_meeting_v2 for new work; this tool exists so an existing v1 integration keeps working until then. Returns HTTP 200 with . The ONLY behavioral difference that matters is the type field's value space: v1 takes a FIXED ENUM of built-in meeting kinds, while v2 takes a meeting-type ID. A v1-created meeting is an ordinary meeting — every other tool here (get, list, delete, completion status, attendees, attach) works on it identically. ScalePad documents no idempotency-key header, so never blind-retry this.
scalepad_lm_create_meeting_v2 details
scalepad_lm_create_meeting_v2 details
[ScalePad] Schedule a new client meeting — the CURRENT create operation (POST /v2/meetings). Prefer this over scalepad_lm_create_meeting, which is the deprecated v1 and is scheduled for removal on March 1, 2027. Returns HTTP 200 with ; pass that id to scalepad_lm_get_meeting, the attendee tools and the attach tools. Every body field except client_key is optional, so the smallest valid call names only the client and accepts the defaults (title becomes "Untitled Meeting"). ScalePad documents no idempotency-key header, so never blind-retry this — re-check with scalepad_lm_list_meetings filtered on the client first. Note the asymmetry with the v2 UPDATE, which requires both title and type.
scalepad_lm_delete_meeting details
scalepad_lm_delete_meeting details
[ScalePad] PERMANENTLY delete a meeting that is no longer needed. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the meeting is missing or inaccessible. ScalePad documents no soft delete, restore or undo, so resolve and echo the exact meeting back to the user first — read it with scalepad_lm_get_meeting. When the intent is only to close out a meeting that happened, prefer scalepad_lm_update_meeting_completion_status with is_completed true, which keeps the record, its agenda and its history. To remove only a PERSON from the meeting use scalepad_lm_delete_meeting_attendee_users (or the contacts equivalent); to break a link to a goal, initiative or action item use the matching detach tool — all of those leave the meeting intact.
scalepad_lm_delete_meeting_attendee_users details
scalepad_lm_delete_meeting_attendee_users details
[ScalePad] REMOVE internal USERS from a meeting's attendee list. This is a removal despite ScalePad expressing it as a POST to a "…/attendees/users/delete" path rather than an HTTP DELETE — the vendor's own operation is named MeetingAttendeeUserDelete, and it is flagged destructive here so removing a person always prompts for confirmation. It removes only the ATTENDANCE record: the users themselves, and the meeting, both survive. Because the body names a SET of users, echo the exact list back to the user before calling and read the current attendees with scalepad_lm_get_meeting first — there is no undo. Succeeds with HTTP 200 and no body (this tool returns ). To remove a client-side person instead, use scalepad_lm_delete_meeting_attendee_contacts; to delete the whole meeting, scalepad_lm_delete_meeting.
scalepad_lm_get_meeting details
scalepad_lm_get_meeting details
[ScalePad] Get ONE Lifecycle Manager meeting in full by its id. The response is WRAPPED in a single-key envelope — {"meeting": } — so read through the meeting property rather than expecting fields at the root (the action-item read, by contrast, returns its fields unwrapped). This is the only way to see WHO is attending: the record carries user_attendee_ids[] (internal staff, ids only — hydrate them separately if you need names) and contact_attendees[] (the client-side people), where scalepad_lm_list_meetings gives you nothing but the user_attendees_count and contact_attendees_count totals. Note the asymmetry in those two field names — the staff side is ids, the contact side is objects. The agenda also lives here, as ProseMirror rich text. Related records hang off separate tools: scalepad_lm_list_meeting_action_items, scalepad_lm_list_meeting_goals and scalepad_lm_list_meeting_initiatives.
scalepad_lm_list_meetings details
scalepad_lm_list_meetings details
[ScalePad] List Lifecycle Manager meetings across every client the caller can access. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page looks short, and deduplicate by meeting id because cursor scans are not atomic. Rows are meeting OVERVIEW records, not the full documents: attendees arrive here only as the COUNTS user_attendees_count and contact_attendees_count, so to learn WHO is attending you must hydrate the meeting with scalepad_lm_get_meeting, which returns user_attendee_ids[] and contact_attendees[]. VENDOR DOC BUG worth knowing before you trust a timestamp: on these overview rows the vendor describes record_created_at and record_updated_at as "the date and time when the GOAL was created/updated" — the prose is copy-pasted from ScalePad's goal schema. The field names are correct and they do refer to the MEETING; only the description is wrong, and it is reproduced here rather than silently corrected. This endpoint is also deliberately narrower than most Lifecycle Manager lists — the vendor documents exactly ONE filter field and NO sort at all, so there is no sort parameter here (do not expect the due_at/sort_rank vocabulary the action-item list accepts).
scalepad_lm_update_meeting details
scalepad_lm_update_meeting details
[ScalePad] DEPRECATED v1 meeting update (PUT /v1/meetings/) — scheduled for removal on March 1, 2027. Use scalepad_lm_update_meeting_v2 for new work. Treat the body as a REPLACEMENT: title and type are both required, so read the meeting first with scalepad_lm_get_meeting and resend what should survive. Succeeds with HTTP 204 and no body (this tool returns ). Two v1-specific hazards. First, type is a FIXED ENUM here, not a meeting-type id. Second, the vendor documents a SILENT FALLBACK: if the account's meeting type was renamed, the update quietly defaults the meeting to the FIRST meeting type for the account instead of failing — so a v1 update can change a meeting's type to something you did not ask for, and you should verify with scalepad_lm_get_meeting afterwards. The v2 update has no such fallback.
scalepad_lm_update_meeting_completion_status details
scalepad_lm_update_meeting_completion_status details
[ScalePad] Mark ONE meeting completed or incomplete. This is the only way to move a meeting's completion flag — neither scalepad_lm_update_meeting nor its v2 counterpart can touch it. Sending false reopens a meeting that was closed. Succeeds with HTTP 204 and no body (this tool returns ). Not to be confused with scalepad_lm_update_action_item_completion_status, which completes a TASK, or with the assessment-level completion tool — three different resources with parallel names.
scalepad_lm_update_meeting_v2 details
scalepad_lm_update_meeting_v2 details
[ScalePad] Update a meeting's core information — the CURRENT update operation (PUT /v2/meetings/). Prefer this over scalepad_lm_update_meeting, the deprecated v1 scheduled for removal on March 1, 2027. Treat the body as a REPLACEMENT, not a merge: title and type are BOTH REQUIRED here even though the v2 CREATE marks them optional, so read the meeting first with scalepad_lm_get_meeting and resend everything that should survive — in particular the nullable starts_at, ends_at and agenda_json, which an omitted field can clear. Succeeds with HTTP 204 and no body (this tool returns ); call scalepad_lm_get_meeting to see the result. Completion state is NOT editable here — use scalepad_lm_update_meeting_completion_status. Attendees and linked goals/initiatives/action items are not editable here either.
LM Notes
scalepad_lm_create_note details
scalepad_lm_create_note details
[ScalePad] Create a new note for a client. Returns HTTP 200 with — that value is what the read tools expose as note_id. There is NO plain-text field on this resource: description_json is required and must be a ProseMirror JSON document, so a note cannot be written as plain text, HTML or Markdown. ScalePad documents no idempotency-key header for this operation, so never blind-retry it — re-check with scalepad_lm_list_notes filtered on filter[client.id] first.
scalepad_lm_delete_note details
scalepad_lm_delete_note details
[ScalePad] PERMANENTLY delete a note. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the note is missing or inaccessible. ScalePad documents no soft delete, restore or undo for this operation, so resolve and echo the exact note back to the user first — read it with scalepad_lm_get_note. In almost every case where the goal is 'get this out of the way', the right call is scalepad_lm_update_note_archive_status with is_archived true instead: archiving is reversible and keeps the note's content and history, while this destroys both.
scalepad_lm_get_note details
scalepad_lm_get_note details
[ScalePad] Get ONE note's full details by its id. Returns the record directly (not wrapped in an envelope): note_id, title, description_json (the ProseMirror document as a string — description_json, is_archived, created_at and note_id are the guaranteed-present fields), is_archived, created_at, updated_at and linked_item, which names the entity the note hangs off. Run this before scalepad_lm_update_note: description_json is REQUIRED on update, so the current document is what you need in order to edit rather than replace the note's body.
scalepad_lm_list_notes details
scalepad_lm_list_notes details
[ScalePad] List Lifecycle Manager notes across every client the caller can access. Cursor-paginated: returns {data[], total_count, next_cursor} — keep paging until next_cursor is null, not until a page looks short, and deduplicate by note_id because cursor scans are not atomic. Each row carries note_id, title, description_json (the ProseMirror rich-text document, as a string), is_archived, created_at, updated_at and linked_item. Exactly TWO filter fields are documented, each eq-only: client.id (note the DOT — this endpoint spells it client.id, matching the contracts list, while the hardware dashboard and hardware lifecycles endpoints use the UNDERSCORED client_id; a wrong spelling is silently ignored rather than rejected) and is_archived. Archived notes are included by default, so pass is_archived eq:false to see only active ones. No sort parameter is documented here.
scalepad_lm_update_note details
scalepad_lm_update_note details
[ScalePad] Update a note's title and description. description_json is REQUIRED, so this call always rewrites the note body — there is no way to change only the title, and there is no plain-text field to fall back on. Read the current document with scalepad_lm_get_note and send the edited version, or the existing body is replaced by whatever is supplied. Omitting the optional title clears it. Succeeds with HTTP 204 and no body (this tool returns ) — re-read with scalepad_lm_get_note to see the result. The archive flag is NOT editable here: use scalepad_lm_update_note_archive_status.
scalepad_lm_update_note_archive_status details
scalepad_lm_update_note_archive_status details
[ScalePad] Archive a note, or bring an archived note back to active. This is a REVERSIBLE boolean toggle in both directions — is_archived true archives, false unarchives — which is why it is deliberately NOT flagged destructive: nothing is lost either way, and the note keeps its id, body and history. It is the safe alternative to scalepad_lm_delete_note when the intent is only to get a note out of the active list. This is the only way to move the flag; scalepad_lm_update_note cannot touch it. Succeeds with HTTP 204 and no body (this tool returns ). The current state is the is_archived field on scalepad_lm_get_note, and archived notes are INCLUDED by default in scalepad_lm_list_notes unless filtered with filter[is_archived]=eq:false.
LM Opportunities
scalepad_lm_get_opportunities_create_fields details
scalepad_lm_get_opportunities_create_fields details
[ScalePad] METADATA read: describe which fields a PSA OPPORTUNITY create would accept for one client, and whether creating one is even possible. Creates nothing. Use it to drive an opportunity-create form or to validate input before calling the initiative-opportunity create on the initiatives surface. Returns {data[], field_options[], ability, integration_url}: data and field_options are BOTH arrays of the same field descriptor, and the vendor gives them the identical description ("flat opportunity fields that the consumer should render") without documenting any difference between them — read them as equivalent rather than inventing one. Each descriptor is {field_key, parent_field_key, label, input_type, is_required}, where input_type is a union on its type field: Text (with validation {min_length, max_length}), Select (with options[{value, label}]), DateTime, Integer, Currency (with max_fraction_digits) or DataTypeReference (with data_type People or Member). ability is {has_psa_integration, organization_is_registered} — note the vendor says organization_is_registered HERE while the ticket equivalent says client_is_registered. integration_url is a direct link into the connected PSA. Note this call REQUIRES a client id, whereas scalepad_lm_get_tickets_create_fields takes one only optionally.
scalepad_lm_list_opportunities details
scalepad_lm_list_opportunities details
[ScalePad] List the PSA sales opportunities available for a client — the vendor's stated purpose is to let an MSP pick an EXISTING opportunity to link to an initiative. Returns {data[]} only: no total_count, no next_cursor, no cursor paging, no filter[...] keys and no sort, just two plain query parameters. Each row is the overview {opportunity_id, title, description, status}; there is no amount, stage-probability, owner or close-date field on this schema, so do not promise those. The opportunity_id is the value an initiative-opportunity attach expects. If the account has no PSA integration connected, expect an empty data array rather than an error — confirm the integration state with scalepad_lm_get_opportunities_create_fields, whose ability.has_psa_integration flag reports it.
LM Roadmap Exports
scalepad_lm_export_roadmap_csv details
scalepad_lm_export_roadmap_csv details
[ScalePad] Export ONE client's initiative roadmap as a CSV file. A POST that only READS — the verb carries the export scope in the body and persists nothing (the vendor's own safety class is "POST command — generates export; no persistence documented"). Because text/csv cannot cross MCP's JSON tool surface, this tool does NOT return the file contents: StackJack downloads the CSV, stores it, and returns a JSON envelope with a short-lived READ-ONLY download URL — {SasUrl, ContentType, SuggestedFilename, SizeBytes, ExpiresAt}, valid for about 30 minutes. Re-run to mint a fresh URL. This shares its body schema exactly with scalepad_lm_export_roadmap_spreadsheet; the PDF export requires six ADDITIONAL fields, so a body built here will be rejected by scalepad_lm_export_roadmap_pdf.
scalepad_lm_export_roadmap_pdf details
scalepad_lm_export_roadmap_pdf details
[ScalePad] Export ONE client's initiative roadmap as the client-facing PDF. A POST that only READS — it persists nothing (the vendor's own safety class is "POST command — generates export; no persistence documented"). Because binary cannot cross MCP's JSON tool surface, this tool does NOT return the file bytes: StackJack downloads the PDF, stores it, and returns a JSON envelope with a short-lived READ-ONLY download URL — {SasUrl, ContentType, SuggestedFilename, SizeBytes, ExpiresAt}, valid for about 30 minutes. Re-run to mint a fresh URL. This export's body is a SUPERSET of the CSV and spreadsheet body: it requires six additional layout switches, none of them optional, so reusing a CSV body here fails validation.
scalepad_lm_export_roadmap_spreadsheet details
scalepad_lm_export_roadmap_spreadsheet details
[ScalePad] Export ONE client's initiative roadmap as an XLSX workbook. A POST that only READS — it persists nothing (the vendor's own safety class is "POST command — generates export; no persistence documented"). Because an XLSX workbook cannot cross MCP's JSON tool surface, this tool does NOT return the file bytes: StackJack downloads the workbook, stores it, and returns a JSON envelope with a short-lived READ-ONLY download URL — {SasUrl, ContentType, SuggestedFilename, SizeBytes, ExpiresAt}, valid for about 30 minutes. Re-run to mint a fresh URL. ContentType comes back as the full OpenXML type (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet), not a short "xlsx". The body schema is IDENTICAL to scalepad_lm_export_roadmap_csv — the two differ only in output format — while the PDF export requires six additional fields.
LM SaaS Management
scalepad_lm_create_saas_enrollment_token details
scalepad_lm_create_saas_enrollment_token details
[ScalePad] Create a SaaS Management enrollment token for ONE client. An enrolling RMM or Core agent presents the returned token to a separate device-enrollment endpoint to register a device under this client. Succeeds with HTTP 201 and returns {id, value, description, site_id, status, max_uses, remaining_uses, expires_at}. TREAT `value` AS A SECRET — it is a credential that enrolls devices into this client's tenant, so do not echo it into logs, tickets or chat transcripts beyond what is needed to hand it to the person doing the rollout. ScalePad documents no idempotency-key header for this operation AND no list or revoke operation in this API surface, so never blind-retry it: a repeated attempt mints an ADDITIONAL live token that cannot be cleaned up from here — only from the ScalePad console. max_uses and remaining_uses come back on the response but no request field controls them. A 400 most often means expires_at is not a valid calendar date.
scalepad_lm_get_saas_utilization_summary details
scalepad_lm_get_saas_utilization_summary details
[ScalePad] Get the SaaS-utilization summary metrics for ONE client: total_apps_used, unapproved_app_count, ai_app_count and total_active_time_ms (active time in MILLISECONDS, not seconds or hours — divide by 3,600,000 for hours). A flat object with no paging, no per-application breakdown, and no way to scope the reporting window: the endpoint exposes no date parameters at all, so the period is whatever ScalePad's SaaS Management reporting period is and cannot be narrowed from here. Requires the client to be enrolled in SaaS Management (see scalepad_lm_create_saas_enrollment_token). A 404 means the client is unknown or not owned by this tenant; a 402 means the tenant has no active SaaS Management subscription, which is a billing state rather than a permissions problem. Note this endpoint documents no 403.
LM Tickets
scalepad_lm_get_tickets_create_fields details
scalepad_lm_get_tickets_create_fields details
[ScalePad] METADATA read: describe which fields a PSA TICKET create would accept against the account's PRIMARY PSA — required and optional fields, valid values, validation hints and dependent child fields. Creates no ticket; the vendor's stated use is to drive a ticket-create form. Returns {data[], status, integration_url, field_options[]}: data and field_options are BOTH arrays of the same descriptor and the vendor gives them the identical description ("the field tree that the consumer should render for ticket creation") without documenting any difference — read them as equivalent rather than inventing one. Each descriptor is {key, label, input_type, is_required, values[{id, name}], validation {min_length, max_length, min_date_time, max_date_time}, child_options} where child_options holds nested options KEYED BY THE PARENT VALUE'S id, which is how dependent fields (board -> status, say) are expressed. Note the field-name drift against the opportunity equivalent: the identifier is key here but field_key on scalepad_lm_get_opportunities_create_fields, and selectable values live in a flat values[] array here rather than inside input_type. status is {has_psa_integration, client_is_registered, unavailable_message} — client_is_registered where opportunities say organization_is_registered, and unavailable_message explains why creation is blocked for this client when a PSA IS connected (null when creation is available or no guidance is needed). integration_url is a direct link into the connected PSA, null when no integration is connected.
Quoter Categories
scalepad_quoter_create_category details
scalepad_quoter_create_category details
[ScalePad] Create a Quoter catalog category. Returns 201 with the created category record (id, name, parent_category, parent_category_id, timestamps). Only name is required; a parent may be given either by name (parent_category) or by id (parent_category_id). ScalePad does not publish name lengths, uniqueness rules, or whether the two parent fields are mutually exclusive, so send just one of them and pass server validation through verbatim.
scalepad_quoter_delete_category details
scalepad_quoter_delete_category details
[ScalePad] Delete a Quoter catalog category by id. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the category is not found. ScalePad documents NO soft delete, restore, undo, cascade behavior, or dependency-conflict status for catalog deletes — treat this as irreversible, and never delete a parent category automatically in response to a 404 or an inferred orphan.
scalepad_quoter_get_category details
scalepad_quoter_get_category details
[ScalePad] Get one Quoter catalog category by id (from scalepad_quoter_list_categories). Returns id, name, parent_category (the parent's name), parent_category_id, record_created_at, and record_updated_at. The only documented failure besides success is 404 — the vendor does not distinguish a deleted category from one this API key cannot see.
scalepad_quoter_list_categories details
scalepad_quoter_list_categories details
[ScalePad] List Quoter catalog categories. Cursor-paginated: returns {data[], total_count, next_cursor} where next_cursor is null on the final page. Each category carries id, name, parent_category (the parent's NAME), parent_category_id, record_created_at, and record_updated_at; the response schema publishes no required array, so tolerate missing properties. The returned id is what you pass to scalepad_quoter_get_category, to filter[category_id] on scalepad_quoter_list_items, and as category.id when authoring quote line items with scalepad_quoter_create_quote_section_line_items.
scalepad_quoter_update_category details
scalepad_quoter_update_category details
[ScalePad] Partially update a Quoter catalog category (HTTP PATCH). Every body property is optional; send only what changes. Returns 200 with the updated record. Unlike the newer quote line-item patch contract, this older catalog shape does NOT document null-as-clear semantics, nor whether an empty body is accepted, so there is no documented way to clear a parent relationship — surface whatever the server returns.
Quoter Contacts
scalepad_quoter_create_contact details
scalepad_quoter_create_contact details
[ScalePad] Create a Quoter contact with billing and optional shipping details. Success is HTTP 200 (NOT 201 — that is the vendor's documented contract, and its 200 text carries the same "updated successfully" copy drift as the fetch) and returns the Contact record. Only the request fields listed below are persisted: response-only address properties such as normalized country/state names, is_eu, or coordinates are ignored if sent. Declares 400 on a malformed request, 401, and 422 on validation — including the rule that the same billing_email + client.id pair must not already exist.
scalepad_quoter_get_contact details
scalepad_quoter_get_contact details
[ScalePad] Get one Quoter contact by id. Returns the Contact record (billing_* and shipping_* fields, client, title, website, normalized addresses, timestamps). One documented side effect to be aware of: if no local remote-system linkage exists for the contact, the fetch performs a remote lookup and BACKFILLS the resolved id — it does not change record_updated_at, so the operation is idempotent in practice, but it is not strictly free of writes. Declares 401, 404, and 422. A vendor copy-drift note: the 200 description reads "Contact updated successfully" even though this is a fetch.
scalepad_quoter_list_contacts details
scalepad_quoter_list_contacts details
[ScalePad] List and filter Quoter contacts. Cursor-paginated: {data[], total_count, next_cursor}. Each contact carries id (NULLABLE — an unlinked contact can appear without one), billing_email, billing_first_name, billing_last_name, billing_organization, billing_address, billing_mobile_phone, billing_work_phone, the shipping_* equivalents (shipping_address, shipping_email, shipping_first_name, shipping_label, shipping_last_name, shipping_organization, shipping_phone), client, title, website, record_created_at, and record_updated_at. Response addresses are NORMALIZED and can include three address lines, country/state names and codes, is_eu, and geospatial coordinates — more than the write contract accepts. The response schema has no required array, so tolerate missing properties. When a row has no id, identify it with the tuple filter filter[billing_email]=eq:...&filter[client.id]=eq:... instead.
scalepad_quoter_update_contact details
scalepad_quoter_update_contact details
[ScalePad] Partially update a Quoter contact (HTTP PATCH), backfilling the remote linkage first if needed (the same side effect as the fetch). Returns 200 with the updated Contact. No property is required. Two hard rules: (1) the body must NOT contain client at all — sending client, EVEN AS NULL, returns 422; and (2) if a changed billing_email combined with the contact's existing client.id would collide with another account contact, the request is rejected. The schema permits nulls but the vendor does not define whether every null clears or is ignored, so preserve the distinction between sending null and omitting a field and report the server result as-is. Declares 400, 401, 404, and 422.
Quoter Item Groups
scalepad_quoter_create_item_group details
scalepad_quoter_create_item_group details
[ScalePad] Create a Quoter item group. Returns 201 with the created record (id, name, timestamps). The body takes exactly one property — name — and creating the group does NOT add any items to it: follow up with scalepad_quoter_create_item_group_assignment once per item. Only 404 is declared besides success. The vendor publishes no name length or uniqueness rule.
scalepad_quoter_create_item_group_assignment details
scalepad_quoter_create_item_group_assignment details
[ScalePad] Assign a catalog item to an item group by creating the join record. Returns 201 with the created assignment (id, item_group_id, item_id, timestamps). Both body fields are required and there is NO PATCH for assignments — to move an item to a different group, delete this assignment and create another. Only 404 is declared besides success; the vendor publishes no duplicate-assignment conflict status.
scalepad_quoter_delete_item_group details
scalepad_quoter_delete_item_group details
[ScalePad] Delete a Quoter item group by id. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the group is not found. ScalePad documents no soft delete, restore, undo, or cascade behavior, and does not say what happens to the assignments that still reference the group — treat this as irreversible and check membership with scalepad_quoter_list_item_group_assignments first.
scalepad_quoter_delete_item_group_assignment details
scalepad_quoter_delete_item_group_assignment details
[ScalePad] Remove an item from an item group by deleting the join record. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the assignment is not found. This deletes only the LINK — neither the catalog item nor the group is removed. ScalePad documents no soft delete or restore for it, so recreate it with scalepad_quoter_create_item_group_assignment if you need it back.
scalepad_quoter_get_item_group details
scalepad_quoter_get_item_group details
[ScalePad] Get one Quoter item group by id (from scalepad_quoter_list_item_groups). Returns id, name, record_created_at, and record_updated_at — nothing else; the group's membership is read via scalepad_quoter_list_item_group_assignments with filter[item_group_id]. The only documented failure besides success is 404.
scalepad_quoter_get_item_group_assignment details
scalepad_quoter_get_item_group_assignment details
[ScalePad] Get one item-group-item assignment by its own id (from scalepad_quoter_list_item_group_assignments — this is the assignment's id, not the item id or the group id). Returns id, item_group_id, item_id, record_created_at, and record_updated_at. The only documented failure besides success is 404.
scalepad_quoter_list_item_group_assignments details
scalepad_quoter_list_item_group_assignments details
[ScalePad] List item-group-item assignments — the join records that place catalog items into item groups. Cursor-paginated: {data[], total_count, next_cursor}. Each assignment carries id, item_group_id, item_id, record_created_at, and record_updated_at. Filter by item_group_id to read a group's membership, or by item_id to find every group an item belongs to.
scalepad_quoter_list_item_groups details
scalepad_quoter_list_item_groups details
[ScalePad] List Quoter item groups. Cursor-paginated: {data[], total_count, next_cursor}. An item group is deliberately thin — each record carries only id, name, record_created_at, and record_updated_at; the items inside it are exposed through the separate assignment resource (scalepad_quoter_list_item_group_assignments filtered by item_group_id), not inlined here.
scalepad_quoter_update_item_group details
scalepad_quoter_update_item_group details
[ScalePad] Partially update a Quoter item group (HTTP PATCH). The only mutable property is name, and it is optional — the vendor does not say whether an empty body is accepted, nor document null-as-clear semantics for this older catalog shape. Returns 200 with the updated record; 404 if the group is not found. Membership is not editable here — use the assignment tools.
Quoter Item Options
scalepad_quoter_create_item_option details
scalepad_quoter_create_item_option details
[ScalePad] Create a configurable option on a catalog item. Returns 201 with the created option record. item_id is required and CANNOT be changed later — the PATCH schema does not accept it — so create the option against the right item the first time. Add its selectable values afterwards with scalepad_quoter_create_item_option_value. Only 404 is declared besides success.
scalepad_quoter_create_item_option_value details
scalepad_quoter_create_item_option_value details
[ScalePad] Create a selectable value under a Quoter item option. Returns 201 with the created record. item_option_id is required and CANNOT be changed later (the PATCH schema does not accept it), so create the value under the right option the first time. Note that unlike the catalog item schema, the official value schema publishes NO enum for cost_type or pricing_scheme — do not assume the item-level enums apply; send what the Quoter UI shows and pass server validation through verbatim. Only 404 is declared besides success.
scalepad_quoter_delete_item_option details
scalepad_quoter_delete_item_option details
[ScalePad] Delete a Quoter item option by id. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the option is not found. ScalePad documents no soft delete, restore, undo, or cascade behavior, and does not state what happens to the option's values — treat this as irreversible and enumerate the values with scalepad_quoter_list_item_option_values first if you need to preserve them.
scalepad_quoter_delete_item_option_value details
scalepad_quoter_delete_item_option_value details
[ScalePad] Delete a Quoter item-option value by id. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the value is not found. ScalePad documents no soft delete, restore, or undo — treat this as irreversible. Deleting the last value of a required option leaves that option with nothing to select, and the vendor does not document how quoting behaves in that state.
scalepad_quoter_get_item_option details
scalepad_quoter_get_item_option details
[ScalePad] Get one Quoter item option by id (from scalepad_quoter_list_item_options). Returns id, item_id, name, description, extended_description, allow_multiple_values, required, sort_order, and timestamps. The option's selectable values are a separate resource — list them with scalepad_quoter_list_item_option_values filtered by item_option_id. The only documented failure besides success is 404.
scalepad_quoter_get_item_option_value details
scalepad_quoter_get_item_option_value details
[ScalePad] Get one Quoter item-option value by id (from scalepad_quoter_list_item_option_values). Returns id, item_id, item_option_id, name, code, cost_decimal, cost_type, price_decimal, pricing_scheme, sort_order, and timestamps; money values are decimal STRINGS. The only documented failure besides success is 404.
scalepad_quoter_list_item_option_values details
scalepad_quoter_list_item_option_values details
[ScalePad] List Quoter item-option VALUES — the individual selectable choices under an option, each with its own pricing. Cursor-paginated: {data[], total_count, next_cursor}. Each value carries id, item_id, item_option_id, name, code, cost_decimal, cost_type, price_decimal, pricing_scheme, sort_order (integer), record_created_at, and record_updated_at. Money values are decimal STRINGS. Filter by item_option_id for one option's choices, or by item_id for every value across an item.
scalepad_quoter_list_item_options details
scalepad_quoter_list_item_options details
[ScalePad] List Quoter item options — the configurable option definitions attached to catalog items. Cursor-paginated: {data[], total_count, next_cursor}. Each option carries id, item_id, name, description, extended_description, allow_multiple_values, required, sort_order (integer), record_created_at, and record_updated_at. Filter by item_id to read one item's options; the option id is what you pass to filter[item_option_id] on scalepad_quoter_list_item_option_values.
scalepad_quoter_update_item_option details
scalepad_quoter_update_item_option details
[ScalePad] Partially update a Quoter item option (HTTP PATCH). Every property is optional and item_id is NOT accepted — an option cannot be reassigned to a different catalog item. Returns 200 with the updated record; 404 if the option is not found. This older catalog shape documents neither null-as-clear semantics nor whether an empty body is accepted.
scalepad_quoter_update_item_option_value details
scalepad_quoter_update_item_option_value details
[ScalePad] Partially update a Quoter item-option value (HTTP PATCH). Every property is optional and item_option_id is NOT accepted — a value cannot be moved to a different option. Returns 200 with the updated record; 404 if the value is not found. Null-as-clear semantics and the acceptability of an empty body are undocumented for this older catalog shape.
Quoter Item Tiers
scalepad_quoter_create_item_tier details
scalepad_quoter_create_item_tier details
[ScalePad] Create a volume pricing tier on a catalog item. Returns 201 with the created tier. Only item_id is required — every pricing property is optional — and item_id CANNOT be changed later (the PATCH schema does not accept it). Tiers are meaningful only on an item whose pricing_scheme is tiered_volume or tiered_stepped (see scalepad_quoter_update_item). The official schema publishes no enum for cost_type and no overlap or ordering validation for lower_boundary, so pass server validation through verbatim. Only 404 is declared besides success.
scalepad_quoter_delete_item_tier details
scalepad_quoter_delete_item_tier details
[ScalePad] Delete a Quoter item pricing tier by id. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the tier is not found. ScalePad documents no soft delete, restore, or undo — treat this as irreversible. Removing a break from a tiered item changes how quantities in that range are priced, and the vendor does not document the resulting gap behavior.
scalepad_quoter_get_item_tier details
scalepad_quoter_get_item_tier details
[ScalePad] Get one Quoter item pricing tier by id (from scalepad_quoter_list_item_tiers). Returns id, item_id, lower_boundary, price_decimal, cost_decimal, cost_type, and timestamps; money values are decimal STRINGS. The only documented failure besides success is 404.
scalepad_quoter_list_item_tiers details
scalepad_quoter_list_item_tiers details
[ScalePad] List Quoter item pricing tiers (volume price breaks). Cursor-paginated: {data[], total_count, next_cursor}. Each tier carries id, item_id, lower_boundary (the integer quantity at which the tier starts applying), price_decimal, cost_decimal, cost_type, record_created_at, and record_updated_at; money values are decimal STRINGS. Filter by item_id and sort by +lower_boundary to read one item's price breaks in order.
scalepad_quoter_update_item_tier details
scalepad_quoter_update_item_tier details
[ScalePad] Partially update a Quoter item pricing tier (HTTP PATCH). Every property is optional and item_id is NOT accepted — a tier cannot be reassigned to a different item. Returns 200 with the updated record; 404 if the tier is not found. Null-as-clear semantics and whether an empty body is accepted are undocumented for this older catalog shape.
Quoter Items
scalepad_quoter_create_item details
scalepad_quoter_create_item details
[ScalePad] Create a Quoter catalog item. Returns 201 with the created item record. Two documented contract traps: (1) the machine-readable required array is ["category_id","name"] while the prose calls BOTH category (a name) and category_id required and says they cannot be sent together — follow the validator, send category_id, and do not send category; (2) recurring_interval here is spelled monthly|quarterly|semi_annually|annually, which differs from the quote-line spelling (semi_annual, annual). The vendor publishes no decimal regex, precision, or numeric range for the money fields, so pass server validation through verbatim. Only 404 is declared besides success.
scalepad_quoter_delete_item details
scalepad_quoter_delete_item details
[ScalePad] Delete a Quoter catalog item by id. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the item is not found. ScalePad documents NO soft delete, restore, undo, cascade behavior, or dependency-conflict status — treat this as irreversible, and be aware that the item's options, option values, tiers, and group assignments all reference it while the vendor does not state what happens to them.
scalepad_quoter_get_item details
scalepad_quoter_get_item details
[ScalePad] Get one Quoter catalog item by id (from scalepad_quoter_list_items). Returns the full item record — name, code (MPN), sku, description (HTML), internal_note, quantity_help_tip, category/category_id, manufacturer/manufacturer_id, supplier/supplier_id, cost_decimal, price_decimal, percentage_price_decimal, weight_decimal, cost_type, pricing_scheme, percentage_price_category_ids, allow_decimal_quantities, restrict_discounting, show_option_prices, recurring, recurring_interval, taxable, and timestamps. Money values are decimal STRINGS. The only documented failure besides success is 404.
scalepad_quoter_list_items details
scalepad_quoter_list_items details
[ScalePad] List Quoter catalog items. Cursor-paginated: {data[], total_count, next_cursor}. Each item carries id, name, code (the MPN shown in the Quoter UI — the vendor says it should be unique but publishes no uniqueness error), sku, description (HTML), internal_note, quantity_help_tip, category and category_id, manufacturer and manufacturer_id, supplier and supplier_id (these reference Quoter supplier records from scalepad_quoter_list_suppliers, NOT SupplierSync feed objects), the decimal-string money fields cost_decimal / price_decimal / percentage_price_decimal / weight_decimal, cost_type, pricing_scheme, percentage_price_category_ids, the flags allow_decimal_quantities / restrict_discounting / show_option_prices / recurring / taxable, recurring_interval, and record_created_at / record_updated_at. The schema publishes no required array, so tolerate missing properties. An item id is what you pass to filter[item_id] on scalepad_quoter_list_item_options, scalepad_quoter_list_item_tiers, and scalepad_quoter_list_item_group_assignments.
scalepad_quoter_update_item details
scalepad_quoter_update_item details
[ScalePad] Partially update a Quoter catalog item (HTTP PATCH). Every body property is optional — including name — so send only what changes. Returns 200 with the updated record. This older catalog shape does NOT document null-as-clear semantics or whether an empty body is accepted, so there is no documented way to clear an association; report whatever the server returns. The same dependent-field rules as create still apply (cost_type only with flat/per_unit/percentage pricing, percentage_price_category_ids only with percentage pricing, recurring_interval only with recurring: true), and recurring_interval keeps the item spelling semi_annually/annually.
Quoter Manufacturers
scalepad_quoter_create_manufacturer details
scalepad_quoter_create_manufacturer details
[ScalePad] Create a Quoter manufacturer. Returns 201 with the created record (id, name, timestamps). The body takes exactly one property — name. ScalePad publishes no name length or uniqueness rule and no conflict status, so check scalepad_quoter_list_manufacturers with filter[name] first if you need to avoid duplicates. Only 404 is declared besides success.
scalepad_quoter_delete_manufacturer details
scalepad_quoter_delete_manufacturer details
[ScalePad] Delete a Quoter manufacturer by id. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the manufacturer is not found. ScalePad documents NO soft delete, restore, undo, cascade behavior, or dependency-conflict status, and does not state what happens to catalog items and quote lines that still reference it — treat this as irreversible and check usage with scalepad_quoter_list_items using filter[manufacturer_id] first.
scalepad_quoter_get_manufacturer details
scalepad_quoter_get_manufacturer details
[ScalePad] Get one Quoter manufacturer by id (from scalepad_quoter_list_manufacturers). Returns id, name, record_created_at, and record_updated_at — the record has no other documented properties. The only documented failure besides success is 404.
scalepad_quoter_list_manufacturers details
scalepad_quoter_list_manufacturers details
[ScalePad] List Quoter manufacturers. Cursor-paginated: {data[], total_count, next_cursor}. Each manufacturer carries only id, name, record_created_at, and record_updated_at. The id is what you pass as manufacturer_id when creating a catalog item (scalepad_quoter_create_item), as manufacturer when authoring quote line items (scalepad_quoter_create_quote_section_line_items), and to filter[manufacturer_id] on scalepad_quoter_list_items.
scalepad_quoter_update_manufacturer details
scalepad_quoter_update_manufacturer details
[ScalePad] Partially update a Quoter manufacturer (HTTP PATCH). The only mutable property is name, and it is optional; the vendor does not say whether an empty body is accepted and documents no null-as-clear semantics for this older catalog shape. Returns 200 with the updated record; 404 if the manufacturer is not found. Renaming does not re-point any item — items reference the manufacturer by id.
Quoter SupplierSync Datafeeds
scalepad_quoter_list_datafeed_supplier_items details
scalepad_quoter_list_datafeed_supplier_items details
[ScalePad] Look up SupplierSync item data for one or more manufacturer part numbers (MPNs) — the live distributor price and stock projection behind Quoter. Cursor-paginated: {data[], total_count, next_cursor}. Each item carries required identity/source fields id, semantic_item_id, supplier_id and supplier_name (the feed, resolvable via scalepad_quoter_list_datafeed_suppliers); required product fields category, mpn, name, sku, weight_decimal, price_amount_decimal; required tax flags taxable and supplier_default_taxable; required record_created_at / record_updated_at; and a required warehouses[] array where each entry has id, name, and quantity — that is where per-location stock lives. The MPN filter is MANDATORY: this endpoint returns 400 without it. Results cover SupplierSync sources ONLY and exclude native distributor integrations. No manufacturer filter, supplier filter, sorting, or sparse fieldset is documented for this endpoint, which is why this tool exposes none. Declares 400 and 422 in addition to 200.
Quoter Suppliers
scalepad_quoter_create_supplier details
scalepad_quoter_create_supplier details
[ScalePad] Create a Quoter catalog supplier. Returns 201 with the created record (id, name, timestamps). The body takes exactly one property — name. This does NOT configure a SupplierSync data feed: feed suppliers (with url, default_taxable, and field_mapping) are set up in SupplierSync and are read-only through this API. ScalePad publishes no name length or uniqueness rule and no conflict status. Only 404 is declared besides success.
scalepad_quoter_delete_supplier details
scalepad_quoter_delete_supplier details
[ScalePad] Delete a Quoter catalog supplier by id. Succeeds with HTTP 204 and no body (this tool returns ); 404 if the supplier is not found. ScalePad documents NO soft delete, restore, undo, cascade behavior, or dependency-conflict status, and does not state what happens to catalog items and quote lines that still reference it — treat this as irreversible and check usage with scalepad_quoter_list_items using filter[supplier_id] first. This deletes only the Quoter catalog record; it does not remove a SupplierSync feed.
scalepad_quoter_get_supplier details
scalepad_quoter_get_supplier details
[ScalePad] Get one Quoter catalog supplier by id (from scalepad_quoter_list_suppliers). Returns id, name, record_created_at, and record_updated_at — the record has no other documented properties, and in particular no URL or tax flag (those belong to the richer SupplierSync feed projection returned by scalepad_quoter_list_datafeed_suppliers). The only documented failure besides success is 404.
scalepad_quoter_list_datafeed_suppliers details
scalepad_quoter_list_datafeed_suppliers details
[ScalePad] List the SupplierSync data feeds configured for the account — a READ-ONLY projection, richer than the editable Quoter supplier records at scalepad_quoter_list_suppliers, and not creatable or editable through this API. Cursor-paginated: {data[], total_count, next_cursor}. Each feed supplier carries required id, name, url, default_taxable, record_created_at, record_updated_at, and field_mapping — the mapping names for category, manufacturer, MPN, product name, price, supplier SKU, weight, and warehouses (each warehouse mapping requiring name and quantity), with the taxable mapping optional. The supplier_id on a SupplierSync item from scalepad_quoter_list_datafeed_supplier_items refers to one of these feeds. Declares 400 and 422 in addition to 200. NOTE: this list documents NO filters, which is why this tool takes none.
scalepad_quoter_list_suppliers details
scalepad_quoter_list_suppliers details
[ScalePad] List Quoter catalog suppliers — the editable vendor records, NOT the SupplierSync feeds (for those use scalepad_quoter_list_datafeed_suppliers). Cursor-paginated: {data[], total_count, next_cursor}. Each supplier carries only id, name, record_created_at, and record_updated_at. The id is what you pass as supplier_id when creating a catalog item (scalepad_quoter_create_item), as supplier when authoring quote line items, and to filter[supplier_id] on scalepad_quoter_list_items.
scalepad_quoter_update_supplier details
scalepad_quoter_update_supplier details
[ScalePad] Partially update a Quoter catalog supplier (HTTP PATCH). The only mutable property is name, and it is optional; the vendor does not say whether an empty body is accepted and documents no null-as-clear semantics for this older catalog shape. Returns 200 with the updated record; 404 if the supplier is not found. Renaming does not re-point any item — items reference the supplier by id.
Quotes & Authoring
scalepad_quoter_create_line_item details
scalepad_quoter_create_line_item details
[ScalePad] Create a single STANDALONE line item in an existing quote (POST /v1/line-items) — the older flat contract, which is a DIFFERENT operation from scalepad_quoter_create_quote_section_line_items. Distinguishing facts: the target quote is named by quote_id IN THE BODY (there is no path parameter and no section id at all), category is a plain STRING rather than a object, prices and quantity are NUMBERS rather than decimal strings, and the response is the small flat LineItem record (id, the request-like fields, record_created_at, record_updated_at) rather than the full QuoteFetchResponse. Its definition documents neither draft-state protection nor total recomputation, and the only declared failure is 404 for a missing referenced record. Prefer the section-scoped batch tool for real quote authoring; use this one only when you specifically need the flat contract. Do not merge the two input models. One vendor inconsistency to expect: the request types unit_cost as a number while the response types it as a string.
scalepad_quoter_create_quote details
scalepad_quoter_create_quote details
[ScalePad] Create a DRAFT quote from a template, identifying or creating its primary contact. Returns 201 with the full QuoteFetchResponse; the new draft has no sections yet, and content blocks, attachments, custom-field values, totals, and contact-sourced addresses may be empty or null. Add sections next with scalepad_quoter_create_quote_sections. Failure semantics: 400 malformed JSON, 404 the referenced template or client was not found, 422 validation (a past expiration, a currency not enabled on the account, or an owner-email lookup failure). Note a documented vendor inconsistency on unknown owners — the page shows ERR_OWNER_EMAIL_NOT_FOUND with 422 in one place and ERR_OWNER_NOT_FOUND with 404 language in another; report whichever code and status the server actually returns rather than normalizing them.
scalepad_quoter_create_quote_section_line_items details
scalepad_quoter_create_quote_section_line_items details
[ScalePad] Add a BATCH of line items to one SECTION of a draft quote and recompute line, section, and quote totals — one call creates SEVERAL line items, which is why this tool is plural and its body is a top-level JSON ARRAY. Returns 201 with the full QuoteFetchResponse including the recomputed totals. This is the section-scoped authoring contract: it uses decimal STRINGS, resolves category/manufacturer/supplier by nested objects, enforces draft state (409 on a published quote), and returns the whole quote. Do NOT confuse it with scalepad_quoter_create_line_item, which is the flat standalone catalog-style create that takes quote_id in the BODY, a plain category STRING, and numeric prices. Validation accumulates across the whole batch: a 422 returns EVERY failure with line_items[i].field locations (e.g. ERR_LINE_ITEM_CATEGORY_REQUIRED, ERR_LINE_ITEM_QUANTITY_INVALID, ERR_LINE_ITEM_DISCOUNT_EXCEEDS_SUBTOTAL), so treat errors[] as a collection. Also 400 on malformed JSON or a missing path value, and 404 if the quote or section is not found. No batch size limit is published.
scalepad_quoter_create_quote_sections details
scalepad_quoter_create_quote_sections details
[ScalePad] Add a BATCH of sections to a draft quote — one call creates SEVERAL sections, which is why this tool is plural and its body is a top-level JSON ARRAY, not a single object. Returns 201 with the full QuoteFetchResponse; each new section comes back with line_items: null until you populate it via scalepad_quoter_create_quote_section_line_items. Requires a draft: 409 if the quote is not a draft, 404 if the quote is not found, 400 on malformed JSON, 422 on validation. ScalePad publishes no minItems, maxItems, or payload ceiling for the array, and does not say whether an empty array is accepted.
scalepad_quoter_get_quote details
scalepad_quoter_get_quote details
[ScalePad] Fetch one full quote revision (the QuoteFetchResponse that every authoring write also returns). Carries id, draft and primary booleans (inspect BOTH to understand revision state — do not infer it from the id), revision (nullable string counter), number and custom_number, name, currency_iso, pricing_split_order (none|one_time_first|recurring_first), expired_at, comments, internal_notes, template_id, nullable client {id,name} and owner {id,email,first_name,last_name}, contacts[] (currently at most one primary contact), normalized billing_address and shipping_address, attachments[] {id,filename,size_bytes,url}, content_blocks {introductory,closing}, cover_page, custom_fields {quote_creation,quote_acceptance}, sections[] (each with its line_items[] and section totals), totals, and record timestamps. All money values are decimal STRINGS, and several fields deliberately distinguish null from "0" and "0.00". A 404 means the quote was not found; a 422 here specifically means the quote uses an external tax provider and cannot currently be retrieved through this endpoint.
scalepad_quoter_list_quote_templates details
scalepad_quoter_list_quote_templates details
[ScalePad] List quote templates — the starting points for a new draft. Cursor-paginated: {data[], total_count, next_cursor}. Each template carries id (normally shaped qtpl_...), slug, title, record_created_at, and record_updated_at; all five are schema-required here. The id is what you pass as template_id to scalepad_quoter_create_quote.
scalepad_quoter_list_quotes details
scalepad_quoter_list_quotes details
[ScalePad] List quote revisions. Cursor-paginated: {data[], total_count, next_cursor}. data[] is a FLATTENED list projection, not the full fetch payload — it carries identity/state (id, uuid, revision, number, custom_number, name, draft, primary, stage, flagged, currency_iso, tags), lifecycle timestamps (record_created_at, record_updated_at, expired_at, won_at, email_first_sent_at, email_last_sent_at, email_status), client/contact/owner fields (client, billing and shipping name/organization/address, owner_id, owner_first_name, owner_last_name), external deal ids (autotask_opportunity_id, connectwise_opportunity_id, halo_opportunity_id, hubspot_deal_id, kaseya_opportunity_id, lm_initiative_id, pipedrive_deal_id, quickbooks_invoice_id, salesforce_opportunity_id, xero_invoice_id, zoho_deal_id), and decimal-STRING money groups for annual/monthly/quarterly/semi_annual/one_time/upfront (cost, discount, discounted subtotal, margin, subtotal, tax total, total) plus shipping_decimal. Most money and integration fields are nullable and the schema declares no required array, so tolerate missing fields. Use scalepad_quoter_get_quote for the full payload with sections and line items. Both draft and primary revisions can appear — read the draft and primary booleans rather than inferring state from the id.
scalepad_quoter_publish_quote details
scalepad_quoter_publish_quote details
[ScalePad] Publish a draft quote, making it LIVE and sendable. Takes NO request body. Returns 200 with the full QuoteFetchResponse; publishing assigns the quote number and, when expired_at is null, resolves it from the account default expiration window. Confirm with the user before calling: the published ScalePad API surface contains NO unpublish operation and no quote DELETE, so this transition is effectively irreversible. Failure semantics: 404 quote not found; 409 the quote is not a draft or is already published; 422 publish validation (documented examples include ERR_QUOTE_HAS_NO_LINE_ITEMS and ERR_EXPIRED_AT_IN_PAST); and 503 ERR_COULD_NOT_FETCH_ACCOUNT_INFO, a temporary upstream failure the vendor explicitly documents as safe to retry.
scalepad_quoter_update_quote_section_line_item details
scalepad_quoter_update_quote_section_line_item details
[ScalePad] Patch ONE existing line item in a draft quote's section and recompute the affected totals. Returns 200 with the full QuoteFetchResponse (totals are recomputed only if a calculation field changed). Every body field is optional, but an empty body is explicitly REJECTED with 422. Nested objects and recurring_interval are tri-state: omitted means no change, null clears where clearing is allowed, and a populated value applies. Requires a draft: 409 on a published quote; 404 if the quote, section, or line item is not found; 400 on malformed JSON or a missing path value; 422 for field validation, with locations reported as line_items[0].field.
More in Tools Reference
Atera ToolsAuvik ToolsAvanan (Check Point Harmony Email) ToolsConnectWise Sell ToolsStill need help? Ask the team