KlockworkKlockworkAPI
Agency

Clients

Agency client book 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 clients

GET /api/public/agency/clients

Query:

FieldTypeRequired
status"active" or "archived" or "all"no

Response 200: { clients: Client[] }

FieldTypeRequired
idstring (uuid)yes
clerkOrgIdstring, min 1yes
displayNamestring, min 1yes
contactPersonNamestring, min 1yes
invoiceEmailstring (email)yes
hourlyRatenumber, min 0yes
currencystring, min 1, max 8yes
hoursPerDaynumberyes
shiftStartstringyes
shiftEndstringyes
timezonestring, min 1yes
status"active" or "archived"yes
unpaidBreakHoursnumber, min 0 or nullyes
billingAddressstring or nullyes
billingStreetstring or nullyes
billingCitystring or nullyes
billingStatestring or nullyes
billingPostalstring or nullyes
billingCountrystring or nullyes
paymentTermsOverridestring or nullyes
internalNotesstring or nullyes
colorTagstring or nullyes
clientClerkOrgIdstring, min 1 or nullyes
clerkInvitationIdstring, min 1 or nullyes
invitationStatus"pending" or "accepted" or "expired" or "revoked" or nullyes
inviteTokenstring (uuid) or nullyes
seatKind"full" or "partial" or nullyes
seatStatus"pending" or "active" or "ended" or "grandfathered"yes
seatAmountCentsinteger, min 0 or nullyes
coversPremiumbooleanyes
acceptedAtstring or nullyes
endedAtstring or nullyes
createdAtstringyes
updatedAtstringyes

Create a client

POST /api/public/agency/clients

The table below is client. Beside it: invitationSent boolean, linkedImmediately boolean, inviteUrl string or null, and seatQuote with kind (full, partial, or unknown), amountCents integer or null, and label string. A duplicate invoice email returns 400 { "error": "A client with this invoice email is already in the book" }.

Request body:

FieldTypeRequired
displayNamestring, min 1yes
contactPersonNamestring, min 1yes
invoiceEmailstring (email)yes
hourlyRatenumber, min 0yes
currencystring, min 1, max 8yes
hoursPerDaynumberyes
shiftStartstringyes
shiftEndstringyes
timezonestring, min 1yes
status"active" or "archived"no
unpaidBreakHoursnumber, min 0 or nullno
billingAddressstring or nullno
billingStreetstring or nullno
billingCitystring or nullno
billingStatestring or nullno
billingPostalstring or nullno
billingCountrystring or nullno
paymentTermsOverridestring or nullno
internalNotesstring or nullno
colorTagstring or nullno
linkOrgIdstring, min 1no

Response 201: { client, invitationSent, linkedImmediately, inviteUrl, seatQuote }

FieldTypeRequired
idstring (uuid)yes
clerkOrgIdstring, min 1yes
displayNamestring, min 1yes
contactPersonNamestring, min 1yes
invoiceEmailstring (email)yes
hourlyRatenumber, min 0yes
currencystring, min 1, max 8yes
hoursPerDaynumberyes
shiftStartstringyes
shiftEndstringyes
timezonestring, min 1yes
status"active" or "archived"yes
unpaidBreakHoursnumber, min 0 or nullyes
billingAddressstring or nullyes
billingStreetstring or nullyes
billingCitystring or nullyes
billingStatestring or nullyes
billingPostalstring or nullyes
billingCountrystring or nullyes
paymentTermsOverridestring or nullyes
internalNotesstring or nullyes
colorTagstring or nullyes
clientClerkOrgIdstring, min 1 or nullyes
clerkInvitationIdstring, min 1 or nullyes
invitationStatus"pending" or "accepted" or "expired" or "revoked" or nullyes
inviteTokenstring (uuid) or nullyes
seatKind"full" or "partial" or nullyes
seatStatus"pending" or "active" or "ended" or "grandfathered"yes
seatAmountCentsinteger, min 0 or nullyes
coversPremiumbooleanyes
acceptedAtstring or nullyes
endedAtstring or nullyes
createdAtstringyes
updatedAtstringyes

Get a client

GET /api/public/agency/clients/{id}

An unknown id returns 404 { "error": "Client not found" }.

Response 200: { client: Client, summary: ClientSummary }

FieldTypeRequired
idstring (uuid)yes
clerkOrgIdstring, min 1yes
displayNamestring, min 1yes
contactPersonNamestring, min 1yes
invoiceEmailstring (email)yes
hourlyRatenumber, min 0yes
currencystring, min 1, max 8yes
hoursPerDaynumberyes
shiftStartstringyes
shiftEndstringyes
timezonestring, min 1yes
status"active" or "archived"yes
unpaidBreakHoursnumber, min 0 or nullyes
billingAddressstring or nullyes
billingStreetstring or nullyes
billingCitystring or nullyes
billingStatestring or nullyes
billingPostalstring or nullyes
billingCountrystring or nullyes
paymentTermsOverridestring or nullyes
internalNotesstring or nullyes
colorTagstring or nullyes
clientClerkOrgIdstring, min 1 or nullyes
clerkInvitationIdstring, min 1 or nullyes
invitationStatus"pending" or "accepted" or "expired" or "revoked" or nullyes
inviteTokenstring (uuid) or nullyes
seatKind"full" or "partial" or nullyes
seatStatus"pending" or "active" or "ended" or "grandfathered"yes
seatAmountCentsinteger, min 0 or nullyes
coversPremiumbooleanyes
acceptedAtstring or nullyes
endedAtstring or nullyes
createdAtstringyes
updatedAtstringyes

Summary on the get response:

FieldTypeRequired
assignedTalentCountinteger, min 0yes
unbilledHoursnumber, min 0yes
outstandingCentsinteger, min 0yes
outstandingCurrencystringyes

Update a client

PATCH /api/public/agency/clients/{id}

Every field is optional. Send only the fields that change.

Request body:

FieldTypeRequired
displayNamestring, min 1no
contactPersonNamestring, min 1no
invoiceEmailstring (email)no
hourlyRatenumber, min 0no
currencystring, min 1, max 8no
hoursPerDaynumberno
shiftStartstringno
shiftEndstringno
timezonestring, min 1no
status"active" or "archived"no
unpaidBreakHoursnumber, min 0 or nullno
billingAddressstring or nullno
billingStreetstring or nullno
billingCitystring or nullno
billingStatestring or nullno
billingPostalstring or nullno
billingCountrystring or nullno
paymentTermsOverridestring or nullno
internalNotesstring or nullno
colorTagstring or nullno
linkOrgIdstring, min 1no

Response 200: { client: Client }

FieldTypeRequired
idstring (uuid)yes
clerkOrgIdstring, min 1yes
displayNamestring, min 1yes
contactPersonNamestring, min 1yes
invoiceEmailstring (email)yes
hourlyRatenumber, min 0yes
currencystring, min 1, max 8yes
hoursPerDaynumberyes
shiftStartstringyes
shiftEndstringyes
timezonestring, min 1yes
status"active" or "archived"yes
unpaidBreakHoursnumber, min 0 or nullyes
billingAddressstring or nullyes
billingStreetstring or nullyes
billingCitystring or nullyes
billingStatestring or nullyes
billingPostalstring or nullyes
billingCountrystring or nullyes
paymentTermsOverridestring or nullyes
internalNotesstring or nullyes
colorTagstring or nullyes
clientClerkOrgIdstring, min 1 or nullyes
clerkInvitationIdstring, min 1 or nullyes
invitationStatus"pending" or "accepted" or "expired" or "revoked" or nullyes
inviteTokenstring (uuid) or nullyes
seatKind"full" or "partial" or nullyes
seatStatus"pending" or "active" or "ended" or "grandfathered"yes
seatAmountCentsinteger, min 0 or nullyes
coversPremiumbooleanyes
acceptedAtstring or nullyes
endedAtstring or nullyes
createdAtstringyes
updatedAtstringyes

Delete a client

DELETE /api/public/agency/clients/{id}

Response 200: { ok: true }

Invite a client

POST /api/public/agency/clients/{id}/invite

No request body.

Response 200: { client, invitationSent, linkedImmediately, inviteUrl, seatQuote }

