Skip to main content

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

TypeDescription
Default company poolAuto-created when a company is created. Every company has exactly one.
Custom poolsUser-created pools with optional skill requirements and descriptions.
Public talent poolSystem-wide pool (ID: a0000000-0000-0000-0000-000000000001) for independent job seekers.

Pool Statuses

StatusDescription
ACTIVEPool is usable and visible to authorized users
INACTIVETemporarily disabled, not shown in default queries
ARCHIVEDRead-only, preserved for historical reference
DRAFTWork-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:

  1. Owner -- creator always has MANAGE permissions.
  2. Company members -- inherit access from company association.
  3. User shares -- explicit per-user permissions override defaults.
  4. Public pools -- viewable by any authenticated user when isPublic: true.
  5. 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 } } }
}
}
info

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 } }
warning

Deleting a talent pool cascades through all share tables and skill requirements. Talents themselves are not deleted -- only their pool association is removed.