> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Productboard

The Productboard connector lets your AI agent act in each user's Productboard account. Each user signs in to Productboard once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 28 tools.

**Authentication:** OAuth 2.0
**Categories:** Project Management, Productivity
**Tools:** 28: 16 read, 12 write, 0 destructive
**Users sign in with:** OAuth
**OAuth app:** Your own Productboard app
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=PRODUCTBOARD)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Productboard connection

   In **AgentKit > Connections**, create a Productboard connection and copy its redirect URI. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Register an OAuth app

   Productboard connections use your own OAuth app. Register one with Productboard and add the redirect URI you copied.

   Then enter the app's Client ID and Client Secret on the Productboard connection.

5. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'productboard'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Productboard:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'productboard_entities_list',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "productboard"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Productboard:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="productboard_entities_list",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'productboard_entities_list',
  toolInput: {},
  connector: 'productboard',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="productboard_entities_list",
    tool_input={},
    connection_name="productboard",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `productboard_entities_list`

List Entities · Read-only

List Productboard entities such as features, components, products, initiatives, objectives, key results, releases, companies and users, filtered by type, name, owner, status, team, parent, archived state or source record.
Returns a page of entities with id, type, fields and links, plus links.next whose pageCursor fetches the next page.
Use productboard_entities_list to browse with simple filters. Use productboard_entities_search for many ids, date ranges or custom-field filters. Use productboard_entity_get for one entity.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `archived` (`boolean`, optional): Filter by archived state. Example: false
- `name` (`string`, optional): Only return entities with this name. Example: Dark mode
- `owner_email` (`string`, optional): Only return entities owned by the member with this email. Needs the members_pii:read scope. Example: john@doe.com
- `owner_id` (`string`, optional): Only return entities owned by this member UUID. Example: 923e4567-e89b-12d3-a456-426614174008
- `page_cursor` (`string`, optional): Cursor for the next page of entities. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0
- `parent_id` (`string`, optional): Only return entities whose parent is this entity UUID, e.g. features of a component. Example: 223e4567-e89b-12d3-a456-426614174001
- `return_fields` (`array`, optional): Limit which entity fields are returned. Pass field ids such as name, owner, tags or a custom field UUID; pass ["all"] to also include empty fields. Leave empty to return all non-empty fields. Do not combine "all" with specific fields. Example: ["name", "owner"]
- `source_record_id` (`string`, optional): Only return entities whose metadata.source.recordId matches. Example: A-1
- `source_system` (`string`, optional): Only return entities whose metadata.source.system matches. Example: sfdc
- `status_id` (`string`, optional): Only return entities with this status UUID. Applies to types with a status, such as feature and initiative. Example: 447eb060-2a7e-4d1e-9d59-322a11e0fdb0
- `status_name` (`string`, optional): Only return entities with this status name, e.g. In Progress. Applies to types with a status. Example: In Progress
- `team_id` (`string`, optional): Only return entities assigned to this team UUID. Do not combine with team_name. Example: 95db5914-36b0-45e9-8f6d-7f11a950ac1d
- `team_name` (`string`, optional): Only return entities assigned to the team with this name. Do not combine with team_id. Example: Product Team
- `types` (`array`, optional): Only return entities of these types: product, component, feature, subfeature, initiative, objective, keyResult, release, releaseGroup, company or user (the set depends on the workspace; productboard_entity_configurations_list lists it). Example: ["feature"]

Example input: `{}`

### `productboard_entity_configuration_get`

Get Entity Configuration · Read-only

Get the configuration of one Productboard entity type.
Returns the type's fields (ids, value types, required flags, allowed values), supported patch operations, available list filters and relationship rules.
Use productboard_entity_configuration_get before creating, updating or filtering entities of that type. Use productboard_entity_configurations_list to see all types.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `type` (`string`, required): Entity type to describe: product, component, feature, subfeature, initiative, objective, keyResult, release, releaseGroup, company or user (the set depends on the workspace; productboard_entity_configurations_list lists it). Example: feature

Example input: `{"type":"<type>"}`

### `productboard_entity_configurations_list`

List Entity Configurations · Read-only

List the entity types available in the Productboard workspace and their configuration.
Returns each type (for example feature, initiative, company) with its fields, required fields, allowed values, supported patch operations, filters and relationship rules.
Use productboard_entity_configurations_list to discover which types exist. Use productboard_entity_configuration_get for one type.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `types` (`array`, optional): Only return these entity types: product, component, feature, subfeature, initiative, objective, keyResult, release, releaseGroup, company or user (the set depends on the workspace; productboard_entity_configurations_list lists it). Leave empty for all. Example: ["feature", "initiative"]

Example input: `{}`

### `productboard_entity_field_values_list`

List Field Values · Read-only

List the allowed values of a select, tag or status field on Productboard entities.
Returns a page of options with id, name and color (statuses also carry their entity type), plus links.next; a query returns up to 20 best tag matches without paging.
Use productboard_entity_field_values_list to find option ids or names before filtering or setting a select, tag or status field.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `field_id` (`string`, required): Field id: the API name of a default field such as status or tags, or a custom field UUID from productboard_entity_configuration_get. Example: status
- `assigned_entity_types` (`array`, optional): Only return values used by these entity types; useful for status, where each type has its own set. Example: ["feature"]
- `page_cursor` (`string`, optional): Cursor for the next page of values. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0
- `query` (`string`, optional): Search tag values by name (case- and accent-insensitive, typo tolerant). Returns up to 20 matches and ignores page_cursor. Example: launch

Example input: `{"field_id":"<field_id>"}`

### `productboard_entity_get`

Get Entity · Read-only

Get one Productboard entity (feature, component, product, initiative, objective, key result, release, company, user and so on) by its UUID.
Returns the entity's id, type, fields (name, description, status, owner, timeframe, teams, tags and custom fields), relationships and links, including the app URL.
Use productboard_entity_get when you have the entity id. Use productboard_entities_list or productboard_entities_search to find entities.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `entity_id` (`string`, required): UUID of the entity to retrieve. Get it from productboard_entities_list or productboard_entities_search. Example: 123e4567-e89b-12d3-a456-426614174000
- `return_fields` (`array`, optional): Limit which entity fields are returned. Pass field ids such as name, owner, tags or a custom field UUID; pass ["all"] to also include empty fields. Leave empty to return all non-empty fields. Do not combine "all" with specific fields. Example: ["name", "owner"]

Example input: `{"entity_id":"<entity_id>"}`

### `productboard_entity_relationships_list`

List Entity Relationships · Read-only

List the relationships of one Productboard entity: its parent, children, linked entities and dependencies.
Returns a page of relationships, each with type and target (id, type, links), plus links.next for the next page.
Use productboard_entity_relationships_list to walk the product hierarchy or dependencies. Use productboard_entity_relationship_create to add one.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `entity_id` (`string`, required): UUID of the entity to inspect. Get it from productboard_entities_list or productboard_entities_search. Example: 123e4567-e89b-12d3-a456-426614174000
- `page_cursor` (`string`, optional): Cursor for the next page of relationships. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0
- `relationship_type` (`string`, optional): Only return relationships of this type: parent, child, link, isBlockedBy or isBlocking. Example: child. One of: `parent`, `child`, `link`, `isBlockedBy`, `isBlocking`.
- `target_id` (`string`, optional): Only return the relationship with this target entity UUID. Example: 223e4567-e89b-12d3-a456-426614174001
- `target_type` (`string`, optional): Only return relationships whose target has this entity type, e.g. feature. Example: feature

Example input: `{"entity_id":"<entity_id>"}`

### `productboard_member_get`

Get Member · Read-only

Get one Productboard workspace member by UUID.
Returns the member's id, name, username, email and role; name and email read [redacted] without the members_pii:read scope.
Use productboard_member_get when you have the member id. Use productboard_members_list or productboard_members_search to find members.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `member_id` (`string`, required): UUID of the member. Get it from productboard_members_list or from an owner field. Example: 923e4567-e89b-12d3-a456-426614174008

Example input: `{"member_id":"<member_id>"}`

### `productboard_members_list`

List Members · Read-only

List members of the Productboard workspace (the people on your team who use Productboard), oldest first, optionally filtered by name or email text and role.
Returns a page of members with id, name, username, email and role, plus links.next; name and email read [redacted] without the members_pii:read scope.
Use productboard_members_list to browse or find member ids. Use productboard_members_search to look up many members by id or email. Use productboard_member_get for one member.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `include_disabled` (`boolean`, optional): Set true to include disabled members. Defaults to false. Example: true
- `include_invitation_pending` (`boolean`, optional): Set true to include members whose invitation is still pending. Defaults to false. Example: true
- `page_cursor` (`string`, optional): Cursor for the next page of members. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0
- `query` (`string`, optional): Text matched against member name or email (partial, case-insensitive). Example: jane
- `roles` (`array`, optional): Only return members with one of these roles: admin, maker, viewer, contributor. Example: ["admin", "maker"]

Example input: `{}`

### `productboard_note_configuration_get`

Get Note Configuration · Read-only

Get the configuration of one Productboard note type.
Returns the type's fields with their value types and constraints, supported patch operations and relationship rules.
Use productboard_note_configuration_get before creating or updating a note of that type. Use productboard_note_configurations_list for all types.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `type` (`string`, required): Note type to describe. One of textNote, conversationNote, opportunityNote. Example: textNote. One of: `textNote`, `conversationNote`, `opportunityNote`.

Example input: `{"type":"textNote"}`

### `productboard_note_configurations_list`

List Note Configurations · Read-only

List the note type configurations of the Productboard workspace.
Returns each note type (textNote, conversationNote, opportunityNote) with its fields, allowed values, supported patch operations and relationship rules.
Use productboard_note_configurations_list to see every note type. Use productboard_note_configuration_get for one type.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `types` (`array`, optional): Only return configurations for these note types. Allowed values: textNote, conversationNote, opportunityNote. Leave empty for all types. Example: ["textNote"]

Example input: `{}`

### `productboard_note_get`

Get Note · Read-only

