> 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.

# Get productivity assistant

GET https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants/{id}

Returns one productivity assistant.

Reference: https://docs.moveworks.com/api-reference/configuration-api/productivity-assistants/get-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

### Path parameters

- `id` (string, required) — The `id` of the productivity assistant, as returned when it was created or listed.

## Response

### 200

The productivity assistant

- `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

### 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)

### 404 Not Found Error

Not found - no productivity assistant has this `id`

- `error` (ErrorResponseError, required)

### 409 Conflict Error

Conflict - the assistant can't be read or updated through this API, because its knowledge scope or plugin setup uses a shape the API can't express. Edit it in Assistant Builder instead.

- `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

### 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.

### 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.

### 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

### ErrorResponseError

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

### 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.

### 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).

### 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

**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_getProductivityAssistant_example
import requests

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

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

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

print(response.json())
```

```javascript Productivity assistant endpoints_getProductivityAssistant_example
const url = 'https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants/id';
const options = {method: 'GET', 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_getProductivityAssistant_example
package main

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

func main() {

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

	req, _ := http.NewRequest("GET", 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_getProductivityAssistant_example
require 'uri'
require 'net/http'

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

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

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

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

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

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

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

$client = new \GuzzleHttp\Client();

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

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

```csharp Productivity assistant endpoints_getProductivityAssistant_example
using RestSharp;

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

```swift Productivity assistant endpoints_getProductivityAssistant_example
import Foundation

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.moveworks.ai/configurations/v1alpha1/assistant/productivity-assistants/id")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
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()
```