FieldTypeRequired
idstring (uuid)yes
clerkOrgIdstring, min 1yes
displayNamestring, min 1yes
contactPersonNamestring, min 1yes
invoiceEmailstring (email)yes
hourlyRatenumber, min 0yes
currencystring, min 1, max 8yes
hoursPerDaynumberyes
shiftStartstringyes
shiftEndstringyes
timezonestring, min 1yes
status"active" or "archived"yes
unpaidBreakHoursnumber, min 0 or nullyes
billingAddressstring or nullyes
billingStreetstring or nullyes
billingCitystring or nullyes
billingStatestring or nullyes
billingPostalstring or nullyes
billingCountrystring or nullyes
paymentTermsOverridestring or nullyes
internalNotesstring or nullyes
colorTagstring or nullyes
clientClerkOrgIdstring, min 1 or nullyes
clerkInvitationIdstring, min 1 or nullyes
invitationStatus"pending" or "accepted" or "expired" or "revoked" or nullyes
inviteTokenstring (uuid) or nullyes
seatKind"full" or "partial" or nullyes
seatStatus"pending" or "active" or "ended" or "grandfathered"yes
seatAmountCentsinteger, min 0 or nullyes
coversPremiumbooleanyes
acceptedAtstring or nullyes
endedAtstring or nullyes
createdAtstringyes
updatedAtstringyes

Revoke a client invite

POST /api/public/agency/clients/{id}/invite/revoke

No request body.

Response 200: { client, invitationSent }

FieldTypeRequired
idstring (uuid)yes
clerkOrgIdstring, min 1yes
displayNamestring, min 1yes
contactPersonNamestring, min 1yes
invoiceEmailstring (email)yes
hourlyRatenumber, min 0yes
currencystring, min 1, max 8yes
hoursPerDaynumberyes
shiftStartstringyes
shiftEndstringyes
timezonestring, min 1yes
status"active" or "archived"yes
unpaidBreakHoursnumber, min 0 or nullyes
billingAddressstring or nullyes
billingStreetstring or nullyes
billingCitystring or nullyes
billingStatestring or nullyes
billingPostalstring or nullyes
billingCountrystring or nullyes
paymentTermsOverridestring or nullyes
internalNotesstring or nullyes
colorTagstring or nullyes
clientClerkOrgIdstring, min 1 or nullyes
clerkInvitationIdstring, min 1 or nullyes
invitationStatus"pending" or "accepted" or "expired" or "revoked" or nullyes
inviteTokenstring (uuid) or nullyes
seatKind"full" or "partial" or nullyes
seatStatus"pending" or "active" or "ended" or "grandfathered"yes
seatAmountCentsinteger, min 0 or nullyes
coversPremiumbooleanyes
acceptedAtstring or nullyes
endedAtstring or nullyes
createdAtstringyes
updatedAtstringyes

Cover a client's premium

POST /api/public/agency/clients/{id}/cover

charge.status is transitioned, canceled_sponsored, unchanged, or ledger_only. charge.checkoutEnabled is false. charge.reason and charge.parentMonthlyCents are present only for some outcomes.

No request body.

Response 200: { client, charge }

FieldTypeRequired
idstring (uuid)yes
clerkOrgIdstring, min 1yes
displayNamestring, min 1yes
contactPersonNamestring, min 1yes
invoiceEmailstring (email)yes
hourlyRatenumber, min 0yes
currencystring, min 1, max 8yes
hoursPerDaynumberyes
shiftStartstringyes
shiftEndstringyes
timezonestring, min 1yes
status"active" or "archived"yes
unpaidBreakHoursnumber, min 0 or nullyes
billingAddressstring or nullyes
billingStreetstring or nullyes
billingCitystring or nullyes
billingStatestring or nullyes
billingPostalstring or nullyes
billingCountrystring or nullyes
paymentTermsOverridestring or nullyes
internalNotesstring or nullyes
colorTagstring or nullyes
clientClerkOrgIdstring, min 1 or nullyes
clerkInvitationIdstring, min 1 or nullyes
invitationStatus"pending" or "accepted" or "expired" or "revoked" or nullyes
inviteTokenstring (uuid) or nullyes
seatKind"full" or "partial" or nullyes
seatStatus"pending" or "active" or "ended" or "grandfathered"yes
seatAmountCentsinteger, min 0 or nullyes
coversPremiumbooleanyes
acceptedAtstring or nullyes
endedAtstring or nullyes
createdAtstringyes
updatedAtstringyes

On this page