Get one Productboard note by its UUID.
Returns the note's id, type, fields (name, content, owner, creator, tags, archived, processed, source), relationships and links.
Use productboard_note_get when you have the note id. Use productboard_notes_list or productboard_notes_search to find notes.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `note_id` (`string`, required): UUID of the note to retrieve. Get it from productboard_notes_list or productboard_notes_search. Example: 123e4567-e89b-12d3-a456-426614174000
- `return_fields` (`array`, optional): Limit which note fields are returned. Pass field ids such as name, owner, tags or a custom field UUID; pass ["all"] to also include empty fields. Leave empty to return all non-empty fields. Do not combine "all" with specific fields. Example: ["name", "owner"]

Example input: `{"note_id":"<note_id>"}`

### `productboard_note_relationships_list`

List Note Relationships · Read-only

List the relationships of one Productboard note: its customer (a user or company) and the features or other entities it is linked to.
Returns a page of relationships, each with type (customer or link), target id and target type, plus links.next for the next page.
Use productboard_note_relationships_list to see what a note is attached to. Use productboard_note_relationship_create or productboard_note_customer_set to change it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `note_id` (`string`, required): UUID of the note to inspect. Get it from productboard_notes_list or productboard_notes_search. Example: 123e4567-e89b-12d3-a456-426614174000
- `limit` (`integer`, optional): Maximum number of relationships per page (minimum 1). Example: 50
- `page_cursor` (`string`, optional): Cursor for the next page of relationships. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0
- `relationship_type` (`string`, optional): Only return relationships of this type: customer (the user or company the feedback came from) or link (linked features and other entities). Example: link. One of: `customer`, `link`.
- `target_type` (`string`, optional): Only return relationships whose target is this entity type. One of user, company, feature, subfeature, product, component. Example: feature. One of: `user`, `company`, `feature`, `subfeature`, `product`, `component`.

Example input: `{"note_id":"<note_id>"}`

### `productboard_notes_list`

List Notes · Read-only

List notes (customer feedback) in the Productboard workspace, newest first, optionally filtered by type, owner, creator, archived or processed state, source record, or created/updated date range.
Returns a page of notes with id, type, fields (name, content, owner, tags, archived, processed) and links.next, whose pageCursor fetches the next page.
Use productboard_notes_list to browse or filter by simple fields. Use productboard_notes_search for a full-text query or to filter by linked customer or feature. Use productboard_note_get for one note by id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `archived` (`boolean`, optional): Filter by archived state. true returns only archived notes; false returns processed and unprocessed notes that are not archived. Leave empty to include all. Example: false
- `created_from` (`string`, optional): Only return notes created on or after this ISO 8601 date-time (inclusive). Example: 2026-01-01T00:00:00Z
- `created_to` (`string`, optional): Only return notes created on or before this ISO 8601 date-time (inclusive). Must not be earlier than created_from. Example: 2026-03-31T23:59:59Z
- `creator_email` (`string`, optional): Only return notes created by the workspace member with this email. Needs the members_pii:read scope. Example: jane.doe@example.com
- `creator_id` (`string`, optional): Only return notes created by the workspace member with this UUID (from productboard_members_list). Example: e23e4567-e89b-12d3-a456-426614174013
- `owner_email` (`string`, optional): Only return notes owned by the workspace member with this email. Needs the members_pii:read scope. Example: john.doe@example.com
- `owner_id` (`string`, optional): Only return notes owned by the workspace member with this UUID (from productboard_members_list). Example: 923e4567-e89b-12d3-a456-426614174008
- `page_cursor` (`string`, optional): Cursor for the next page. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0
- `processed` (`boolean`, optional): Filter by processed state. true returns processed notes; false returns unprocessed and archived notes (archived notes always report processed=false). Leave empty to include all. Example: false
- `return_fields` (`array`, optional): Limit which note fields are returned. Pass field ids such as name, content, tags, owner; pass ["all"] to also include empty fields. Leave empty to return all non-empty fields. Do not combine "all" with specific fields. Example: ["name", "tags"]
- `source_record_id` (`string`, optional): Only return notes whose metadata.source.recordId matches this external record id. Combine with source_system. Example: ticket-12345
- `source_system` (`string`, optional): Only return notes whose metadata.source.system matches this external system name. Example: intercom
- `types` (`array`, optional): Only return notes of these types. Allowed values: textNote, conversationNote, opportunityNote. Example: ["textNote", "conversationNote"]
- `updated_from` (`string`, optional): Only return notes updated on or after this ISO 8601 date-time (inclusive). Example: 2026-01-01T00:00:00Z
- `updated_to` (`string`, optional): Only return notes updated on or before this ISO 8601 date-time (inclusive). Must not be earlier than updated_from. Example: 2026-03-31T23:59:59Z

Example input: `{}`

### `productboard_team_get`

Get Team · Read-only

Get one Productboard team by UUID.
Returns the team's id, name, handle, description, avatar URL and timestamps.
Use productboard_team_get when you have the team id. Use productboard_team_members_list for its members.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `team_id` (`string`, required): UUID of the team. Get it from productboard_teams_list. Example: 95db5914-36b0-45e9-8f6d-7f11a950ac1d

Example input: `{"team_id":"<team_id>"}`

### `productboard_team_members_list`

List Team Members · Read-only

List the members of one Productboard team, newest membership first.
Returns a page of members with id, name and email (name and email read [redacted] without the members_pii:read scope), plus links.next.
Use productboard_team_members_list to see who is on a team. Use productboard_member_get for one member's details.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `team_id` (`string`, required): UUID of the team. Get it from productboard_teams_list. Example: 95db5914-36b0-45e9-8f6d-7f11a950ac1d
- `page_cursor` (`string`, optional): Cursor for the next page of team members. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0

Example input: `{"team_id":"<team_id>"}`

### `productboard_teams_list`

List Teams · Read-only

List teams in the Productboard workspace, newest first, optionally filtered by exact name or handle or by a partial text query.
Returns a page of teams with id, name, handle, description and links.next.
Use productboard_teams_list to browse or find team ids. Use productboard_teams_search to look up many teams at once. Use productboard_team_get for one team.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `handle` (`string`, optional): Only return the team with this exact @mention handle (case-insensitive). Example: product
- `name` (`string`, optional): Only return the team with this exact name (case-insensitive). Example: Product Team
- `page_cursor` (`string`, optional): Cursor for the next page of teams. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0
- `query` (`string`, optional): Text matched against team name and handle (partial, case-insensitive). Example: prod

Example input: `{}`

### `productboard_entities_search`

Search Entities · Write

Search Productboard entities with a structured filter: type, ids, created or updated date range, name, archived state, status, owner, team, parent, source record and custom field values.
Returns a page of matching entities with id, type, fields and links.next, whose pageCursor fetches the next page.
Use productboard_entities_search for many ids, date ranges or custom-field filters. Use productboard_entities_list for simple filters. Use productboard_entity_get for one entity.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `archived` (`boolean`, optional): Filter by archived state. Example: false
- `created_from` (`string`, optional): Only match entities created on or after this ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
- `created_to` (`string`, optional): Only match entities created on or before this ISO 8601 date-time. Example: 2026-03-31T23:59:59Z
- `custom_field_filters` (`object`, optional): Filters on other fields, keyed by field id (a predefined id such as domain or a custom field UUID). A text field takes contains, a number or date field takes eq, a single-select field takes id or name, a multi-select field takes any or all with a list of options, and any field takes isSet on its own. Requires types. At most 25 entries. Example: {"domain": {"contains": "acme.com"}}
- `entity_ids` (`array`, optional): Only match entities with these UUIDs. Example: ["123e4567-e89b-12d3-a456-426614174000"]
- `name` (`string`, optional): Only match entities with this name. Example: Dark mode
- `owner_emails` (`array`, optional): Only match entities owned by one of these member emails. Needs the members_pii:read scope. Example: ["john@doe.com"]
- `owner_ids` (`array`, optional): Only match entities owned by one of these member UUIDs. Example: ["923e4567-e89b-12d3-a456-426614174008"]
- `page_cursor` (`string`, optional): Cursor for the next page of results. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0
- `parent_ids` (`array`, optional): Only match entities whose parent is one of these entity UUIDs. Example: ["223e4567-e89b-12d3-a456-426614174001"]
- `return_fields` (`array`, optional): Limit which fields each result returns, e.g. name, status, owner; pass ["all"] to include empty fields too. Example: ["name", "status"]
- `source_record_id` (`string`, optional): Only match entities with this source record id. Example: PROJ-456
- `source_system` (`string`, optional): Only match entities whose source system matches. Example: Jira
- `status_names` (`array`, optional): Only match entities in one of these statuses, by name. Example: ["In Progress", "At Risk"]
- `team_names` (`array`, optional): Only match entities assigned to any of these teams, by name. Example: ["Product Team"]
- `types` (`array`, optional): Entity types to search: product, component, feature, subfeature, initiative, objective, keyResult, release, releaseGroup, company or user (the set depends on the workspace; productboard_entity_configurations_list lists it). Searching one type at a time is the documented norm, and custom field filters require a type. Example: ["feature"]
- `updated_from` (`string`, optional): Only match entities updated on or after this ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
- `updated_to` (`string`, optional): Only match entities updated on or before this ISO 8601 date-time. Example: 2026-03-31T23:59:59Z

Example input: `{}`

### `productboard_entity_create`

Create Entity · Write

Create a Productboard entity of a given type, such as a feature, component, initiative, objective, release, company or user, with its name, description, owner, status, timeframe, teams, tags and parent.
Returns the new entity's id and links.
Use productboard_entity_create to add a new item. Use productboard_entity_update to change an existing one. Run productboard_entity_configuration_get first to learn which fields the type requires (for example, features need a parent).

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Name of the entity, up to 255 characters. Example: Dark mode
- `type` (`string`, required): Entity type to create: product, component, feature, subfeature, initiative, objective, keyResult, release, releaseGroup, company or user (the set depends on the workspace; productboard_entity_configurations_list lists it). Example: feature
- `additional_fields` (`object`, optional): Other fields to set, keyed by field id as listed by productboard_entity_configuration_get: predefined ids such as domain for companies or a custom field UUID. Example: {"faa1d59a-d55f-4ad2-b1d3-5b888123873b": 120}
- `archived` (`boolean`, optional): Set true to archive the entity or false to keep or make it active. Example: false
- `description` (`string`, optional): Rich-text description. Wrap text in supported HTML tags such as , <b>, <ul>/<li>, <h1>/<h2>; plain text without a tag is rejected. Example: <p>Let users switch the app to a dark theme.

