Access the Basecamp 4 API with managed OAuth authentication. Manage projects, to-dos, messages, schedules, documents, and team collaboration.
Reference
Get Current User
GET /basecamp/my/profile.jsonResponse:
{
"id": 51197030,
"name": "Chris Kim",
"email_address": "chris@example.com",
"admin": true,
"owner": true,
"time_zone": "America/Los_Angeles",
"avatar_url": "https://..."
}List People
GET /basecamp/people.jsonResponse:
[
{
"id": 51197030,
"name": "Chris Kim",
"email_address": "chris@example.com",
"admin": true,
"owner": true,
"employee": true,
"time_zone": "America/Los_Angeles"
}
]Get Person
GET /basecamp/people/{person_id}.jsonList Project Members
GET /basecamp/projects/{project_id}/people.jsonList Projects
GET /basecamp/projects.jsonResponse:
[
{
"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
GET /basecamp/projects/{project_id}.jsonThe project response includes a dock array with available tools (message_board, todoset, vault, chat, schedule, etc.). Each dock item has:
id: The tool's IDname: Tool type (e.g., "todoset", "message_board")enabled: Whether the tool is activeurl: Direct URL to access the tool
Create Project
POST /basecamp/projects.json
Content-Type: application/json
{
"name": "New Project",
"description": "Project description"
}Update Project
PUT /basecamp/projects/{project_id}.json
Content-Type: application/json
{
"name": "Updated Project Name",
"description": "Updated description"
}Delete (Trash) Project
DELETE /basecamp/projects/{project_id}.jsonGet Todoset
First, get the todoset ID from the project's dock:
GET /basecamp/buckets/{project_id}/todosets/{todoset_id}.jsonList Todolists
GET /basecamp/buckets/{project_id}/todosets/{todoset_id}/todolists.jsonResponse:
[
{
"id": 9550474442,
"title": "Basecamp essentials",
"description": "",
"completed": false,
"completed_ratio": "0/5",
"url": "https://..."
}
]Create Todolist
POST /basecamp/buckets/{project_id}/todosets/{todoset_id}/todolists.json
Content-Type: application/json
{
"name": "New Todo List",
"description": "List description"
}Get Todolist
GET /basecamp/buckets/{project_id}/todolists/{todolist_id}.jsonList Todos
GET /basecamp/buckets/{project_id}/todolists/{todolist_id}/todos.jsonResponse:
[
{
"id": 9550474446,
"content": "Start here",
"description": "",
"completed": false,
"due_on": null,
"assignees": []
}
]Create Todo
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:
{
"id": 9555973289,
"content": "New todo item",
"completed": false
}Update Todo
PUT /basecamp/buckets/{project_id}/todos/{todo_id}.json
Content-Type: application/json
{
"content": "Updated todo",
"description": "Updated description"
}Complete Todo
POST /basecamp/buckets/{project_id}/todos/{todo_id}/completion.jsonReturns 204 on success.
Uncomplete Todo
DELETE /basecamp/buckets/{project_id}/todos/{todo_id}/completion.jsonGet Message Board
GET /basecamp/buckets/{project_id}/message_boards/{message_board_id}.jsonList Messages
GET /basecamp/buckets/{project_id}/message_boards/{message_board_id}/messages.jsonCreate Message
POST /basecamp/buckets/{project_id}/message_boards/{message_board_id}/messages.json
Content-Type: application/json
{
"subject": "Message Subject",
"content": "<p>Message body with HTML</p>",
"category_id": 123
}Get Message
GET /basecamp/buckets/{project_id}/messages/{message_id}.jsonUpdate Message
PUT /basecamp/buckets/{project_id}/messages/{message_id}.json
Content-Type: application/json
{
"subject": "Updated Subject",
"content": "<p>Updated content</p>"
}Get Schedule
GET /basecamp/buckets/{project_id}/schedules/{schedule_id}.jsonList Schedule Entries
GET /basecamp/buckets/{project_id}/schedules/{schedule_id}/entries.jsonCreate Schedule Entry
POST /basecamp/buckets/{project_id}/schedules/{schedule_id}/entries.json
Content-Type: application/json
{
"summary": "Team Meeting",
"description": "Weekly sync",
"starts_at": "2026-02-15T14:00:00Z",
"ends_at": "2026-02-15T15:00:00Z",
"all_day": false,
"participant_ids": [51197030]
}Update Schedule Entry
PUT /basecamp/buckets/{project_id}/schedule_entries/{entry_id}.json
Content-Type: application/json
{
"summary": "Updated Meeting",
"starts_at": "2026-02-15T15:00:00Z",
"ends_at": "2026-02-15T16:00:00Z"
}Get Vault
GET /basecamp/buckets/{project_id}/vaults/{vault_id}.jsonList Documents in Vault
GET /basecamp/buckets/{project_id}/vaults/{vault_id}/documents.jsonCreate Document
POST /basecamp/buckets/{project_id}/vaults/{vault_id}/documents.json
Content-Type: application/json
{
"title": "Document Title",
"content": "<p>Document content with HTML</p>"
}List Uploads in Vault
GET /basecamp/buckets/{project_id}/vaults/{vault_id}/uploads.jsonList All Campfires
GET /basecamp/chats.jsonGet Campfire
GET /basecamp/buckets/{project_id}/chats/{chat_id}.jsonList Campfire Lines (Messages)
GET /basecamp/buckets/{project_id}/chats/{chat_id}/lines.jsonCreate Campfire Line
POST /basecamp/buckets/{project_id}/chats/{chat_id}/lines.json
Content-Type: application/json
{
"content": "Hello from the API!"
}List Comments on Recording
GET /basecamp/buckets/{project_id}/recordings/{recording_id}/comments.jsonCreate Comment
POST /basecamp/buckets/{project_id}/recordings/{recording_id}/comments.json
Content-Type: application/json
{
"content": "<p>Comment text</p>"
}Trash Recording
PUT /basecamp/buckets/{project_id}/recordings/{recording_id}/status/trashed.jsonArchive Recording
PUT /basecamp/buckets/{project_id}/recordings/{recording_id}/status/archived.jsonUnarchive Recording
PUT /basecamp/buckets/{project_id}/recordings/{recording_id}/status/active.jsonList Templates
GET /basecamp/templates.jsonCreate Project from Template
POST /basecamp/templates/{template_id}/project_constructions.json
Content-Type: application/json
{
"name": "New Project from Template",
"description": "Description"
}