API Reference
The DevBar REST API base URL is https://api.devbar.app. All endpoints are prefixed with /api/v1.
Authorization header: Authorization: Bearer <access_token>X-RateLimit-Remaining and X-RateLimit-Reset headers. When rate-limited you receive a 429 response.https://api.devbar.app/api/v1. EU customers use https://eu.api.devbar.app/api/v1.Authentication
| Method | Path |
|---|---|
| POST | /auth/register |
| POST | /auth/login |
| POST | /auth/refresh |
| POST | /auth/forgot-password |
| POST | /auth/reset-password |
| POST | /auth/verify-email |
OAuth
| Method | Path |
|---|---|
| GET | /auth/google |
| GET | /auth/github |
Device Auth
PKCE flow used by the macOS app: the browser sign-in is bound to a local port and a code challenge.
| Method | Path |
|---|---|
| GET | /auth/device/authorize?port=&code_challenge= |
| GET | /auth/device/status/:session_id?code_verifier= |
| POST | /auth/device/complete |
| POST | /auth/device/exchange |
SAML
| Method | Path |
|---|---|
| GET | /auth/saml/metadata?org_id= |
| GET | /auth/saml/login?org_id= |
| POST | /auth/saml/acs |
Users
| Method | Path |
|---|---|
| GET | /users/me |
| PATCH | /users/me |
| GET | /users/me/features |
Tokens
| Method | Path |
|---|---|
| GET | /tokens |
| POST | /tokens |
| PATCH | /tokens/:id |
| DELETE | /tokens/:id |
Organisation
| Method | Path |
|---|---|
| GET | /org |
| PATCH | /org |
| GET | /org/members |
| DELETE | /org/members/:userId |
| GET | /org/invitations |
| POST | /org/invitations |
| DELETE | /org/invitations/:id |
Workflows
| Method | Path |
|---|---|
| GET | /org/workflows |
| POST | /org/workflows |
| GET | /org/workflows/:id |
| PATCH | /org/workflows/:id |
| DELETE | /org/workflows/:id |
| POST | /org/workflows/:id/install |
| POST | /org/workflows/:id/fork |
| POST | /org/workflows/:id/publish |
| GET | /org/workflows/:id/runs |
| GET | /marketplace/workflows |
Admin
| Method | Path |
|---|---|
| GET | /admin/users |
| GET | /admin/orgs |
| GET | /admin/features |
| PATCH | /admin/features/:key |
| GET | /admin/plans |
| GET | /admin/audit-log |
| GET | /admin/email-config |
| PUT | /admin/email-config |
| GET | /admin/orgs/:id/saml |
| PUT | /admin/orgs/:id/saml |
| DELETE | /admin/orgs/:id/saml |
| POST | /admin/orgs/:id/saml/test |
| POST | /admin/orgs/:id/saml/scim-token |
| GET | /admin/audit-log-v2?from=&to= |
| GET | /admin/newsletter |
| GET | /admin/metrics/summary |
| GET | /admin/metrics |
Webhooks
Webhook receivers live at the API root (https://api.devbar.app/webhooks/...), not under /api/v1.
| Method | Path |
|---|---|
| POST | /webhooks/stripe |
| POST | /webhooks/paddle |
| POST | /webhooks/pagerduty |
| POST | /webhooks/github |
| POST | /webhooks/datadog |
| POST | /webhooks/inbound |
SCIM
SCIM is served at https://api.devbar.app/scim/v2 (not under /api/v1) and authenticated with the SCIM token generated for the organisation.
| Method | Path |
|---|---|
| GET | /scim/v2/Users |
| POST | /scim/v2/Users |
| GET | /scim/v2/Users/:id |
| PUT | /scim/v2/Users/:id |
| PATCH | /scim/v2/Users/:id |
| DELETE | /scim/v2/Users/:id |
WebSocket
| Method | Path |
|---|---|
| GET | /ws |
Request / Response Examples
Curl examples for the most commonly used endpoints. Replace bearer tokens with your own.
Authentication
POST /api/v1/auth/login
Request
curl -X POST https://api.devbar.app/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "[email protected]", "password": "s3cret!"}'Response (200)
{
"data": {
"user": { "id": "usr_abc123", "email": "[email protected]", "name": "Jane Doe" },
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"refresh_token": "dGhpcyBpcyBhIHJlZnJl..."
}
}Errors
- 401 Invalid credentials
- 429 Rate limited (10 req/15min)
POST /api/v1/auth/register
Request
curl -X POST https://api.devbar.app/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"name": "Jane Doe", "email": "[email protected]", "password": "s3cret!"}'Response (201)
{
"data": {
"user": { "id": "usr_abc123", "email": "[email protected]", "name": "Jane Doe" },
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"refresh_token": "dGhpcyBpcyBhIHJlZnJl..."
}
}Errors
- 409 Email already registered
- 422 Validation error (weak password, invalid email)
POST /api/v1/auth/refresh
Request
curl -X POST https://api.devbar.app/api/v1/auth/refresh \
-H "Content-Type: application/json" \
-d '{"refresh_token": "dGhpcyBpcyBhIHJlZnJl..."}'Response (200)
{
"data": {
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"refresh_token": "bmV3IHJlZnJlc2ggdG9r..."
}
}Errors
- 401 Invalid or expired refresh token
Tokens
POST /api/v1/tokens
Request
curl -X POST https://api.devbar.app/api/v1/tokens \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{"label": "CI Pipeline"}'Response (201)
{
"data": {
"token": { "id": "tok_xyz789", "label": "CI Pipeline", "token_prefix": "dvb_live_abc", "is_active": true },
"raw_token": "dvb_live_abc123..."
}
}Errors
- 401 Unauthorized
- 400 Missing or too long label
GET /api/v1/tokens
Request
curl https://api.devbar.app/api/v1/tokens \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIs..."Response (200)
{
"data": [
{
"id": "tok_xyz789",
"label": "CI Pipeline",
"token_prefix": "dvb_live_abc",
"is_active": true,
"last_verified_at": "2026-04-23T18:30:00Z",
"created_at": "2026-04-01T12:00:00Z"
}
]
}Errors
- 401 Unauthorized
Billing
GET /api/v1/billing/plans
Request
curl https://api.devbar.app/api/v1/billing/plansResponse (200)
{
"data": [
{ "slug": "solo", "name": "Solo", "price_monthly": 8, "max_seats": 1 },
{ "slug": "team", "name": "Team", "price_monthly": 12, "max_seats": 100 },
{ "slug": "enterprise", "name": "Enterprise", "price_monthly": 15, "max_seats": 1000 }
]
}POST /api/v1/billing/checkout
Request
curl -X POST https://api.devbar.app/api/v1/billing/checkout \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{"plan": "solo"}'Response (200)
{
"data": {
"checkout_url": "https://checkout.stripe.com/c/pay/cs_live_...",
"provider": "stripe"
}
}Errors
- 401 Unauthorized
- 400 Already subscribed to this plan
Announcements
GET /api/v1/announcements
Request
curl https://api.devbar.app/api/v1/announcements \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIs..."Response (200)
{
"data": [
{
"id": "ann_001",
"title": "v1.3.0 Released",
"body": "Free trial and storage provider choice now available.",
"created_at": "2026-04-20T10:00:00Z"
}
]
}Errors
- 401 Unauthorized
Webhooks
POST /webhooks/inbound accepts a structured JSON payload and routes the event to the user, org, or team associated with the token. The token query parameter is required and determines routing scope.
Request payload
{
"tab": string, // required — the source tab/platform label (e.g. "github", "pagerduty")
"title": string, // required — short event title shown in the menu bar
"message": string, // required — event body / detail text
"severity": string // optional — "info" | "warning" | "error" (default: "info")
}POST /webhooks/inbound
Request
curl -X POST "https://api.devbar.app/webhooks/inbound?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tab":"alerts","title":"Deploy failed","message":"Step build failed on main","severity":"error"}'Response (200)
{
"received": true
}Errors
- 400 Invalid JSON or missing title