Canvas · OpenAPI Overlay 1.0.0

API Evangelist conversational phrasing for Canvas LMS REST Users API

49 actions 49 updates phrasing extends openapi/canvas-users-api-openapi.yml
Generated by API Evangelist Written by API Evangelist tooling for Canvas's API. It is a proposal applied on top of the contract, not a document Canvas publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

x-apievangelist-phrasing

Targets 49 · first 16 shown; the file carries all of them

$.info
$.paths['/v1/accounts/{account_id}/users'].get
$.paths['/v1/accounts/{account_id}/users'].post
$.paths['/v1/users/{user_id}/files'].post
$.paths['/v1/users/self/activity_stream'].get
$.paths['/v1/users/self/activity_stream'].delete
$.paths['/v1/users/activity_stream'].get
$.paths['/v1/users/self/activity_stream/summary'].get
$.paths['/v1/users/self/todo'].get
$.paths['/v1/users/self/todo_item_count'].get
$.paths['/v1/users/self/upcoming_events'].get
$.paths['/v1/users/{user_id}/missing_submissions'].get
$.paths['/v1/users/self/activity_stream/{id}'].delete
$.paths['/v1/users/{id}'].get
$.paths['/v1/users/{id}'].put
$.paths['/v1/accounts/{account_id}/self_registration'].post

OpenAPI Overlay

Raw ↑
# Generated by API Evangelist (build-phrasing.py). Our phrasing, not observed demand.
overlay: 1.0.0
info:
  title: API Evangelist conversational phrasing for Canvas LMS REST Users API
  version: 1.0.0
extends: openapi/canvas-users-api-openapi.yml
actions:
- target: $.info
  update:
    x-apievangelist-phrasing:
      method: generated
      generated: '2026-10-01'
      generator: build-phrasing.py
      label: Generated by API Evangelist
      operations: 48
- target: $.paths['/v1/accounts/{account_id}/users'].get
  update:
    x-apievangelist-phrasing:
      intent: List users in an account
      effect: read
      questions:
      - How can I see every user that belongs to a Canvas account?
      - Can I search an account's users by name or login and sort the results?
      - Is there a way to include deleted users when listing an account's people?
      instructions:
      - text: List the users in account {account_id}.
        slots:
          account_id: path.account_id
      - text: Search account {account_id} for users matching {search_term}.
        slots:
          account_id: path.account_id
          search_term: query.search_term
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/accounts/{account_id}/users'].post
  update:
    x-apievangelist-phrasing:
      intent: Create a user with a login in an account
      effect: write
      questions:
      - How do I add a new person with a login to a Canvas account as an admin?
      - Can I set a new user's SIS ID and email address when I create them?
      - What's needed to provision a brand-new user and pseudonym in an account?
      instructions:
      - text: Create a user named {name} with login {unique_id} in account {account_id}.
        slots:
          name: requestBody.user[name]
          unique_id: requestBody.pseudonym[unique_id]
          account_id: path.account_id
      - text: Add a new user with login {unique_id} and SIS ID {sis_user_id} to account {account_id}.
        slots:
          unique_id: requestBody.pseudonym[unique_id]
          sis_user_id: requestBody.pseudonym[sis_user_id]
          account_id: path.account_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{user_id}/files'].post
  update:
    x-apievangelist-phrasing:
      intent: Upload a file to a user's personal files
      effect: write
      questions:
      - How do I upload a file into a user's personal files area?
      - What's the first step to start a file upload to someone's own Canvas files?
      instructions:
      - text: Start uploading a file to the personal files of user {user_id}.
        slots:
          user_id: path.user_id
      - text: Begin a personal-files upload for user {user_id}.
        slots:
          user_id: path.user_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/activity_stream'].get
  update:
    x-apievangelist-phrasing:
      intent: List my activity stream
      effect: read
      questions:
      - How can I pull my own recent activity stream from the self endpoint?
      - Can I limit my activity stream to only my active courses?
      instructions:
      - text: Show my activity stream via users/self.
      - text: 'List my activity stream items, only for active courses: {only_active_courses}.'
        slots:
          only_active_courses: query.only_active_courses
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/activity_stream'].delete
  update:
    x-apievangelist-phrasing:
      intent: Hide every item in my activity stream
      effect: destructive
      questions:
      - Can I clear out my whole activity stream at once?
      - Is there a way to hide all of my stream items in one call?
      instructions:
      - text: Hide all items in my activity stream.
      - text: Clear every entry from my activity stream.
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/activity_stream'].get
  update:
    x-apievangelist-phrasing:
      intent: List my activity stream (alternate route)
      effect: read
      questions:
      - Is there an alternate route without self to fetch the current user's activity stream?
      - Which endpoint at users/activity_stream returns my global stream?
      instructions:
      - text: Fetch my global activity stream from the users/activity_stream route.
      - text: 'Get the current user''s stream via the alternate route, active courses only: {only_active_courses}.'
        slots:
          only_active_courses: query.only_active_courses
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/activity_stream/summary'].get
  update:
    x-apievangelist-phrasing:
      intent: Summarize my activity stream
      effect: read
      questions:
      - How do I get counts of what's in my activity stream by type?
      - Can I see a summary of unread stream items instead of the full stream?
      instructions:
      - text: Summarize my activity stream.
      - text: 'Give me an activity stream summary limited to active courses: {only_active_courses}.'
        slots:
          only_active_courses: query.only_active_courses
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/todo'].get
  update:
    x-apievangelist-phrasing:
      intent: List my to-do items
      effect: read
      questions:
      - What's on my Canvas to-do list right now?
      - Can I filter my to-do items to certain courses or submission status?
      instructions:
      - text: List my to-do items.
      - text: Show my to-do items for courses {course_ids}.
        slots:
          course_ids: query.course_ids
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/todo_item_count'].get
  update:
    x-apievangelist-phrasing:
      intent: Count my to-do items
      effect: read
      questions:
      - How many assignments do I have waiting to be graded or submitted?
      - Can I get just the number of to-do items rather than the list?
      instructions:
      - text: Count my to-do items.
      - text: Tell me how many assignments need grading or submitting for me.
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/upcoming_events'].get
  update:
    x-apievangelist-phrasing:
      intent: List my upcoming assignments and events
      effect: read
      questions:
      - What assignments and calendar events are coming up for me?
      - Is there a quick way to see my next due dates and events?
      instructions:
      - text: List my upcoming assignments and calendar events.
      - text: Show what's coming up next on my schedule.
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{user_id}/missing_submissions'].get
  update:
    x-apievangelist-phrasing:
      intent: List a student's missing submissions
      effect: read
      questions:
      - Which past-due assignments has a student not turned in?
      - Can a parent observer see a child's missing work in specific courses?
      instructions:
      - text: List missing submissions for student {user_id}.
        slots:
          user_id: path.user_id
      - text: Show past-due unsubmitted work for user {user_id} in courses {course_ids}.
        slots:
          user_id: path.user_id
          course_ids: query.course_ids
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/activity_stream/{id}'].delete
  update:
    x-apievangelist-phrasing:
      intent: Hide one activity stream item
      effect: destructive
      questions:
      - Can I hide a single item from my activity stream?
      - How do I dismiss one specific stream entry?
      instructions:
      - text: Hide stream item {id}.
        slots:
          id: path.id
      - text: Remove activity stream entry {id} from my view.
        slots:
          id: path.id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}'].get
  update:
    x-apievangelist-phrasing:
      intent: Get a user's details
      effect: read
      questions:
      - How do I look up a specific user's details and permissions?
      - Can I see whether a user is allowed to change their own name?
      instructions:
      - text: Show details for user {id}.
        slots:
          id: path.id
      - text: Get user {id} including {include}.
        slots:
          id: path.id
          include: query.include
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}'].put
  update:
    x-apievangelist-phrasing:
      intent: Update a user's profile fields
      effect: write
      questions:
      - How do I change a user's display name, time zone or pronouns?
      - Can I update someone's bio or avatar through the API?
      instructions:
      - text: Rename user {id} to {name}.
        slots:
          id: path.id
          name: requestBody.user[name]
      - text: Set user {id}'s time zone to {time_zone}.
        slots:
          id: path.id
          time_zone: requestBody.user[time_zone]
      - text: Update the pronouns of user {id} to {pronouns}.
        slots:
          id: path.id
          pronouns: requestBody.user[pronouns]
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/accounts/{account_id}/self_registration'].post
  update:
    x-apievangelist-phrasing:
      intent: Self-register a user (deprecated)
      effect: write
      questions:
      - Can people still sign themselves up on an account using the old self-registration endpoint?
      - What does the deprecated self-registration call require, like accepting terms of use?
      instructions:
      - text: Self-register {name} with login {unique_id} on account {account_id} using the deprecated endpoint.
        slots:
          name: requestBody.user[name]
          unique_id: requestBody.pseudonym[unique_id]
          account_id: path.account_id
      - text: 'Use the legacy self-registration for {name} on account {account_id}, terms accepted: {terms_of_use}, login {unique_id}.'
        slots:
          name: requestBody.user[name]
          account_id: path.account_id
          terms_of_use: requestBody.user[terms_of_use]
          unique_id: requestBody.pseudonym[unique_id]
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/settings'].get
  update:
    x-apievangelist-phrasing:
      intent: Update a user's UI settings
      effect: write
      questions:
      - How do I turn on manual mark-as-read for a user?
      - Can I collapse the global navigation by default for someone?
      instructions:
      - text: 'Enable manual mark-as-read for user {id}: {manual_mark_as_read}.'
        slots:
          id: path.id
          manual_mark_as_read: query.manual_mark_as_read
      - text: Set collapse global nav to {collapse_global_nav} for user {id}.
        slots:
          collapse_global_nav: query.collapse_global_nav
          id: path.id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/colors'].get
  update:
    x-apievangelist-phrasing:
      intent: Get all of a user's custom colors
      effect: read
      questions:
      - What custom course colors has a user saved?
      - Can I fetch every color a user picked for their calendar and courses?
      instructions:
      - text: Get all custom colors for user {id}.
        slots:
          id: path.id
      - text: List the saved color choices of user {id}.
        slots:
          id: path.id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/colors/{asset_string}'].get
  update:
    x-apievangelist-phrasing:
      intent: Get a user's color for one course or context
      effect: read
      questions:
      - What color has a user chosen for one particular course?
      - How do I read the custom color saved for a single context like course_42?
      instructions:
      - text: Get the custom color user {id} set for {asset_string}.
        slots:
          id: path.id
          asset_string: path.asset_string
      - text: Show which color user {id} uses for context {asset_string}.
        slots:
          id: path.id
          asset_string: path.asset_string
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/colors/{asset_string}'].put
  update:
    x-apievangelist-phrasing:
      intent: Set a user's color for a course or context
      effect: write
      questions:
      - Can I change the color a course shows in someone's calendar?
      - How do I save a hex color for one context on a user's dashboard?
      instructions:
      - text: Set user {id}'s color for {asset_string} to {hexcode}.
        slots:
          id: path.id
          asset_string: path.asset_string
          hexcode: requestBody.hexcode
      - text: Change the {asset_string} color for user {id} to hex {hexcode}.
        slots:
          asset_string: path.asset_string
          id: path.id
          hexcode: requestBody.hexcode
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/text_editor_preference'].put
  update:
    x-apievangelist-phrasing:
      intent: Set a user's preferred text editor
      effect: write
      questions:
      - Can I preset which rich content editor a user gets by default?
      - How do I stop the choose-an-editor prompt by saving someone's editor choice?
      instructions:
      - text: Set user {id}'s text editor preference to {text_editor_preference}.
        slots:
          id: path.id
          text_editor_preference: requestBody.text_editor_preference
      - text: Save {text_editor_preference} as the default editor for user {id}.
        slots:
          text_editor_preference: requestBody.text_editor_preference
          id: path.id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/files_ui_version_preference'].put
  update:
    x-apievangelist-phrasing:
      intent: Set a user's files UI version
      effect: write
      questions:
      - Can I choose which version of the files interface a user sees?
      - How do I save a user's preference between the old and new Files UI?
      instructions:
      - text: Set the files UI version for user {id} to {files_ui_version}.
        slots:
          id: path.id
          files_ui_version: requestBody.files_ui_version
      - text: Switch user {id} to files UI {files_ui_version}.
        slots:
          id: path.id
          files_ui_version: requestBody.files_ui_version
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/dashboard_positions'].get
  update:
    x-apievangelist-phrasing:
      intent: Get a user's dashboard card positions
      effect: read
      questions:
      - In what order has a user arranged their dashboard cards?
      - Can I read the saved dashboard card positions for someone?
      instructions:
      - text: Get dashboard positions for user {id}.
        slots:
          id: path.id
      - text: Show how user {id} has ordered their dashboard cards.
        slots:
          id: path.id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/dashboard_positions'].put
  update:
    x-apievangelist-phrasing:
      intent: Reorder a user's dashboard cards
      effect: write
      questions:
      - How do I change the order of course cards on a user's dashboard?
      - Can I save new dashboard card positions for someone?
      instructions:
      - text: Update the dashboard card positions for user {id}.
        slots:
          id: path.id
      - text: Rearrange user {id}'s dashboard cards.
        slots:
          id: path.id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/sessions'].delete
  update:
    x-apievangelist-phrasing:
      intent: Sign a user out everywhere and revoke tokens
      effect: destructive
      questions:
      - How do I force a compromised user out of every browser session and access token?
      - Does ending a user's sessions also kill their manually generated tokens?
      instructions:
      - text: Terminate all sessions and access tokens for user {id}.
        slots:
          id: path.id
      - text: Log user {id} out of every session immediately.
        slots:
          id: path.id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/mobile_sessions'].delete
  update:
    x-apievangelist-phrasing:
      intent: Log everyone out of mobile apps
      effect: destructive
      questions:
      - Can I expire every user's mobile app session across the whole account at once?
      - Is there a way to log all users out of mobile but skip admins?
      instructions:
      - text: Expire all users' mobile sessions account-wide.
      - text: 'Log everyone out of the mobile apps, skipping admins: {skip_admins}.'
        slots:
          skip_admins: query.skip_admins
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/mobile_sessions'].delete
  update:
    x-apievangelist-phrasing:
      intent: Log one user out of mobile apps
      effect: destructive
      questions:
      - How do I force a single user to re-authorize on their mobile app?
      - Can I expire just one person's mobile sessions?
      instructions:
      - text: Log user {id} out of all mobile apps.
        slots:
          id: path.id
      - text: Expire the mobile sessions of user {id}.
        slots:
          id: path.id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/merge_into/{destination_user_id}'].put
  update:
    x-apievangelist-phrasing:
      intent: Merge a user into another user
      effect: destructive
      questions:
      - How do I combine two duplicate user records into one?
      - Is merging users reversible, and what happens to the source user's data?
      instructions:
      - text: Merge user {id} into user {destination_user_id}.
        slots:
          id: path.id
          destination_user_id: path.destination_user_id
      - text: Fold duplicate user {id} into {destination_user_id}.
        slots:
          id: path.id
          destination_user_id: path.destination_user_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/merge_into/accounts/{destination_account_id}/users/{destination_user_id}'].put
  update:
    x-apievangelist-phrasing:
      intent: Merge a user into a user on another account
      effect: destructive
      questions:
      - Can I merge a user into someone on a different account or shard?
      - How do I specify the destination account when merging two users?
      instructions:
      - text: Merge user {id} into user {destination_user_id} on account {destination_account_id}.
        slots:
          id: path.id
          destination_user_id: path.destination_user_id
          destination_account_id: path.destination_account_id
      - text: Combine user {id} with {destination_user_id} in destination account {destination_account_id}.
        slots:
          id: path.id
          destination_user_id: path.destination_user_id
          destination_account_id: path.destination_account_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/split'].post
  update:
    x-apievangelist-phrasing:
      intent: Split a merged user back apart
      effect: write
      questions:
      - Can I undo a user merge that went wrong?
      - How much of a merged user can be restored by splitting them?
      instructions:
      - text: Split merged user {id} into separate users.
        slots:
          id: path.id
      - text: Undo the merge for user {id}.
        slots:
          id: path.id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/pandata_events_token'].post
  update:
    x-apievangelist-phrasing:
      intent: Get a Pandata events token
      effect: write
      questions:
      - How does a mobile app get a token for sending events to Pandata?
      - When does the Pandata events JWT expire?
      instructions:
      - text: Get a Pandata events token for app key {app_key}.
        slots:
          app_key: requestBody.app_key
      - text: Issue a Pandata events JWT for mobile app {app_key}.
        slots:
          app_key: requestBody.app_key
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{id}/graded_submissions'].get
  update:
    x-apievangelist-phrasing:
      intent: List a user's recently graded submissions
      effect: read
      questions:
      - What has a student most recently had graded?
      - Can I limit recently graded work to current enrollments and published assignments?
      instructions:
      - text: Show the most recently graded submissions for user {id}.
        slots:
          id: path.id
      - text: 'List recent grades for user {id}, current enrollments only: {only_current_enrollments}.'
        slots:
          id: path.id
          only_current_enrollments: query.only_current_enrollments
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{user_id}/profile'].get
  update:
    x-apievangelist-phrasing:
      intent: Get a user's profile
      effect: read
      questions:
      - How do I get a user's name and profile picture?
      - Where can I find my own calendar feed URL and LTI user id?
      instructions:
      - text: Get the profile of user {user_id}.
        slots:
          user_id: path.user_id
      - text: Show profile info and picture for user {user_id}.
        slots:
          user_id: path.user_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{user_id}/avatars'].get
  update:
    x-apievangelist-phrasing:
      intent: List avatar choices for a user
      effect: read
      questions:
      - What avatar images can a user pick from?
      - Which avatar options are available to set on someone's profile?
      instructions:
      - text: List avatar options for user {user_id}.
        slots:
          user_id: path.user_id
      - text: Show the avatars user {user_id} can choose.
        slots:
          user_id: path.user_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{user_id}/page_views'].get
  update:
    x-apievangelist-phrasing:
      intent: List a user's page view history
      effect: read
      questions:
      - Can I see which pages a user visited and when?
      - How do I pull page views for a user between two dates, newest first?
      instructions:
      - text: List page views for user {user_id}.
        slots:
          user_id: path.user_id
      - text: Show page views for user {user_id} from {start_time} to {end_time}.
        slots:
          user_id: path.user_id
          start_time: query.start_time
          end_time: query.end_time
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{user_id}/page_views/query'].post
  update:
    x-apievangelist-phrasing:
      intent: Start an async page views export for a user
      effect: write
      questions:
      - How do I kick off a background export of one user's page views as CSV?
      - Can I queue a page views query for a date range and poll for it later?
      instructions:
      - text: Start a page views query for user {user_id} from {start_date} to {end_date}.
        slots:
          user_id: path.user_id
          start_date: requestBody.start_date
          end_date: requestBody.end_date
      - text: Queue a {results_format} page views export for user {user_id}.
        slots:
          results_format: requestBody.results_format
          user_id: path.user_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{user_id}/page_views/query/{query_id}'].get
  update:
    x-apievangelist-phrasing:
      intent: Check a user's page views query status
      effect: read
      questions:
      - Is my single-user page views query finished yet?
      - How do I tell if a user's page views export failed?
      instructions:
      - text: Check status of page views query {query_id} for user {user_id}.
        slots:
          query_id: path.query_id
          user_id: path.user_id
      - text: Poll user {user_id}'s page views query {query_id}.
        slots:
          user_id: path.user_id
          query_id: path.query_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{user_id}/page_views/query/{query_id}/results'].get
  update:
    x-apievangelist-phrasing:
      intent: Download a user's page views query results
      effect: read
      questions:
      - Where do I download the results of a finished page views query for one user?
      - Are single-user page view query results returned compressed?
      instructions:
      - text: Download results of page views query {query_id} for user {user_id}.
        slots:
          query_id: path.query_id
          user_id: path.user_id
      - text: Get the completed page view data from query {query_id} for user {user_id}.
        slots:
          query_id: path.query_id
          user_id: path.user_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/page_views/query'].post
  update:
    x-apievangelist-phrasing:
      intent: Start a page views export for many users
      effect: write
      questions:
      - Can I export page views for a whole list of users in one job?
      - How do I queue a multi-user page views query for a date range?
      instructions:
      - text: Start a batch page views query for users {user_ids} from {start_date} to {end_date}.
        slots:
          user_ids: requestBody.user_ids
          start_date: requestBody.start_date
          end_date: requestBody.end_date
      - text: Queue a multi-user page views export in {results_format} for {user_ids}.
        slots:
          results_format: requestBody.results_format
          user_ids: requestBody.user_ids
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/page_views/query/{query_id}'].get
  update:
    x-apievangelist-phrasing:
      intent: Check a batch page views query status
      effect: read
      questions:
      - Has my multi-user page views export finished?
      - How do I poll the status of a batch page views job?
      instructions:
      - text: Check status of batch page views query {query_id}.
        slots:
          query_id: path.query_id
      - text: Poll the multi-user page views job {query_id}.
        slots:
          query_id: path.query_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/page_views/query/{query_id}/results'].get
  update:
    x-apievangelist-phrasing:
      intent: Download batch page views query results
      effect: read
      questions:
      - How do I download the output of a completed multi-user page views query?
      - In what format do batch page view results come back?
      instructions:
      - text: Download results of batch page views query {query_id}.
        slots:
          query_id: path.query_id
      - text: Fetch the finished multi-user page view data for query {query_id}.
        slots:
          query_id: path.query_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{user_id}/custom_data'].get
  update:
    x-apievangelist-phrasing:
      intent: Read a user's stored custom data
      effect: read
      questions:
      - How can my integration read back the JSON it stored on a user?
      - Can I load custom user data for one namespace only?
      instructions:
      - text: Load custom data for user {user_id} in namespace {ns}.
        slots:
          user_id: path.user_id
          ns: query.ns
      - text: Read the {ns} custom data stored on user {user_id}.
        slots:
          ns: query.ns
          user_id: path.user_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{user_id}/custom_data'].put
  update:
    x-apievangelist-phrasing:
      intent: Save custom JSON data on a user
      effect: write
      questions:
      - Can an external service attach its own JSON data to a Canvas user?
      - How do I save arbitrary key-value data under my own namespace on a user?
      instructions:
      - text: Store {data} on user {user_id} under namespace {ns}.
        slots:
          data: requestBody.data
          user_id: path.user_id
          ns: requestBody.ns
      - text: Save custom data {data} for user {user_id} in the {ns} namespace.
        slots:
          data: requestBody.data
          user_id: path.user_id
          ns: requestBody.ns
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/{user_id}/custom_data'].delete
  update:
    x-apievangelist-phrasing:
      intent: Delete a user's stored custom data
      effect: destructive
      questions:
      - How do I remove the custom data my app stored on a user?
      - Can I delete custom user data for just one namespace?
      instructions:
      - text: Delete custom data for user {user_id} in namespace {ns}.
        slots:
          user_id: path.user_id
          ns: query.ns
      - text: Wipe the {ns} custom data from user {user_id}.
        slots:
          ns: query.ns
          user_id: path.user_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/course_nicknames'].get
  update:
    x-apievangelist-phrasing:
      intent: List my course nicknames
      effect: read
      questions:
      - What nicknames have I given my courses?
      - Can I see all the course nicknames I've set?
      instructions:
      - text: List my course nicknames.
      - text: Show every nickname I've set for my courses.
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/course_nicknames'].delete
  update:
    x-apievangelist-phrasing:
      intent: Remove all my course nicknames
      effect: destructive
      questions:
      - How do I reset all of my course nicknames at once?
      - Can I wipe every nickname and go back to the real course names?
      instructions:
      - text: Clear all my course nicknames.
      - text: Remove every course nickname I've set.
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/course_nicknames/{course_id}'].get
  update:
    x-apievangelist-phrasing:
      intent: Get my nickname for a course
      effect: read
      questions:
      - What nickname did I give a particular course?
      - Can I check whether one course has a nickname set?
      instructions:
      - text: Get my nickname for course {course_id}.
        slots:
          course_id: path.course_id
      - text: Show the nickname I use for course {course_id}.
        slots:
          course_id: path.course_id
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/course_nicknames/{course_id}'].put
  update:
    x-apievangelist-phrasing:
      intent: Give a course a nickname
      effect: write
      questions:
      - Can I rename a course just for myself so it shows a shorter name?
      - How do I set a personal nickname that replaces a course's name in my view?
      instructions:
      - text: Nickname course {course_id} as {nickname}.
        slots:
          course_id: path.course_id
          nickname: requestBody.nickname
      - text: Set my nickname for course {course_id} to {nickname}.
        slots:
          course_id: path.course_id
          nickname: requestBody.nickname
      method: generated
      generated: '2026-10-01'
- target: $.paths['/v1/users/self/course_nicknames/{course_id}'].delete
  update:
    x-apievangelist-phrasing:
      intent: Remove my nickname for a course
      effect: destructive
      questions:
      - How do I drop the nickname from one course and see its real name again?
      - Can I remove a single course nickname without clearing the rest?
      instructions:
      - text: Remove my nickname for course {course_id}.
        slots:
          course_id: path.course_id
      - text: Restore the real name of course {course_id} by deleting its nickname.
        slots:
          course_id: path.course_id
      method: generated
      generated: '2026-10-01'