> This page is for API Reference & Tools.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.moveworks.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.moveworks.com/_mcp/server.

# Create productivity assistant

POST https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants
Content-Type: application/json

Creates a productivity assistant and returns it with its `id` and `version`.

Send the assistant's fields at the top level of the JSON body. `name`, `user_access` and `version.change_description` are required. Don't send `id` or `version.num`.

Reference: https://docs.moveworks.com/api-reference/configuration-api/productivity-assistants/create-productivity-assistant

## Authentication

- `Authorization` header (bearer token, required) — JWT bearer token authentication. Include the Configuration API key in the Authorization header as 'Bearer \<token>'.

## Request

### Body (application/json)

This endpoint expects a CreateProductivityAssistantRequest.

- `name` (string, required) — Display name of the assistant. Must be unique in your organization.
- `user_access` (UserAccess, required) — Who can use the assistant. Send exactly one option. Required on create, because every assistant needs an audience. On update, leave it out to keep the stored audience. The person who created the assistant always keeps access.
- `version` (VersionOnCreate, required) — The note to record with the new document. Don't send `num` on create.
- `description` (string, optional) — What the assistant does. Shown to users when they choose an assistant.
- `welcome_message` (string, optional) — Message shown when a user opens the assistant.
- `icon` (string, optional) — Name of the assistant's icon in the Moveworks icon set, for example `MWIconPublic`. This is a name, not a URL.
- `instructions` (string, optional) — Instructions that shape the assistant's behavior.
- `conversation_starters` (list of ConversationStarter, optional) — Suggested prompts shown in a new conversation. Up to 10.
- `plugin_identifiers` (list of string, optional) — Plugins the assistant can use. Each value is a built-in plugin name such as `enterprise_search_plugin`, or the id of a custom plugin. An empty list means no plugins. While `knowledge_scope` has at least one entry, the API keeps `enterprise_search_plugin` in this list for you.
- `knowledge_scope` (KnowledgeScope, optional) — Limits the assistant's enterprise search to the systems, documents, workspaces and channels you list. The assistant searches the combined set. Leave the scope out, or send every list empty, to search everything the user can already access.
- `skill_access_mode` (enum, optional) — Which Skills the assistant can use. - `ALL` - every Skill in your organization, including Skills registered later. - `SELECTED` - only the Skills in `skill_ids`. If you leave this out when you create an assistant, the API stores `SELECTED`, so the assistant gets no Skills you didn't list. On update, leaving it out keeps the stored mode.
  - Allowed values: `ALL`, `SELECTED`
- `skill_ids` (list of string, optional) — Ids of the Skills the assistant can use when `skill_access_mode` is `SELECTED`. Each id must belong to a Skill registered in your organization.
- `mcp_server_ids` (list of string, optional) — Ids of the MCP servers whose tools the assistant can call. Each server must already be connected for your organization.
- `a2a_agent_ids` (list of string, optional) — Ids of the A2A agents the assistant can delegate to. Each agent must already be registered for your organization.

## Response

### 200

The created productivity assistant. `plugin_identifiers` includes `enterprise_search_plugin` when the knowledge scope isn't empty.

- `id` (string, required) — Unique identifier of the assistant, assigned by the server.
- `name` (string, required) — Display name of the assistant. Must be unique in your organization.
- `version` (Version, required) — The version of a stored document.
- `description` (string, optional) — What the assistant does. Shown to users when they choose an assistant.
- `welcome_message` (string, optional) — Message shown when a user opens the assistant.
- `icon` (string, optional) — Name of the assistant's icon in the Moveworks icon set, for example `MWIconPublic`. This is a name, not a URL.
- `instructions` (string, optional) — Instructions that shape the assistant's behavior.
- `conversation_starters` (list of ConversationStarter, optional) — Suggested prompts shown in a new conversation. Up to 10.
- `plugin_identifiers` (list of string, optional) — Plugins the assistant can use. Each value is a built-in plugin name such as `enterprise_search_plugin`, or the id of a custom plugin. An empty list means no plugins. While `knowledge_scope` has at least one entry, the API keeps `enterprise_search_plugin` in this list for you.
- `knowledge_scope` (KnowledgeScope, optional) — Limits the assistant's enterprise search to the systems, documents, workspaces and channels you list. The assistant searches the combined set. Leave the scope out, or send every list empty, to search everything the user can already access.
- `skill_access_mode` (enum, optional) — Which Skills the assistant can use. - `ALL` - every Skill in your organization, including Skills registered later. - `SELECTED` - only the Skills in `skill_ids`. If you leave this out when you create an assistant, the API stores `SELECTED`, so the assistant gets no Skills you didn't list. On update, leaving it out keeps the stored mode.
  - Allowed values: `ALL`, `SELECTED`
- `skill_ids` (list of string, optional) — Ids of the Skills the assistant can use when `skill_access_mode` is `SELECTED`. Each id must belong to a Skill registered in your organization.
- `mcp_server_ids` (list of string, optional) — Ids of the MCP servers whose tools the assistant can call. Each server must already be connected for your organization.
- `a2a_agent_ids` (list of string, optional) — Ids of the A2A agents the assistant can delegate to. Each agent must already be registered for your organization.
- `user_access` (UserAccess, optional) — Who can use the assistant. Send exactly one option. Required on create, because every assistant needs an audience. On update, leave it out to keep the stored audience. The person who created the assistant always keeps access.
- `updated_time` (datetime, optional) — When the assistant was last updated.
- `updated_by` (string, optional) — Who last updated the assistant.

## Errors

### 400 Bad Request Error

Bad request - a field breaks a rule in the schema (a length or item limit, an unknown `skill_access_mode`, an invalid email address or a DSL syntax error); `id` or `version.num` was sent; `version.change_description` is missing; `user_access` is missing, names two options or sets `allow_all` to `false`; or an id in `skill_ids`, `mcp_server_ids`, `a2a_agent_ids` or `plugin_identifiers` doesn't exist in your organization

- `error` (ErrorResponseError, required)

### 401 Unauthorized Error

Unauthorized - the `Authorization` header is missing or the token is invalid

- `error` (ErrorResponseError, required)

### 403 Forbidden Error

Forbidden - the API key's user isn't allowed to read or change productivity assistants

- `error` (ErrorResponseError, required)

### 409 Conflict Error

Conflict - another assistant already uses this `name`, or your organization serves assistants from a storage path this API version doesn't write yet

- `error` (ErrorResponseError, required)

### 429 Too Many Requests Error

Too many requests - the organization exceeded the Configuration API rate limit. Back off and retry.

- `error` (ErrorResponseError, required)

### 500 Internal Server Error

Internal server error - retry the request

- `error` (ErrorResponseError, required)

## Types

### UserAccess

Who can use the assistant. Send exactly one option. Required on create, because every assistant needs an audience. On update, leave it out to keep the stored audience. The person who created the assistant always keeps access.

- Everyone: UserAccessEveryone
- Listed users: UserAccessListedUsers
- DSL rule: UserAccessRule

### VersionOnCreate

The note to record with the new document. Don't send `num` on create.

- `change_description` (string, required) — A short note describing this change. Required.

### ConversationStarter

A suggested prompt shown in a new conversation.

- `display_text` (string, required) — Short label shown on the suggestion.
- `utterance` (string, required) — Full message sent when the user selects the suggestion.

### KnowledgeScope

Limits the assistant's enterprise search to the systems, documents, workspaces and channels you list. The assistant searches the combined set. Leave the scope out, or send every list empty, to search everything the user can already access.

- `systems` (list of string, optional) — External systems to search in full, for example `CONFLUENCE` or `SHAREPOINT`. Up to 50.
- `documents` (list of KnowledgeDocument, optional) — Individual documents to search. Up to 200.
- `workspaces` (list of KnowledgePartition, optional) — Workspaces to search, such as a SharePoint site. Up to 100.
- `channels` (list of KnowledgePartition, optional) — Channels to search, such as a Slack channel. Up to 100. A channel must leave `filter_key` empty.

### Version

The version of a stored document.

- `num` (integer, required) — Version number set by the server. Send it back on your next update.
- `change_description` (string, optional) — The note recorded with this version.

### ErrorResponseError

- `code` (string, optional) — A machine-readable error code.
- `message` (string, optional) — What went wrong, and for a rejected field, which rule it broke.

### UserAccessEveryone

- `allow_all` (boolean, required) — Set to `true` to let every user in your organization use the assistant. `false` is rejected.

