§ Developer platform
Build on
bitcoin++.
Published event data is open to everyone. Account and administrative operations use narrowly scoped bearer tokens with live ownership and role checks.
01 / Start here
Quick start
The stable base URL is https://btcpp.dev/api/v1. Public reads need no credentials and return only data already published on the website.
curl -H 'Accept: application/json' \
https://btcpp.dev/api/v1/bootstrap
The OpenAPI 3.1 JSON document contains complete schemas and response definitions.
02 / Public resources
Conferences
Discover published events, their configured days, public agenda, speakers, sponsors, and talks.
03 / Public resources
People
Public people records are holistic: profiles include published talks, conference appearances, and hackathon projects without exposing email addresses or private contact data.
04 / Public + admin
Recordings
Browse published recordings anonymously. Conference and global admins can update recording metadata, then start, heartbeat, and stop HLS broadcasts with a scoped token. Global-admin services can incrementally poll the broadcast-plan feed to reconcile recording sources, release times, and destinations.
05 / Accounts admin
Shop accounting
Services acting for a profile with accts-admin can synchronize the current merchandise inventory ledger and inventory-affecting sales without receiving customer names, email addresses, shipping data, or payment credentials. Ticket registrations are canonical, so mixed ticket and merchandise checkouts are not counted twice.
05 / Public resources
Hackathons
Browse public competitions, submitted projects, confirmed teammates, published awards, and finalized results. Draft and disqualified projects remain private.
06 / Authentication
Bearer tokens
Protected endpoints accept a personal API token created in Account Settings or an OAuth access token. Credentials belong only in the HTTP Authorization header—never in URLs.
curl -H 'Authorization: Bearer YOUR_TOKEN' \
https://btcpp.dev/api/v1/me
Administrative calls require both the requested token scope and the account’s current conference or global-admin role.
07 / Protected resources
Account + talks
Applications can read and update the current person’s profile, list their talks, and edit shared talk content. Schedule placement remains restricted to event administrators.
08 / Authorization
Scopes
identity:self:readRead your account ID, display name, and current roles.
profile:self:readRead your private account projection.
profile:self:writeUpdate your public profile fields.
talks:readRead talks associated with your account.
talks:writeEdit talks you speak at.
schedule:writeSchedule talks when you administer the event.
recordings:writeManage event recording metadata.
shop:accounting:readRead PII-free shop inventory and sales. Only profiles with accts-admin can create or use this credential.
offline_accessOAuth only: request a rotating refresh token.
09 / OAuth
Authorization code + PKCE
Native, browser, and server-backed applications use the authorization-code flow. S256 PKCE, an exact registered redirect URI, and state are required.
/oauth/authorize/oauth/token/oauth/revoke/.well-known/oauth-authorization-serverAccess tokens last one hour. Approved offline_access grants a rotating 30-day refresh token. Bitcoin++ currently provides OAuth authorization, not OpenID Connect; identify the signed-in person and inspect their current roles through GET /api/v1/me/identity.
10 / Protocol
Conventions + errors
- JSON keys use
snake_case; timestamps use RFC 3339. - Growing collections accept
limit(maximum 100) and an opaquecursor. - Public GET responses use ETags and short-lived caching.
- Mutations reject unknown fields; schedule collisions return
409 schedule_conflict. - Errors include a stable code, human-readable message, and request ID.
{
"error": {
"code": "insufficient_scope",
"message": "The token does not grant the required scope.",
"request_id": "..."
}
}
11 / Operations
Rate limits
Initial limits are 120 public reads per minute per IP, 600 authenticated reads per minute per token, 60 ordinary mutations per minute, and 10 recording writes per minute. A 429 response includes Retry-After.