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.
OpenClaw skills run inside an OpenClaw container. EasyClawd deploys and manages yours — no server setup needed.
- Added clawdbot metadata to SKILL.md, including an emoji and environment variable requirements. - No functional or API changes. Documentation only.
---
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 ORead full documentation on ClawHub