Talents
Agency talent roster request and response fields.
Base URL https://api.klockwork.org. Send X-Klockwork-Key or Authorization: Bearer kw_…. An agency key acts as the agency that created it. JSON bodies use these fields. A missing required field returns 400 with { "error": "Validation failed", "details": {} }.
List talents
GET /api/public/agency/talents
Query:
| Field | Type | Required |
|---|---|---|
status | "active" or "archived" or "pending" or "all" | no |
Response 200: { talents: Talent[] }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkOrgId | string, min 1 | yes |
displayName | string, min 1 | yes |
contactName | string, min 1 | yes |
contactEmail | string (email) | yes |
hourlyRate | number, min 0 | yes |
currency | string, min 1, max 8 | yes |
hoursPerDay | number | yes |
shiftStart | string | yes |
shiftEnd | string | yes |
timezone | string, min 1 | yes |
status | "active" or "archived" or "pending" | yes |
unpaidBreakHours | number, min 0 or null | yes |
payoutHints | string or null | yes |
paymentTermsOverride | string or null | yes |
internalNotes | string or null | yes |
colorTag | string or null | yes |
clerkUserId | string or null | yes |
clerkInvitationId | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
Create a talent
POST /api/public/agency/talents
A new roster row returns 201. An email that is already on the roster returns 200 and re-sends the invite. If the invite itself fails, the same body includes warning instead of invitationSent. status on create must be omitted or pending. A duplicate email race returns 400 { "error": "A talent with this email is already on the roster" }.
Request body:
| Field | Type | Required |
|---|---|---|
displayName | string, min 1 | yes |
contactName | string, min 1 | yes |
contactEmail | string (email) | yes |
hourlyRate | number, min 0 | yes |
currency | string, min 1, max 8 | yes |
hoursPerDay | number | yes |
shiftStart | string | yes |
shiftEnd | string | yes |
timezone | string, min 1 | yes |
status | "active" or "archived" or "pending" | no |
unpaidBreakHours | number, min 0 or null | no |
payoutHints | string or null | no |
paymentTermsOverride | string or null | no |
internalNotes | string or null | no |
colorTag | string or null | no |
Response 201: { talent, invitationSent, linkedImmediately }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkOrgId | string, min 1 | yes |
displayName | string, min 1 | yes |
contactName | string, min 1 | yes |
contactEmail | string (email) | yes |
hourlyRate | number, min 0 | yes |
currency | string, min 1, max 8 | yes |
hoursPerDay | number | yes |
shiftStart | string | yes |
shiftEnd | string | yes |
timezone | string, min 1 | yes |
status | "active" or "archived" or "pending" | yes |
unpaidBreakHours | number, min 0 or null | yes |
payoutHints | string or null | yes |
paymentTermsOverride | string or null | yes |
internalNotes | string or null | yes |
colorTag | string or null | yes |
clerkUserId | string or null | yes |
clerkInvitationId | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
Get a talent
GET /api/public/agency/talents/{id}
Response 200: { talent: Talent }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkOrgId | string, min 1 | yes |
displayName | string, min 1 | yes |
contactName | string, min 1 | yes |
contactEmail | string (email) | yes |
hourlyRate | number, min 0 | yes |
currency | string, min 1, max 8 | yes |
hoursPerDay | number | yes |
shiftStart | string | yes |
shiftEnd | string | yes |
timezone | string, min 1 | yes |
status | "active" or "archived" or "pending" | yes |
unpaidBreakHours | number, min 0 or null | yes |
payoutHints | string or null | yes |
paymentTermsOverride | string or null | yes |
internalNotes | string or null | yes |
colorTag | string or null | yes |
clerkUserId | string or null | yes |
clerkInvitationId | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
Update a talent
PATCH /api/public/agency/talents/{id}
Every field is optional.
Request body:
| Field | Type | Required |
|---|---|---|
displayName | string, min 1 | no |
contactName | string, min 1 | no |
contactEmail | string (email) | no |
hourlyRate | number, min 0 | no |
currency | string, min 1, max 8 | no |
hoursPerDay | number | no |
shiftStart | string | no |
shiftEnd | string | no |
timezone | string, min 1 | no |
status | "active" or "archived" or "pending" | no |
unpaidBreakHours | number, min 0 or null | no |
payoutHints | string or null | no |
paymentTermsOverride | string or null | no |
internalNotes | string or null | no |
colorTag | string or null | no |
Response 200: { talent: Talent }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkOrgId | string, min 1 | yes |
displayName | string, min 1 | yes |
contactName | string, min 1 | yes |
contactEmail | string (email) | yes |
hourlyRate | number, min 0 | yes |
currency | string, min 1, max 8 | yes |
hoursPerDay | number | yes |
shiftStart | string | yes |
shiftEnd | string | yes |
timezone | string, min 1 | yes |
status | "active" or "archived" or "pending" | yes |
unpaidBreakHours | number, min 0 or null | yes |
payoutHints | string or null | yes |
paymentTermsOverride | string or null | yes |
internalNotes | string or null | yes |
colorTag | string or null | yes |
clerkUserId | string or null | yes |
clerkInvitationId | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
Delete a talent
DELETE /api/public/agency/talents/{id}
Response 200: { ok: true }
Invite a talent
POST /api/public/agency/talents/{id}/invite
No request body.
Response 200: { talent, invitationSent, linkedImmediately }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkOrgId | string, min 1 | yes |
displayName | string, min 1 | yes |
contactName | string, min 1 | yes |
contactEmail | string (email) | yes |
hourlyRate | number, min 0 | yes |
currency | string, min 1, max 8 | yes |
hoursPerDay | number | yes |
shiftStart | string | yes |
shiftEnd | string | yes |
timezone | string, min 1 | yes |
status | "active" or "archived" or "pending" | yes |
unpaidBreakHours | number, min 0 or null | yes |
payoutHints | string or null | yes |
paymentTermsOverride | string or null | yes |
internalNotes | string or null | yes |
colorTag | string or null | yes |
clerkUserId | string or null | yes |
clerkInvitationId | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