- `owner_email` (`string`, optional): Email of the member who owns the entity. Used only when owner_id is empty. Example: john@doe.com
- `owner_id` (`string`, optional): UUID of the member who owns the entity. Use owner_id or owner_email, not both. Example: 923e4567-e89b-12d3-a456-426614174008
- `parent_id` (`string`, optional): UUID of the parent entity, e.g. the component or product a feature belongs to, or the feature a subfeature belongs to. Required for types that must have a parent. Example: 223e4567-e89b-12d3-a456-426614174001
- `source_record_id` (`string`, optional): Id of the record in the external system, stored as metadata.source.recordId. Example: PROJ-456
- `source_system` (`string`, optional): Name of the external system this entity is synced from, stored as metadata.source.system. Example: Jira
- `source_url` (`string`, optional): URL of the record in the external system, stored as metadata.source.url. Example: https://jira.example.com/browse/PROJ-456
- `status_id` (`string`, optional): Status to set, by UUID. Used instead of status_name. Example: 447eb060-2a7e-4d1e-9d59-322a11e0fdb0
- `status_name` (`string`, optional): Status to set, by name, e.g. In Progress. Must match a status configured for this entity type. Use status_name or status_id. Example: In Progress
- `tags` (`array`, optional): Tag names to set on the entity. Example: ["Q4", "Launch"]
- `team_names` (`array`, optional): Teams to assign, by exact team name. Example: ["Product Team"]
- `timeframe_end` (`string`, optional): Timeframe end date (yyyy-MM-dd). Example: 2026-12-31
- `timeframe_granularity` (`string`, optional): How the timeframe is shown: year, quarter, month or day. Example: month. One of: `year`, `quarter`, `month`, `day`.
- `timeframe_start` (`string`, optional): Timeframe start date (yyyy-MM-dd). Example: 2026-10-01

Example input: `{"name":"<name>","type":"<type>"}`

### `productboard_entity_parent_set`

Set Entity Parent · Write

Move a Productboard entity under a new parent, replacing its current parent (for example, move a feature to another component, or a subfeature to another feature).
Returns the new parent relationship.
Use productboard_entity_parent_set to re-parent an entity. Use productboard_entity_relationship_create for links and dependencies.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `entity_id` (`string`, required): UUID of the entity to move. Get it from productboard_entities_list or productboard_entities_search. Example: 123e4567-e89b-12d3-a456-426614174000
- `parent_id` (`string`, required): UUID of the new parent entity. Must be a valid parent type (e.g. a component or product for a feature, a feature for a subfeature). Example: 223e4567-e89b-12d3-a456-426614174001

Example input: `{"entity_id":"<entity_id>","parent_id":"<parent_id>"}`

### `productboard_entity_relationship_create`

Create Entity Relationship · Write

Create a relationship from one Productboard entity to another: parent, child, link, or an isBlockedBy/isBlocking dependency.
Returns the created relationship.
Use productboard_entity_relationship_create to link entities or add dependencies. Use productboard_entity_parent_set to replace an existing parent.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `entity_id` (`string`, required): UUID of the entity to relate from. Get it from productboard_entities_list or productboard_entities_search. Example: 123e4567-e89b-12d3-a456-426614174000
- `target_id` (`string`, required): UUID of the other entity. Example: 223e4567-e89b-12d3-a456-426614174001
- `relationship_type` (`string`, optional): Relationship from the source entity to the target: parent (target is the parent), child (target is a child), link (plain link), isBlockedBy or isBlocking. Defaults to link. Only valid source and target type combinations are accepted. Example: link. One of: `parent`, `child`, `link`, `isBlockedBy`, `isBlocking`. Default: `link`.

Example input: `{"entity_id":"<entity_id>","target_id":"<target_id>"}`

### `productboard_entity_update`

Update Entity · Write

Update fields of an existing Productboard entity, such as its name, description, owner, status, timeframe, teams, tags, archived state or custom fields.
Returns the entity's id and links.
Use productboard_entity_update to edit an entity. Use productboard_entity_parent_set to move it under another parent. Values replace the current ones; use patch_operations to add or remove single list items.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `entity_id` (`string`, required): UUID of the entity to update. Get it from productboard_entities_list or productboard_entities_search. Example: 123e4567-e89b-12d3-a456-426614174000
- `additional_fields` (`object`, optional): Other fields to set, keyed by field id as listed by productboard_entity_configuration_get: predefined ids such as domain for companies or a custom field UUID. Example: {"faa1d59a-d55f-4ad2-b1d3-5b888123873b": 120}
- `archived` (`boolean`, optional): Set true to archive the entity or false to keep or make it active. Example: false
- `description` (`string`, optional): Rich-text description. Wrap text in supported HTML tags such as , <b>, <ul>/<li>, <h1>/<h2>; plain text without a tag is rejected. Example: <p>Let users switch the app to a dark theme.

