Basecamp Templates API

Manage project templates and construct projects from them

OpenAPI Specification

basecamp-templates-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Basecamp Authorization Templates 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: Templates
  description: Manage project templates and construct projects from them
paths:
  /templates.json:
    get:
      operationId: listTemplates
      summary: List templates
      description: Returns a paginated list of active project templates visible to the authenticated user. Optionally filter by status.
      tags:
      - Templates
      parameters:
      - name: status
        in: query
        description: Filter templates by status.
        required: false
        schema:
          type: string
          enum:
          - archived
          - trashed
      responses:
        '200':
          description: List of templates
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Template'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createTemplate
      summary: Create a template
      description: Creates a new project template with the given name and optional description. Returns the template with a 201 Created status.
      tags:
      - Templates
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TemplateCreateRequest'
      responses:
        '201':
          description: Template created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Template'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /templates/{templateId}.json:
    get:
      operationId: getTemplate
      summary: Get a template
      description: Returns the project template with the given ID.
      tags:
      - Templates
      parameters:
      - $ref: '#/components/parameters/TemplateId'
      responses:
        '200':
          description: Template details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Template'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateTemplate
      summary: Update a template
      description: Updates the name and description of an existing project template.
      tags:
      - Templates
      parameters:
      - $ref: '#/components/parameters/TemplateId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TemplateCreateRequest'
      responses:
        '200':
          description: Updated template
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Template'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteTemplate
      summary: Delete a template
      description: Moves the template with the given ID to trash.
      tags:
      - Templates
      parameters:
      - $ref: '#/components/parameters/TemplateId'
      responses:
        '204':
          description: Template trashed
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /templates/{templateId}/project_constructions.json:
    post:
      operationId: createProjectFromTemplate
      summary: Create project from template
      description: Starts the construction of a new project based on the given template. Returns a project construction object whose status can be polled until it transitions from "pending" to "completed".
      tags:
      - Templates
      parameters:
      - $ref: '#/components/parameters/TemplateId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProjectConstructionRequest'
      responses:
        '201':
          description: Project construction initiated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectConstruction'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /templates/{templateId}/project_constructions/{constructionId}.json:
    get:
      operationId: getProjectConstruction
      summary: Get project construction status
      description: Returns the current status of a project construction job. Poll this endpoint until status changes from "pending" to "completed".
      tags:
      - Templates
      parameters:
      - $ref: '#/components/parameters/TemplateId'
      - $ref: '#/components/parameters/ConstructionId'
      responses:
        '200':
          description: Project construction status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectConstruction'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    ConstructionId:
      name: constructionId
      in: path
      required: true
      description: Unique identifier of the project construction job
      schema:
        type: integer
    TemplateId:
      name: templateId
      in: path
      required: true
      description: Unique identifier of the template
      schema:
        type: integer
  schemas:
    Template:
      type: object
      required:
      - id
      - name
      - status
      properties:
        id:
          type: integer
          description: Template ID
        status:
          type: string
          description: Template status
          enum:
          - active
          - archived
          - trashed
        created_at:
          type: string
          format: date-time
          description: Timestamp when the template was created
        updated_at:
          type: string
          format: date-time
          description: Timestamp when the template was last updated
        name:
          type: string
          description: Template name
        description:
          type: string
          description: Template description
          nullable: true
        url:
          type: string
          format: uri
          description: API URL for this template
        app_url:
          type: string
          format: uri
          description: Web URL for this template
        dock:
          type: array
          description: Tools available in this template
          items:
            $ref: '#/components/schemas/DockItem'
    ProjectConstruction:
      type: object
      properties:
        id:
          type: integer
          description: Project construction job ID
        status:
          type: string
          description: Construction status
          enum:
          - pending
          - completed
        url:
          type: string
          format: uri
          description: API URL to poll for this construction job
        project:
          $ref: '#/components/schemas/Project'
          description: The resulting project once construction is completed
    ProjectConstructionRequest:
      type: object
      required:
      - project
      properties:
        project:
          type: object
          required:
          - name
          properties:
            name:
              type: string
              description: Name for the new project being constructed
            description:
              type: string
              description: Optional description for the new project
    TemplateCreateRequest:
      type: object
      required:
      - name
      properties:
        name:
          type: string
          description: Template name
        description:
          type: string
          description: Optional template description
    DockItem:
      type: object
      description: A tool available on a project's dock
      properties:
        id:
          type: integer
          description: Dock item ID
        title:
          type: string
          description: Display title of the tool
        name:
          type: string
          description: Internal name of the tool (e.g., message_board, todoset)
        enabled:
          type: boolean
          description: Whether this tool is enabled on the project
        position:
          type: integer
          description: Display position of the tool in the dock
          nullable: true
        url:
          type: string
          format: uri
          description: API URL for this tool's resource
        app_url:
          type: string
          format: uri
          description: Web URL for this tool's resource
    Project:
      type: object
      required:
      - id
      - name
      - status
      properties:
        id:
          type: integer
          description: Unique project identifier
        status:
          type: string
          description: Project status (active, archived, trashed)
          enum:
          - active
          - archived
          - trashed
        created_at:
          type: string
          format: date-time
          description: Timestamp when the project was created
        updated_at:
          type: string
          format: date-time
          description: Timestamp when the project was last updated
        name:
          type: string
          description: Project name
        description:
          type: string
          description: Project description
          nullable: true
        purpose:
          type: string
          description: Project purpose classification
        clients_enabled:
          type: boolean
          description: Whether client access is enabled for this project
        timesheet_enabled:
          type: boolean
          description: Whether timesheets are enabled for this project
        color:
          type: string
          description: Project color identifier
          nullable: true
        url:
          type: string
          format: uri
          description: API URL for this project
        app_url:
          type: string
          format: uri
          description: Web URL for this project
        bookmark_url:
          type: string
          format: uri
          description: API URL to bookmark this project
        dock:
          type: array
          description: List of tools available on this project
          items:
            $ref: '#/components/schemas/DockItem'
    Error:
      type: object
      properties:
        error:
          type: string
          description: Human-readable error message
  responses:
    BadRequest:
      description: Bad request — missing required fields or invalid values
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Not found — the requested resource does not exist
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Unauthorized — missing or invalid Bearer token
      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