> **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 Basecamp

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

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

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

   In **AgentKit > Connections**, create a Basecamp 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

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

   Then enter the app's Client ID and Client Secret on the Basecamp 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 = 'basecamp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Basecamp:', 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: 'basecamp_account_get',
     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 = "basecamp"
   identifier = "user_123"

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

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="basecamp_account_get",
       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: 'basecamp_account_get',
  toolInput: {},
  connector: 'basecamp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="basecamp_account_get",
    tool_input={},
    connection_name="basecamp",
    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.

### `basecamp_account_get`

Get Account · Read-only

Get the Basecamp account this connection is set up for.
Returns the account's id, name, owner and plan limits.
Use basecamp_account_get to confirm which account the connection uses.

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

Inputs: none.

Example input: `{}`

### `basecamp_answer_get`

Get Check-in Answer · Read-only

Get one check-in answer by ID.
Returns the answer's HTML content, author, date and parent question.
Use basecamp_answer_get for a single answer. Use basecamp_answers_list for all answers to a question.

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

Inputs:

- `answer_id` (`integer`, required): ID of the answer. Get it from basecamp_answers_list. Example: 1069479450.

Example input: `{"answer_id":1069479450}`

### `basecamp_answers_list`

List Check-in Answers · Read-only

List the answers people gave to a check-in question.
Returns each answer's id, HTML content, author and the date it is grouped under.
Use basecamp_answers_list to read check-in responses. Use basecamp_answer_get for one answer.

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

Inputs:

- `question_id` (`integer`, required): ID of the question. Get it from basecamp_questions_list. Example: 1069479346.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{"question_id":1069479346}`

### `basecamp_assignable_people_list`

List Assignable People · Read-only

List the people who can be assigned to-dos.
Returns each person's id, name and email address.
Use basecamp_assignable_people_list to pick a person for basecamp_assigned_todos_get or for to-do assignments.

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

Inputs: none.

Example input: `{}`

### `basecamp_assigned_todos_get`

Get Assigned To-dos · Read-only

Get the open to-dos assigned to one person across all projects.
Returns the person and their to-dos, grouped by project or by date.
Use basecamp_assigned_todos_get to see someone's workload. Use basecamp_my_assignments_get for the connected user.

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

Inputs:

- `person_id` (`integer`, required): ID of the person. Get it from basecamp_assignable_people_list or basecamp_people_list. Example: 1049715913.
- `group_by` (`string`, optional): Group the to-dos by bucket (project) or by date. One of: `bucket`, `date`.

Example input: `{"person_id":1049715913}`

### `basecamp_campfire_get`

Get Campfire · Read-only

Get one Campfire group chat by ID.
Returns the Campfire's title, project and the URL of its lines.
Use basecamp_campfire_get for one chat's details. Use basecamp_campfire_lines_list for its messages.

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

Inputs:

- `campfire_id` (`integer`, required): ID of the campfire. Get it from basecamp_campfires_list, or the project's dock entry named chat. Example: 1069479341.

Example input: `{"campfire_id":1069479341}`

### `basecamp_campfire_line_get`

Get Campfire Line · Read-only

Get one Campfire chat line by ID.
Returns the line's content, creator and timestamp.
Use basecamp_campfire_line_get for a single line. Use basecamp_campfire_lines_list for the conversation.

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

Inputs:

- `campfire_id` (`integer`, required): ID of the campfire. Get it from basecamp_campfires_list, or the project's dock entry named chat. Example: 1069479341.
- `line_id` (`integer`, required): ID of the line. Get it from basecamp_campfire_lines_list. Example: 1069479350.

Example input: `{"campfire_id":1069479341,"line_id":1069479350}`

### `basecamp_campfire_lines_list`

List Campfire Lines · Read-only

List the chat lines (messages) in a Campfire.
Returns each line's id, content, creator and timestamp.
Use basecamp_campfire_lines_list to read a chat. Use basecamp_campfire_line_create to post to it.

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

Inputs:

- `campfire_id` (`integer`, required): ID of the campfire. Get it from basecamp_campfires_list, or the project's dock entry named chat. Example: 1069479341.
- `direction` (`string`, optional): Sort direction: asc (oldest first) or desc (newest first). One of: `asc`, `desc`.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.
- `sort` (`string`, optional): Field to sort by: created_at or updated_at. One of: `created_at`, `updated_at`.

Example input: `{"campfire_id":1069479341}`

### `basecamp_campfires_list`

List Campfires · Read-only

List the Campfire group chats across every project the user can see.
Returns each Campfire's id, title, project and the URL of its lines.
Use basecamp_campfires_list to find a chat. Use basecamp_campfire_lines_list to read its messages.

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

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{}`

### `basecamp_card_column_get`

Get Card Column · Read-only

Get one column of a card table.
Returns the column's id, title, description, color and card count.
Use basecamp_card_column_get for one column's details. Use basecamp_card_table_get to see every column.

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

Inputs:

- `column_id` (`integer`, required): ID of the column. Get it from the lists array of basecamp_card_table_get. Example: 1069482092.

Example input: `{"column_id":1069482092}`

### `basecamp_card_get`

Get Card · Read-only

Get one card from a card table.
Returns the card's title, content, assignees, due date, column, steps and completion state.
Use basecamp_card_get to read a card and its steps. Use basecamp_cards_list to find card IDs.

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

Inputs:

- `card_id` (`integer`, required): ID of the card. Get it from basecamp_cards_list. Example: 1069482295.

Example input: `{"card_id":1069482295}`

### `basecamp_card_table_get`

Get Card Table · Read-only

Get a project's card table (Kanban board) with its columns.
Returns the card table and its lists array: each column's id, title, color and card count.
Use basecamp_card_table_get to find column IDs. Use basecamp_cards_list to list the cards in one column.

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

Inputs:

- `card_table_id` (`integer`, required): ID of the card table. Find it in the project's dock (the entry named kanban_board) from basecamp_project_get. Example: 1069482091.

Example input: `{"card_table_id":1069482091}`

### `basecamp_cards_list`

List Cards · Read-only

List the cards in one card table column.
Returns each card's id, title, content, assignees, due date, steps and completion state.
Use basecamp_cards_list to see the work in a column. Use basecamp_card_get for one card.

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

Inputs:

- `column_id` (`integer`, required): ID of the column. Get it from the lists array of basecamp_card_table_get. Example: 1069482092.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{"column_id":1069482092}`

### `basecamp_comment_get`

Get Comment · Read-only

Get one comment by ID.
Returns the comment's HTML content, creator, timestamps and parent item.
Use basecamp_comment_get for a single comment. Use basecamp_comments_list for all comments on an item.

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

Inputs:

- `comment_id` (`integer`, required): ID of the comment. Get it from basecamp_comments_list. Example: 1069479361.

Example input: `{"comment_id":1069479361}`

### `basecamp_comments_list`

List Comments · Read-only

List the comments on a Basecamp item such as a message, to-do, document, card or schedule entry.
Returns each comment's id, HTML content, creator and timestamps.
Use basecamp_comments_list to read a discussion. Use basecamp_comment_create to reply.

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

Inputs:

- `recording_id` (`integer`, required): ID of the recording. Any commentable item such as a to-do, message, document, card or schedule entry; use that item's id. Example: 1069479351.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{"recording_id":1069479351}`

### `basecamp_document_get`

Get Document · Read-only

Get one Basecamp document by ID.
Returns the document's title, HTML content, status, creator and timestamps.
Use basecamp_document_get to read a document in full, or before basecamp_document_update.

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

Inputs:

- `document_id` (`integer`, required): ID of the document. Get it from basecamp_documents_list. Example: 1069479353.

Example input: `{"document_id":1069479353}`

### `basecamp_documents_list`

List Documents · Read-only

List the documents in a Docs & Files folder.
Returns each document's id, title, HTML content, creator and timestamps.
Use basecamp_documents_list to browse documents. Use basecamp_document_get for one document. Use basecamp_search to find documents by text.

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

Inputs:

- `vault_id` (`integer`, required): ID of the folder. The project's top-level Docs & Files folder is the dock entry named vault in basecamp_project_get; subfolders come from basecamp_vaults_list. Example: 1069479340.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{"vault_id":1069479340}`

### `basecamp_message_board_get`

Get Message Board · Read-only

Get a project's message board.
Returns the board's id, title, message count and the URL of its messages.
Use basecamp_message_board_get to check a board. Use basecamp_messages_list to read the messages on it.

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

Inputs:

- `message_board_id` (`integer`, required): ID of the message board. Find it in the project's dock (the entry named message_board) from basecamp_project_get. Example: 1069479338.

Example input: `{"message_board_id":1069479338}`

### `basecamp_message_get`

Get Message · Read-only

Get one message by ID.
Returns the message's subject, HTML content, category, creator, status and timestamps.
Use basecamp_message_get to read a message in full. Use basecamp_comments_list with the message ID to read its replies.

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

Inputs:

- `message_id` (`integer`, required): ID of the message. Get it from basecamp_messages_list. Example: 1069479351.

Example input: `{"message_id":1069479351}`

### `basecamp_message_types_list`

List Message Types · Read-only

List the message types (categories such as Announcement or FYI) available in a project.
Returns each type's id, name and icon.
Use basecamp_message_types_list to get a category_id for basecamp_message_create or basecamp_message_update.

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

Inputs:

- `project_id` (`integer`, required): ID of the project. Get it from basecamp_projects_list. Example: 2085958499.

Example input: `{"project_id":2085958499}`

### `basecamp_messages_list`

List Messages · Read-only

List the messages posted on a project's message board.
Returns each message's id, subject, content, category, creator, comment count and timestamps.
Use basecamp_messages_list to browse announcements and discussions. Use basecamp_message_get for one message. Use basecamp_search to find messages by text.

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

Inputs:

- `message_board_id` (`integer`, required): ID of the message board. Find it in the project's dock (the entry named message_board) from basecamp_project_get. Example: 1069479338.
- `direction` (`string`, optional): Sort direction: asc (oldest first) or desc (newest first). One of: `asc`, `desc`.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.
- `sort` (`string`, optional): Field to sort by: created_at or updated_at. One of: `created_at`, `updated_at`.

Example input: `{"message_board_id":1069479338}`

### `basecamp_my_assignments_get`

Get My Assignments · Read-only

Get the connected user's open assignments (to-dos and cards) across all projects.
Returns assignments grouped into priorities and non_priorities, with card steps nested under their cards.
Use basecamp_my_assignments_get for the user's own work. Use basecamp_my_due_assignments_get to filter by due date. Use basecamp_assigned_todos_get for someone else's to-dos.

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

Inputs: none.

Example input: `{}`

### `basecamp_my_completed_assignments_get`

Get My Completed Assignments · Read-only

Get the connected user's completed assignments.
Returns completed to-dos and cards, leaving out archived and trashed ones.
Use basecamp_my_completed_assignments_get to review finished work. Use basecamp_my_assignments_get for open work.

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

Inputs: none.

Example input: `{}`

### `basecamp_my_due_assignments_get`

Get My Due Assignments · Read-only

Get the connected user's assignments due in a given range, overdue ones by default.
Returns the matching to-dos and cards with their due dates and projects.
Use basecamp_my_due_assignments_get to see what is overdue or due soon. Use basecamp_my_assignments_get for every open assignment.

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

Inputs:

- `scope` (`string`, optional): Which assignments to return: overdue (the default), due_today, due_tomorrow, due_later_this_week, due_next_week or due_later. One of: `overdue`, `due_today`, `due_tomorrow`, `due_later_this_week`, `due_next_week`, `due_later`.

Example input: `{}`

### `basecamp_my_notifications_get`

Get My Notifications · Read-only

Get the connected user's notifications (the Hey! menu).
Returns notifications grouped into unreads (up to 100), reads (50 per page) and bubble-ups.
Use basecamp_my_notifications_get to see what needs the user's attention.

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

Inputs:

- `limit_bubble_ups` (`boolean`, optional): Set true to return at most 2 current bubble-ups and leave out scheduled ones.
- `page` (`integer`, optional): Page of read notifications to fetch, starting at 1. Unreads are always included. Example: 2.

Example input: `{}`

### `basecamp_my_profile_get`

Get My Profile · Read-only

Get the profile of the connected Basecamp user.
Returns the user's person id, name, email address, title, company and role flags.
Use basecamp_my_profile_get to learn who is connected and get their person ID. Use basecamp_person_get for someone else.

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

Inputs: none.

Example input: `{}`

### `basecamp_overdue_todos_get`

Get Overdue To-dos · Read-only

Get every overdue to-do in the account, grouped by how late it is.
Returns overdue to-dos with their assignees, due dates and projects.
Use basecamp_overdue_todos_get for an account-wide overdue report. Use basecamp_my_due_assignments_get for the user's own overdue work.

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

Inputs: none.

Example input: `{}`

### `basecamp_people_list`

List People · Read-only

