Talent Pools
Talent pools are company-scoped containers for organizing talent profiles. They support skill-based requirements, intelligent recommendations, and a three-tier sharing system for internal and external collaboration.
Pool Types
| Type | Description |
|---|---|
| Default company pool | Auto-created when a company is created. Every company has exactly one. |
| Custom pools | User-created pools with optional skill requirements and descriptions. |
| Public talent pool | System-wide pool (ID: a0000000-0000-0000-0000-000000000001) for independent job seekers. |
Pool Statuses
| Status | Description |
|---|---|
ACTIVE | Pool is usable and visible to authorized users |
INACTIVE | Temporarily disabled, not shown in default queries |
ARCHIVED | Read-only, preserved for historical reference |
DRAFT | Work-in-progress, visible only to the creator |
Skill Requirements
Pools can define skill requirements used for talent matching. Each requirement specifies a skill, proficiency level, whether it is required, and optional years of experience.
mutation {
createTalentPool(createTalentPoolInput: {
name: "Senior Engineers"
companyId: "company-uuid"
skills: [
{ skillId: "skill-uuid", required: true, proficiency: ADVANCED, yearsExperience: 5 }
{ skillId: "skill-uuid-2", required: false, proficiency: INTERMEDIATE }
]
}) { id name status }
}
Proficiency levels: BASIC (1), INTERMEDIATE (2), ADVANCED (3), EXPERT (4).
Talent Recommendations
The recommendation engine scores talents against pool skill requirements. Talents already in the pool can be excluded.
Scoring algorithm:
skillScore = (required ? 1.5 : 1.0) * (talentProficiency / requiredProficiency) * experienceMultiplier
Required skills receive a 1.5x weight. The final match score aggregates all skill scores and normalizes to 0-1.
query {
talentRecommendations(input: {
talentPoolId: "pool-uuid"
limit: 20
minScore: 0.3
includeExisting: false
}) {
recommendations {
talent { id user { firstName lastName } }
matchScore
skillMatches { skill { name } required hasSkill scoreContribution }
}
totalCount
averageScore
}
}
Sharing System
Talent pools support three sharing tiers with cascading access control:
- Owner -- creator always has MANAGE permissions.
- Company members -- inherit access from company association.
- User shares -- explicit per-user permissions override defaults.
- Public pools -- viewable by any authenticated user when
isPublic: true. - External shares -- token-based, time-limited access for unauthenticated stakeholders.
User-to-User Sharing
Share a pool directly with a specific user at a given permission level.
mutation {
createTalentPoolUserShare(createTalentPoolUserShareInput: {
talentPoolId: "pool-uuid"
userId: "user-uuid"
permissionLevel: EDIT
}) { id user { firstName lastName } permissionLevel }
}
# Discover pools shared with current user
query {
talentPoolsSharedWithMe {
id
permissionLevel
talentPool { id name status company { name } }
}
}
Permission levels: VIEW (read-only), EDIT (modify content, add/remove talents), MANAGE (full access including sharing and deletion).
Company-to-Company Sharing
Grant access to all users of another company, useful for B2B recruitment partnerships.
mutation {
createTalentPoolCompanyShare(createTalentPoolCompanyShareInput: {
talentPoolId: "pool-uuid"
sharedWithCompanyId: "other-company-uuid"
permissionLevel: VIEW
}) { id sharedWithCompany { name } permissionLevel }
}
External Token Sharing
Generate a secure, time-limited link for external stakeholders who do not have platform accounts.
mutation {
createTalentPoolExternalShare(createTalentPoolExternalShareInput: {
talentPoolId: "pool-uuid"
email: "client@partner.com"
expirationHours: 72
}) { id token expiresAt accessCount isActive }
}
# Public access (no auth required)
query {
talentPoolByToken(token: "secure-token") {
name
description
talents { id user { firstName lastName } activeCv { skills { skill { name } proficiency } } }
}
}
External share tokens default to 168 hours (7 days). The system tracks accessCount and can be deactivated by the creator at any time.
Pool Statistics
Query pool-level aggregates via the talentPool query:
query {
talentPool(id: "pool-uuid") {
id
name
status
isPublic
talents { id }
userShares { id permissionLevel }
skills { skill { name } required proficiency yearsExperience }
company { id name }
createdBy { id firstName lastName }
createdAt
updatedAt
}
}
CRUD Operations
# List all accessible pools
query { talentPools { id name status isPublic company { name } } }
# Create pool
mutation {
createTalentPool(createTalentPoolInput: {
name: "Pool Name"
description: "Description"
companyId: "company-uuid"
status: ACTIVE
isPublic: false
}) { id name }
}
# Update pool
mutation {
updateTalentPool(updateTalentPoolInput: {
id: "pool-uuid"
name: "Updated Name"
status: ARCHIVED
}) { id name status updatedAt }
}
# Delete pool
mutation { removeTalentPool(id: "pool-uuid") { success message } }
# Add/remove talents
mutation { addTalent(createTalentInput: { userId: "user-uuid", talentPoolId: "pool-uuid" }) { id } }
mutation { removeTalent(removeTalentInput: { talentId: "talent-uuid", talentPoolId: "pool-uuid" }) { id } }
Deleting a talent pool cascades through all share tables and skill requirements. Talents themselves are not deleted -- only their pool association is removed.