DevBarDevBar

API Reference

The DevBar REST API base URL is https://api.devbar.app. All endpoints are prefixed with /api/v1.

Authentication: Endpoints marked Auth required require a Bearer token in the Authorization header: Authorization: Bearer <access_token>
Rate Limits: Most authenticated endpoints allow 120 requests per minute per user. Authentication endpoints (login, register) are limited to 10 requests per 15 minutes per IP. Responses include X-RateLimit-Remaining and X-RateLimit-Reset headers. When rate-limited you receive a 429 response.
Base URL: https://api.devbar.app/api/v1. EU customers use https://eu.api.devbar.app/api/v1.

Authentication

MethodPath
POST/auth/register
POST/auth/login
POST/auth/refresh
POST/auth/forgot-password
POST/auth/reset-password
POST/auth/verify-email

OAuth

MethodPath
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.

MethodPath
GET/auth/device/authorize?port=&code_challenge=
GET/auth/device/status/:session_id?code_verifier=
POST/auth/device/complete
POST/auth/device/exchange

SAML

MethodPath
GET/auth/saml/metadata?org_id=
GET/auth/saml/login?org_id=
POST/auth/saml/acs

Users

MethodPath
GET/users/me
PATCH/users/me
GET/users/me/features

Tokens

MethodPath
GET/tokens
POST/tokens
PATCH/tokens/:id
DELETE/tokens/:id

Organisation

MethodPath
GET/org
PATCH/org
GET/org/members
DELETE/org/members/:userId
GET/org/invitations
POST/org/invitations
DELETE/org/invitations/:id

Workflows

MethodPath
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

MethodPath
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.

MethodPath
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.

MethodPath
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

MethodPath
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/plans

Response (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