OpenClaw Skillv1.0.2

Basecamp

byungkyuby byungkyu
Deploy on EasyClawdfrom $14.9/mo

Basecamp API integration with managed OAuth. Manage projects, to-dos, messages, schedules, documents, and team collaboration. Use this skill when users want to create and manage projects, to-do lists, schedule events, or collaborate with teams in Basecamp. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key.

How to use this skill

OpenClaw skills run inside an OpenClaw container. EasyClawd deploys and manages yours — no server setup needed.

  1. Sign up on EasyClawd (2 minutes)
  2. Connect your Telegram bot
  3. Install Basecamp from the skills panel
Get started — from $14.9/mo
5stars
3,412downloads
0comments
3versions

Latest Changelog

- Added clawdbot metadata to SKILL.md, including an emoji and environment variable requirements.
- No functional or API changes. Documentation only.

Tags

latest: 1.0.2

Skill Documentation

---
name: basecamp
description: |
  Basecamp API integration with managed OAuth. Manage projects, to-dos, messages, schedules, documents, and team collaboration.
  Use this skill when users want to create and manage projects, to-do lists, schedule events, or collaborate with teams in Basecamp.
  For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
  Requires network access and valid Maton API key.
metadata:
  author: maton
  version: "1.0"
  clawdbot:
    emoji: 🧠
    requires:
      env:
        - MATON_API_KEY
---

# Basecamp

Access the Basecamp 4 API with managed OAuth authentication. Manage projects, to-dos, messages, schedules, documents, and team collaboration.

## Quick Start

```bash
# List all projects
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/basecamp/projects.json')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
```

## Base URL

```
https://gateway.maton.ai/basecamp/{resource}.json
```

The gateway proxies requests to `3.basecampapi.com/{account_id}/` and automatically injects your OAuth token and account ID.

**Important:** All Basecamp API URLs must end with `.json`.

## Authentication

All requests require the Maton API key in the Authorization header:

```
Authorization: Bearer $MATON_API_KEY
```

**Environment Variable:** Set your API key as `MATON_API_KEY`:

```bash
export MATON_API_KEY="YOUR_API_KEY"
```

### Getting Your API Key

1. Sign in or create an account at [maton.ai](https://maton.ai)
2. Go to [maton.ai/settings](https://maton.ai/settings)
3. Copy your API key

## Connection Management

Manage your Basecamp OAuth connections at `https://ctrl.maton.ai`.

### List Connections

```bash
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=basecamp&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
```

### Create Connection

```bash
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'basecamp'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
```

### Get Connection

```bash
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
```

**Response:**
```json
{
  "connection": {
    "connection_id": "71e313c8-9100-48c6-8ea1-6323f6fafd04",
    "status": "ACTIVE",
    "creation_time": "2026-02-08T03:12:39.815086Z",
    "last_updated_time": "2026-02-08T03:12:59.259878Z",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "basecamp",
    "metadata": {}
  }
}
```

Open the returned `url` in a browser to complete OAuth authorization.

### Delete Connection

```bash
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
```

### Specifying Connection

If you have multiple Basecamp connections, specify which one to use with the `Maton-Connection` header:

```bash
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/basecamp/projects.json')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '71e313c8-9100-48c6-8ea1-6323f6fafd04')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
```

If omitted, the gateway uses the default (oldest) active connection.

## API Reference

### User Info

#### Get Current User

```bash
GET /basecamp/my/profile.json
```

**Response:**
```json
{
  "id": 51197030,
  "name": "Chris Kim",
  "email_address": "[email protected]",
  "admin": true,
  "owner": true,
  "time_zone": "America/Los_Angeles",
  "avatar_url": "https://..."
}
```

### People Operations

#### List People

```bash
GET /basecamp/people.json
```

**Response:**
```json
[
  {
    "id": 51197030,
    "name": "Chris Kim",
    "email_address": "[email protected]",
    "admin": true,
    "owner": true,
    "employee": true,
    "time_zone": "America/Los_Angeles"
  }
]
```

#### Get Person

```bash
GET /basecamp/people/{person_id}.json
```

#### List Project Members

```bash
GET /basecamp/projects/{project_id}/people.json
```

### Project Operations

#### List Projects

```bash
GET /basecamp/projects.json
```

**Response:**
```json
[
  {
    "id": 46005636,
    "status": "active",
    "name": "Getting Started",
    "description": "Quickly get up to speed with everything Basecamp",
    "created_at": "2026-02-05T22:59:26.087Z",
    "url": "https://3.basecampapi.com/6153810/projects/46005636.json",
    "dock": [...]
  }
]
```

#### Get Project

```bash
GET /basecamp/projects/{project_id}.json
```

The project response includes a `dock` array with available tools (message_board, todoset, vault, chat, schedule, etc.). Each dock item has:
- `id`: The tool's ID
- `name`: Tool type (e.g., "todoset", "message_board")
- `enabled`: Whether the tool is active
- `url`: Direct URL to access the tool

#### Create Project

```bash
POST /basecamp/projects.json
Content-Type: application/json

{
  "name": "New Project",
  "description": "Project description"
}
```

#### Update Project

```bash
PUT /basecamp/projects/{project_id}.json
Content-Type: application/json

{
  "name": "Updated Project Name",
  "description": "Updated description"
}
```

#### Delete (Trash) Project

```bash
DELETE /basecamp/projects/{project_id}.json
```

### To-Do Operations

#### Get Todoset

First, get the todoset ID from the project's dock:

```bash
GET /basecamp/buckets/{project_id}/todosets/{todoset_id}.json
```

#### List Todolists

```bash
GET /basecamp/buckets/{project_id}/todosets/{todoset_id}/todolists.json
```

**Response:**
```json
[
  {
    "id": 9550474442,
    "title": "Basecamp essentials",
    "description": "",
    "completed": false,
    "completed_ratio": "0/5",
    "url": "https://..."
  }
]
```

#### Create Todolist

```bash
POST /basecamp/buckets/{project_id}/todosets/{todoset_id}/todolists.json
Content-Type: application/json

{
  "name": "New Todo List",
  "description": "List description"
}
```

#### Get Todolist

```bash
GET /basecamp/buckets/{project_id}/todolists/{todolist_id}.json
```

#### List Todos

```bash
GET /basecamp/buckets/{project_id}/todolists/{todolist_id}/todos.json
```

**Response:**
```json
[
  {
    "id": 9550474446,
    "content": "Start here",
    "description": "",
    "completed": false,
    "due_on": null,
    "assignees": []
  }
]
```

#### Create Todo

```bash
POST /basecamp/buckets/{project_id}/todolists/{todolist_id}/todos.json
Content-Type: application/json

{
  "content": "New todo item",
  "description": "Todo description",
  "due_on": "2026-02-15",
  "assignee_ids": [51197030]
}
```

**Response:**
```json
{
  "id": 9555973289,
  "content": "New todo item",
  "completed": false
}
```

#### Update Todo

```bash
PUT /basecamp/buckets/{project_id}/todos/{todo_id}.json
Content-Type: application/json

{
  "content": "Updated todo",
  "description": "Updated description"
}
```

#### Complete Todo

```bash
POST /basecamp/buckets/{project_id}/todos/{todo_id}/completion.json
```

Returns 204 on success.

#### Uncomplete Todo

```bash
DELETE /basecamp/buckets/{project_id}/todos/{todo_id}/completion.json
```

### Message Board O
Read full documentation on ClawHub
Security scan, version history, and community comments: view on ClawHub