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
AvailableQuery 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
AvailableAuthenticate 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
- Sign in to the Rolodex dashboard
- Navigate to Settings → API Keys
- Create a new key for your service account (requires org:admin role)
- 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
AvailableRegister a URL to receive HMAC-signed POST notifications when directory resources change. Each webhook delivery includes a signature header for verification.
Supported Events
| Event | Description |
|---|---|
| user.public_changed | A user's public visibility changed |
| group.public_changed | A group's public visibility changed |
| directory.synced | Directory sync completed |
| webhook.test | Test 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: