Learn how to connect Bolt.new AI with Basecamp in 2025 using our simple step-by-step guide to boost workflow efficiency and team productivity.

Book a call with an Expert
Starting a new venture? Need to upgrade your web app? RapidDev builds application with your growth in mind.
To integrate Bolt.new with Basecamp, you treat Basecamp like any other external API: Bolt.new doesn’t have a built‑in connector, so you wire your app to Basecamp’s REST API using an OAuth2 flow, store the tokens as environment variables in Bolt.new, and then call Basecamp’s endpoints (projects, messages, to‑dos, etc.) from your backend code. In practice, this means creating a Basecamp OAuth application, implementing the OAuth callback inside your Bolt.new backend route, exchanging the “code” for an access token, then using that token to make real API calls. Basecamp’s API is standard JSON over HTTPS, which makes it straightforward to use from Node, Python, or any backend Bolt.new supports.
You connect Bolt.new to Basecamp through Basecamp’s REST API and OAuth2. There is no plugin or automatic connection — you manually implement the known API flow. Basecamp exposes well-documented endpoints (for example, to list projects or create to‑do items). Your Bolt.new backend calls these endpoints using normal HTTP requests.
This sequence works inside Bolt.new and in any production environment later:
This is a working pattern you can drop into Bolt.new’s server code. It uses standard fetch and environment variables.
import express from "express";
import fetch from "node-fetch";
const app = express();
// Pull secrets from environment variables in Bolt.new
const CLIENT_ID = process.env.BASECAMP_CLIENT_ID;
const CLIENT_SECRET = process.env.BASECAMP_CLIENT_SECRET;
const REDIRECT_URI = process.env.BASECAMP_REDIRECT_URI;
// Step: Redirect user to Basecamp OAuth
app.get("/api/basecamp/auth", (req, res) => {
const authUrl = `https://launchpad.37signals.com/authorization/new?type=web_server&client_id=${CLIENT_ID}&redirect_uri=${encodeURIComponent(REDIRECT_URI)}`;
res.redirect(authUrl);
});
// Step: Handle OAuth callback
app.get("/api/basecamp/callback", async (req, res) => {
const { code } = req.query;
// Exchange code for token
const tokenRes = await fetch("https://launchpad.37signals.com/authorization/token?type=web_server", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
redirect_uri: REDIRECT_URI,
code: code
})
});
const tokenData = await tokenRes.json();
// At this point tokenData.access_token is what you use for Basecamp API calls
// In a real app you would store this in a DB or user session
res.json(tokenData);
});
// Example: Fetch Basecamp projects using access token
app.get("/api/basecamp/projects", async (req, res) => {
const token = req.headers["authorization"];
// Expected: "Bearer <access_token>"
const apiRes = await fetch("https://3.basecampapi.com/<ACCOUNT_ID>/projects.json", {
method: "GET",
headers: {
"Authorization": token,
"User-Agent": "YourAppName ([email protected])"
}
});
const data = await apiRes.json();
res.json(data);
});
export default app;
When it comes to serving you, we sweat the little things. That’s why our work makes a big impact.