Claude-code-plugins-plus juicebox-enterprise-rbac

install
source · Clone the upstream repo
git clone https://github.com/jeremylongshore/claude-code-plugins-plus-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/jeremylongshore/claude-code-plugins-plus-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/saas-packs/juicebox-pack/skills/juicebox-enterprise-rbac" ~/.claude/skills/jeremylongshore-claude-code-plugins-plus-juicebox-enterprise-rbac && rm -rf "$T"
manifest: plugins/saas-packs/juicebox-pack/skills/juicebox-enterprise-rbac/SKILL.md
source content

Juicebox Enterprise RBAC

Overview

Juicebox provides AI-powered people search and analysis for recruiting and sales teams. Enterprise RBAC controls who can search candidate databases, enrich profiles with contact info, trigger outreach sequences, and export data. Workspace admins manage team seats and API usage limits. Analysts run searches but may be restricted from exporting PII. Viewers can review saved searches without accessing raw contact data. SOC 2 compliance requires audit logging on all data enrichment and export actions.

Role Hierarchy

RolePermissionsScope
Workspace AdminManage seats, billing, API keys, configure integrationsEntire workspace
RecruiterSearch, enrich, access contact info, run outreach campaignsAll datasets
AnalystSearch and enrich profiles, view analytics dashboardsAssigned datasets
SourcerSearch and enrich only, no contact reveal or outreachAssigned datasets
ViewerView saved searches and reports, no data access or exportRead-only

Permission Check

async function checkJuiceboxAccess(userId: string, action: string, datasetId: string): Promise<boolean> {
  const response = await fetch(`${JUICEBOX_API}/v1/workspaces/${WORKSPACE_ID}/permissions`, {
    headers: { Authorization: `Bearer ${JUICEBOX_API_KEY}`, 'Content-Type': 'application/json' },
  });
  const perms = await response.json();
  const user = perms.members.find((m: any) => m.id === userId);
  if (!user) return false;
  const rolePerms = ROLE_PERMISSIONS[user.role];
  return rolePerms?.[action] && (user.datasets.includes(datasetId) || user.role === 'admin');
}

Role Assignment

async function assignWorkspaceRole(email: string, role: string, datasets: string[]): Promise<void> {
  await fetch(`${JUICEBOX_API}/v1/workspaces/${WORKSPACE_ID}/members`, {
    method: 'POST',
    headers: { Authorization: `Bearer ${JUICEBOX_API_KEY}`, 'Content-Type': 'application/json' },
    body: JSON.stringify({ email, role, datasetAccess: datasets }),
  });
}

async function revokeAccess(email: string): Promise<void> {
  await fetch(`${JUICEBOX_API}/v1/workspaces/${WORKSPACE_ID}/members/${email}`, {
    method: 'DELETE',
    headers: { Authorization: `Bearer ${JUICEBOX_API_KEY}` },
  });
}

Audit Logging

interface JuiceboxAuditEntry {
  timestamp: string; userId: string; role: string;
  action: 'search' | 'enrich' | 'contact_reveal' | 'export' | 'outreach' | 'role_change';
  datasetId: string; recordCount?: number; result: 'allowed' | 'denied';
}

function logAccess(entry: JuiceboxAuditEntry): void {
  console.log(JSON.stringify({ ...entry, workspaceId: process.env.JUICEBOX_WORKSPACE_ID }));
}

RBAC Checklist

  • Workspace admin role limited to designated team leads
  • Contact reveal and export restricted to recruiter role and above
  • Dataset access scoped per team to prevent cross-team data leakage
  • API key usage monitored with rate limits per role
  • Viewer role enforced for stakeholders who only need reporting
  • All enrichment and export actions logged for SOC 2 compliance
  • Quarterly access review to remove departed team members

Error Handling

IssueCauseFix
403
on contact reveal endpoint
User role lacks contact permissionUpgrade to recruiter role or request admin approval
Export returns empty resultsDataset not assigned to userAdd dataset to user's access list in workspace settings
API rate limit exceededToo many enrichment calls per hourCheck role-based rate limits, batch requests
Saved search not visibleSearch created in different dataset scopeVerify dataset access or share search explicitly
Seat limit reachedAll workspace licenses usedRemove inactive members or upgrade plan

Resources

Next Steps

See

juicebox-security-basics
.