### UserAccessListedUsers

- `allowed_emails` (UserAccessListedUsersAllowedEmails, required) — Only the listed users can use the assistant.

### UserAccessRule

- `allowlist_rule_dsl` (string, required) — A Moveworks DSL rule over the `user` object, for example `user.department == "IT"`. Users for whom the rule is true can use the assistant. The rule's syntax is checked when you save. See the [Moveworks DSL reference](/api-reference/configuration-languages/moveworks-dsl-reference).

### KnowledgeDocument

One document the assistant can search.

- `external_system` (string, required) — The system the document belongs to.
- `mw_record_urn` (string, required) — The Moveworks record URN of the document.
- `title` (string, optional) — Document title. Display only.
- `source_icon_url` (string, optional) — Icon of the document's source. Display only.

### KnowledgePartition

A workspace or channel the assistant can search.

- `external_system` (string, required) — The system the workspace or channel belongs to.
- `value` (string, required) — The workspace key or channel id.
- `filter_key` (string, optional) — For a workspace, the name of the source attribute that `value` matches, for example `site`. Leave it empty for a channel.
- `label` (string, optional) — Display label.
- `icon_url` (string, optional) — Icon of the source. Display only.

### UserAccessListedUsersAllowedEmails

Only the listed users can use the assistant.

- `email_addrs` (list of string, required) — Email addresses of the users who can use the assistant. Up to 1,000. Addresses match regardless of letter case.

## Examples

### Productivity assistant endpoints_createProductivityAssistant_example

**Response**

```json
{
  "id": "7c2b6a1e-3f4d-4b8a-9c1d-2e5f6a7b8c9d",
  "name": "Helpdesk",
  "version": {
    "num": 1,
    "change_description": "Create Helpdesk assistant"
  },
  "description": "Answers IT questions and files tickets.",
  "welcome_message": "Hi! How can I help with IT today?",
  "icon": "MWIconPublic",
  "instructions": "Be brief. Prefer linking the knowledge article over summarizing it.",
  "conversation_starters": [
    {
      "display_text": "Reset my password",
      "utterance": "How do I reset my password?"
    }
  ],
  "plugin_identifiers": [
    "ticket_plugin",
    "enterprise_search_plugin"
  ],
  "knowledge_scope": {
    "systems": [
      "CONFLUENCE"
    ],
    "documents": [],
    "workspaces": [
      {
        "external_system": "SHAREPOINT",
        "value": "hr-site",
        "filter_key": "site",
        "label": "HR",
        "icon_url": ""
      }
    ],
    "channels": []
  },
  "skill_access_mode": "SELECTED",
  "skill_ids": [
    "9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f"
  ],
  "mcp_server_ids": [],
  "a2a_agent_ids": [
    "33333333-3333-4333-8333-333333333333"
  ],
  "user_access": {
    "allow_all": true
  },
  "updated_time": "2026-11-12T18:04:11Z",
  "updated_by": "admin@example.com"
}
```

**SDK Code**

```python Productivity assistant endpoints_createProductivityAssistant_example
import requests

url = "https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript Productivity assistant endpoints_createProductivityAssistant_example
const url = 'https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Productivity assistant endpoints_createProductivityAssistant_example
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Productivity assistant endpoints_createProductivityAssistant_example
require 'uri'
require 'net/http'

url = URI("https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java Productivity assistant endpoints_createProductivityAssistant_example
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Productivity assistant endpoints_createProductivityAssistant_example
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp Productivity assistant endpoints_createProductivityAssistant_example
using RestSharp;

var client = new RestClient("https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift Productivity assistant endpoints_createProductivityAssistant_example
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Assistant open to everyone

**Request**

```json
{
  "name": "Helpdesk",
  "user_access": {
    "allow_all": true
  },
  "version": {
    "change_description": "Create Helpdesk assistant"
  },
  "description": "Answers IT questions and files tickets.",
  "welcome_message": "Hi! How can I help with IT today?",
  "icon": "MWIconPublic",
  "instructions": "Be brief. Prefer linking the knowledge article over summarizing it.",
  "conversation_starters": [
    {
      "display_text": "Reset my password",
      "utterance": "How do I reset my password?"
    }
  ],
  "plugin_identifiers": [
    "ticket_plugin"
  ],
  "knowledge_scope": {
    "systems": [
      "CONFLUENCE"
    ],
    "workspaces": [
      {
        "external_system": "SHAREPOINT",
        "value": "hr-site",
        "filter_key": "site",
        "label": "HR"
      }
    ]
  },
  "skill_access_mode": "SELECTED",
  "skill_ids": [
    "9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f"
  ],
  "a2a_agent_ids": [
    "33333333-3333-4333-8333-333333333333"
  ]
}
```

**Response**

```json
{
  "id": "7c2b6a1e-3f4d-4b8a-9c1d-2e5f6a7b8c9d",
  "name": "Helpdesk",
  "version": {
    "num": 1,
    "change_description": "Create Helpdesk assistant"
  },
  "description": "Answers IT questions and files tickets.",
  "welcome_message": "Hi! How can I help with IT today?",
  "icon": "MWIconPublic",
  "instructions": "Be brief. Prefer linking the knowledge article over summarizing it.",
  "conversation_starters": [
    {
      "display_text": "Reset my password",
      "utterance": "How do I reset my password?"
    }
  ],
  "plugin_identifiers": [
    "ticket_plugin",
    "enterprise_search_plugin"
  ],
  "knowledge_scope": {
    "systems": [
      "CONFLUENCE"
    ],
    "documents": [],
    "workspaces": [
      {
        "external_system": "SHAREPOINT",
        "value": "hr-site",
        "filter_key": "site",
        "label": "HR",
        "icon_url": ""
      }
    ],
    "channels": []
  },
  "skill_access_mode": "SELECTED",
  "skill_ids": [
    "9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f"
  ],
  "mcp_server_ids": [],
  "a2a_agent_ids": [
    "33333333-3333-4333-8333-333333333333"
  ],
  "user_access": {
    "allow_all": true
  },
  "updated_time": "2026-11-12T18:04:11Z",
  "updated_by": "admin@example.com"
}
```

**SDK Code**

```python Assistant open to everyone
import requests

url = "https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants"

payload = {
    "name": "Helpdesk",
    "user_access": { "allow_all": True },
    "version": { "change_description": "Create Helpdesk assistant" },
    "description": "Answers IT questions and files tickets.",
    "welcome_message": "Hi! How can I help with IT today?",
    "icon": "MWIconPublic",
    "instructions": "Be brief. Prefer linking the knowledge article over summarizing it.",
    "conversation_starters": [
        {
            "display_text": "Reset my password",
            "utterance": "How do I reset my password?"
        }
    ],
    "plugin_identifiers": ["ticket_plugin"],
    "knowledge_scope": {
        "systems": ["CONFLUENCE"],
        "workspaces": [
            {
                "external_system": "SHAREPOINT",
                "value": "hr-site",
                "filter_key": "site",
                "label": "HR"
            }
        ]
    },
    "skill_access_mode": "SELECTED",
    "skill_ids": ["9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f"],
    "a2a_agent_ids": ["33333333-3333-4333-8333-333333333333"]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Assistant open to everyone
const url = 'https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"name":"Helpdesk","user_access":{"allow_all":true},"version":{"change_description":"Create Helpdesk assistant"},"description":"Answers IT questions and files tickets.","welcome_message":"Hi! How can I help with IT today?","icon":"MWIconPublic","instructions":"Be brief. Prefer linking the knowledge article over summarizing it.","conversation_starters":[{"display_text":"Reset my password","utterance":"How do I reset my password?"}],"plugin_identifiers":["ticket_plugin"],"knowledge_scope":{"systems":["CONFLUENCE"],"workspaces":[{"external_system":"SHAREPOINT","value":"hr-site","filter_key":"site","label":"HR"}]},"skill_access_mode":"SELECTED","skill_ids":["9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f"],"a2a_agent_ids":["33333333-3333-4333-8333-333333333333"]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Assistant open to everyone
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants"

	payload := strings.NewReader("{\n  \"name\": \"Helpdesk\",\n  \"user_access\": {\n    \"allow_all\": true\n  },\n  \"version\": {\n    \"change_description\": \"Create Helpdesk assistant\"\n  },\n  \"description\": \"Answers IT questions and files tickets.\",\n  \"welcome_message\": \"Hi! How can I help with IT today?\",\n  \"icon\": \"MWIconPublic\",\n  \"instructions\": \"Be brief. Prefer linking the knowledge article over summarizing it.\",\n  \"conversation_starters\": [\n    {\n      \"display_text\": \"Reset my password\",\n      \"utterance\": \"How do I reset my password?\"\n    }\n  ],\n  \"plugin_identifiers\": [\n    \"ticket_plugin\"\n  ],\n  \"knowledge_scope\": {\n    \"systems\": [\n      \"CONFLUENCE\"\n    ],\n    \"workspaces\": [\n      {\n        \"external_system\": \"SHAREPOINT\",\n        \"value\": \"hr-site\",\n        \"filter_key\": \"site\",\n        \"label\": \"HR\"\n      }\n    ]\n  },\n  \"skill_access_mode\": \"SELECTED\",\n  \"skill_ids\": [\n    \"9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f\"\n  ],\n  \"a2a_agent_ids\": [\n    \"33333333-3333-4333-8333-333333333333\"\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Assistant open to everyone
require 'uri'
require 'net/http'

url = URI("https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"name\": \"Helpdesk\",\n  \"user_access\": {\n    \"allow_all\": true\n  },\n  \"version\": {\n    \"change_description\": \"Create Helpdesk assistant\"\n  },\n  \"description\": \"Answers IT questions and files tickets.\",\n  \"welcome_message\": \"Hi! How can I help with IT today?\",\n  \"icon\": \"MWIconPublic\",\n  \"instructions\": \"Be brief. Prefer linking the knowledge article over summarizing it.\",\n  \"conversation_starters\": [\n    {\n      \"display_text\": \"Reset my password\",\n      \"utterance\": \"How do I reset my password?\"\n    }\n  ],\n  \"plugin_identifiers\": [\n    \"ticket_plugin\"\n  ],\n  \"knowledge_scope\": {\n    \"systems\": [\n      \"CONFLUENCE\"\n    ],\n    \"workspaces\": [\n      {\n        \"external_system\": \"SHAREPOINT\",\n        \"value\": \"hr-site\",\n        \"filter_key\": \"site\",\n        \"label\": \"HR\"\n      }\n    ]\n  },\n  \"skill_access_mode\": \"SELECTED\",\n  \"skill_ids\": [\n    \"9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f\"\n  ],\n  \"a2a_agent_ids\": [\n    \"33333333-3333-4333-8333-333333333333\"\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java Assistant open to everyone
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"name\": \"Helpdesk\",\n  \"user_access\": {\n    \"allow_all\": true\n  },\n  \"version\": {\n    \"change_description\": \"Create Helpdesk assistant\"\n  },\n  \"description\": \"Answers IT questions and files tickets.\",\n  \"welcome_message\": \"Hi! How can I help with IT today?\",\n  \"icon\": \"MWIconPublic\",\n  \"instructions\": \"Be brief. Prefer linking the knowledge article over summarizing it.\",\n  \"conversation_starters\": [\n    {\n      \"display_text\": \"Reset my password\",\n      \"utterance\": \"How do I reset my password?\"\n    }\n  ],\n  \"plugin_identifiers\": [\n    \"ticket_plugin\"\n  ],\n  \"knowledge_scope\": {\n    \"systems\": [\n      \"CONFLUENCE\"\n    ],\n    \"workspaces\": [\n      {\n        \"external_system\": \"SHAREPOINT\",\n        \"value\": \"hr-site\",\n        \"filter_key\": \"site\",\n        \"label\": \"HR\"\n      }\n    ]\n  },\n  \"skill_access_mode\": \"SELECTED\",\n  \"skill_ids\": [\n    \"9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f\"\n  ],\n  \"a2a_agent_ids\": [\n    \"33333333-3333-4333-8333-333333333333\"\n  ]\n}")
  .asString();
```

```php Assistant open to everyone
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants', [
  'body' => '{
  "name": "Helpdesk",
  "user_access": {
    "allow_all": true
  },
  "version": {
    "change_description": "Create Helpdesk assistant"
  },
  "description": "Answers IT questions and files tickets.",
  "welcome_message": "Hi! How can I help with IT today?",
  "icon": "MWIconPublic",
  "instructions": "Be brief. Prefer linking the knowledge article over summarizing it.",
  "conversation_starters": [
    {
      "display_text": "Reset my password",
      "utterance": "How do I reset my password?"
    }
  ],
  "plugin_identifiers": [
    "ticket_plugin"
  ],
  "knowledge_scope": {
    "systems": [
      "CONFLUENCE"
    ],
    "workspaces": [
      {
        "external_system": "SHAREPOINT",
        "value": "hr-site",
        "filter_key": "site",
        "label": "HR"
      }
    ]
  },
  "skill_access_mode": "SELECTED",
  "skill_ids": [
    "9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f"
  ],
  "a2a_agent_ids": [
    "33333333-3333-4333-8333-333333333333"
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Assistant open to everyone
using RestSharp;

var client = new RestClient("https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"name\": \"Helpdesk\",\n  \"user_access\": {\n    \"allow_all\": true\n  },\n  \"version\": {\n    \"change_description\": \"Create Helpdesk assistant\"\n  },\n  \"description\": \"Answers IT questions and files tickets.\",\n  \"welcome_message\": \"Hi! How can I help with IT today?\",\n  \"icon\": \"MWIconPublic\",\n  \"instructions\": \"Be brief. Prefer linking the knowledge article over summarizing it.\",\n  \"conversation_starters\": [\n    {\n      \"display_text\": \"Reset my password\",\n      \"utterance\": \"How do I reset my password?\"\n    }\n  ],\n  \"plugin_identifiers\": [\n    \"ticket_plugin\"\n  ],\n  \"knowledge_scope\": {\n    \"systems\": [\n      \"CONFLUENCE\"\n    ],\n    \"workspaces\": [\n      {\n        \"external_system\": \"SHAREPOINT\",\n        \"value\": \"hr-site\",\n        \"filter_key\": \"site\",\n        \"label\": \"HR\"\n      }\n    ]\n  },\n  \"skill_access_mode\": \"SELECTED\",\n  \"skill_ids\": [\n    \"9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f\"\n  ],\n  \"a2a_agent_ids\": [\n    \"33333333-3333-4333-8333-333333333333\"\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Assistant open to everyone
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "name": "Helpdesk",
  "user_access": ["allow_all": true],
  "version": ["change_description": "Create Helpdesk assistant"],
  "description": "Answers IT questions and files tickets.",
  "welcome_message": "Hi! How can I help with IT today?",
  "icon": "MWIconPublic",
  "instructions": "Be brief. Prefer linking the knowledge article over summarizing it.",
  "conversation_starters": [
    [
      "display_text": "Reset my password",
      "utterance": "How do I reset my password?"
    ]
  ],
  "plugin_identifiers": ["ticket_plugin"],
  "knowledge_scope": [
    "systems": ["CONFLUENCE"],
    "workspaces": [
      [
        "external_system": "SHAREPOINT",
        "value": "hr-site",
        "filter_key": "site",
        "label": "HR"
      ]
    ]
  ],
  "skill_access_mode": "SELECTED",
  "skill_ids": ["9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f"],
  "a2a_agent_ids": ["33333333-3333-4333-8333-333333333333"]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Assistant for listed users, with no plugins or knowledge scope

**Request**

```json
{
  "name": "Payroll helper",
  "user_access": {
    "allowed_emails": {
      "email_addrs": [
        "ada@example.com",
        "grace@example.com"
      ]
    }
  },
  "version": {
    "change_description": "Create Payroll helper"
  },
  "instructions": "Answer payroll questions for the finance team."
}
```

**Response**

```json
{
  "id": "7c2b6a1e-3f4d-4b8a-9c1d-2e5f6a7b8c9d",
  "name": "Helpdesk",
  "version": {
    "num": 1,
    "change_description": "Create Helpdesk assistant"
  },
  "description": "Answers IT questions and files tickets.",
  "welcome_message": "Hi! How can I help with IT today?",
  "icon": "MWIconPublic",
  "instructions": "Be brief. Prefer linking the knowledge article over summarizing it.",
  "conversation_starters": [
    {
      "display_text": "Reset my password",
      "utterance": "How do I reset my password?"
    }
  ],
  "plugin_identifiers": [
    "ticket_plugin",
    "enterprise_search_plugin"
  ],
  "knowledge_scope": {
    "systems": [
      "CONFLUENCE"
    ],
    "documents": [],
    "workspaces": [
      {
        "external_system": "SHAREPOINT",
        "value": "hr-site",
        "filter_key": "site",
        "label": "HR",
        "icon_url": ""
      }
    ],
    "channels": []
  },
  "skill_access_mode": "SELECTED",
  "skill_ids": [
    "9e41c7d2-5a6b-4c3d-8e9f-1a2b3c4d5e6f"
  ],
  "mcp_server_ids": [],
  "a2a_agent_ids": [
    "33333333-3333-4333-8333-333333333333"
  ],
  "user_access": {
    "allow_all": true
  },
  "updated_time": "2026-11-12T18:04:11Z",
  "updated_by": "admin@example.com"
}
```

**SDK Code**

```python Assistant for listed users, with no plugins or knowledge scope
import requests

url = "https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants"

payload = {
    "name": "Payroll helper",
    "user_access": { "allowed_emails": { "email_addrs": ["ada@example.com", "grace@example.com"] } },
    "version": { "change_description": "Create Payroll helper" },
    "instructions": "Answer payroll questions for the finance team."
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Assistant for listed users, with no plugins or knowledge scope
const url = 'https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"name":"Payroll helper","user_access":{"allowed_emails":{"email_addrs":["ada@example.com","grace@example.com"]}},"version":{"change_description":"Create Payroll helper"},"instructions":"Answer payroll questions for the finance team."}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Assistant for listed users, with no plugins or knowledge scope
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants"

	payload := strings.NewReader("{\n  \"name\": \"Payroll helper\",\n  \"user_access\": {\n    \"allowed_emails\": {\n      \"email_addrs\": [\n        \"ada@example.com\",\n        \"grace@example.com\"\n      ]\n    }\n  },\n  \"version\": {\n    \"change_description\": \"Create Payroll helper\"\n  },\n  \"instructions\": \"Answer payroll questions for the finance team.\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Assistant for listed users, with no plugins or knowledge scope
require 'uri'
require 'net/http'

url = URI("https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"name\": \"Payroll helper\",\n  \"user_access\": {\n    \"allowed_emails\": {\n      \"email_addrs\": [\n        \"ada@example.com\",\n        \"grace@example.com\"\n      ]\n    }\n  },\n  \"version\": {\n    \"change_description\": \"Create Payroll helper\"\n  },\n  \"instructions\": \"Answer payroll questions for the finance team.\"\n}"

response = http.request(request)
puts response.read_body
```

```java Assistant for listed users, with no plugins or knowledge scope
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"name\": \"Payroll helper\",\n  \"user_access\": {\n    \"allowed_emails\": {\n      \"email_addrs\": [\n        \"ada@example.com\",\n        \"grace@example.com\"\n      ]\n    }\n  },\n  \"version\": {\n    \"change_description\": \"Create Payroll helper\"\n  },\n  \"instructions\": \"Answer payroll questions for the finance team.\"\n}")
  .asString();
```

```php Assistant for listed users, with no plugins or knowledge scope
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants', [
  'body' => '{
  "name": "Payroll helper",
  "user_access": {
    "allowed_emails": {
      "email_addrs": [
        "ada@example.com",
        "grace@example.com"
      ]
    }
  },
  "version": {
    "change_description": "Create Payroll helper"
  },
  "instructions": "Answer payroll questions for the finance team."
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Assistant for listed users, with no plugins or knowledge scope
using RestSharp;

var client = new RestClient("https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"name\": \"Payroll helper\",\n  \"user_access\": {\n    \"allowed_emails\": {\n      \"email_addrs\": [\n        \"ada@example.com\",\n        \"grace@example.com\"\n      ]\n    }\n  },\n  \"version\": {\n    \"change_description\": \"Create Payroll helper\"\n  },\n  \"instructions\": \"Answer payroll questions for the finance team.\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Assistant for listed users, with no plugins or knowledge scope
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "name": "Payroll helper",
  "user_access": ["allowed_emails": ["email_addrs": ["ada@example.com", "grace@example.com"]]],
  "version": ["change_description": "Create Payroll helper"],
  "instructions": "Answer payroll questions for the finance team."
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```