List everyone in the Basecamp account that the user can see.
Returns each person's id, name, email address, title, company and admin, owner or client flags.
Use basecamp_people_list to look up person IDs for assignments and subscriptions. Use basecamp_project_people_list for one project's members.

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

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{}`

### `basecamp_person_get`

Get Person · Read-only

Get one person in the Basecamp account by ID.
Returns the person's name, email address, title, bio, company, time zone and role flags.
Use basecamp_person_get for one person's profile. Use basecamp_my_profile_get for the connected user.

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

Inputs:

- `person_id` (`integer`, required): ID of the person. Get it from basecamp_people_list. Example: 1049715913.

Example input: `{"person_id":1049715913}`

### `basecamp_pingable_people_list`

List Pingable People · Read-only

List the people the user can start a private chat (Ping) with.
Returns each person's id, name, email address and company.
Use basecamp_pingable_people_list to see who is reachable by Ping. Use basecamp_people_list for the whole account.

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

Inputs: none.

Example input: `{}`

### `basecamp_progress_report_get`

Get Progress Report · Read-only

Get the latest activity across every project in the account, newest first.
Returns timeline events: what changed, who did it, when, and in which project.
Use basecamp_progress_report_get for account-wide activity. Use basecamp_project_timeline_get for one project.

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

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{}`

### `basecamp_project_construction_get`

Get Project Construction · Read-only

Check the progress of a project being created from a template.
Returns the construction's status (pending or completed) and, once completed, the new project.
Use basecamp_project_construction_get after basecamp_project_from_template_create until the status is completed.

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

Inputs:

- `construction_id` (`integer`, required): ID of the construction. Returned by basecamp_project_from_template_create. Example: 1069480000.
- `template_id` (`integer`, required): ID of the template. Get it from basecamp_templates_list. Example: 2085958500.

Example input: `{"construction_id":1069480000,"template_id":2085958500}`

### `basecamp_project_get`

Get Project · Read-only

Get one Basecamp project by ID.
Returns the project's name, description, status, timestamps and dock: the tools in the project with their IDs (todoset, message_board, schedule, kanban_board, vault, chat, questionnaire, inbox).
Use basecamp_project_get to look up a project's tool IDs before working with its to-dos, messages, cards, schedule, docs or chat. Use basecamp_projects_list to find the project ID.

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

Inputs:

- `project_id` (`integer`, required): ID of the project. Get it from basecamp_projects_list. Example: 2085958499.

Example input: `{"project_id":2085958499}`

### `basecamp_project_people_list`

List Project People · Read-only

List the active people on one Basecamp project.
Returns each person's id, name, email address, title, company and admin or client flags.
Use basecamp_project_people_list to find who can be assigned work in a project. Use basecamp_people_list for everyone in the account.

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

Inputs:

- `project_id` (`integer`, required): ID of the project. Get it from basecamp_projects_list. Example: 2085958499.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{"project_id":2085958499}`

### `basecamp_project_timeline_get`

Get Project Timeline · Read-only

Get the activity timeline of one Basecamp project, newest first.
Returns timeline events: what changed (created, completed, commented and so on), who did it, when, and the item it happened to.
Use basecamp_project_timeline_get to see recent activity in a project. Use basecamp_progress_report_get for activity across all projects.

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

Inputs:

- `project_id` (`integer`, required): ID of the project. Get it from basecamp_projects_list. Example: 2085958499.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{"project_id":2085958499}`

### `basecamp_projects_list`

List Projects · Read-only

List the Basecamp projects the user can see, active ones by default.
Returns each project's id, name, description, status, timestamps and dock (the IDs of its to-do set, message board, schedule, card table, docs folder and chat).
Use basecamp_projects_list to browse or find a project. Use basecamp_project_get for one project by ID. Use basecamp_recent_projects_list for the user's recently visited projects.

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

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.
- `status` (`string`, optional): Which projects to return: active (the default when empty), archived or trashed. One of: `active`, `archived`, `trashed`.

Example input: `{}`

### `basecamp_question_get`

Get Check-in Question · Read-only

Get one automatic check-in question by ID.
Returns the question's title, schedule (days and time), paused state and answer count.
Use basecamp_question_get for one question's settings. Use basecamp_answers_list for its answers.

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

Inputs:

- `question_id` (`integer`, required): ID of the question. Get it from basecamp_questions_list. Example: 1069479346.

Example input: `{"question_id":1069479346}`

### `basecamp_questionnaire_get`

Get Check-ins · Read-only

Get a project's automatic check-ins container (questionnaire).
Returns the questionnaire's id, title, question count and the URL of its questions.
Use basecamp_questionnaire_get to check a project's check-ins. Use basecamp_questions_list to list the questions.

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

Inputs:

- `questionnaire_id` (`integer`, required): ID of the questionnaire. Find it in the project's dock (the entry named questionnaire) from basecamp_project_get. Example: 1069479343.

Example input: `{"questionnaire_id":1069479343}`

### `basecamp_questions_list`

List Check-in Questions · Read-only

List the automatic check-in questions in a questionnaire.
Returns each question's id, title, schedule, paused state and answer count.
Use basecamp_questions_list to find a check-in question. Use basecamp_answers_list to read its answers.

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

Inputs:

- `questionnaire_id` (`integer`, required): ID of the questionnaire. Find it in the project's dock (the entry named questionnaire) from basecamp_project_get. Example: 1069479343.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{"questionnaire_id":1069479343}`

### `basecamp_recent_projects_list`

List Recent Projects · Read-only

List the projects the user visited most recently, newest visit first.
Returns up to 50 active projects with the usual project fields plus a bookmarked flag.
Use basecamp_recent_projects_list to find what the user is working on now. Use basecamp_projects_list to see every project.

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

Inputs: none.

Example input: `{}`

### `basecamp_recording_events_list`

List Item History · Read-only

List the change history of one Basecamp item, such as a to-do, message, document or card.
Returns each event's action (created, completed, assignment_changed and so on), the person who did it, the details and the time.
Use basecamp_recording_events_list to see who changed an item and when. Use basecamp_project_timeline_get for a whole project.

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

Inputs:

- `recording_id` (`integer`, required): ID of the item. The id of the to-do, message, document, card or other item. Example: 1069479521.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{"recording_id":1069479521}`

### `basecamp_recordings_list`

List Recordings · Read-only

List every item of one type across projects, such as all to-dos, messages, documents or comments.
Returns the items with their id, type, title, status, project, creator and timestamps.
Use basecamp_recordings_list to list or sort items of one type across projects. Use basecamp_search to find items by text.

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

Inputs:

- `type` (`string`, required): Item type to list: Comment, Document, Kanban::Card, Kanban::Step, Message, Question::Answer, Schedule::Entry, Todo, Todolist, Upload or Vault. One of: `Comment`, `Document`, `Kanban::Card`, `Kanban::Step`, `Message`, `Question::Answer`, `Schedule::Entry`, `Todo`, `Todolist`, `Upload`, `Vault`.
- `bucket` (`string`, optional): Limit to these projects: one project ID or a comma-separated list. Leave empty for all active projects. Example: 2085958499,2085958500.
- `direction` (`string`, optional): Sort direction: asc (oldest first) or desc (newest first). One of: `asc`, `desc`.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.
- `sort` (`string`, optional): Field to sort by: created_at or updated_at. One of: `created_at`, `updated_at`.
- `status` (`string`, optional): Which items to return: active (the default when empty), archived or trashed. One of: `active`, `archived`, `trashed`.

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

### `basecamp_schedule_entries_list`

List Schedule Entries · Read-only

List the events on a project's schedule.
Returns each entry's id, summary, description, start and end, all-day flag and participants.
Use basecamp_schedule_entries_list for one project's events. Use basecamp_upcoming_schedule_get for upcoming events across all projects.

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

Inputs:

- `schedule_id` (`integer`, required): ID of the schedule. Find it in the project's dock (the entry named schedule) from basecamp_project_get. Example: 1069479342.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.
- `status` (`string`, optional): Which entries to return: active (the default when empty), archived or trashed. One of: `active`, `archived`, `trashed`.

Example input: `{"schedule_id":1069479342}`

### `basecamp_schedule_entry_get`

Get Schedule Entry · Read-only

Get one schedule entry (event) by ID.
Returns the entry's summary, description, start and end, all-day flag, join link and participants. A recurring entry answers with a redirect to its own URL instead.
Use basecamp_schedule_entry_get before basecamp_schedule_entry_update to read the values to keep.

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

Inputs:

- `schedule_entry_id` (`integer`, required): ID of the schedule entry. Get it from basecamp_schedule_entries_list. Example: 1069479847.

Example input: `{"schedule_entry_id":1069479847}`

### `basecamp_schedule_get`

Get Schedule · Read-only

Get a project's schedule (calendar).
Returns the schedule's id, title, entry count and the URL of its entries.
Use basecamp_schedule_get to check a schedule. Use basecamp_schedule_entries_list to list its events.

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

Inputs:

- `schedule_id` (`integer`, required): ID of the schedule. Find it in the project's dock (the entry named schedule) from basecamp_project_get. Example: 1069479342.

Example input: `{"schedule_id":1069479342}`

### `basecamp_search`

Search · Read-only

Search Basecamp content across the account by text: messages, to-dos, documents, comments, files, chats and more.
Returns matching items with their id, type, title, project and URL.
Use basecamp_search to find items by keyword. Use basecamp_search_metadata_get first to get valid type and file type filter values. Use basecamp_recordings_list to list every item of one type without a query.

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

Inputs:

- `q` (`string`, required): Text to search for. Example: launch plan.
- `creator_ids` (`array`, optional): Only return items created by these people. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913].
- `exclude_chat` (`boolean`, optional): Set true to leave Campfire and Ping chat lines out of the results.
- `file_type` (`string`, optional): Limit attachment results to one file type, using a key from file_search_types in basecamp_search_metadata_get.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.
- `project_ids` (`array`, optional): Only return results from these projects. Get project IDs from basecamp_projects_list. Example: [2085958499].
- `since` (`string`, optional): Time range to search: last_7_days, last_30_days, last_90_days, last_12_months or forever (the default). One of: `last_7_days`, `last_30_days`, `last_90_days`, `last_12_months`, `forever`.
- `sort` (`string`, optional): best_match ranks by relevance (the default); recency puts the newest first. One of: `best_match`, `recency`.
- `type_names` (`array`, optional): Item types to include, using the key values from recording_search_types in basecamp_search_metadata_get. Example: ["Message", "Todo"].

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

### `basecamp_search_metadata_get`

Get Search Filters · Read-only

Get the filter values that basecamp_search accepts.
Returns the available item types (recording_search_types) and attachment types (file_search_types), each with a key and a display name.
Use basecamp_search_metadata_get before basecamp_search to pick valid type_names and file_type values.

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

Inputs: none.

Example input: `{}`

### `basecamp_template_get`

Get Project Template · Read-only

Get one project template by ID.
Returns the template's name, description and dock of tools.
Use basecamp_template_get to inspect a template before creating a project from it.

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

Inputs:

- `template_id` (`integer`, required): ID of the template. Get it from basecamp_templates_list. Example: 2085958500.

Example input: `{"template_id":2085958500}`

### `basecamp_templates_list`

List Project Templates · Read-only

List the project templates in the account.
Returns each template's id, name, description and dock of tools.
Use basecamp_templates_list to find a template for basecamp_project_from_template_create.

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

Inputs:

- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.
- `status` (`string`, optional): Which templates to return: active (the default when empty), archived or trashed. One of: `active`, `archived`, `trashed`.

Example input: `{}`

### `basecamp_todo_get`

Get To-do · Read-only

Get one to-do by ID.
Returns the to-do's content, description, assignees, completion subscribers, start and due dates, completion state and parent list.
Use basecamp_todo_get before basecamp_todo_update to read the values you need to keep. Use basecamp_todos_list to find to-do IDs.

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

Inputs:

- `todo_id` (`integer`, required): ID of the to-do. Get it from basecamp_todos_list. Example: 1069479521.

Example input: `{"todo_id":1069479521}`

### `basecamp_todolist_get`

Get To-do List · Read-only

Get one to-do list (or to-do list group) by ID.
Returns the list's name, description, completion ratio and parent to-do set.
Use basecamp_todolist_get for one list's details. Use basecamp_todolists_list to find lists in a project.

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

Inputs:

- `todolist_id` (`integer`, required): ID of the to-do list. Get it from basecamp_todolists_list or basecamp_todolist_groups_list. Example: 1069479520.

Example input: `{"todolist_id":1069479520}`

### `basecamp_todolist_groups_list`

List To-do List Groups · Read-only

List the groups inside a to-do list.
Returns each group's id, name and completion ratio. Groups are sections that split a long list.
Use basecamp_todolist_groups_list to find a group ID. Pass a group ID to basecamp_todos_list or basecamp_todo_create to work with that group's to-dos.

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

Inputs:

- `todolist_id` (`integer`, required): ID of the to-do list. Get it from basecamp_todolists_list. Example: 1069479520.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{"todolist_id":1069479520}`

### `basecamp_todolists_list`

List To-do Lists · Read-only

List the to-do lists in a project's to-do set.
Returns each list's id, name, description, completion ratio and creator.
Use basecamp_todolists_list to find a to-do list. Use basecamp_todos_list to list the to-dos inside one list.

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

Inputs:

- `todoset_id` (`integer`, required): ID of the to-do set. Find it in the project's dock (the entry named todoset) from basecamp_project_get. Example: 1069479339.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.
- `status` (`string`, optional): Which to-do lists to return: active (the default when empty), archived or trashed. One of: `active`, `archived`, `trashed`.

Example input: `{"todoset_id":1069479339}`

### `basecamp_todos_list`