- `name` (`string`, optional): New name, up to 255 characters. Example: Dark mode (mobile)
- `owner_email` (`string`, optional): Email of the member who owns the entity. Used only when owner_id is empty. Example: john@doe.com
- `owner_id` (`string`, optional): UUID of the member who owns the entity. Use owner_id or owner_email, not both. Example: 923e4567-e89b-12d3-a456-426614174008
- `patch_operations` (`array`, optional): Granular changes sent instead of the field inputs: each operation has op (set, addItems, removeItems or clear), path (a field id such as tags, teams or a custom field UUID) and, except for clear, a value. Productboard rejects a request that mixes field values and patch operations, so when this is set the other field inputs are ignored. Example: [{"op": "addItems", "path": "tags", "value": [{"name": "Q1 2027"}]}]
- `source_record_id` (`string`, optional): Id of the record in the external system, stored as metadata.source.recordId. Example: PROJ-456
- `source_system` (`string`, optional): Name of the external system this entity is synced from, stored as metadata.source.system. Example: Jira
- `source_url` (`string`, optional): URL of the record in the external system, stored as metadata.source.url. Example: https://jira.example.com/browse/PROJ-456
- `status_id` (`string`, optional): Status to set, by UUID. Used instead of status_name. Example: 447eb060-2a7e-4d1e-9d59-322a11e0fdb0
- `status_name` (`string`, optional): Status to set, by name, e.g. In Progress. Must match a status configured for this entity type. Use status_name or status_id. Example: In Progress
- `tags` (`array`, optional): Tag names to set on the entity. Example: ["Q4", "Launch"]
- `team_names` (`array`, optional): Teams to assign, by exact team name. Example: ["Product Team"]
- `timeframe_end` (`string`, optional): Timeframe end date (yyyy-MM-dd). Example: 2026-12-31
- `timeframe_granularity` (`string`, optional): How the timeframe is shown: year, quarter, month or day. Example: month. One of: `year`, `quarter`, `month`, `day`.
- `timeframe_start` (`string`, optional): Timeframe start date (yyyy-MM-dd). Example: 2026-10-01

Example input: `{"entity_id":"<entity_id>"}`

### `productboard_members_search`

Search Members · Write

Search Productboard workspace members by ids, emails, roles, disabled or pending state, and a text query.
Returns a page of matching members with id, name, username, email and role, plus links.next.
Use productboard_members_search for batch lookups by id or email. Use productboard_members_list to browse. Use productboard_member_get for one member.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `disabled_only` (`boolean`, optional): Set true to return only disabled members. Example: true
- `emails` (`array`, optional): Only match members with these emails (up to 100, case-insensitive). Needs the members_pii:read scope. Example: ["john.doe@example.com"]
- `include_disabled` (`boolean`, optional): Set true to return disabled members alongside active ones. Example: true
- `include_invitation_pending` (`boolean`, optional): Set true to return pending members alongside accepted ones. Example: true
- `invitation_pending_only` (`boolean`, optional): Set true to return only members whose invitation is pending. Example: true
- `member_ids` (`array`, optional): Only match members with these UUIDs (up to 100). Example: ["923e4567-e89b-12d3-a456-426614174008"]
- `page_cursor` (`string`, optional): Cursor for the next page of results. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0
- `query` (`string`, optional): Text matched against member name or email (partial, case-insensitive). Needs the members_pii:read scope. Example: john
- `roles` (`array`, optional): Only match members with one of these roles: admin, maker, viewer, contributor. Example: ["admin"]

Example input: `{}`

### `productboard_note_create`

Create Note · Write

Create a note (a piece of customer feedback) in Productboard, optionally attributed to a customer, linked to features and tagged.
Returns the new note's id and links.
Use productboard_note_create to capture new feedback. Use productboard_note_update to change an existing note. Opportunity notes cannot be created through the API.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): Title of the note, up to 255 characters. Example: Customer asks for dark mode
- `additional_fields` (`object`, optional): Other note fields to set, keyed by field id as listed by productboard_note_configuration_get, for example archived, processed or a custom field. Example: {"processed": false}
- `content` (`string`, optional): Body of a textNote. HTML is accepted; the Notes API keeps semantic tags and strips styling. Example: Customer reported slow loading on the mobile app.

- `conversation_parts` (`array`, optional): Messages of a conversationNote, oldest first. Each message needs an externalId (its id in your system), authorType (customer or agent), content and an ISO 8601 timestamp; authorName is optional. Example: [{"externalId": "msg-1", "authorType": "customer", "authorName": "John Doe", "content": "Hello", "timestamp": "2026-10-01T11:00:00Z"}]
- `creator_email` (`string`, optional): Email of the workspace member to record as the note's creator. Example: john.doe@example.com
- `customer_email` (`string`, optional): Email of the customer user the feedback came from, used instead of customer_id. Productboard looks up the user by email. Example: john@acme.com
- `customer_id` (`string`, optional): UUID of the user or company entity the feedback came from. Set customer_type to match. Leave empty if you use customer_email or want no customer. Example: 223e4567-e89b-12d3-a456-426614174001
- `customer_type` (`string`, optional): Entity type of customer_id: user or company. Defaults to user. Ignored when customer_email is used. Example: company. One of: `user`, `company`. Default: `user`.
- `linked_entity_ids` (`array`, optional): UUIDs of features or other entities to link the note to. Example: ["223e4567-e89b-12d3-a456-426614174001"]
- `owner_email` (`string`, optional): Email of the workspace member who owns the note. Used only when owner_id is empty. Example: jane.doe@example.com
- `owner_id` (`string`, optional): UUID of the workspace member who owns the note. Use owner_id or owner_email, not both. Example: 923e4567-e89b-12d3-a456-426614174008
- `source_record_id` (`string`, optional): Id of the feedback record in the external system, stored as metadata.source.recordId. Example: ticket-12345
- `source_system` (`string`, optional): Name of the external system the feedback came from, stored as metadata.source.system. Example: support
- `source_url` (`string`, optional): URL of the feedback record in the external system, stored as metadata.source.url. Example: https://support.example.com/ticket/12345
- `tags` (`array`, optional): Tag names to put on the note. Tags that do not exist yet are created. Example: ["mobile", "performance"]
- `type` (`string`, optional): Note type. textNote for plain feedback; conversationNote for a chat or email thread passed in conversation_parts. Defaults to textNote. Example: textNote. One of: `textNote`, `conversationNote`. Default: `textNote`.

Example input: `{"name":"<name>"}`

### `productboard_note_customer_set`

Set Note Customer · Write

Set or replace the customer (user or company) a Productboard note is attributed to.
Returns the updated customer relationship.
Use productboard_note_customer_set to change who the feedback came from. Use productboard_note_relationship_create to link the note to features.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `note_id` (`string`, required): UUID of the note to update. Get it from productboard_notes_list or productboard_notes_search. Example: 123e4567-e89b-12d3-a456-426614174000
- `customer_email` (`string`, optional): Email of the customer user the feedback came from, used instead of customer_id. Productboard looks up the user by email. Example: john@acme.com
- `customer_id` (`string`, optional): UUID of the user or company entity the feedback came from. Set customer_type to match. Leave empty if you use customer_email or want no customer. Example: 223e4567-e89b-12d3-a456-426614174001
- `customer_type` (`string`, optional): Entity type of customer_id: user or company. Defaults to user. Ignored when customer_email is used. Example: company. One of: `user`, `company`. Default: `user`.

Example input: `{"note_id":"<note_id>"}`

### `productboard_note_relationship_create`

Link Note · Write

Link a Productboard note to a feature or other entity, or attach it to a customer (user or company).
Returns the created relationship.
Use productboard_note_relationship_create to add a link or a first customer. A note has one customer; use productboard_note_customer_set to replace an existing customer.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `note_id` (`string`, required): UUID of the note to link. Get it from productboard_notes_list or productboard_notes_search. Example: 123e4567-e89b-12d3-a456-426614174000
- `relationship_type` (`string`, required): link to connect the note to a feature or other entity (set target_id); customer to attach the user or company the feedback came from (set customer_id or customer_email). Example: link. One of: `link`, `customer`.
- `customer_email` (`string`, optional): Email of the customer user the feedback came from, used instead of customer_id. Productboard looks up the user by email. Example: john@acme.com
- `customer_id` (`string`, optional): UUID of the user or company entity the feedback came from. Set customer_type to match. Leave empty if you use customer_email or want no customer. Example: 223e4567-e89b-12d3-a456-426614174001
- `customer_type` (`string`, optional): Entity type of customer_id: user or company. Defaults to user. Ignored when customer_email is used. Example: company. One of: `user`, `company`. Default: `user`.
- `target_id` (`string`, optional): UUID of the feature or other entity to link. Required when relationship_type is link. Example: 223e4567-e89b-12d3-a456-426614174001

Example input: `{"note_id":"<note_id>","relationship_type":"link"}`

### `productboard_note_update`

Update Note · Write

Update fields of an existing Productboard note: name, content, owner, tags, archived or processed state.
Returns the note's id and links.
Use productboard_note_update to edit a note. Use productboard_note_relationship_create or productboard_note_customer_set to change what it is linked to. Notes whose content is highlighted into features cannot have content changed.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `note_id` (`string`, required): UUID of the note to update. Get it from productboard_notes_list or productboard_notes_search. Example: 123e4567-e89b-12d3-a456-426614174000
- `add_tags` (`array`, optional): Tag names to add, keeping existing tags. Example: ["urgent"]
- `archived` (`boolean`, optional): Set true to archive the note or false to unarchive it. Example: true
- `clear_owner` (`boolean`, optional): Set true to remove the owner. Do not combine with owner_id or owner_email. Example: true
- `content` (`string`, optional): New body of a textNote; replaces the existing content. HTML is accepted. Example: Updated feedback text.

