§ 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 discover eligible talks and idempotently update recording metadata with a scoped token.
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
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.
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 through GET /api/v1/me.
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.