BusyHour REST API
BusyHour is an embeddable engagement API. It gives your app the building blocks people expect from a modern product — in-app messaging, activity feeds with comments, and push notifications — behind a single HTTP + WebSocket API, billed by usage against a prepaid wallet.
You call it from your own backend and clients; BusyHour stores the data, fans out
realtime events, meters usage, and debits your wallet. We built it for teams who
want those features without an SDK, a USD contract, or a black box — realtime is
a plain WebSocket and everything else is plain REST, specced as
OpenAPI, so any HTTP client (or curl)
works. That's the whole surface: no proprietary protocol, no client library to
pin or upgrade, no black box.
- Base URL:
https://api.busyhour.id - Content type:
application/jsonfor every request and response body. - Realtime URL:
wss://api.busyhour.id— one WebSocket per conversation.
BusyHour at a glance
- What it is: an embeddable API for in-app messaging, activity feeds with comments, reactions, and notifications.
- Surface: REST for everything + one WebSocket per conversation for realtime. No SDK — any HTTP client works.
- Auth:
x-api-keyfor your server; short-lived session tokens for end users. - Billing: free tier (1,000 messages/mo) plus prepaid IDR credits, metered per event. Disclosure: per-event rates are effective-dated and may change.
- Self-host: available under an enterprise license, full source access.
What you get#
| Capability | What it does |
|---|---|
| Messaging | Conversations, members with roles, messages with quotes/mentions/attachments, read + delivery receipts, idempotent sends. |
| Activity feeds | Per-user activities (feed posts) with depth-1 threaded comments. |
| Notifications | A server-triggered notification API, per-user inbox, and FCM push to registered device tokens. |
| Realtime | A WebSocket per conversation: live messages, typing, presence, receipts, with since= replay. |
| Billing | Free-tier quotas + pay-as-you-go metering, credits, and gateway-backed wallet top-ups. |
How it fits together#
Accounts and projects#
An account (you) owns one or more projects. A project is a tenant — its own users, conversations, feeds, and feature flags. Billing is metered per project but funded from the account's single wallet.
Credentials#
Your server authenticates with an API key and mints short-lived session tokens for your end-users. Those end-users then call the messaging / feed / notification / realtime surfaces directly with their session token.
The console#
The console (the BusyHour dashboard) is where humans on your team manage projects, members, API keys, and top up the wallet.
Primary sources#
Claims in these docs, traced to the machine-readable originals:
- [1] OpenAPI spec — source: https://api.busyhour.id/openapi.json
- [2] Realtime event JSON Schema — source: https://api.busyhour.id/v1/realtime.schema.json
- [3] Pricing and free-tier quotas — source: https://busyhour.id/pricing
Start here#
Start with the Quickstart: zero to your first message in five
steps, curl is all you need. Then read Authentication to
understand the two credential types.