- `name` (`string`, optional): New title, up to 255 characters. Example: Customer asks for dark mode (mobile)
- `owner_email` (`string`, optional): Email of the member to make the owner. Used only when owner_id is empty. Example: jane.doe@example.com
- `owner_id` (`string`, optional): UUID of the member to make the owner. Use owner_id or owner_email, not both. Example: 923e4567-e89b-12d3-a456-426614174008
- `patch_operations` (`array`, optional): Extra patch operations applied after the ones built from the other inputs, for fields they do not cover. Each operation has op (set, clear, addItems or removeItems), path (the field id) and, except for clear, a value. Example: [{"op": "addItems", "path": "content", "value": [{"externalId": "msg-2", "authorType": "agent", "content": "Thanks!", "timestamp": "2026-10-02T09:00:00Z"}]}]
- `processed` (`boolean`, optional): Set true to mark the note processed or false to mark it unprocessed. Example: true
- `remove_tags` (`array`, optional): Tag names to remove, keeping the others. Example: ["triage"]
- `tags` (`array`, optional): Replace all tags with exactly these tag names. Do not combine with add_tags or remove_tags. Example: ["mobile", "q3"]

Example input: `{"note_id":"<note_id>"}`

### `productboard_notes_search`

Search Notes · Write

Search Productboard notes with a full-text query and structured filters, including the linked customer (user or company) and linked features.
Returns a page of matching notes with id, type, fields and links.next, whose pageCursor fetches the next page.
Use productboard_notes_search for text queries or customer and feature filters. Use productboard_notes_list for simple field filters. Use productboard_note_get for one note by id.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `archived` (`boolean`, optional): Filter by archived state. Example: false
- `created_from` (`string`, optional): Only match notes created on or after this ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
- `created_to` (`string`, optional): Only match notes created on or before this ISO 8601 date-time. Example: 2026-03-31T23:59:59Z
- `creator_emails` (`array`, optional): Only match notes created by one of these member emails. Needs the members_pii:read scope. Example: ["jane.doe@example.com"]
- `creator_ids` (`array`, optional): Only match notes created by one of these member UUIDs. Example: ["923e4567-e89b-12d3-a456-426614174008"]
- `customer_ids` (`array`, optional): Only match notes whose customer is one of these user or company entity UUIDs. Example: ["223e4567-e89b-12d3-a456-426614174001"]
- `linked_entity_ids` (`array`, optional): Only match notes linked to one of these feature or other entity UUIDs. Example: ["223e4567-e89b-12d3-a456-426614174001"]
- `note_ids` (`array`, optional): Only match notes with these UUIDs (up to 100). Example: ["123e4567-e89b-12d3-a456-426614174000"]
- `owner_emails` (`array`, optional): Only match notes owned by one of these member emails. Needs the members_pii:read scope. Example: ["john.doe@example.com"]
- `owner_ids` (`array`, optional): Only match notes owned by one of these member UUIDs. Example: ["923e4567-e89b-12d3-a456-426614174008"]
- `page_cursor` (`string`, optional): Cursor for the next page of results. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0
- `processed` (`boolean`, optional): Filter by processed state. Example: true
- `query` (`string`, optional): Full-text query matched against note content, up to 255 characters. Example: onboarding
- `return_fields` (`array`, optional): Limit which note fields each result returns, e.g. name, content, owner, tags. Leave empty for all non-empty fields. Example: ["name", "content"]
- `source_record_id` (`string`, optional): Only match notes with this source record id. Use together with source_system. Example: ticket-12345
- `source_system` (`string`, optional): Only match notes whose source system matches, e.g. intercom or zendesk. Example: intercom
- `tags` (`array`, optional): Only match notes with at least one of these tag names. Example: ["important"]
- `types` (`array`, optional): Only match notes of these types. Allowed values: textNote, conversationNote, opportunityNote. Example: ["textNote"]
- `updated_from` (`string`, optional): Only match notes updated on or after this ISO 8601 date-time. Example: 2026-01-01T00:00:00Z
- `updated_to` (`string`, optional): Only match notes updated on or before this ISO 8601 date-time. Example: 2026-03-31T23:59:59Z

Example input: `{}`

### `productboard_teams_search`

Search Teams · Write

Search Productboard teams by ids, names or handles and a partial text query.
Returns a page of matching teams with id, name, handle, description and links.next.
Use productboard_teams_search for batch lookups. Use productboard_teams_list to browse. Use productboard_team_get for one team.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `handles` (`array`, optional): Only match teams with one of these handles (case-insensitive). Example: ["product"]
- `names` (`array`, optional): Only match teams with one of these names (case-insensitive). Example: ["Product Team", "Engineering Team"]
- `page_cursor` (`string`, optional): Cursor for the next page of results. Copy the pageCursor value from links.next of the previous response. Leave empty for the first page. Example: eyJvZmZzZXQiOjEwMH0
- `query` (`string`, optional): Text matched against team name and handle (partial, case-insensitive). Example: product
- `team_ids` (`array`, optional): Only match teams with these UUIDs (up to 100). Example: ["95db5914-36b0-45e9-8f6d-7f11a950ac1d"]

Example input: `{}`

## Related

Other Project Management connectors ([all 40](/agentkit/connectors/?category=project-management)):

- [Notion](/agentkit/connectors/notion/): Scalekit connector, OAuth, 51 tools
- [Linear](/agentkit/connectors/linear/): Scalekit connector, OAuth, 62 tools
- [Airtable](/agentkit/connectors/airtable/): Scalekit connector, OAuth, 26 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
