basecamp / basecamp/basecamp-sdk
Expose scheduled publishing for drafts (`scheduled_posting_at`) as a writable field
- Dominant language
- Go
- Stars
- 49
- Forks
- 12
- Avg merge
- 20h 47m
- Merged PRs (30d)
- 89
Description
**Summary**
The web app can schedule a draft message to publish later ("Post later…" in the message editor), and the API already reports the result: `GET /my/drafts.json` returns `scheduled_posting_at`, documented in bc-api `sections/drafts.md` as "null unless the draft is scheduled to publish later", and the OpenAPI spec in this repository carries it as a required, nullable property of the draft object. There is no way to set it. Requesting a write path so integrations can stage a draft and have Basecamp publish it at a chosen time.
**What I tried**
- `PUT /buckets/{bucket_id}/messages/{message_id}.json` with `{"scheduled_posting_at": "2026-09-07T16:00:00Z"}` returns 200 and the message unchanged; the drafts listing still shows `null`. Wrapping it as `{"message": {...}}` behaves the same.
- The documented update parameters are `subject`, `content`, `category_id`, `subscriptions`, and `notify`; the create parameters add `status` and `visible_to_clients`. Neither accepts a posting time.
- The OpenAPI spec has no schedule operation on any message path; the only occurrence of `scheduled_posting_at` is the read-only draft projection.
- Setting the time through the web editor works and is then visible through `GET /my/drafts.json`, so the field round-trips fine on the read side.
**Why it matters**
We generate a weekly company report as a draft from an automation account and want Basecamp itself to publish it at 9:00 AM on Monday. Without a write path we have to keep a separate scheduler alive to call the publish endpoint at that moment, which is fragile compared with letting Basecamp own the timing the way the editor already does.
**Proposal**
Accept `scheduled_posting_at` (ISO 8601) on message create and update while `status` is `drafted`; publishing at that time would behave exactly as the editor's "Schedule and save". Sending `null` would clear the schedule. Documenting the account or user timezone rule for the value would help too: in our testing, the editor interprets the picked hour in the posting account's timezone, so two accounts in the same company scheduled "9:00 AM" and landed an hour apart.
**Environment**
Basecamp 4, account with two API identities (a person and an automation user), calls made through the official CLI and raw `PUT` requests, September 2026.
Contributor guide
Research direction
Start with the OpenAPI draft schema and the message create and update paths, then compare them with bc-api sections/drafts.md and the web editor behavior described here. Trace how the official CLI sends draft message writes and identify the existing publish path. Done means scheduled_posting_at can be set or cleared on draft create/update, publishes at the documented time-zone rule, and is reflected in the OpenAPI spec.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go, openapi
- Domain
- api, backend-api-design
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100