BuildChart REST API

Build integrations with the BuildChart API.

Ready to integrate?

Create a free account to get your API key. API access is available on the Business plan.

Authentication

Include your API key in the Authorization header:

curl -H "Authorization: Bearer cg_live_xxxxxxxxxxxx" \
  https://your-domain.com/api/v1/projects

API keys are generated in your account settings after signing up. API access is available on the Business plan.

Rate Limits

API access is available on Business plans. Rate limits are enforced per API key. Exceeding limits returns HTTP 429.

PlanPer MinutePer DayPer Month
Business1,000100,0001,000,000

Response headers include X-RateLimit-Limit, X-RateLimit-Remaining, and Retry-After.

Circuit breaker: Keys making 3x their normal rate in any 5-minute window are automatically suspended. Unsuspend from /account/api-keys.

Base URL

https://your-domain.com/api/v1

Response Format

// Success
{ "data": { ... }, "error": null }

// Error
{ "data": null, "error": "Error message" }

Endpoints

GET/api/v1/healthPublic

Health check

Response:

{ "status": "ok", "timestamp": "...", "version": "1.0" }
GET/api/v1/me

Current user info

Response:

{ "user_id": "uuid", "scope": "read_write", "profile": {...}, "project_count": 5 }
GET/api/v1/projects

List all projects

Response:

[{ "id": "uuid", "name": "New Home Build", "start_date": "2026-05-01", ... }]
GET/api/v1/projects/[id]

Get project with tasks and members

Response:

{ "id": "uuid", "name": "...", "tasks": [...], "members": [...] }
GET/api/v1/projects/[id]/tasks

List tasks (filterable)

Query params: ?status=In+Progress&section=Execution&assignee=Mike

Response:

[{ "id": "uuid", "activity": "Framing", "status": "In Progress", ... }]
POST/api/v1/projects/[id]/tasks

Create new task

Request body:

{ "activity": "Framing", "start_date": "2026-05-04", "end_date": "2026-05-15", "section": "Execution" }

Response:

{ "id": "uuid", "activity": "Framing", ... }
PATCH/api/v1/projects/[id]/tasks/[taskId]

Update task

Request body:

{ "status": "Complete", "percent_done": 1 }

Response:

{ "id": "uuid", "status": "Complete", ... }
DELETE/api/v1/projects/[id]/tasks/[taskId]

Delete task

Response:

{ "deleted": true }
GET/api/v1/projects/[id]/members

List project members

Response:

[{ "user_id": "uuid", "role": "subcontractor", ... }]
GET/api/v1/projects/[id]/activity

Activity log

Query params: ?limit=20&offset=0

Response:

{ "entries": [...], "total": 42, "limit": 20, "offset": 0 }

Webhooks

Receive real-time events when things change in BuildChart.

Events

task.createdtask.updatedtask.completedtask.deletedtask.overdueproject.createdproject.updatedaction.pending_approvalaction.executed

Signature Verification

const crypto = require('crypto');
const signature = req.headers['x-webhook-signature'];
const expected = 'sha256=' + crypto
  .createHmac('sha256', webhookSecret)
  .update(JSON.stringify(req.body))
  .digest('hex');
if (signature !== expected) throw new Error('Invalid signature');

Code Examples

JavaScript / Node.js

const res = await fetch('https://your-domain.com/api/v1/projects', {
  headers: { 'Authorization': 'Bearer cg_live_xxxx' }
});
const { data } = await res.json();
console.log(data); // Array of projects

Python

import requests
headers = {"Authorization": "Bearer cg_live_xxxx"}
r = requests.get("https://your-domain.com/api/v1/projects", headers=headers)
projects = r.json()["data"]