PHPackages                             writecrow/basecamp\_api - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. writecrow/basecamp\_api

ActiveDrupal-module[API Development](/categories/api)

writecrow/basecamp\_api
=======================

Drupal integration for Basecamp API v3

1.1.0(3y ago)067GPL-2.0+PHP

Since Oct 4Pushed 1y ago1 watchersCompare

[ Source](https://github.com/writecrow/basecamp_api)[ Packagist](https://packagist.org/packages/writecrow/basecamp_api)[ Docs](https://github.com/writecrow/basecamp_api)[ RSS](/packages/writecrow-basecamp-api/feed)WikiDiscussions main Synced today

READMEChangelog (5)Dependencies (1)Versions (8)Used By (0)

Basecamp API v3 Integration
===========================

[](#basecamp-api-v3-integration)

This is a Drupal module that facilitates using the \[[https://github.com/basecamp/bc3-api\](Basecamp](https://github.com/basecamp/bc3-api](Basecamp) API v3).

As an integration module, this facilitates transactions between the Basecamp endpoints, and requires simple coding to achieve this.

After creating an authorized application &amp; storing the initial access token &amp; refresh token, this module will continue to renew the token via a cron job that runs once per day.

Once complete, actions, such as creating a new todo, are as simple as:

```
$data = [
  'content' => $title,
  'description' => $message,
  'due_on' => date('Y-m-d', strtotime('+7 days')),
  'notify' => TRUE,
  'assignee_ids' => [1,2,3],
];
$project = $config->get('project');
$list = $config->get('list');

Basecamp::createTodo($project, $list, $data);
```

Proper setup &amp; configuration of the refresh token
-----------------------------------------------------

[](#proper-setup--configuration-of-the-refresh-token)

At this time, creating the initial access &amp; refresh token is the purview of the developer (and it is pretty easy -- see ).

1. Sign in to Basecamp with the user ID that will provide the integration (in most cases, this should be identified as a non-human account so that people know that actions performed are being triggered by the Drupal integration).
2. Go to  and use the Authorization dialog to generate a 1-time code.
3. Trade this code for a [long-lived access token &amp; refresh token](https://github.com/basecamp/api/blob/master/sections/authentication.md#oauth-2-from-scratch):

```
curl -X POST -d "type=web_server&client_id=your-client-id&redirect_uri=your-redirect-uri&client_secret=your-client-secret&code=verification-code" https://launchpad.37signals.com/authorization/token
```

4. Set these tokens in Drupal's non-config-exportable State API:

```
vendor/bin/drush state:set basecamp_api_refresh_token
vendor/bin/drush state:set basecamp_api_access_token

```

5. **Important**: by default, this token will not refresh via cron so that development environments don't accidentally invalidate your access token in the production environment. For the token to be refreshed regularly in your production environment, add the following to your `settings.php` or equivalent:

```
$settings['basecamp_api_do_refresh'] = TRUE;

```

###  Health Score

30

—

LowBetter than 61% of packages

Maintenance34

Infrequent updates — may be unmaintained

Popularity8

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity60

Established project with proven stability

 Bus Factor1

Top contributor holds 90.9% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~168 days

Recently: every ~252 days

Total

7

Last Release

1136d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/4305692?v=4)[Mark Fullmer](/maintainers/markfullmer)[@markfullmer](https://github.com/markfullmer)

![](https://avatars.githubusercontent.com/u/27739911?v=4)[Corpus &amp; Repository of Writing (Crow)](/maintainers/writecrow)[@writecrow](https://github.com/writecrow)

---

Top Contributors

[![markfullmer](https://avatars.githubusercontent.com/u/4305692?v=4)](https://github.com/markfullmer "markfullmer (10 commits)")[![jmf3658](https://avatars.githubusercontent.com/u/34824280?v=4)](https://github.com/jmf3658 "jmf3658 (1 commits)")

---

Tags

basecamp3drupaldrupal

### Embed Badge

![Health badge](/badges/writecrow-basecamp-api/health.svg)

```
[![Health](https://phpackages.com/badges/writecrow-basecamp-api/health.svg)](https://phpackages.com/packages/writecrow-basecamp-api)
```

###  Alternatives

[helsingborg-stad/municipio

A bootstrap theme for creating municipality sites.

4028.6k10](/packages/helsingborg-stad-municipio)[october/rain

October Rain Library

1601.7M103](/packages/october-rain)[pressbooks/pressbooks

Pressbooks is an open source book publishing tool built on a WordPress multisite platform. Pressbooks outputs books in multiple formats, including PDF, EPUB, web, and a variety of XML flavours, using a theming/templating system, driven by CSS.

45844.8k1](/packages/pressbooks-pressbooks)[mediawiki/maps

Adds various mapping features to MediaWiki

85155.1k3](/packages/mediawiki-maps)[civicrm/civicrm-drupal-8

Open source constituent relationship management for non-profits, NGOs and advocacy organizations.

20256.6k4](/packages/civicrm-civicrm-drupal-8)[altis/core

Core module for Altis

19233.0k4](/packages/altis-core)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
