PROJECT MANAGEMENT · TASKS
Stories, epics, iterations, and docs in the workspace they already work in.
Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.
Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.
Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.
Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.
shortcut_delete_api_v3_categories_by_category_public_idWRITEDelete Category can be used to delete any Category. via DELETE /api/v3/categories/{category-public-id}
shortcut_delete_api_v3_custom_fields_by_custom_field_public_idWRITEDelete Custom Field via DELETE /api/v3/custom-fields/{custom-field-public-id}
shortcut_delete_api_v3_documents_by_doc_public_idWRITEPermanently deletes a Doc and its associated data. Requires admin access to the doc. When a document is deleted, connected clients will be notified via SSE events. via DELETE /api/v3/documents/{doc-public-id}
shortcut_delete_api_v3_documents_by_doc_public_id_epics_by_epic_public_idWRITERemove a relationship between a Document and an Epic. via DELETE /api/v3/documents/{doc-public-id}/epics/{epic-public-id}
shortcut_delete_api_v3_entity_templates_by_entity_template_public_idWRITEDelete Entity Template via DELETE /api/v3/entity-templates/{entity-template-public-id}
shortcut_delete_api_v3_epics_by_epic_public_idWRITEDelete Epic can be used to delete the Epic. The only required parameter is Epic ID. via DELETE /api/v3/epics/{epic-public-id}
shortcut_delete_api_v3_epics_by_epic_public_id_comments_by_comment_public_idWRITEThis endpoint allows you to delete a Comment from an Epic. via DELETE /api/v3/epics/{epic-public-id}/comments/{comment-public-id}
shortcut_delete_api_v3_files_by_file_public_idWRITEDelete File deletes a previously uploaded file. via DELETE /api/v3/files/{file-public-id}
shortcut_delete_api_v3_integrations_webhook_by_integration_public_idWRITEDelete Generic Integration via DELETE /api/v3/integrations/webhook/{integration-public-id}
shortcut_delete_api_v3_iterations_by_iteration_public_idWRITEDelete Iteration via DELETE /api/v3/iterations/{iteration-public-id}
shortcut_delete_api_v3_labels_by_label_public_idWRITEDelete Label can be used to delete any Label. via DELETE /api/v3/labels/{label-public-id}
shortcut_delete_api_v3_linked_files_by_linked_file_public_idWRITEDelete Linked File can be used to delete any previously attached Linked-File. via DELETE /api/v3/linked-files/{linked-file-public-id}
shortcut_delete_api_v3_objectives_by_objective_public_idWRITEDelete Objective can be used to delete any Objective. via DELETE /api/v3/objectives/{objective-public-id}
shortcut_delete_api_v3_projects_by_project_public_idWRITEDelete Project can be used to delete a Project. Projects can only be deleted if all associated Stories are moved or deleted. In the case that the Project cannot be deleted, you will receive a 422 response. via DELETE /api/v3/projects/{project-public-id}
shortcut_delete_api_v3_stories_bulkWRITEDelete Multiple Stories allows you to delete multiple archived stories at once. via DELETE /api/v3/stories/bulk
shortcut_delete_api_v3_stories_by_story_public_idWRITEDelete Story can be used to delete any Story. via DELETE /api/v3/stories/{story-public-id}
shortcut_delete_api_v3_stories_by_story_public_id_comments_by_comment_public_idWRITEDelete a Comment from any story. via DELETE /api/v3/stories/{story-public-id}/comments/{comment-public-id}
shortcut_delete_api_v3_stories_by_story_public_id_comments_by_comment_public_id_reactionsWRITEDelete a reaction from any story comment. via DELETE /api/v3/stories/{story-public-id}/comments/{comment-public-id}/reactions
shortcut_delete_api_v3_stories_by_story_public_id_tasks_by_task_public_idWRITEDelete Task can be used to delete any previously created Task on a Story. via DELETE /api/v3/stories/{story-public-id}/tasks/{task-public-id}
shortcut_delete_api_v3_story_links_by_story_link_public_idWRITERemoves the relationship between the stories for the given Story Link. via DELETE /api/v3/story-links/{story-link-public-id}
shortcut_get_api_v3_categoriesREADList Categories returns a list of all Categories and their attributes. via GET /api/v3/categories
shortcut_get_api_v3_categories_by_category_public_idREADGet Category returns information about the selected Category. via GET /api/v3/categories/{category-public-id}
shortcut_get_api_v3_categories_by_category_public_id_milestonesREADList Category Milestones returns a list of all Milestones with the Category. via GET /api/v3/categories/{category-public-id}/milestones
shortcut_get_api_v3_categories_by_category_public_id_objectivesREADReturns a list of all Objectives with the Category. via GET /api/v3/categories/{category-public-id}/objectives
shortcut_get_api_v3_custom_fieldsREADList Custom Fields via GET /api/v3/custom-fields
shortcut_get_api_v3_custom_fields_by_custom_field_public_idREADGet Custom Field via GET /api/v3/custom-fields/{custom-field-public-id}
shortcut_get_api_v3_documentsREADList Docs returns a list of Doc that the current user can read. via GET /api/v3/documents
shortcut_get_api_v3_documents_by_doc_public_idREADGet a Doc by its public ID with content. Use content_format=html query parameter to include HTML content. via GET /api/v3/documents/{doc-public-id}
shortcut_get_api_v3_documents_by_doc_public_id_epicsREADGet a list of all Epics related to this Document. via GET /api/v3/documents/{doc-public-id}/epics
shortcut_get_api_v3_entity_templatesREADList all the entity templates for the Workspace. via GET /api/v3/entity-templates
shortcut_get_api_v3_entity_templates_by_entity_template_public_idREADGet Entity Template returns information about a given entity template. via GET /api/v3/entity-templates/{entity-template-public-id}
shortcut_get_api_v3_epic_workflowREADReturns the Epic Workflow for the Workspace. via GET /api/v3/epic-workflow
shortcut_get_api_v3_epicsREADList Epics returns a list of all Epics and their attributes. via GET /api/v3/epics
shortcut_get_api_v3_epics_by_epic_public_idREADGet Epic returns information about the selected Epic. via GET /api/v3/epics/{epic-public-id}
shortcut_get_api_v3_epics_by_epic_public_id_commentsREADGet a list of all Comments on an Epic. via GET /api/v3/epics/{epic-public-id}/comments
shortcut_get_api_v3_epics_by_epic_public_id_comments_by_comment_public_idREADThis endpoint returns information about the selected Epic Comment. via GET /api/v3/epics/{epic-public-id}/comments/{comment-public-id}
shortcut_get_api_v3_epics_by_epic_public_id_documentsREADGet a list of all Documents related to this Epic. via GET /api/v3/epics/{epic-public-id}/documents
shortcut_get_api_v3_epics_by_epic_public_id_healthREADGet the current health for the specified Epic. via GET /api/v3/epics/{epic-public-id}/health
shortcut_get_api_v3_epics_by_epic_public_id_health_historyREADList the history of health statuses for the specified Epic, most recent first. via GET /api/v3/epics/{epic-public-id}/health-history
shortcut_get_api_v3_epics_by_epic_public_id_storiesREADGet a list of all Stories in an Epic. via GET /api/v3/epics/{epic-public-id}/stories
shortcut_get_api_v3_epics_paginatedREADList Epics with pagination returns a paginated list of Epics and their attributes. via GET /api/v3/epics/paginated
shortcut_get_api_v3_external_link_storiesREADGet Stories which have a given External Link associated with them. via GET /api/v3/external-link/stories
shortcut_get_api_v3_filesREADList Files returns a list of all UploadedFiles in the workspace. via GET /api/v3/files
shortcut_get_api_v3_files_by_file_public_idREADGet File returns information about the selected UploadedFile. via GET /api/v3/files/{file-public-id}
shortcut_get_api_v3_groupsREADA group in our API maps to a "Team" within the Shortcut Product. A Team is a collection of Users that can be associated to Stories, Epics, and Iterations within Shortcut. via GET /api/v3/groups
shortcut_get_api_v3_groups_by_group_public_idREADGet Group via GET /api/v3/groups/{group-public-id}
shortcut_get_api_v3_groups_by_group_public_id_storiesREADList the Stories assigned to the Group. (By default, limited to 1,000). via GET /api/v3/groups/{group-public-id}/stories
shortcut_get_api_v3_integrations_webhook_by_integration_public_idREADGet Generic Integration via GET /api/v3/integrations/webhook/{integration-public-id}
shortcut_get_api_v3_iterationsREADList Iterations via GET /api/v3/iterations
shortcut_get_api_v3_iterations_by_iteration_public_idREADGet Iteration via GET /api/v3/iterations/{iteration-public-id}
shortcut_get_api_v3_iterations_by_iteration_public_id_storiesREADGet a list of all Stories in an Iteration. via GET /api/v3/iterations/{iteration-public-id}/stories
shortcut_get_api_v3_key_results_by_key_result_public_idREADGet Key Result returns information about a chosen Key Result. via GET /api/v3/key-results/{key-result-public-id}
shortcut_get_api_v3_labelsREADList Labels returns a list of all Labels and their attributes. via GET /api/v3/labels
shortcut_get_api_v3_labels_by_label_public_idREADGet Label returns information about the selected Label. via GET /api/v3/labels/{label-public-id}
shortcut_get_api_v3_labels_by_label_public_id_epicsREADList all of the Epics with the Label. via GET /api/v3/labels/{label-public-id}/epics
shortcut_get_api_v3_labels_by_label_public_id_storiesREADList all of the Stories with the Label. via GET /api/v3/labels/{label-public-id}/stories
shortcut_get_api_v3_linked_filesREADList Linked Files returns a list of all Linked-Files and their attributes. via GET /api/v3/linked-files
shortcut_get_api_v3_linked_files_by_linked_file_public_idREADGet File returns information about the selected Linked File. via GET /api/v3/linked-files/{linked-file-public-id}
shortcut_get_api_v3_memberREADReturns information about the authenticated member. via GET /api/v3/member
shortcut_get_api_v3_membersREADReturns information about members of the Workspace. via GET /api/v3/members
shortcut_get_api_v3_members_by_member_public_idREADReturns information about a Member. via GET /api/v3/members/{member-public-id}
shortcut_get_api_v3_objectivesREADList Objectives returns a list of all Objectives and their attributes. via GET /api/v3/objectives
shortcut_get_api_v3_objectives_by_objective_public_idREADGet Objective returns information about a chosen Objective. via GET /api/v3/objectives/{objective-public-id}
shortcut_get_api_v3_objectives_by_objective_public_id_epicsREADList all of the Epics within the Objective. via GET /api/v3/objectives/{objective-public-id}/epics
shortcut_get_api_v3_objectives_by_objective_public_id_healthREADGet the current health for the specified Objective. via GET /api/v3/objectives/{objective-public-id}/health
shortcut_get_api_v3_objectives_by_objective_public_id_health_historyREADList the history of health statuses for the specified Objective, most recent first. via GET /api/v3/objectives/{objective-public-id}/health-history
shortcut_get_api_v3_projectsREADList Projects returns a list of all Projects and their attributes. via GET /api/v3/projects
shortcut_get_api_v3_projects_by_project_public_idREADGet Project returns information about the selected Project. via GET /api/v3/projects/{project-public-id}
shortcut_get_api_v3_projects_by_project_public_id_storiesREADList Stories returns a list of all Stories in a selected Project and their attributes. via GET /api/v3/projects/{project-public-id}/stories
shortcut_get_api_v3_repositoriesREADList Repositories returns a list of all Repositories and their attributes. via GET /api/v3/repositories
shortcut_get_api_v3_repositories_by_repo_public_idREADGet Repository returns information about the selected Repository. via GET /api/v3/repositories/{repo-public-id}
shortcut_get_api_v3_searchREADSearch lets you search Epics and Stories based on desired parameters. Since ordering of the results can change over time (due to search ranking decay, new Epics and Stories being created), the `next` value from the previous response can be used as the path and query string for the next page to ensure stable ordering. via GET /api/v3/search
shortcut_get_api_v3_search_documentsREADSearch Documents lets you search Documents based on desired parameters. Supports structured filters: title, archived, created_by_me, followed_by_me. via GET /api/v3/search/documents
shortcut_get_api_v3_search_epicsREADSearch Epics lets you search Epics based on desired parameters. Since ordering of stories can change over time (due to search ranking decay, new Epics being created), the `next` value from the previous response can be used as the path and query string for the next page to ensure stable ordering. via GET /api/v3/search/epics
shortcut_get_api_v3_search_iterationsREADSearch Iterations lets you search Iterations based on desired parameters. Since ordering of results can change over time (due to search ranking decay, new Iterations being created), the `next` value from the previous response can be used as the path and query string for the next page to ensure stable ordering. via GET /api/v3/search/iterations
shortcut_get_api_v3_search_milestonesREADSearch Milestones lets you search Milestones based on desired parameters. Since ordering of results can change over time (due to search ranking decay, new Milestones being created), the `next` value from the previous response can be used as the path and query string for the next page to ensure stable ordering. via GET /api/v3/search/milestones
shortcut_get_api_v3_search_objectivesREADSearch Objectives lets you search Objectives based on desired parameters. Since ordering of results can change over time (due to search ranking decay, new Objectives being created), the `next` value from the previous response can be used as the path and query string for the next page to ensure stable ordering. via GET /api/v3/search/objectives
shortcut_get_api_v3_search_storiesREADSearch Stories lets you search Stories based on desired parameters. Since ordering of stories can change over time (due to search ranking decay, new stories being created), the `next` value from the previous response can be used as the path and query string for the next page to ensure stable ordering. via GET /api/v3/search/stories
shortcut_get_api_v3_stories_by_story_public_idREADGet Story returns information about a chosen Story. via GET /api/v3/stories/{story-public-id}
shortcut_get_api_v3_stories_by_story_public_id_commentsREADLists Comments associated with a Story via GET /api/v3/stories/{story-public-id}/comments
shortcut_get_api_v3_stories_by_story_public_id_comments_by_comment_public_idREADGet Comment is used to get Comment information. via GET /api/v3/stories/{story-public-id}/comments/{comment-public-id}
shortcut_get_api_v3_stories_by_story_public_id_historyREADStory History via GET /api/v3/stories/{story-public-id}/history
shortcut_get_api_v3_stories_by_story_public_id_sub_tasksREADList Story Sub tasks returns a list of all Sub-task Stories for a given parent Story. via GET /api/v3/stories/{story-public-id}/sub-tasks
shortcut_get_api_v3_stories_by_story_public_id_tasks_by_task_public_idREADReturns information about a chosen Task. via GET /api/v3/stories/{story-public-id}/tasks/{task-public-id}
shortcut_get_api_v3_story_links_by_story_link_public_idREADReturns the stories and their relationship for the given Story Link. via GET /api/v3/story-links/{story-link-public-id}
shortcut_get_api_v3_workflowsREADReturns a list of all Workflows in the Workspace. via GET /api/v3/workflows
shortcut_get_api_v3_workflows_by_workflow_public_idREADGet Workflow returns information about a chosen Workflow. via GET /api/v3/workflows/{workflow-public-id}
shortcut_post_api_v3_categoriesWRITECreate Category allows you to create a new Category in Shortcut. via POST /api/v3/categories
shortcut_post_api_v3_documentsWRITECreates a new Doc. Supports markdown or HTML input via content_format parameter. WARNING: if content_format is not supplied, `content` input defaults to html. via POST /api/v3/documents
shortcut_post_api_v3_entity_templatesWRITECreate a new entity template for the Workspace. via POST /api/v3/entity-templates
shortcut_post_api_v3_epicsWRITECreate Epic allows you to create a new Epic in Shortcut. via POST /api/v3/epics
shortcut_post_api_v3_epics_by_epic_public_id_commentsWRITEThis endpoint allows you to create a threaded Comment on an Epic. via POST /api/v3/epics/{epic-public-id}/comments
shortcut_post_api_v3_epics_by_epic_public_id_comments_by_comment_public_idWRITEThis endpoint allows you to create a nested Comment reply to an existing Epic Comment. via POST /api/v3/epics/{epic-public-id}/comments/{comment-public-id}
shortcut_post_api_v3_epics_by_epic_public_id_healthWRITECreate a new health status for the specified Epic. via POST /api/v3/epics/{epic-public-id}/health
shortcut_post_api_v3_groupsWRITECreate Group via POST /api/v3/groups
shortcut_post_api_v3_integrations_webhookWRITECreate Generic Integration via POST /api/v3/integrations/webhook
shortcut_post_api_v3_iterationsWRITECreate Iteration via POST /api/v3/iterations
shortcut_post_api_v3_labelsWRITECreate Label allows you to create a new Label in Shortcut. via POST /api/v3/labels
shortcut_post_api_v3_linked_filesWRITECreate Linked File allows you to create a new Linked File in Shortcut. via POST /api/v3/linked-files
shortcut_post_api_v3_objectivesWRITECreate Objective allows you to create a new Objective in Shortcut. via POST /api/v3/objectives
shortcut_post_api_v3_objectives_by_objective_public_id_healthWRITECreate a new health status for the specified Objective. via POST /api/v3/objectives/{objective-public-id}/health
shortcut_post_api_v3_projectsWRITECreate Project is used to create a new Shortcut Project. via POST /api/v3/projects
shortcut_post_api_v3_storiesWRITECreate Story is used to add a new story to your Shortcut Workspace. This endpoint requires that either **workflow_state_id** or **project_id** be provided, but will reject the request if both or neither are specified. The workflow_state_id has been marked as required and is the recommended field to specify because we are in the process of sunsetting Projects in Shortcut. via POST /api/v3/stories
shortcut_post_api_v3_stories_bulkWRITECreate Multiple Stories allows you to create multiple stories in a single request using the same syntax as [Create Story](https://developer.shortcut.com/api/rest/v3#create-story). via POST /api/v3/stories/bulk
shortcut_post_api_v3_stories_by_story_public_id_commentsWRITECreate Comment allows you to create a Comment on any Story. via POST /api/v3/stories/{story-public-id}/comments
shortcut_post_api_v3_stories_by_story_public_id_comments_by_comment_public_id_reactionsWRITECreate a reaction to a story comment. via POST /api/v3/stories/{story-public-id}/comments/{comment-public-id}/reactions
shortcut_post_api_v3_stories_by_story_public_id_comments_by_comment_public_id_unlink_from_slackWRITEUnlinks a Comment from its linked Slack thread (Comment replies and Slack replies will no longer be synced) via POST /api/v3/stories/{story-public-id}/comments/{comment-public-id}/unlink-from-slack
shortcut_post_api_v3_stories_by_story_public_id_tasksWRITECreate Task is used to create a new task in a Story. via POST /api/v3/stories/{story-public-id}/tasks
shortcut_post_api_v3_stories_from_templateWRITECreate Story From Template is used to add a new story derived from a template to your Shortcut Workspace. via POST /api/v3/stories/from-template
shortcut_post_api_v3_stories_searchWRITESearch Stories lets you search Stories based on desired parameters. via POST /api/v3/stories/search
shortcut_post_api_v3_story_linksWRITEStory Links (called Story Relationships in the UI) allow you create semantic relationships between two stories. The parameters read like an active voice grammatical sentence: subject -> verb -> object. The subject story acts on the object Story; the object story is the direct object of the sentence. The subject story "blocks", "duplicates", or "relates to" the object story. Examples: - "story 5 blocks story 6” -- story 6 is now "blocked" until story 5 is moved to a Done workflow state. - "story 2 duplicates story 1” -- Story 2 represents the same body of work as Story 1 (and should probably be archived). - "story 7 relates to story 3” via POST /api/v3/story-links
shortcut_put_api_v3_categories_by_category_public_idWRITEUpdate Category allows you to replace a Category name with another name. If you try to name a Category something that already exists, you will receive a 422 response. via PUT /api/v3/categories/{category-public-id}
shortcut_put_api_v3_custom_fields_by_custom_field_public_idWRITEUpdate Custom Field can be used to update the definition of a Custom Field. The order of items in the 'values' collection is interpreted to be their ascending sort order.To delete an existing enum value, simply omit it from the 'values' collection. New enum values may be created inline by including an object in the 'values' collection having a 'value' entry with no 'id' (eg. {'value': 'myNewValue', 'color_key': 'green'}). via PUT /api/v3/custom-fields/{custom-field-public-id}
shortcut_put_api_v3_documents_by_doc_public_idWRITEUpdates an existing Doc's title and/or content. Supports markdown or HTML input via content_format parameter. WARNING: if content_format is not supplied, `content` input defaults to html. When a document is updated: (1) For Tiptap-migrated docs, SSE events notify connected Tiptap clients to refresh. (2) For non-migrated docs, CKEditor cache is flushed and SSE events notify connected CKEditor users. via PUT /api/v3/documents/{doc-public-id}
shortcut_put_api_v3_documents_by_doc_public_id_epics_by_epic_public_idWRITECreate a relationship between a Document and an Epic. via PUT /api/v3/documents/{doc-public-id}/epics/{epic-public-id}
shortcut_put_api_v3_entity_templates_by_entity_template_public_idWRITEUpdate an entity template's name or its contents. via PUT /api/v3/entity-templates/{entity-template-public-id}
shortcut_put_api_v3_entity_templates_disableWRITEDisables the Story Template feature for the Workspace. via PUT /api/v3/entity-templates/disable
shortcut_put_api_v3_entity_templates_enableWRITEEnables the Story Template feature for the Workspace. via PUT /api/v3/entity-templates/enable
shortcut_put_api_v3_epics_by_epic_public_idWRITEUpdate Epic can be used to update numerous fields in the Epic. The only required parameter is Epic ID, which can be found in the Shortcut UI. via PUT /api/v3/epics/{epic-public-id}
shortcut_put_api_v3_epics_by_epic_public_id_comments_by_comment_public_idWRITEThis endpoint allows you to update a threaded Comment on an Epic. via PUT /api/v3/epics/{epic-public-id}/comments/{comment-public-id}
shortcut_put_api_v3_files_by_file_public_idWRITEUpdate File updates the properties of an UploadedFile (but not its content). via PUT /api/v3/files/{file-public-id}
shortcut_put_api_v3_groups_by_group_public_idWRITEUpdate Group via PUT /api/v3/groups/{group-public-id}
shortcut_put_api_v3_health_by_health_public_idWRITEUpdate an existing health status by its ID. via PUT /api/v3/health/{health-public-id}
shortcut_put_api_v3_iterations_by_iteration_public_idWRITEUpdate Iteration via PUT /api/v3/iterations/{iteration-public-id}
shortcut_put_api_v3_iterations_disableWRITEDisables Iterations for the current workspace via PUT /api/v3/iterations/disable
shortcut_put_api_v3_iterations_enableWRITEEnables Iterations for the current workspace via PUT /api/v3/iterations/enable
shortcut_put_api_v3_key_results_by_key_result_public_idWRITEUpdate Key Result allows updating a Key Result's name or initial, observed, or target values. via PUT /api/v3/key-results/{key-result-public-id}
shortcut_put_api_v3_labels_by_label_public_idWRITEUpdate Label allows you to replace a Label name with another name. If you try to name a Label something that already exists, you will receive a 422 response. via PUT /api/v3/labels/{label-public-id}
shortcut_put_api_v3_linked_files_by_linked_file_public_idWRITEUpdated Linked File allows you to update properties of a previously attached Linked-File. via PUT /api/v3/linked-files/{linked-file-public-id}
shortcut_put_api_v3_objectives_by_objective_public_idWRITEUpdate Objective can be used to update Objective properties. via PUT /api/v3/objectives/{objective-public-id}
shortcut_put_api_v3_projects_by_project_public_idWRITEUpdate Project can be used to change properties of a Project. via PUT /api/v3/projects/{project-public-id}
shortcut_put_api_v3_stories_bulkWRITEUpdate Multiple Stories allows you to make changes to numerous stories at once. via PUT /api/v3/stories/bulk
shortcut_put_api_v3_stories_by_story_public_idWRITEUpdate Story can be used to update Story properties. via PUT /api/v3/stories/{story-public-id}
shortcut_put_api_v3_stories_by_story_public_id_comments_by_comment_public_idWRITEUpdate Comment replaces the text of the existing Comment. via PUT /api/v3/stories/{story-public-id}/comments/{comment-public-id}
shortcut_put_api_v3_stories_by_story_public_id_tasks_by_task_public_idWRITEUpdate Task can be used to update Task properties. via PUT /api/v3/stories/{story-public-id}/tasks/{task-public-id}
shortcut_put_api_v3_story_links_by_story_link_public_idWRITEUpdates the stories and/or the relationship for the given Story Link. via PUT /api/v3/story-links/{story-link-public-id}
Put Shortcut behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.