List To-dos · Read-only

List the to-dos in one to-do list or to-do list group.
Returns each to-do's id, content, description, assignees, due date and completion state. Pending to-dos are returned unless completed is true.
Use basecamp_todos_list to see the to-dos in a list. Use basecamp_todo_get for one to-do. Use basecamp_my_assignments_get for the user's own to-dos across projects.

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

Inputs:

- `todolist_id` (`integer`, required): ID of the to-do list. Get it from basecamp_todolists_list, or use a group ID from basecamp_todolist_groups_list. Example: 1069479520.
- `completed` (`boolean`, optional): Set true to return completed to-dos instead of pending ones.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.
- `status` (`string`, optional): Which to-dos to return: active (the default when empty), archived or trashed. One of: `active`, `archived`, `trashed`.

Example input: `{"todolist_id":1069479520}`

### `basecamp_todoset_get`

Get To-do Set · Read-only

Get a project's to-do set, the container that holds all of its to-do lists.
Returns the to-do set's id, name, completion ratio and the URL of its to-do lists.
Use basecamp_todoset_get to check overall to-do progress. Use basecamp_todolists_list to list the to-do lists inside it.

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

Inputs:

- `todoset_id` (`integer`, required): ID of the to-do set. Find it in the project's dock (the entry named todoset) from basecamp_project_get. Example: 1069479339.

Example input: `{"todoset_id":1069479339}`

### `basecamp_upcoming_schedule_get`

Get Upcoming Schedule · Read-only

Get the events and dated assignments across all projects within a date window.
Returns schedule entries and dated to-dos and cards that fall between the two dates.
Use basecamp_upcoming_schedule_get for an account-wide calendar view. Use basecamp_schedule_entries_list for one project's schedule.

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

Inputs:

- `window_ends_on` (`string`, required): Last day of the window, inclusive. Date as YYYY-MM-DD. Example: 2026-10-31.
- `window_starts_on` (`string`, required): First day of the window, inclusive. Date as YYYY-MM-DD. Example: 2026-10-01.

Example input: `{"window_ends_on":"<window_ends_on>","window_starts_on":"<window_starts_on>"}`

### `basecamp_upload_get`

Get Upload · Read-only

Get one uploaded file's details by ID.
Returns the file's name, content type, size, description, creator and download URL.
Use basecamp_upload_get for a file's metadata and download link. Use basecamp_uploads_list to find file IDs.

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

Inputs:

- `upload_id` (`integer`, required): ID of the upload. Get it from basecamp_uploads_list. Example: 1069479848.

Example input: `{"upload_id":1069479848}`

### `basecamp_uploads_list`

List Uploads · Read-only

List the uploaded files in a Docs & Files folder.
Returns each file's id, filename, content type, size, description and download URL.
Use basecamp_uploads_list to find files. Use basecamp_upload_get for one file.

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

Inputs:

- `vault_id` (`integer`, required): ID of the folder. The project's top-level Docs & Files folder is the dock entry named vault in basecamp_project_get; subfolders come from basecamp_vaults_list. Example: 1069479340.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{"vault_id":1069479340}`

### `basecamp_vault_get`

Get Folder · Read-only

Get a Docs & Files folder (vault) by ID.
Returns the folder's title and counts of its documents, uploads and subfolders.
Use basecamp_vault_get to check a folder. Use basecamp_documents_list, basecamp_uploads_list or basecamp_vaults_list to list what is inside.

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

Inputs:

- `vault_id` (`integer`, required): ID of the folder. The project's top-level Docs & Files folder is the dock entry named vault in basecamp_project_get; subfolders come from basecamp_vaults_list. Example: 1069479340.

Example input: `{"vault_id":1069479340}`

### `basecamp_vaults_list`

List Folders · Read-only

List the subfolders inside a Docs & Files folder.
Returns each subfolder's id, title and content counts.
Use basecamp_vaults_list to walk the folder tree. Use basecamp_documents_list for documents in a folder.

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

Inputs:

- `vault_id` (`integer`, required): ID of the folder. The project's top-level Docs & Files folder is the dock entry named vault in basecamp_project_get; subfolders come from basecamp_vaults_list. Example: 1069479340.
- `page` (`integer`, optional): Page number to fetch, starting at 1. Basecamp pages hold up to 50 items. Request the next page until a page comes back empty. Example: 2.

Example input: `{"vault_id":1069479340}`

### `basecamp_campfire_line_create`

Post Campfire Line · Write

Post a chat line to a Campfire.
Returns the new line with its id.
Use basecamp_campfire_line_create for a quick chat message. Use basecamp_message_create for a message-board post.

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

Inputs:

- `campfire_id` (`integer`, required): ID of the campfire. Get it from basecamp_campfires_list, or the project's dock entry named chat. Example: 1069479341.
- `content` (`string`, required): Text of the chat line. Plain text by default; set content_type to text/html to send HTML. Example: Good morning.
- `content_type` (`string`, optional): Leave empty for plain text, or set text/html when content contains HTML. One of: `text/html`.

Example input: `{"campfire_id":1069479341,"content":"<content>"}`

### `basecamp_card_column_create`

Create Card Column · Write

Add a column to a card table.
Returns the new column with its id.
Use basecamp_card_column_create to add a workflow stage. Use basecamp_card_column_update to rename one.

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

Inputs:

- `card_table_id` (`integer`, required): ID of the card table. Find it in the project's dock (the entry named kanban_board) from basecamp_project_get. Example: 1069482091.
- `title` (`string`, required): Name of the column. Example: In progress.
- `description` (`string`, optional): Optional column description. Example: Stuff we are doing right now.

Example input: `{"card_table_id":1069482091,"title":"<title>"}`

### `basecamp_card_column_update`

Update Card Column · Write

Rename a card table column or change its description.
Returns the updated column.
Use basecamp_card_column_update to edit a column. Use basecamp_card_column_create to add one.

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

Inputs:

- `column_id` (`integer`, required): ID of the column. Get it from the lists array of basecamp_card_table_get. Example: 1069482092.
- `description` (`string`, optional): New column description.
- `title` (`string`, optional): New column name. Example: On it.

Example input: `{"column_id":1069482092}`

### `basecamp_card_create`

Create Card · Write

Create a card in a card table column.
Returns the new card with its id.
Use basecamp_card_create to add work to a Kanban board. Use basecamp_card_update afterwards to assign people. Use basecamp_todo_create for a to-do list item instead.

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

Inputs:

- `column_id` (`integer`, required): ID of the column. Get it from the lists array of basecamp_card_table_get. Example: 1069482092.
- `title` (`string`, required): Title of the card. Example: Investigation.
- `content` (`string`, optional): Card details. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br.
- `due_on` (`string`, optional): Due date. Date as YYYY-MM-DD. Example: 2026-01-01.
- `notify` (`boolean`, optional): Set true to notify people about the new card.

Example input: `{"column_id":1069482092,"title":"<title>"}`

### `basecamp_card_move`

Move Card · Write

Move a card to another column of its card table.
Returns no content on success (HTTP 204).
Use basecamp_card_move to change a card's stage, for example from In progress to Done. Use basecamp_card_table_get to find the target column ID.

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

Inputs:

- `card_id` (`integer`, required): ID of the card. Get it from basecamp_cards_list. Example: 1069482295.
- `column_id` (`integer`, required): ID of the column to move the card to. Get it from the lists array of basecamp_card_table_get. Example: 1069482093.
- `position` (`integer`, optional): 1-based position in the target column. Defaults to 1 (top). Example: 1.

Example input: `{"card_id":1069482295,"column_id":1069482093}`

### `basecamp_card_step_completion_set`

Set Card Step Completion · Write

Mark a card step as completed or not completed.
Returns the updated step.
Use basecamp_card_step_completion_set to tick off or reopen a step. Use basecamp_card_step_update to change its title or dates.

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

Inputs:

- `completed` (`boolean`, required): true marks the step completed; false marks it not completed.
- `step_id` (`integer`, required): ID of the step. Get it from the steps array of basecamp_card_get. Example: 1069482296.

Example input: `{"completed":true,"step_id":1069482296}`

### `basecamp_card_step_create`

Create Card Step · Write

Add a step (a checklist item) to a card.
Returns the new step with its id.
Use basecamp_card_step_create to break a card into steps. Use basecamp_card_step_completion_set to tick a step off.

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

Inputs:

- `card_id` (`integer`, required): ID of the card. Get it from basecamp_cards_list. Example: 1069482295.
- `title` (`string`, required): What the step is. Example: Inspiration.
- `assignee_ids` (`array`, optional): People to assign the step to. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `due_on` (`string`, optional): Due date. Date as YYYY-MM-DD. Example: 2026-01-01.

Example input: `{"card_id":1069482295,"title":"<title>"}`

### `basecamp_card_step_update`

Update Card Step · Write

Update a card step's title, due date or assignees.
Returns the updated step.
Use basecamp_card_step_update to edit a step; fields you leave empty stay unchanged. Use basecamp_card_step_completion_set to complete it.

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

Inputs:

- `step_id` (`integer`, required): ID of the step. Get it from the steps array of basecamp_card_get. Example: 1069482296.
- `assignee_ids` (`array`, optional): People to assign. Replaces the current assignees. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `due_on` (`string`, optional): New due date. Date as YYYY-MM-DD.
- `title` (`string`, optional): New title. Example: Updated inspiration.

Example input: `{"step_id":1069482296}`

### `basecamp_card_update`

Update Card · Write

Update a card's title, content, due date or assignees.
Returns the updated card.
Use basecamp_card_update to edit or assign a card; fields you leave empty stay unchanged. Use basecamp_card_move to move it to another column.

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

Inputs:

- `card_id` (`integer`, required): ID of the card. Get it from basecamp_cards_list. Example: 1069482295.
- `assignee_ids` (`array`, optional): People to assign. Replaces the current assignees. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `content` (`string`, optional): New details. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br.
- `due_on` (`string`, optional): New due date. Date as YYYY-MM-DD. Example: 2026-05-01.
- `title` (`string`, optional): New title. Example: Updated investigation.

Example input: `{"card_id":1069482295}`

### `basecamp_comment_create`

Create Comment · Write

Add a comment to a Basecamp item such as a message, to-do, document, card or schedule entry.
Returns the new comment with its id.
Use basecamp_comment_create to reply on an item. Use basecamp_message_create to start a new message thread.

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

Inputs:

- `content` (`string`, required): Comment text. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br. Example: <div><em>Wow!</em> That is cool.</div>.
- `recording_id` (`integer`, required): ID of the recording. Any commentable item such as a to-do, message, document, card or schedule entry; use that item's id. Example: 1069479351.

Example input: `{"content":"<content>","recording_id":1069479351}`

### `basecamp_comment_update`

Update Comment · Write

Change the text of an existing comment.
Returns the updated comment.
Use basecamp_comment_update to edit a comment. Use basecamp_comment_create to add a new one.

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

Inputs:

- `comment_id` (`integer`, required): ID of the comment. Get it from basecamp_comments_list. Example: 1069479361.
- `content` (`string`, required): New comment text. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br. Example: <div>Updated: that is cool.</div>.

Example input: `{"comment_id":1069479361,"content":"<content>"}`

### `basecamp_document_create`

Create Document · Write

Create a document in a Docs & Files folder.
Returns the new document with its id.
Use basecamp_document_create for long-form content. Use basecamp_message_create for an announcement that notifies people.

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

Inputs:

- `title` (`string`, required): Title of the document. Example: New Hire Info.
- `vault_id` (`integer`, required): ID of the folder. The project's top-level Docs & Files folder is the dock entry named vault in basecamp_project_get; subfolders come from basecamp_vaults_list. Example: 1069479340.
- `content` (`string`, optional): Body of the document. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br.
- `status` (`string`, optional): active publishes the document; drafted saves it unpublished. Defaults to active. One of: `active`, `drafted`. Default: `active`.
- `subscriptions` (`array`, optional): People to subscribe and notify. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `visible_to_clients` (`boolean`, optional): Set true to show the document to clients on a project that has client access.

Example input: `{"title":"<title>","vault_id":1069479340}`

### `basecamp_document_update`

Update Document · Write

Replace a document's title and content.
Returns the updated document.
Use basecamp_document_update to edit a document. This replaces it: an empty title or content is cleared (an empty title reads back as Untitled), so send both, using basecamp_document_get for the current values.

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

Inputs:

- `document_id` (`integer`, required): ID of the document. Get it from basecamp_documents_list. Example: 1069479353.
- `content` (`string`, optional): Document body. Leaving it empty clears it. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br.
- `title` (`string`, optional): Document title. Leaving it empty clears it. Example: New Hire Information.

Example input: `{"document_id":1069479353}`

### `basecamp_message_create`

Create Message · Write

Post a message to a project's message board.
Returns the new message with its id.
Use basecamp_message_create for an announcement or discussion thread. Use basecamp_comment_create to reply to an existing message. Use basecamp_campfire_line_create for a quick chat line.

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

Inputs:

- `message_board_id` (`integer`, required): ID of the message board. Find it in the project's dock (the entry named message_board) from basecamp_project_get. Example: 1069479338.
- `subject` (`string`, required): Title of the message. Example: Kickoff.
- `category_id` (`integer`, optional): Optional message type (category) ID from basecamp_message_types_list. Example: 1069479380.
- `content` (`string`, optional): Body of the message. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br. Example: <div><strong>Welcome to Basecamp, everyone.</strong></div>.
- `status` (`string`, optional): active publishes the message now and notifies subscribers; drafted saves it as an unpublished draft. Defaults to active. One of: `active`, `drafted`. Default: `active`.
- `subscriptions` (`array`, optional): People to subscribe and notify. Leave empty to subscribe everyone on the project. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `visible_to_clients` (`boolean`, optional): Set true to show the message to clients on a project that has client access.

Example input: `{"message_board_id":1069479338,"subject":"<subject>"}`

### `basecamp_message_update`

Update Message · Write

Update a message's subject, content, status or message type.
Returns the updated message.
Use basecamp_message_update to edit a message or publish a draft (status active). Send only the fields to change.

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

Inputs:

- `message_id` (`integer`, required): ID of the message. Get it from basecamp_messages_list. Example: 1069479351.
- `category_id` (`integer`, optional): New message type (category) ID from basecamp_message_types_list. Example: 1069479380.
- `content` (`string`, optional): New body. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br.
- `status` (`string`, optional): Set active to publish a draft. One of: `active`, `drafted`.
- `subject` (`string`, optional): New subject. Example: Spin-down.

Example input: `{"message_id":1069479351}`

### `basecamp_project_create`

Create Project · Write

Create a new Basecamp project.
Returns the new project, including its id and dock of tool IDs.
Use basecamp_project_create to start an empty project. Use basecamp_project_from_template_create to start one from a template.

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

Inputs:

- `name` (`string`, required): Name of the new project. Example: Marketing Campaign.
- `description` (`string`, optional): Short description shown under the project name. Example: For Client: Xyz Corp Conference.

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

### `basecamp_project_from_template_create`

Create Project from Template · Write

Start creating a new project from a project template. Basecamp builds it in the background.
Returns a project construction with its id and status (pending until the project is ready).
Use basecamp_project_from_template_create to copy a template. Then poll basecamp_project_construction_get until the status is completed to get the new project.

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

Inputs:

- `project` (`object`, required): New project details as an object: name (required), description, and start_date (YYYY-MM-DD) to shift the template's dates. Example: {"name": "Marketing Campaign", "description": "For Client: Xyz Corp Conference"}.
- `template_id` (`integer`, required): ID of the template. Get it from basecamp_templates_list. Example: 2085958500.

Example input: `{"project":{"name":"Marketing Campaign","description":"For Client: Xyz Corp Conference"},"template_id":2085958500}`

### `basecamp_project_update`

Update Project · Write

Update a Basecamp project's name, description, access policy or start and end dates.
Returns the updated project.
Use basecamp_project_update to rename or reconfigure a project. The name is always required; send the current name to keep it. Use basecamp_project_get to read the current values.

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

Inputs:

- `name` (`string`, required): Project name. Required even if it isn't changing; send the current name to keep it. Example: Marketing Campaign for Xyz Corp.
- `project_id` (`integer`, required): ID of the project. Get it from basecamp_projects_list. Example: 2085958499.
- `admissions` (`string`, optional): Who in the account can join the project: invite (only people added to it), employee (team members from the account's own company) or team (any team member except clients). One of: `invite`, `employee`, `team`.
- `description` (`string`, optional): Project description. Example: 2016-2017 Strategy.
- `schedule_attributes` (`object`, optional): Project start and end dates as an object with start_date and end_date (YYYY-MM-DD). Send both dates together. Example: {"start_date": "2026-01-01", "end_date": "2026-04-01"}.

Example input: `{"name":"<name>","project_id":2085958499}`

### `basecamp_schedule_entry_create`

Create Schedule Entry · Write

Create an event on a project's schedule.
Returns the new schedule entry with its id.
Use basecamp_schedule_entry_create to add a meeting, deadline or other event. Use basecamp_todo_create for a task with a due date instead.

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

Inputs:

- `ends_at` (`string`, required): End as an ISO 8601 timestamp, or a date for an all-day event. Same form as starts_at.
- `schedule_id` (`integer`, required): ID of the schedule. Find it in the project's dock (the entry named schedule) from basecamp_project_get. Example: 1069479342.
- `starts_at` (`string`, required): Start as an ISO 8601 timestamp (2026-06-04T09:00:00Z), or a date (2026-06-04) for an all-day event.
- `summary` (`string`, required): Title of the event. Example: Important Meeting.
- `all_day` (`boolean`, optional): Set true for an all-day event; then pass dates, not timestamps, in starts_at and ends_at.
- `description` (`string`, optional): Event details. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br.
- `notify` (`boolean`, optional): Set true to notify the participants.
- `participant_ids` (`array`, optional): People taking part in the event. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `status` (`string`, optional): active publishes the entry (the default); drafted saves it unpublished. One of: `active`, `drafted`.
- `subscriptions` (`array`, optional): People to subscribe to the entry's notifications. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `url` (`string`, optional): Video-call or other link for the event. Example: https://meet.example.com/abc-defg-hij.
- `visible_to_clients` (`boolean`, optional): Set true to show the entry to clients on a project that has client access.

Example input: `{"ends_at":"<ends_at>","schedule_id":1069479342,"starts_at":"<starts_at>","summary":"<summary>"}`

### `basecamp_schedule_entry_update`

Update Schedule Entry · Write

Replace a schedule entry's summary, description, times and settings.
Returns the updated schedule entry.
Use basecamp_schedule_entry_update to reschedule or edit an event. This replaces the entry: an empty summary or description is cleared and an empty all_day resets to false, while participants, join link and highlight are kept when left empty. Read the entry with basecamp_schedule_entry_get first.

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

Inputs:

- `ends_at` (`string`, required): End as an ISO 8601 timestamp, or a date for an all-day event. Required.
- `schedule_entry_id` (`integer`, required): ID of the schedule entry. Get it from basecamp_schedule_entries_list. Example: 1069479847.
- `starts_at` (`string`, required): Start as an ISO 8601 timestamp, or a date (2026-06-04) for an all-day event. Required.
- `all_day` (`boolean`, optional): true for an all-day event. Send the current value: leaving it empty resets it to false.
- `description` (`string`, optional): Event details. Leaving it empty clears them. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br.
- `highlighted` (`boolean`, optional): true highlights the entry on the schedule; false removes the highlight. Leave empty to keep it as is.
- `notify` (`boolean`, optional): Set true to notify the participants about the change.
- `participant_ids` (`array`, optional): People taking part. Leave empty to keep the current participants. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `summary` (`string`, optional): Title of the event. Leaving it empty clears it, so send the current title to keep it.
- `url` (`string`, optional): Video-call or other link. Leave empty to keep the current link.

Example input: `{"ends_at":"<ends_at>","schedule_entry_id":1069479847,"starts_at":"<starts_at>"}`

### `basecamp_todo_complete`

Complete To-do · Write

Mark a to-do as completed.
Returns no content on success (HTTP 204).
Use basecamp_todo_complete to tick off a to-do. Use basecamp_todo_uncomplete to reopen it.

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

Inputs:

- `todo_id` (`integer`, required): ID of the to-do. Get it from basecamp_todos_list. Example: 1069479521.

Example input: `{"todo_id":1069479521}`

### `basecamp_todo_create`

Create To-do · Write

Create a to-do in a to-do list or to-do list group.
Returns the new to-do with its id.
Use basecamp_todo_create to add a task. Use basecamp_card_create for a card on a card table instead.

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

Inputs:

- `content` (`string`, required): What the to-do is for, as plain text. Example: Program it.
- `todolist_id` (`integer`, required): ID of the to-do list. Get it from basecamp_todolists_list, or use a group ID from basecamp_todolist_groups_list. Example: 1069479520.
- `assignee_ids` (`array`, optional): People to assign the to-do to. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `completion_subscriber_ids` (`array`, optional): People to notify when the to-do is completed. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `description` (`string`, optional): Extra details. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br. Example: <div><em>Try that new language!</em></div>.
- `due_on` (`string`, optional): Due date. Date as YYYY-MM-DD. Example: 2026-05-01.
- `notify` (`boolean`, optional): Set true to notify the assignees that they were assigned.
- `starts_on` (`string`, optional): Start date, which makes the to-do span a date range. Date as YYYY-MM-DD. Example: 2026-04-20.

Example input: `{"content":"<content>","todolist_id":1069479520}`

### `basecamp_todo_update`

Update To-do · Write

Replace a to-do's content, description, assignees and dates.
Returns the updated to-do.
Use basecamp_todo_update to edit a to-do. This replaces the to-do: every optional field you leave empty is cleared (description, assignees, subscribers, dates), so read the to-do with basecamp_todo_get first and send back the values to keep. Use basecamp_todo_complete to tick it off.

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

Inputs:

- `content` (`string`, required): What the to-do is for. Required, even if unchanged. Example: Program it.
- `todo_id` (`integer`, required): ID of the to-do. Get it from basecamp_todos_list. Example: 1069479521.
- `assignee_ids` (`array`, optional): People assigned to the to-do. Leaving it empty removes every assignee. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `completion_subscriber_ids` (`array`, optional): People notified on completion. Leaving it empty removes them. Get person IDs from basecamp_people_list or basecamp_project_people_list. Example: [1049715913, 1049715914].
- `description` (`string`, optional): Details. Leaving it empty clears the current description. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br.
- `due_on` (`string`, optional): Due date. Leaving it empty clears it. Date as YYYY-MM-DD. Example: 2026-05-01.
- `notify` (`boolean`, optional): Set true to notify newly assigned people.
- `starts_on` (`string`, optional): Start date. Leaving it empty clears it. Date as YYYY-MM-DD. Example: 2026-04-20.

Example input: `{"content":"<content>","todo_id":1069479521}`

### `basecamp_todolist_create`

Create To-do List · Write

Create a to-do list in a project's to-do set.
Returns the new to-do list with its id.
Use basecamp_todolist_create to add a list. Use basecamp_todo_create to add to-dos to an existing list.

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

Inputs:

- `name` (`string`, required): Name of the to-do list. Example: Launch.
- `todoset_id` (`integer`, required): ID of the to-do set. Find it in the project's dock (the entry named todoset) from basecamp_project_get. Example: 1069479339.
- `description` (`string`, optional): Optional description. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br. Example: <div><em>Finish it!</em></div>.
- `visible_to_clients` (`boolean`, optional): Set true to show the list to clients on a project that has client access.

Example input: `{"name":"<name>","todoset_id":1069479339}`

### `basecamp_todolist_group_create`

Create To-do List Group · Write

Create a group (a named section) inside a to-do list.
Returns the new group with its id.
Use basecamp_todolist_group_create to split a list into sections. Use basecamp_todo_create with the group ID to add to-dos to it.

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

Inputs:

- `name` (`string`, required): Name of the group. Example: Design tasks.
- `todolist_id` (`integer`, required): ID of the to-do list. Get it from basecamp_todolists_list. Example: 1069479520.

Example input: `{"name":"<name>","todolist_id":1069479520}`

### `basecamp_todolist_update`

Update To-do List · Write

Replace a to-do list's name and description.
Returns the updated to-do list.
Use basecamp_todolist_update to rename a list or change its description. This replaces the list: leaving description empty clears it, so read the current values with basecamp_todolist_get and send back what you want to keep.

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

Inputs:

- `name` (`string`, required): New name of the to-do list. Required. Example: Relaunch.
- `todolist_id` (`integer`, required): ID of the to-do list. Get it from basecamp_todolists_list. Example: 1069479520.
- `description` (`string`, optional): Description. Leaving it empty clears the current description. Basecamp rich text: HTML using tags such as div, strong, em, a, ul, ol, li and br. Example: <div><strong>Try this again.</strong></div>.

Example input: `{"name":"<name>","todolist_id":1069479520}`

### `basecamp_vault_create`

Create Folder · Write

Create a subfolder inside a Docs & Files folder.
Returns the new folder with its id.
Use basecamp_vault_create to organize documents. Use basecamp_document_create to add a document.

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

Inputs:

- `title` (`string`, required): Name of the new folder. Example: Materials.
- `vault_id` (`integer`, required): ID of the parent folder. The project's top-level folder is the dock entry named vault in basecamp_project_get. Example: 1069479340.

Example input: `{"title":"<title>","vault_id":1069479340}`

### `basecamp_vault_update`

Rename Folder · Write

Rename a Docs & Files folder.
Returns the updated folder.
Use basecamp_vault_update to rename a folder. Use basecamp_vault_create to make a new one.

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

Inputs:

- `title` (`string`, required): New folder name. Example: Important Materials.
- `vault_id` (`integer`, required): ID of the folder. The project's top-level Docs & Files folder is the dock entry named vault in basecamp_project_get; subfolders come from basecamp_vaults_list. Example: 1069479340.

Example input: `{"title":"<title>","vault_id":1069479340}`

### `basecamp_todo_uncomplete`

Uncomplete To-do · Destructive

Mark a completed to-do as not completed.
Returns no content on success (HTTP 204).
Use basecamp_todo_uncomplete to reopen a to-do. Use basecamp_todo_complete to complete it.

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

Inputs:

- `todo_id` (`integer`, required): ID of the to-do. Get it from basecamp_todos_list. Example: 1069479521.

Example input: `{"todo_id":1069479521}`

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