Developers

Build on an open, searchable directory. Rolodex exposes a public search API, webhooks for real-time change notifications, and API keys for authenticated directory access. The unix-style permission model (user/group/other × view/edit/delete) makes publicly-visible resources discoverable — enabling an ecosystem of integrations.

Public Search API

Available

Query publicly-visible users and groups without authentication. PII is redacted; results are rate-limited to prevent scraping.

Endpoint

GET https://rolodex-api.fleetworks.dev/public/search?q=<query>&type=<all|users|groups>

Example Request

curl "https://rolodex-api.fleetworks.dev/public/search?q=engineering&type=users"

Example Response

{
  "users": [
    {
      "displayName": "Alice Engineer",
      "sAMAccountName": "aengineer",
      "title": "Senior Engineer",
      "businessCategory": "Engineering",
      "isServiceAccount": false,
      "objectGUID": "a1b2c3d4-...",
      "memberOf": [{"group_name": "eng-platform"}]
    }
  ],
  "groups": [],
  "query": "engineering",
  "count": 1
}

Note:Only resources with the public visibility bit set (mode & 4 = other-view) appear in results. PII fields (birthDate, telephoneNumber) are omitted.

API Keys

Available

Authenticate with a Personal Access Token (PAT) for machine-to-machine access.dg_-prefixed tokens are issued by org admins and scoped to a service account.

PATs hold the ci:agentmachine role, which does not sit on the org permission ladder. The directory lookup endpoints carry employee PII and require org:contributor or above, so they answer 403 to a PAT. Use the unauthenticated public search surface for machine directory reads.

Every other authenticated surface (service accounts, webhooks, sync, access, directory admin) requires org:admin, which a PAT also cannot hold. A PAT therefore currently authenticates but authorizes only GET /api/me.

How to Get a Key

  1. Sign in to the Rolodex dashboard
  2. Navigate to Settings → API Keys
  3. Create a new key for your service account (requires org:admin role)
  4. Copy the token (it will only be shown once)

Example Authenticated Request

curl -H "Authorization: Bearer dg_..." \
  "https://rolodex-api.fleetworks.dev/api/me"

Webhooks

Available

Register a URL to receive HMAC-signed POST notifications when directory resources change. Each webhook delivery includes a signature header for verification.

Supported Events

EventDescription
user.public_changedA user's public visibility changed
group.public_changedA group's public visibility changed
directory.syncedDirectory sync completed
webhook.testTest event for verification

Verifying Webhook Signatures

Each delivery carries X-Rolodex-Signature, X-Rolodex-Timestamp, and X-Rolodex-Delivery (dedup id). The signature covers timestamp + "." + rawBody — reject stale timestamps to defend against replay:

import crypto from 'crypto'

function verifySignature(body, headers, secret, toleranceSec = 300) {
  const ts = headers['x-rolodex-timestamp']
  const sig = headers['x-rolodex-signature']
  if (!ts || !sig) return false
  // Replay defense: reject stale/future timestamps.
  if (Math.abs(Date.now() - Date.parse(ts)) / 1000 > toleranceSec) return false

  const expected = 'sha256=' +
    crypto.createHmac('sha256', secret)
      .update(`${ts}.${body}`, 'utf8')
      .digest('hex')
  const a = Buffer.from(expected), b = Buffer.from(sig)
  return a.length === b.length && crypto.timingSafeEqual(a, b)
}

Register webhooks via Settings → Webhooks in the dashboard.

Permission Model

Rolodex uses a unix-style permission model: each resource has a modebitfield encoding user/group/other × view/edit/delete permissions. Public visibility is the "other-view" bit (504 = fail-closed private; 508 = public).

Permission Bits

  • User (owner): view (256), edit (128), delete (64)
  • Group(owner's group): view (32), edit (16), delete (8)
  • Other (public): view (4), edit (2), delete (1)

Example: mode 504 = 256 + 128 + 64 + 32 + 16 + 8 (owner full view/edit/delete + group full view/edit/delete, other bits unset) — the fail-closed private default.

Example: mode 508 = 504 + 4 (same owner/group permissions, plus the other-view bit) — publishes the resource to the public search API.

See docs/PERMISSIONS.md for the full specification.

OpenAPI Specification

The full API contract is available at: