openapi: 3.1.0
info:
title: Basecamp Authorization Token API
description: The Basecamp API is a REST API that provides programmatic access to Basecamp's project management and team communication platform. It enables developers to manage projects, to-do lists, messages, documents, schedules, campfires, uploads, card tables, templates, and team members across Basecamp accounts. The API uses OAuth 2.0 for authentication and returns JSON responses, with all requests scoped to an account ID in the base URL path. Resources include projects, people, to-dos, message boards, documents, card tables, campfires, questionnaires, and webhooks, covering the full breadth of Basecamp's collaboration toolset.
version: '1.0'
contact:
name: Basecamp Developer Support
url: https://github.com/basecamp/bc3-api
termsOfService: https://basecamp.com/terms
servers:
- url: https://3.basecampapi.com/{accountId}
description: Production Server
variables:
accountId:
description: Your Basecamp account ID
default: '999999999'
security:
- bearerAuth: []
tags:
- name: Token
description: Token exchange and refresh endpoints
paths:
/authorization/token:
post:
operationId: exchangeCodeForToken
summary: Exchange code for token
description: Exchanges an authorization code for an access token and refresh token. The authorization code is single-use and expires shortly after being issued. The resulting access token expires after two weeks.
tags:
- Token
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/TokenRequest'
responses:
'200':
description: Access token and refresh token
content:
application/json:
schema:
$ref: '#/components/schemas/TokenResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/authorization/token/refresh:
post:
operationId: refreshAccessToken
summary: Refresh access token
description: Uses a refresh token to obtain a new access token without requiring the user to re-authorize. Refresh tokens do not expire but are revoked if the user revokes access.
tags:
- Token
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/RefreshTokenRequest'
responses:
'200':
description: New access token
content:
application/json:
schema:
$ref: '#/components/schemas/TokenResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
components:
schemas:
TokenRequest:
type: object
required:
- type
- client_id
- client_secret
- code
- redirect_uri
properties:
type:
type: string
description: Must be set to "web_server"
enum:
- web_server
client_id:
type: string
description: Your application's client ID
client_secret:
type: string
description: Your application's client secret
code:
type: string
description: The authorization code received from the authorization redirect
redirect_uri:
type: string
format: uri
description: The redirect URI used in the authorization request
RefreshTokenRequest:
type: object
required:
- type
- client_id
- client_secret
- refresh_token
properties:
type:
type: string
description: Must be set to "refresh"
enum:
- refresh
client_id:
type: string
description: Your application's client ID
client_secret:
type: string
description: Your application's client secret
refresh_token:
type: string
description: The refresh token from a previous token exchange
TokenResponse:
type: object
properties:
access_token:
type: string
description: Bearer token to use in API requests
refresh_token:
type: string
description: Token used to obtain new access tokens after expiry
expires_in:
type: integer
description: Access token lifetime in seconds (approximately two weeks)
token_type:
type: string
description: Token type, always "Bearer"
enum:
- Bearer
Error:
type: object
properties:
error:
type: string
description: Human-readable error message
responses:
Unauthorized:
description: Unauthorized — invalid or expired credentials
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: Bad request — missing or invalid parameters
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: 'OAuth 2.0 Bearer token obtained via the Basecamp authorization code flow at launchpad.37signals.com. Include as "Authorization: Bearer {token}" in all requests.'
externalDocs:
description: Basecamp API Documentation
url: https://github.com/basecamp/bc3-api