API reference
The native ezacto v1 contract. Contract and generated clients are deterministic build artifacts. Version 1.0.0. The machine-readable document is at /openapi/v1.json; the same JSON is served by every running instance at /openapi/v1.json. Read the API contract first for errors, cursors and money-field redaction.
Authenticate with a bearer API token (Authorization: Bearer ezacto_…, issued under Settings → API tokens, scoped) or a browser session cookie. Operations marked cookieSession only cannot be called with a token.
activity
GET/api/v1/activity-log
List activity recorded from delivered domain events
Parameters
| name | in | required | type |
|---|---|---|---|
per_page | query | integer | |
from | query | string | |
to | query | string | |
event_type | query | string | |
actor_id | query | integer |
Responses
200 ActivityLogPage
Authentication
bearerAuth or cookieSession
admin-modules
GET/api/v1/admin/modules
List module enabled states
Responses
Authentication
cookieSession
PATCH/api/v1/admin/modules/{module}
Enable or disable a module
Parameters
| name | in | required | type |
|---|---|---|---|
module | path | yes | string |
Request body
ModulePatch (required)
Responses
Authentication
cookieSession
GET/api/v1/admin/sign-in-methods
List sign-in methods with their configured and enabled states
Responses
Authentication
cookieSession
PATCH/api/v1/admin/sign-in-methods/{method}
Switch a sign-in method on or off
Parameters
| name | in | required | type |
|---|---|---|---|
method | path | yes | string |
Request body
ModulePatch (required)
Responses
Authentication
cookieSession
api-tokens
GET/api/v1/api-tokens
List API tokens for the acting user
Responses
Authentication
cookieSession
POST/api/v1/api-tokens
Issue an API token
Request body
CreateApiTokenInput (required)
Responses
Authentication
cookieSession
DELETE/api/v1/api-tokens/{tokenId}
Revoke an API token
Parameters
| name | in | required | type |
|---|---|---|---|
tokenId | path | yes | integer |
Responses
200 ApiTokenEnvelope
Authentication
cookieSession
attachments
GET/api/v1/invoices/{invoiceId}/attachments
List attachments owned by a invoice
Parameters
| name | in | required | type |
|---|---|---|---|
invoiceId | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/invoices/{invoiceId}/attachments
Upload an attachment owned by a invoice
Parameters
| name | in | required | type |
|---|---|---|---|
invoiceId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
AttachmentUploadInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/invoices/{invoiceId}/attachments/{attachmentId}
Get metadata for a invoice attachment
Parameters
| name | in | required | type |
|---|---|---|---|
invoiceId | path | yes | integer |
attachmentId | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/invoices/{invoiceId}/attachments/{attachmentId}/content
Download an attachment owned by a invoice
Parameters
| name | in | required | type |
|---|---|---|---|
invoiceId | path | yes | integer |
attachmentId | path | yes | integer |
Responses
200 —
Authentication
bearerAuth or cookieSession
GET/api/v1/recurring-invoices/{recurringInvoiceId}/attachments
List attachments owned by a recurringinvoice
Parameters
| name | in | required | type |
|---|---|---|---|
recurringInvoiceId | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/recurring-invoices/{recurringInvoiceId}/attachments
Upload an attachment owned by a recurringinvoice
Parameters
| name | in | required | type |
|---|---|---|---|
recurringInvoiceId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
AttachmentUploadInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/recurring-invoices/{recurringInvoiceId}/attachments/{attachmentId}
Get metadata for a recurringinvoice attachment
Parameters
| name | in | required | type |
|---|---|---|---|
recurringInvoiceId | path | yes | integer |
attachmentId | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/recurring-invoices/{recurringInvoiceId}/attachments/{attachmentId}/content
Download an attachment owned by a recurringinvoice
Parameters
| name | in | required | type |
|---|---|---|---|
recurringInvoiceId | path | yes | integer |
attachmentId | path | yes | integer |
Responses
200 —
Authentication
bearerAuth or cookieSession
GET/api/v1/estimates/{estimateId}/attachments
List attachments owned by a estimate
Parameters
| name | in | required | type |
|---|---|---|---|
estimateId | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/estimates/{estimateId}/attachments
Upload an attachment owned by a estimate
Parameters
| name | in | required | type |
|---|---|---|---|
estimateId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
AttachmentUploadInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/estimates/{estimateId}/attachments/{attachmentId}
Get metadata for a estimate attachment
Parameters
| name | in | required | type |
|---|---|---|---|
estimateId | path | yes | integer |
attachmentId | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/estimates/{estimateId}/attachments/{attachmentId}/content
Download an attachment owned by a estimate
Parameters
| name | in | required | type |
|---|---|---|---|
estimateId | path | yes | integer |
attachmentId | path | yes | integer |
Responses
200 —
Authentication
bearerAuth or cookieSession
GET/api/v1/expenses/{expenseId}/attachments
List attachments owned by a expense
Parameters
| name | in | required | type |
|---|---|---|---|
expenseId | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/expenses/{expenseId}/attachments
Upload an attachment owned by a expense
Parameters
| name | in | required | type |
|---|---|---|---|
expenseId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
AttachmentUploadInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/expenses/{expenseId}/attachments/{attachmentId}
Get metadata for a expense attachment
Parameters
| name | in | required | type |
|---|---|---|---|
expenseId | path | yes | integer |
attachmentId | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/expenses/{expenseId}/attachments/{attachmentId}/content
Download an attachment owned by a expense
Parameters
| name | in | required | type |
|---|---|---|---|
expenseId | path | yes | integer |
attachmentId | path | yes | integer |
Responses
200 —
Authentication
bearerAuth or cookieSession
GET/api/v1/projects/{projectId}/attachments
List attachments owned by a project
Parameters
| name | in | required | type |
|---|---|---|---|
projectId | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/projects/{projectId}/attachments
Upload an attachment owned by a project
Parameters
| name | in | required | type |
|---|---|---|---|
projectId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
AttachmentUploadInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/projects/{projectId}/attachments/{attachmentId}
Get metadata for a project attachment
Parameters
| name | in | required | type |
|---|---|---|---|
projectId | path | yes | integer |
attachmentId | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/projects/{projectId}/attachments/{attachmentId}/content
Download an attachment owned by a project
Parameters
| name | in | required | type |
|---|---|---|---|
projectId | path | yes | integer |
attachmentId | path | yes | integer |
Responses
200 —
Authentication
bearerAuth or cookieSession
authentication
GET/auth/oidc/{provider}
Start an OpenID Connect sign-in
Parameters
| name | in | required | type |
|---|---|---|---|
provider | path | yes | string |
Responses
204 no content
Authentication
none
GET/auth/oidc/{provider}/callback
Complete an OpenID Connect sign-in
Parameters
| name | in | required | type |
|---|---|---|---|
provider | path | yes | string |
code | query | string | |
state | query | string |
Responses
204 no content
Authentication
none
POST/auth/oidc/exchange
Exchange a native-app OIDC sign-in code for a session
Responses
200 ErrorEnvelope
Authentication
none
POST/auth/signup
Create the first owner and send email verification
Request body
SignupInput (required)
Responses
Authentication
none
POST/auth/verify-email
Verify an email address
Request body
AuthTokenInput (required)
Responses
Authentication
none
POST/auth/sign-in
Authenticate a verified email and password
Request body
PasswordSignInInput (required)
Responses
Authentication
none
POST/auth/two-factor/challenge
Answer a two-factor challenge and receive the session
Request body
TwoFactorChallengeInput (required)
Responses
200 TwoFactorChallengeAcceptedEnvelope
Authentication
none
POST/auth/password/forgot
Request a password-reset email
Request body
EmailInput (required)
Responses
Authentication
none
POST/auth/password/reset
Consume a password-reset token
Request body
PasswordResetInput (required)
Responses
Authentication
none
GET/api/v1/sessions
List sessions for the acting user
Responses
200 SessionPage
Authentication
cookieSession
DELETE/api/v1/sessions/{sessionId}
Revoke a session for the acting user
Parameters
| name | in | required | type |
|---|---|---|---|
sessionId | path | yes | integer |
Responses
200 SessionEnvelope
Authentication
cookieSession
backup
GET/api/v1/backup/status
The last completed and last failed backup run, and recent history
Responses
Authentication
cookieSession
brand-assets
GET/api/v1/brand
Get the organisation name and brand marks for any principal
Responses
200 BrandEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/settings/brand-assets
List the brand marks stored on this instance
Responses
Authentication
cookieSession
POST/api/v1/settings/brand-assets/{slot}
Store a brand mark, replacing whatever the slot held
Parameters
| name | in | required | type |
|---|---|---|---|
slot | path | yes | string |
Request body
BrandAssetUploadInput (required)
Responses
Authentication
cookieSession
DELETE/api/v1/settings/brand-assets/{slot}
Discard a stored brand mark and fall back to configuration
Parameters
| name | in | required | type |
|---|---|---|---|
slot | path | yes | string |
Responses
204 —
Authentication
cookieSession
client-tree
GET/api/v1/clients/{id}/ancestors
List ancestors of a client in the hierarchy
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 ClientHierarchyListEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/clients/{id}/descendants
List descendants of a client in the hierarchy
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 ClientHierarchyListEnvelope
Authentication
bearerAuth or cookieSession
clients
GET/api/v1/clients
List clients
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
is_active | query | boolean | |
updated_since | query | string | |
parent_client_id | query | integer | |
bill_to_client_id | query | integer | |
q | query | string |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/clients
Create a client
Request body
GeneralMutationInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/clients/{id}
Get a client
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/clients/{id}
Update a client
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
GeneralMutationInput (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/clients/{id}
Delete or archive a client
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
bearerAuth or cookieSession
contacts
GET/api/v1/contacts
List contacts
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
client_id | query | integer | |
updated_since | query | string |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/contacts
Create a contact
Request body
GeneralMutationInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/contacts/{id}
Get a contact
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/contacts/{id}
Update a contact
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
GeneralMutationInput (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/contacts/{id}
Delete or archive a contact
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
bearerAuth or cookieSession
GET/api/v1/email-log
List outbound email delivery outcomes
Parameters
| name | in | required | type |
|---|---|---|---|
status | query | string: queued | sent | bounced | complained | failed | |
per_page | query | integer |
Responses
200 EmailLogPage
Authentication
cookieSession
GET/api/v1/email-health
Get email reputation health with bounce and complaint rates
Responses
Authentication
cookieSession
GET/api/v1/email-template-variables
List the closed email-template variable vocabulary
Responses
200 EmailTemplateVariableCatalog
Authentication
cookieSession
GET/api/v1/email-templates
List active versioned email templates
Responses
Authentication
cookieSession
GET/api/v1/email-templates/{kind}/versions
List immutable versions of an email template
Parameters
| name | in | required | type |
|---|---|---|---|
kind | path | yes | string |
Responses
Authentication
cookieSession
POST/api/v1/email-templates/{kind}/versions
Append an immutable email-template version
Parameters
| name | in | required | type |
|---|---|---|---|
kind | path | yes | string |
Idempotency-Key | header | yes | string |
Request body
EmailTemplateVersionInput (required)
Responses
Authentication
cookieSession
GET/api/v1/sender-identities
List organization sender identities and provider evidence
Responses
Authentication
cookieSession
POST/api/v1/sender-identities
Configure an unverified organization sender identity
Parameters
| name | in | required | type |
|---|---|---|---|
Idempotency-Key | header | yes | string |
Request body
SenderIdentityInput (required)
Responses
Authentication
cookieSession
PATCH/api/v1/sender-identities/{id}
Update sender display and Reply-To configuration
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
SenderIdentityPatch (required)
Responses
Authentication
cookieSession
POST/api/v1/sender-identities/{id}/default
Select a fully verified default sender identity
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
SenderIdentityVersionInput (required)
Responses
Authentication
cookieSession
POST/api/v1/sender-identities/{id}/archive
Archive a non-default sender identity
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
SenderIdentityVersionInput (required)
Responses
Authentication
cookieSession
POST/api/v1/sender-identities/{id}/refresh
Refresh authoritative sender verification evidence from its provider
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
SenderEvidenceRefreshInput (required)
Responses
Authentication
cookieSession
POST/api/v1/sender-identities/{id}/test-send
Queue a persisted organization-template test to the acting administrator
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
EmailTestSendInput (required)
Responses
Authentication
cookieSession
estimate-messages
GET/api/v1/estimates/{id}/messages
List estimate lifecycle messages
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 EstimateMessageListEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/estimates/{id}/messages
Create a retry-safe estimate lifecycle message
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
EstimateMessageInput (required)
Responses
201 EstimateMessageCommandEnvelope
Authentication
bearerAuth or cookieSession
estimates
GET/api/v1/estimates
List estimates
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer |
Responses
200 EstimatePage
Authentication
bearerAuth or cookieSession
GET/api/v1/estimates/{id}
Get an estimate
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 EstimateEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/estimates/{id}/convert
Convert an accepted estimate into one draft invoice
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
EstimateConversionInput (required)
Responses
201 EstimateConversionEnvelope
Authentication
bearerAuth or cookieSession
expense-categories
GET/api/v1/expense-categories
List expense-categories
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
is_active | query | boolean | |
updated_since | query | string |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/expense-categories
Create a expensecategory
Request body
ExpenseCategoryInput (required)
Responses
Authentication
cookieSession
GET/api/v1/expense-categories/{id}
Get a expensecategory
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/expense-categories/{id}
Update a expensecategory
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
ExpenseCategoryPatch (required)
Responses
Authentication
cookieSession
DELETE/api/v1/expense-categories/{id}
Delete or archive a expensecategory
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
cookieSession
expenses
GET/api/v1/expenses
List the acting user's expenses
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
user_id | query | integer | |
client_id | query | integer | |
project_id | query | integer | |
spent_date | query | string | |
from | query | string | |
to | query | string | |
approval_status | query | string: unsubmitted | submitted | approved | |
invoice_id | query | integer | |
is_billed | query | boolean | |
billable | query | boolean | |
updated_since | query | string | |
expense_category_id | query | integer | |
reimbursable | query | boolean | |
reimbursement_status | query | string: none | pending | approved | paid |
Responses
200 ExpensePage
Authentication
bearerAuth or cookieSession
POST/api/v1/expenses
Create an expense
Request body
ExpenseInput (required)
Responses
201 ExpenseEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/expenses/{id}
Get an expense
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 ExpenseEnvelope
Authentication
bearerAuth or cookieSession
PATCH/api/v1/expenses/{id}
Update an expense
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
ExpensePatch (required)
Responses
200 ExpenseEnvelope
Authentication
bearerAuth or cookieSession
DELETE/api/v1/expenses/{id}
Delete an expense
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 ExpenseEnvelope
Authentication
bearerAuth or cookieSession
identity
GET/api/v1/whoami
Get the authenticated user and credential authority
Responses
200 WhoamiEnvelope
Authentication
bearerAuth or cookieSession
instance-theme
GET/api/v1/settings/theme
The palette this instance wears, or null for the built-in theme
Responses
Authentication
cookieSession
POST/api/v1/settings/theme
Replace the instance palette, subject to the contrast rule
Request body
InstanceThemeInput (required)
Responses
Authentication
cookieSession
DELETE/api/v1/settings/theme
Return this instance to the built-in theme
Responses
204 —
Authentication
cookieSession
integrations
GET/api/v1/integrations/quickbooks
Whether QuickBooks is configured, and the connected company
Responses
Authentication
cookieSession
DELETE/api/v1/integrations/quickbooks
Disconnect the QuickBooks company and revoke the grant
Responses
204 —
Authentication
cookieSession
POST/api/v1/integrations/quickbooks/authorize
Begin connecting a QuickBooks company
Responses
200 QuickBooksAuthorizeEnvelope
Authentication
cookieSession
POST/api/v1/integrations/quickbooks/settings
Whether mirrored invoices offer QuickBooks payment links
Request body
QuickBooksSettingsInput (required)
Responses
200 QuickBooksConnectionEnvelope
Authentication
cookieSession
GET/api/v1/integrations/quickbooks/callback
Where Intuit returns an administrator after they approve
Parameters
| name | in | required | type |
|---|---|---|---|
code | query | string | |
state | query | string | |
realmId | query | string |
Responses
204 no content
Authentication
none
GET/api/v1/integrations/wise
Whether Wise is configured, and which profile pays
Responses
Authentication
cookieSession
GET/api/v1/integrations/wise/recipients
The Wise destinations the organisation can pay
Responses
Authentication
cookieSession
POST/api/v1/integrations/wise/recipients
Create a Wise destination from a contractor's email and link it
Request body
WiseOnboardInput (required)
Responses
201 WiseLinkEnvelope
Authentication
cookieSession
GET/api/v1/integrations/wise/proposals
People with no payout destination, and who at Wise they might be
Responses
Authentication
cookieSession
GET/api/v1/integrations/wise/destinations/{userId}
Where one person is currently paid, if anywhere
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
Responses
Authentication
cookieSession
DELETE/api/v1/integrations/wise/destinations/{userId}
Remove a person's Wise payout destination
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
Responses
204 —
Authentication
cookieSession
POST/api/v1/integrations/wise/recipients/link
Point a person at the Wise destination they are paid through
Request body
WiseLinkInput (required)
Responses
201 WiseLinkEnvelope
Authentication
cookieSession
DELETE/api/v1/integrations/wise/recipients/{accountId}
Detach a person's Wise payout destination
Parameters
| name | in | required | type |
|---|---|---|---|
accountId | path | yes | integer |
Responses
204 —
Authentication
cookieSession
GET/api/v1/integrations/bill
Whether this deployment can reach BILL, and how it can deliver
Responses
Authentication
cookieSession
GET/api/v1/integrations/bill/clients/{id}
Whether this client is billed through BILL
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 BillClientDeliveryEnvelope
Authentication
cookieSession
POST/api/v1/integrations/bill/clients/{id}
Bill this client through BILL, or stop
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
BillClientDeliveryInput (required)
Responses
200 BillClientDeliveryEnvelope
Authentication
cookieSession
invoice-messages
GET/api/v1/invoices/{id}/messages
List invoice lifecycle messages
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoiceMessageListEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/invoices/{id}/messages
Create an invoice lifecycle message
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
InvoiceMessageInput (required)
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/invoices/{id}/transitions
Create the message equivalent of an invoice transition
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
InvoiceTransitionInput (required)
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/invoices/{id}/deliveries
Confirm and durably enqueue invoice email delivery
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
InvoiceEmailDeliveryInput (required)
Responses
Authentication
bearerAuth or cookieSession
invoice-payments
GET/api/v1/invoices/{id}/payments
List effective invoice payments
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoicePaymentListEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/invoices/{id}/payments
Record a retry-safe manual invoice payment
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
InvoicePaymentInput (required)
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/invoices/{id}/payments/{paymentId}
Correct a retry-safe manual payment
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
paymentId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
InvoicePaymentUpdateInput (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/invoices/{id}/payments/{paymentId}
Delete a retry-safe manual payment
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
paymentId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
VersionedRowDeleteInput (required)
Responses
Authentication
bearerAuth or cookieSession
invoices
GET/api/v1/invoices
List invoices
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
state | query | string | |
client_id | query | string |
Responses
200 InvoicePage
Authentication
bearerAuth or cookieSession
GET/api/v1/invoices/{id}
Get an invoice
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoiceEnvelope
Authentication
bearerAuth or cookieSession
PATCH/api/v1/invoices/{id}
Apply one retry-safe invoice edit
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
InvoiceEditInput (required)
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/invoice-generations
Delegate transactional tracked-resource invoice generation
Parameters
| name | in | required | type |
|---|---|---|---|
Idempotency-Key | header | yes | string |
Request body
InvoiceGenerationInput (required)
Responses
201 InvoiceEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/invoices/{id}/line-items
Add a parent-owned invoice line
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
InvoiceLineInput (required)
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/invoices/{id}/line-items/{lineId}
Update a parent-owned invoice line
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
lineId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
InvoiceLineUpdateInput (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/invoices/{id}/line-items/{lineId}
Delete a parent-owned invoice line
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
lineId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
VersionedRowDeleteInput (required)
Responses
Authentication
bearerAuth or cookieSession
money
POST/api/v1/invoices/{id}/payment-link
The URL a client pays this invoice at, minted once and reused
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoicePaymentLinkEnvelope
Authentication
cookieSession
POST/api/v1/invoices/{id}/released-time
Hand this invoice's time entries back, once it no longer stands
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
cookieSession
GET/api/v1/invoices/{id}/document-preference
Whether this invoice will carry its document, and why
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoiceDocumentPreferenceEnvelope
Authentication
cookieSession
POST/api/v1/invoices/{id}/document-preference
Attach this invoice's document, refuse it, or follow the organization
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoiceDocumentPreferenceEnvelope
Authentication
cookieSession
GET/api/v1/settings/invoice-documents
Whether invoices carry their document by default
Responses
200 OrganizationInvoiceDocumentsEnvelope
Authentication
cookieSession
POST/api/v1/settings/invoice-documents
Set whether invoices carry their document by default
Responses
200 OrganizationInvoiceDocumentsEnvelope
Authentication
cookieSession
GET/api/v1/invoices/{id}/thank-you-preference
Whether this invoice will thank its client when it settles, and why
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoiceThankYouPreferenceEnvelope
Authentication
cookieSession
POST/api/v1/invoices/{id}/thank-you-preference
Thank this invoice's client, refuse to, or follow the organization
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoiceThankYouPreferenceEnvelope
Authentication
cookieSession
GET/api/v1/settings/invoice-thank-you
Whether settled invoices thank their client by default
Responses
200 OrganizationInvoiceThankYouEnvelope
Authentication
cookieSession
POST/api/v1/settings/invoice-thank-you
Set whether settled invoices thank their client by default
Responses
200 OrganizationInvoiceThankYouEnvelope
Authentication
cookieSession
GET/api/v1/settings/invoice-reminders
The default payment reminder policy for overdue invoices
Responses
200 OrganizationInvoiceRemindersEnvelope
Authentication
cookieSession
POST/api/v1/settings/invoice-reminders
Set, or switch off, the default payment reminder policy
Request body
OrganizationInvoiceRemindersInput (required)
Responses
200 OrganizationInvoiceRemindersEnvelope
Authentication
cookieSession
GET/api/v1/recurring-invoices/incomplete
Recurring definitions an import could not finish, and what bills against them
Responses
200 IncompleteRecurringInvoiceListEnvelope
Authentication
cookieSession
POST/api/v1/recurring-invoices/{id}/completion
Give an unfinished recurring definition its terms
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 RecurringInvoiceCompletionEnvelope
Authentication
cookieSession
operations
GET/api/v1/outbox-deliveries
List domain-event subscriber delivery outcomes
Parameters
| name | in | required | type |
|---|---|---|---|
status | query | string: pending | processing | delivered | failed | |
per_page | query | integer |
Responses
Authentication
cookieSession
POST/api/v1/outbox-deliveries/{subscriberId}/{eventId}/retry
Retry a failed domain-event subscriber delivery
Parameters
| name | in | required | type |
|---|---|---|---|
subscriberId | path | yes | string |
eventId | path | yes | string |
Responses
Authentication
cookieSession
payout-accounts
GET/api/v1/users/{id}/payout-accounts
The payout accounts a person is currently payable through
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
cookieSession
POST/api/v1/users/{id}/payout-accounts
Link a person to their account at a payout provider
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
PayoutAccountInput (required)
Responses
Authentication
cookieSession
DELETE/api/v1/payout-accounts/{id}
Detach a payout account; re-attaching is a new link
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
cookieSession
profile
GET/api/v1/profile
The signed-in user's own profile
Responses
200 ProfileEnvelope
Authentication
bearerAuth or cookieSession
PATCH/api/v1/profile
Update the signed-in user's own profile
Request body
ProfilePatch (required)
Responses
200 ProfileEnvelope
Authentication
bearerAuth or cookieSession
projects
GET/api/v1/projects
List projects
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
client_id | query | integer | |
is_active | query | boolean | |
updated_since | query | string | |
q | query | string |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/projects
Create a project
Request body
GeneralMutationInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/projects/{id}
Get a project
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/projects/{id}
Update a project
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
GeneralMutationInput (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/projects/{id}
Delete or archive a project
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
bearerAuth or cookieSession
recurring-invoices
GET/api/v1/recurring-invoices
List recurring invoice definitions
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/recurring-invoices
Create a recurring invoice definition
Parameters
| name | in | required | type |
|---|---|---|---|
Idempotency-Key | header | yes | string |
Request body
RecurringInvoiceInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/recurring-invoices/{id}
Get a recurring invoice definition
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/recurring-invoices/{id}
Replace a recurring invoice definition
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
RecurringInvoiceInput (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/recurring-invoices/{id}
Delete a recurring invoice definition
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
bearerAuth or cookieSession
POST/api/v1/recurring-invoices/{id}/claim-backfill
Rehearse or apply the claims a band was issued too early to make
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
BandClaimBackfillInput (required)
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/recurring-invoices/{id}/generations
Issue the invoice this definition is due for
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Responses
201 RecurringGenerationEnvelope
Authentication
bearerAuth or cookieSession
reports
GET/api/v1/report-definitions/registry
List report builder fields and metrics
Responses
200 ReportDefinitionRegistryEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/report-definitions
List report definitions visible to the acting user
Parameters
| name | in | required | type |
|---|---|---|---|
view | query | string: all | yours | shared | |
q | query | string | |
custom_only | query | boolean |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/report-definitions
Save a report definition
Request body
SavedReportInput (required)
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/report-definitions/preview
Run an unsaved report definition
Request body
SavedReportInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/report-definitions/{reportId}
Read a saved report definition
Parameters
| name | in | required | type |
|---|---|---|---|
reportId | path | yes | string |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/report-definitions/{reportId}
Update a saved report at an expected version
Parameters
| name | in | required | type |
|---|---|---|---|
reportId | path | yes | string |
Request body
SavedReportUpdate (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/report-definitions/{reportId}
Delete an owned saved report
Parameters
| name | in | required | type |
|---|---|---|---|
reportId | path | yes | string |
Responses
204 —
Authentication
bearerAuth or cookieSession
POST/api/v1/report-definitions/{reportId}/duplicate
Duplicate a visible report into the acting user's library
Parameters
| name | in | required | type |
|---|---|---|---|
reportId | path | yes | string |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/report-definitions/{reportId}/pin
Pin a visible saved report
Parameters
| name | in | required | type |
|---|---|---|---|
reportId | path | yes | string |
Responses
204 —
Authentication
bearerAuth or cookieSession
DELETE/api/v1/report-definitions/{reportId}/pin
Unpin a visible saved report
Parameters
| name | in | required | type |
|---|---|---|---|
reportId | path | yes | string |
Responses
204 —
Authentication
bearerAuth or cookieSession
POST/api/v1/report-definitions/{reportId}/run
Run the exact current version of a saved report
Parameters
| name | in | required | type |
|---|---|---|---|
reportId | path | yes | string |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/my-hours
Report the acting user's own tracked hours by project
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
project_id | query | integer |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/time
Report tracked time by client, project, task and teammate
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
include_fixed_fee | query | boolean |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/invoiced
List invoices issued in a period with paid and balance amounts
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
client_id | query | integer | |
status | query | string: draft | open | paid | closed |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/payments-received
List invoice payments received in a period
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
client_id | query | integer |
Responses
200 PaymentsReceivedReportEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/receivables
Age outstanding invoice balances by client as of a date
Parameters
| name | in | required | type |
|---|---|---|---|
as_of | query | yes | string |
client_id | query | integer |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/contractor
Total what each person cost over a period
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
Responses
200 ContractorCostReportEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/month-end
What a month-end pack would send, before anybody sends it
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/banded-months
What a banded month was worth at full rates, against what it charged
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/band-cost-alert
Read the organisation cost-share threshold for banded work
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/reports/band-cost-alert
Set the organisation cost-share threshold for banded work
Request body
BandCostAlertInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/profitability
Revenue, cost and profit per project against the window before it
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
project_status | query | string: all | active | archived | |
billing_method | query | string: non_billable | time_materials | fixed_fee | |
manager_id | query | integer | |
tag_id | query | integer |
Responses
200 ProfitabilityReportEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/detailed-expense
List every expense in a period, one row each
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
client_id | query | integer | |
project_id | query | integer | |
category_id | query | integer | |
user_id | query | integer | |
billable | query | boolean | |
reimbursable | query | boolean | |
invoice_state | query | string: all | invoiced | uninvoiced | |
active_projects_only | query | boolean |
Responses
200 DetailedExpenseReportEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/uninvoiced
Report uninvoiced tracked time and expenses
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
client_id | query | integer | |
project_id | query | integer |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/detailed-time
List tracked time by date, task and person
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
client_id | query | integer | |
project_id | query | integer | |
task_id | query | integer | |
user_id | query | integer | |
role_id | query | integer | |
tag_id | query | integer | |
hours | query | string: all | billable | non_billable | uninvoiced | claimed | unclaimed | |
grain | query | string: day | entry | |
invoice_state | query | string: all | invoiced | uninvoiced | |
active_projects_only | query | boolean |
Responses
200 DetailedTimeReportEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/reports/detailed-time/actions
Apply a confirmed idempotent action to selected time rows
Request body
ReportTimeActionInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/client-rollups/{clientId}
Roll up reporting metrics through a client subtree
Parameters
| name | in | required | type |
|---|---|---|---|
clientId | path | yes | integer |
from | query | yes | string |
to | query | yes | string |
Responses
200 ClientRollupReportEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/project-budgets
Report budget consumption for every visible project
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
Responses
200 ProjectBudgetSummaryListEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/project-budget/{projectId}
Report project budget consumption
Parameters
| name | in | required | type |
|---|---|---|---|
projectId | path | yes | integer |
from | query | yes | string |
to | query | yes | string |
Responses
200 ProjectBudgetReportEnvelope
Authentication
bearerAuth or cookieSession
retainers
GET/api/v1/retainers
List retainers with live balances
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
client_id | query | string |
Responses
200 RetainerPage
Authentication
bearerAuth or cookieSession
POST/api/v1/retainers
Create a single-denomination retainer
Parameters
| name | in | required | type |
|---|---|---|---|
Idempotency-Key | header | yes | string |
Request body
RetainerInput (required)
Responses
201 RetainerEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/retainers/{id}
Get a retainer
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 RetainerEnvelope
Authentication
bearerAuth or cookieSession
PATCH/api/v1/retainers/{id}
Update a retainer
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
RetainerPatch (required)
Responses
200 RetainerEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/retainers/{id}/ledger
List append-only retainer movements
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 RetainerLedgerListEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/retainers/{id}/ledger
Append a stable retainer movement
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
RetainerLedgerInput (required)
Responses
201 RetainerLedgerMutationEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/retainers/{id}/drawdowns
Draw down a retainer and return its new balance
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
RetainerDrawdownInput (required)
Responses
201 RetainerLedgerMutationEnvelope
Authentication
bearerAuth or cookieSession
roles
GET/api/v1/roles
List roles
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/roles
Create a role
Request body
GeneralMutationInput (required)
Responses
Authentication
cookieSession
GET/api/v1/roles/{id}
Get a role
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/roles/{id}
Update a role
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
GeneralMutationInput (required)
Responses
Authentication
cookieSession
DELETE/api/v1/roles/{id}
Delete or archive a role
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
cookieSession
service
GET/api/v1
Get API service metadata
Responses
200 ServiceEnvelope
Authentication
bearerAuth or cookieSession
sso-domains
GET/api/v1/settings/sso-domains
List SSO provisioning domains and their DNS challenges
Responses
Authentication
cookieSession
POST/api/v1/settings/sso-domains
Claim a domain and issue its DNS challenge
Request body
SsoDomainInput (required)
Responses
Authentication
cookieSession
DELETE/api/v1/settings/sso-domains/{id}
Remove a provisioning domain
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
cookieSession
POST/api/v1/settings/sso-domains/{id}/verify
Check the DNS challenge and record the result
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
cookieSession
task-assignments
GET/api/v1/task-assignments
List task-assignments
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
project_id | query | integer | |
task_id | query | integer | |
is_active | query | boolean | |
updated_since | query | string |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/task-assignments
Create a taskassignment
Request body
GeneralMutationInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/task-assignments/{id}
Get a taskassignment
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/task-assignments/{id}
Update a taskassignment
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
GeneralMutationInput (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/task-assignments/{id}
Delete or archive a taskassignment
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
bearerAuth or cookieSession
tasks
GET/api/v1/tasks
List tasks
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
is_active | query | boolean | |
updated_since | query | string | |
q | query | string |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/tasks
Create a task
Request body
GeneralMutationInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/tasks/{id}
Get a task
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/tasks/{id}
Update a task
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
GeneralMutationInput (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/tasks/{id}
Delete or archive a task
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
bearerAuth or cookieSession
team
GET/api/v1/team/status
Get Team module availability for navigation
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/team/people
List Team people with authoritative utilization
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
from | query | yes | string |
to | query | yes | string |
is_active | query | boolean |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/team/people/{id}
Get a Team person editor record
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/team/people/{id}
Update a Team person with optimistic concurrency
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
TeamPersonPatch (required)
Responses
200 TeamCommandReceiptEnvelope
Authentication
cookieSession
GET/api/v1/team/catalog
Get roles, departments, and assignable projects
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/team/people/{id}/project-assignments/replace
Replace a person's active project assignments
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
TeamAssignmentReplaceInput (required)
Responses
200 TeamCommandReceiptEnvelope
Authentication
cookieSession
POST/api/v1/team/people/{id}/notifications
Persist inactive notification preferences; delivery is unavailable
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
TeamNotificationInput (required)
Responses
200 TeamCommandReceiptEnvelope
Authentication
cookieSession
POST/api/v1/team/people/{id}/rates
Append an effective-dated person rate
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
TeamRateInput (required)
Responses
201 TeamCommandReceiptEnvelope
Authentication
cookieSession
DELETE/api/v1/team/people/{id}/rates/{rateId}
Remove a person rate that has priced nothing
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
rateId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
TeamRateRemovalInput (required)
Responses
200 TeamCommandReceiptEnvelope
Authentication
cookieSession
time-entries
GET/api/v1/time-entry-settings
Get organization time-entry display and entry-mode settings
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/time-entry-note-settings
Get organization time-entry note settings
Responses
200 TimeEntryNoteSettingsEnvelope
Authentication
bearerAuth or cookieSession
PATCH/api/v1/time-entry-note-settings
Update organization time-entry note settings
Request body
TimeEntryNoteSettingsPatch (required)
Responses
200 TimeEntryNoteSettingsEnvelope
Authentication
cookieSession
GET/api/v1/time-entry-options
List the acting user's active project and task combinations
Responses
200 TimeEntryOptionListEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/time-entries
List the acting user's time entries
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
user_id | query | integer | |
client_id | query | integer | |
project_id | query | integer | |
spent_date | query | string | |
from | query | string | |
to | query | string | |
approval_status | query | string: unsubmitted | submitted | approved | |
invoice_id | query | integer | |
is_billed | query | boolean | |
billable | query | boolean | |
updated_since | query | string | |
task_id | query | integer | |
is_running | query | boolean | |
budgeted | query | boolean | |
external_reference_id | query | string |
Responses
200 TimeEntryPage
Authentication
bearerAuth or cookieSession
POST/api/v1/time-entries
Create or start a time entry
Request body
TimeEntryInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/time-entries/{id}
Get a time entry
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/time-entries/{id}
Update a time entry
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
TimeEntryPatch (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/time-entries/{id}
Delete a time entry
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/time-entries/{id}/stop
Stop a time entry
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/time-entries/{id}/restart
Restart a time entry
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
timesheet-approvals
GET/api/v1/timesheet-submissions
List the acting user's timesheet submissions
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
period_start | query | string | |
period_end | query | string |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/timesheet-submissions
Submit a timesheet period for approval
Request body
TimesheetSubmissionInput (required)
Responses
200 TimesheetSubmissionEnvelope, 201 TimesheetSubmissionEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/timesheet-submissions/pending
List timesheet submissions awaiting review
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
period_start | query | string | |
period_end | query | string | |
user_id | query | integer | |
client_id | query | integer | |
project_id | query | integer |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/timesheet-submissions/approved
List recently approved timesheet periods available to reopen
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
period_start | query | string | |
period_end | query | string | |
user_id | query | integer | |
client_id | query | integer | |
project_id | query | integer |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/timesheet-submissions/{id}
Get an owner- or approver-visible timesheet submission
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 TimesheetSubmissionDetailEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/timesheet-submissions/bulk-approve
Approve an explicit selection of submitted timesheet periods
Parameters
| name | in | required | type |
|---|---|---|---|
Idempotency-Key | header | yes | string |
Request body
TimesheetBulkApprovalInput (required)
Responses
200 TimesheetBulkApprovalResult
Authentication
bearerAuth or cookieSession
POST/api/v1/timesheet-submissions/{id}/approve
Approve a submitted timesheet period
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 TimesheetSubmissionEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/timesheet-submissions/{id}/reject
Reject a submitted timesheet period with a reason
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
TimesheetRejectionInput (required)
Responses
200 TimesheetSubmissionEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/timesheet-submissions/{id}/unsubmit
Take back your own timesheet before anyone has reviewed it
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 TimesheetSubmissionEnvelope
Authentication
cookieSession
POST/api/v1/timesheet-submissions/{id}/withdraw
Explicitly withdraw or reopen a timesheet period
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
TimesheetWithdrawalInput (required)
Responses
200 TimesheetSubmissionEnvelope
Authentication
cookieSession
timesheet-locks
GET/api/v1/timesheet-lock-policy
Get the organization timesheet lock policy
Responses
200 TimesheetLockPolicyEnvelope
Authentication
cookieSession
PATCH/api/v1/timesheet-lock-policy
Update the organization timesheet lock policy
Request body
TimesheetLockPolicyPatch (required)
Responses
200 TimesheetLockPolicyEnvelope
Authentication
cookieSession
GET/api/v1/timesheet-locks
List durable timesheet lock windows
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
active | query | boolean | |
kind | query | string: manual | auto |
Responses
Authentication
cookieSession
POST/api/v1/timesheet-locks
Create an organization-wide manual lock cutoff
Parameters
| name | in | required | type |
|---|---|---|---|
Idempotency-Key | header | yes | string |
Request body
TimesheetManualLockInput (required)
Responses
201 TimesheetLockWindowEnvelope
Authentication
cookieSession
GET/api/v1/timesheet-locks/{id}
Get a durable timesheet lock window
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 TimesheetLockWindowEnvelope
Authentication
cookieSession
POST/api/v1/timesheet-locks/{id}/unlock
Explicitly unlock a timesheet lock window
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
TimesheetUnlockInput (required)
Responses
200 TimesheetLockWindowEnvelope
Authentication
cookieSession
two-factor
GET/api/v1/two-factor
Report whether a second factor is enrolled, pending, or absent
Responses
Authentication
cookieSession
POST/api/v1/two-factor
Issue a TOTP seed and recovery codes, pending confirmation
Responses
201 TwoFactorEnrolmentEnvelope
Authentication
cookieSession
DELETE/api/v1/two-factor
Remove the second factor, on presentation of a current code
Request body
TwoFactorCodeInput (required)
Responses
Authentication
cookieSession
POST/api/v1/two-factor/confirm
Prove the authenticator holds the seed and turn the factor on
Request body
TwoFactorCodeInput (required)
Responses
Authentication
cookieSession
user-assignments
GET/api/v1/user-assignments
List user-assignments
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
project_id | query | integer | |
user_id | query | integer | |
is_active | query | boolean | |
updated_since | query | string |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/user-assignments
Create a userassignment
Request body
GeneralMutationInput (required)
Responses
Authentication
cookieSession
GET/api/v1/user-assignments/{id}
Get a userassignment
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/user-assignments/{id}
Update a userassignment
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
GeneralMutationInput (required)
Responses
Authentication
cookieSession
DELETE/api/v1/user-assignments/{id}
Delete or archive a userassignment
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
cookieSession
user-rates
GET/api/v1/users/{userId}/billable-rates
List billable rates for a user
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
cursor | query | string | |
per_page | query | integer |
Responses
200 UserRatePage
Authentication
bearerAuth or cookieSession
POST/api/v1/users/{userId}/billable-rates
Append a billable rate for a user
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
UserRateInput (required)
Responses
201 UserRateEnvelope
Authentication
cookieSession
PATCH/api/v1/users/{userId}/billable-rates
BillableRate records are append-only
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
Responses
204 no content
Authentication
bearerAuth or cookieSession
DELETE/api/v1/users/{userId}/billable-rates
BillableRate records are append-only
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
Responses
204 no content
Authentication
bearerAuth or cookieSession
GET/api/v1/users/{userId}/billable-rates/{id}
Get a billable rate
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
id | path | yes | integer |
Responses
200 UserRateEnvelope
Authentication
bearerAuth or cookieSession
PATCH/api/v1/users/{userId}/billable-rates/{id}
BillableRate records are append-only
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
id | path | yes | integer |
Responses
204 no content
Authentication
bearerAuth or cookieSession
DELETE/api/v1/users/{userId}/billable-rates/{id}
BillableRate records are append-only
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
id | path | yes | integer |
Responses
204 no content
Authentication
bearerAuth or cookieSession
GET/api/v1/users/{userId}/cost-rates
List cost rates for a user
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
cursor | query | string | |
per_page | query | integer |
Responses
200 UserRatePage
Authentication
bearerAuth or cookieSession
POST/api/v1/users/{userId}/cost-rates
Append a cost rate for a user
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
UserRateInput (required)
Responses
201 UserRateEnvelope
Authentication
cookieSession
PATCH/api/v1/users/{userId}/cost-rates
CostRate records are append-only
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
Responses
204 no content
Authentication
bearerAuth or cookieSession
DELETE/api/v1/users/{userId}/cost-rates
CostRate records are append-only
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
Responses
204 no content
Authentication
bearerAuth or cookieSession
GET/api/v1/users/{userId}/cost-rates/{id}
Get a cost rate
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
id | path | yes | integer |
Responses
200 UserRateEnvelope
Authentication
bearerAuth or cookieSession
PATCH/api/v1/users/{userId}/cost-rates/{id}
CostRate records are append-only
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
id | path | yes | integer |
Responses
204 no content
Authentication
bearerAuth or cookieSession
DELETE/api/v1/users/{userId}/cost-rates/{id}
CostRate records are append-only
Parameters
| name | in | required | type |
|---|---|---|---|
userId | path | yes | integer |
id | path | yes | integer |
Responses
204 no content
Authentication
bearerAuth or cookieSession
users
GET/api/v1/users
List users
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
is_active | query | boolean | |
updated_since | query | string | |
profile | query | string: member | project_manager | people_admin | accounting | executive_manager | administrator | |
is_contractor | query | boolean |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/users
Create a user
Request body
GeneralMutationInput (required)
Responses
Authentication
cookieSession
GET/api/v1/users/{id}
Get a user
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/users/{id}
Update a user
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
GeneralMutationInput (required)
Responses
Authentication
cookieSession
DELETE/api/v1/users/{id}
Delete or archive a user
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
cookieSession
POST/api/v1/users/{id}/emails
Add a second email address and send its verification
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
UserEmailInput (required)
Responses
Authentication
cookieSession
Schemas
ActivityLog
| field | type | required |
|---|---|---|
event_id | string | yes |
event_type | string | yes |
aggregate | OutboxAggregate | yes |
payload | object | yes |
occurred_at | string (date-time) | yes |
available_at | string (date-time) | yes |
recorded_at | string (date-time) | yes |
ActivityLogPage
| field | type | required |
|---|---|---|
data | array of ActivityLog | yes |
links | Links | yes |
ApiToken
| field | type | required |
|---|---|---|
id | integer | yes |
name | string | yes |
scopes | array of string | yes |
token_hint | string | yes |
created_at | string (date-time) | yes |
last_used_at | string | null | yes |
expires_at | string | null | yes |
revoked_at | string | null | yes |
Attachment
| field | type | required |
|---|---|---|
id | integer | yes |
name | string | yes |
content_hash | string | yes |
byte_size | integer | yes |
content_type | string | yes |
uploaded_by_user_id | integer | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
AttachmentEnvelope
| field | type | required |
|---|---|---|
data | Attachment | yes |
links | Links | yes |
AttachmentListEnvelope
| field | type | required |
|---|---|---|
data | array of Attachment | yes |
links | Links | yes |
AttachmentUploadInput
| field | type | required |
|---|---|---|
file | string (binary) | yes |
AuthAccepted
| field | type | required |
|---|---|---|
status | verification_sent | reset_requested | yes |
AuthAcceptedEnvelope
| field | type | required |
|---|---|---|
data | AuthAccepted | yes |
AuthPrincipal
| field | type | required |
|---|---|---|
status | verified | authenticated | password_reset | yes |
user_id | integer | yes |
profile | member | project_manager | people_admin | accounting | executive_manager | administrator | yes |
manager_grants | array of string | yes |
AuthPrincipalEnvelope
| field | type | required |
|---|---|---|
data | AuthPrincipal | yes |
AuthTokenInput
| field | type | required |
|---|---|---|
token | string | yes |
BackupRun
| field | type | required |
|---|---|---|
id | integer | yes |
status | running | completed | failed | yes |
trigger | nightly | manual | yes |
started_at | string (date-time) | yes |
completed_at | string | null | yes |
r2_prefix | string | null | yes |
table_count | integer | null | yes |
total_rows | integer | null | yes |
error_message | string | null | yes |
BackupStatusEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
links | Links | yes |
BandClaimBackfill
| field | type | required |
|---|---|---|
run_id | string | yes |
applied | boolean | yes |
invoices | array of BandClaimBackfillLine | yes |
remaining_entry_count | integer | yes |
remaining_seconds | integer | yes |
BandClaimBackfillEnvelope
| field | type | required |
|---|---|---|
data | BandClaimBackfill | yes |
BandClaimBackfillInput
| field | type | required |
|---|---|---|
invoice_ids | array of integer | yes |
project_ids | array of integer | |
apply | boolean |
BandClaimBackfillLine
| field | type | required |
|---|---|---|
invoice_id | integer | yes |
number | string | yes |
issue_date | string (date) | yes |
state | string | yes |
amount_cents | integer | yes |
entry_count | integer | yes |
seconds | integer | yes |
billable_value_cents | integer | yes |
entries_without_billable_rate | integer | yes |
foregone_billable_cents | integer | yes |
BandCostAlert
| field | type | required |
|---|---|---|
basis_points | integer | yes |
BandCostAlertEnvelope
| field | type | required |
|---|---|---|
data | BandCostAlert | yes |
BandCostAlertInput
| field | type | required |
|---|---|---|
basis_points | integer | yes |
BandedMonthReport
| field | type | required |
|---|---|---|
from | string (date) | yes |
to | string (date) | yes |
rows | array of BandedMonthRow | yes |
BandedMonthReportEnvelope
| field | type | required |
|---|---|---|
data | BandedMonthReport | yes |
links | Links | yes |
BandedMonthRow
| field | type | required |
|---|---|---|
period_start | string (date) | yes |
period_end | string (date) | yes |
project_id | integer | yes |
project_name | string | yes |
client_id | integer | yes |
client_name | string | yes |
currency | string | yes |
rounded_seconds | integer | yes |
billable_value_cents | integer | null | yes |
cost_value_cents | integer | null | yes |
entries_without_billable_rate | integer | yes |
entries_without_cost_rate | integer | yes |
claimed_in_other_currency | integer | yes |
billed_cents | integer | null | yes |
foregone_cents | integer | null | yes |
cost_ratio_basis_points | integer | null | yes |
cost_alert_basis_points | integer | yes |
cost_ratio_state | within | over | unpriced | unbilled | yes |
BillClientDelivery
| field | type | required |
|---|---|---|
client_id | integer | yes |
deliver_via_bill | boolean | yes |
BillClientDeliveryEnvelope
| field | type | required |
|---|---|---|
data | BillClientDelivery | yes |
BillClientDeliveryInput
| field | type | required |
|---|---|---|
deliver_via_bill | boolean | yes |
BillStatus
| field | type | required |
|---|---|---|
configured | boolean | yes |
company_id | string | null | yes |
environment | sandbox | production | yes |
can_send_from_bill | boolean | yes |
BillStatusEnvelope
| field | type | required |
|---|---|---|
data | BillStatus | yes |
Brand
| field | type | required |
|---|---|---|
organization_name | string | yes |
assets | array of BrandMark | yes |
palette | InstancePalette |
BrandAsset
| field | type | required |
|---|---|---|
slot | wordmark_light | wordmark_dark | favicon | yes |
content_hash | string | yes |
content_type | image/png | image/jpeg | image/webp | yes |
byte_size | integer | yes |
url | string | yes |
updated_at | string (date-time) | yes |
BrandAssetEnvelope
| field | type | required |
|---|---|---|
data | BrandAsset | yes |
BrandAssetListEnvelope
| field | type | required |
|---|---|---|
data | array of BrandAsset | yes |
links | Links | yes |
BrandAssetUploadInput
| field | type | required |
|---|---|---|
file | string (binary) | yes |
BrandMark
| field | type | required |
|---|---|---|
slot | wordmark_light | wordmark_dark | favicon | yes |
url | string | yes |
content_type | image/png | image/jpeg | image/webp | yes |
updated_at | string (date-time) | yes |
ClientHierarchyListEnvelope
| field | type | required |
|---|---|---|
data | array of ClientHierarchyNode | yes |
links | Links | yes |
ClientHierarchyNode
| field | type | required |
|---|---|---|
ancestor_id | integer | yes |
descendant_id | integer | yes |
depth | integer | yes |
ClientRollupCurrency
| field | type | required |
|---|---|---|
currency | string | yes |
expense_cents | integer | yes |
uninvoiced_time_cents | integer | |
uninvoiced_expense_cents | integer | |
uninvoiced_total_cents | integer | |
money_budget_cents | integer | |
cost_cents | integer |
ClientRollupMetrics
| field | type | required |
|---|---|---|
time_entry_count | integer | yes |
expense_count | integer | yes |
rounded_seconds | integer | yes |
billable_seconds | integer | yes |
budgeted_seconds | integer | yes |
time_budget_seconds | integer | yes |
unpriced_billable_entry_count | integer | yes |
unpriced_cost_entry_count | integer | yes |
currencies | array of ClientRollupCurrency | yes |
ClientRollupNode
| field | type | required |
|---|---|---|
client_id | integer | yes |
name | string | yes |
parent_client_id | integer | null | yes |
depth | integer | yes |
direct | ClientRollupMetrics | yes |
rollup | ClientRollupMetrics | yes |
ClientRollupReport
| field | type | required |
|---|---|---|
root_client_id | integer | yes |
from | string (date) | yes |
to | string (date) | yes |
nodes | array of ClientRollupNode | yes |
ClientRollupReportEnvelope
| field | type | required |
|---|---|---|
data | ClientRollupReport | yes |
links | Links | yes |
ContractorCostReport
| field | type | required |
|---|---|---|
from | string | yes |
to | string | yes |
rows | array of ContractorCostRow | yes |
ContractorCostReportEnvelope
| field | type | required |
|---|---|---|
data | ContractorCostReport | yes |
links | Links | yes |
ContractorCostRow
| field | type | required |
|---|---|---|
user_id | integer | yes |
name | string | yes |
payroll_email | string | null | yes |
is_contractor | boolean | yes |
currency | string | yes |
rounded_seconds | integer | yes |
utilization_ppm | integer | null | yes |
cost_cents | integer | null | yes |
cost_rate_cents | integer | null | yes |
cost_rate_is_mixed | boolean | yes |
entry_count | integer | yes |
entries_without_rate | integer | yes |
CreateApiTokenInput
| field | type | required |
|---|---|---|
name | string | yes |
scopes | array of string | yes |
expires_at | string | null |
DetailedExpenseReport
| field | type | required |
|---|---|---|
from | string (date) | yes |
to | string (date) | yes |
client_id | integer | null | yes |
project_id | integer | null | yes |
category_id | integer | null | yes |
user_id | integer | null | yes |
billable | boolean | null | yes |
reimbursable | boolean | null | yes |
invoice_state | all | invoiced | uninvoiced | yes |
active_projects_only | boolean | yes |
totals | array of DetailedExpenseTotal | yes |
rows | array of DetailedExpenseRow | yes |
DetailedExpenseReportEnvelope
| field | type | required |
|---|---|---|
data | DetailedExpenseReport | yes |
links | Links | yes |
DetailedExpenseRow
| field | type | required |
|---|---|---|
expense_id | integer | yes |
spent_date | string (date) | yes |
client_id | integer | yes |
client_name | string | yes |
project_id | integer | yes |
project_name | string | yes |
project_code | string | yes |
category_id | integer | yes |
category_name | string | yes |
user_id | integer | yes |
user_name | string | yes |
notes | string | null | yes |
units | integer | null | yes |
billable | boolean | yes |
reimbursable | boolean | yes |
invoice_id | integer | null | yes |
currency | string | yes |
total_cost_cents | integer |
DetailedExpenseTotal
| field | type | required |
|---|---|---|
currency | string | yes |
expense_count | integer | yes |
total_cost_cents | integer |
DetailedTimeCurrencyTotal
| field | type | required |
|---|---|---|
currency | string | yes |
billable_amount_cents | integer | null | |
entries_without_billable_rate | integer | yes |
DetailedTimeReport
| field | type | required |
|---|---|---|
from | string (date) | yes |
to | string (date) | yes |
client_id | integer | null | yes |
project_id | integer | null | yes |
task_id | integer | null | yes |
user_id | integer | null | yes |
role_id | integer | null | yes |
tag_id | integer | null | yes |
invoice_state | all | invoiced | uninvoiced | yes |
hours | all | billable | non_billable | uninvoiced | claimed | unclaimed | yes |
grain | day | entry | yes |
active_projects_only | boolean | yes |
seconds | integer | yes |
rounded_seconds | integer | yes |
billable_seconds | integer | yes |
uninvoiced_billable_seconds | integer | yes |
claimed_seconds | integer | yes |
unclaimed_seconds | integer | yes |
time_entry_count | integer | yes |
currencies | array of DetailedTimeCurrencyTotal | yes |
rows | array of DetailedTimeRow | yes |
DetailedTimeReportEnvelope
| field | type | required |
|---|---|---|
data | DetailedTimeReport | yes |
links | Links | yes |
DetailedTimeRow
| field | type | required |
|---|---|---|
spent_date | string (date) | yes |
client_id | integer | yes |
client_name | string | yes |
project_id | integer | yes |
project_name | string | yes |
project_code | string | yes |
task_id | integer | yes |
task_name | string | yes |
user_id | integer | yes |
user_name | string | yes |
roles | array of string | yes |
currency | string | yes |
seconds | integer | yes |
rounded_seconds | integer | yes |
billable_seconds | integer | yes |
uninvoiced_billable_seconds | integer | yes |
time_entry_count | integer | yes |
billable_amount_cents | integer | null | |
entries_without_billable_rate | integer | yes |
claimed | boolean | yes |
time_entry_id | integer | |
invoice_id | integer | null | |
notes | string | null | |
project_active | boolean |
EmailHealth
| field | type | required |
|---|---|---|
reputation | EmailReputationSnapshot | yes |
EmailHealthEnvelope
| field | type | required |
|---|---|---|
data | EmailHealth | yes |
links | Links | yes |
EmailInput
| field | type | required |
|---|---|---|
email | string (email) | yes |
EmailLog
| field | type | required |
|---|---|---|
id | integer | yes |
from | EmailRecipient | null | yes |
reply_to | array of EmailRecipient | yes |
to | array of EmailRecipient | yes |
template | string | yes |
subject | string | yes |
provider | string | null | yes |
provider_message_id | string | null | yes |
provider_request_id | string | null | yes |
provider_latency_ms | integer | null | yes |
status | queued | sent | bounced | complained | failed | yes |
related_type | string | null | yes |
related_id | integer | null | yes |
attempt_count | integer | yes |
failure_code | string | null | yes |
failure_reason | string | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
EmailRecipient
| field | type | required |
|---|---|---|
email | string | yes |
name | string |
EmailReputationSnapshot
| field | type | required |
|---|---|---|
sent | integer | yes |
bounced | integer | yes |
complained | integer | yes |
failed | integer | yes |
bounce_rate_ppm | integer | yes |
complaint_rate_ppm | integer | yes |
EmailTemplate
| field | type | required |
|---|---|---|
kind | invoice | reminder | thank_you | auth_email_verification | auth_password_reset | yes |
version | integer | yes |
subject_template | string | yes |
text_template | string | yes |
html_template | string | null | yes |
unknown_variable_policy | error | literal | yes |
created_by_user_id | integer | null | yes |
created_at | string (date-time) | yes |
EmailTemplateEnvelope
| field | type | required |
|---|---|---|
data | EmailTemplate | yes |
EmailTemplatePage
| field | type | required |
|---|---|---|
data | array of EmailTemplate | yes |
links | Links | yes |
EmailTemplateVariable
| field | type | required |
|---|---|---|
name | string | yes |
token | string | yes |
description | string | yes |
compatibility | harvest | native | yes |
EmailTemplateVariableCatalog
| field | type | required |
|---|---|---|
data | array of EmailTemplateVariableGroup | yes |
links | Links | yes |
EmailTemplateVariableGroup
| field | type | required |
|---|---|---|
kind | invoice | reminder | thank_you | auth_email_verification | auth_password_reset | yes |
variables | array of EmailTemplateVariable | yes |
EmailTemplateVersionInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
subject_template | string | yes |
text_template | string | yes |
html_template | string | null | |
unknown_variable_policy | error | literal |
EmailTestSend
| field | type | required |
|---|---|---|
status | any | yes |
delivery_id | integer | yes |
sender_identity_id | integer | yes |
template_kind | invoice | reminder | thank_you | yes |
template_version | integer | yes |
recipient_email | string (email) | yes |
EmailTestSendEnvelope
| field | type | required |
|---|---|---|
data | EmailTestSend | yes |
EmailTestSendInput
| field | type | required |
|---|---|---|
template_kind | invoice | reminder | thank_you | yes |
template_version | integer | yes |
variables | object | yes |
confirmed | any | yes |
ErrorDetail
| field | type | required |
|---|---|---|
code | string | yes |
message | string | yes |
fields | array of FieldError | yes |
ErrorEnvelope
| field | type | required |
|---|---|---|
error | ErrorDetail | yes |
request_id | string | yes |
Estimate
| field | type | required |
|---|---|---|
id | integer | yes |
client_id | integer | yes |
created_by_user_id | integer | null | yes |
number | string | yes |
purchase_order | string | null | yes |
subject | string | null | yes |
notes | string | null | yes |
currency | string | yes |
state | draft | sent | accepted | declined | yes |
version | integer | yes |
issue_date | string (date) | yes |
sent_at | string | null | yes |
accepted_at | string | null | yes |
declined_at | string | null | yes |
tax_rate_ppm | integer | null | yes |
tax2_rate_ppm | integer | null | yes |
discount_rate_ppm | integer | null | yes |
amount_cents | integer | yes |
tax_amount_cents | integer | yes |
tax2_amount_cents | integer | yes |
discount_amount_cents | integer | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
line_items | array of EstimateLine | yes |
EstimateConversion
| field | type | required |
|---|---|---|
invoice | Invoice | yes |
event | EstimateMessage | yes |
EstimateConversionEnvelope
| field | type | required |
|---|---|---|
data | EstimateConversion | yes |
links | Links | yes |
EstimateConversionInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
number | string | yes |
issue_date | string (date) | yes |
due_date | string (date) | yes |
payment_terms | upon_receipt | net_15 | net_30 | net_45 | net_60 | custom | yes |
EstimateLine
| field | type | required |
|---|---|---|
id | integer | yes |
estimate_id | integer | yes |
position | integer | yes |
kind | string | yes |
description | string | null | yes |
quantity | number | yes |
unit_price_cents | integer | yes |
amount_cents | integer | yes |
taxed | boolean | yes |
taxed2 | boolean | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
EstimateMessage
| field | type | required |
|---|---|---|
id | integer | yes |
estimate_id | integer | yes |
sent_by | string | null | yes |
sent_by_email | string | null | yes |
sent_from | string | null | yes |
sent_from_email | string | null | yes |
recipients | array of InvoiceRecipient | yes |
subject | string | null | yes |
body | string | null | yes |
send_me_a_copy | boolean | yes |
event_type | string | null | yes |
delivery_status | string | null | yes |
provider_message_id | string | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
EstimateMessageCommandEnvelope
| field | type | required |
|---|---|---|
data | EstimateMessageCommandResponse | yes |
links | Links | yes |
EstimateMessageCommandResponse
| field | type | required |
|---|---|---|
estimate | Estimate | yes |
message | EstimateMessage | yes |
EstimateMessageInput
{"oneOf":[{"type":"object","required":["expected_version","event_type","recipients"],"properties":{"expected_version":{"type":"integer","minimum":0},"event_type":{"const":"send"},"recipients":{"type":
EstimateMessageListEnvelope
| field | type | required |
|---|---|---|
data | array of EstimateMessage | yes |
links | Links | yes |
EstimatePage
| field | type | required |
|---|---|---|
data | array of Estimate | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
Expense
| field | type | required |
|---|---|---|
id | integer | yes |
user_id | integer | yes |
project_id | integer | yes |
expense_category_id | integer | yes |
spent_date | string (date) | yes |
notes | string | null | |
units | number | null | |
total_cost_cents | integer | yes |
billable | boolean | yes |
approval_status | unsubmitted | submitted | approved | yes |
source_approval_status | string | null | |
invoice_id | integer | null | |
is_billed | boolean | |
is_locked | boolean | yes |
locked_reason_code | string | null | |
locked_reason | string | null | |
reimbursable | boolean | yes |
reimbursement_status | none | pending | approved | paid | yes |
payout_ref | string | null | |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
ExpenseCategory
| field | type | required |
|---|---|---|
id | integer | yes |
name | string | yes |
unit_name | string | null | yes |
unit_price_cents | integer | null | yes |
is_active | boolean | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
ExpenseCategoryEnvelope
| field | type | required |
|---|---|---|
data | ExpenseCategory | yes |
links | Links | yes |
ExpenseCategoryInput
| field | type | required |
|---|---|---|
name | string | yes |
unit_name | string | null | |
unit_price_cents | integer | null | |
is_active | boolean |
ExpenseCategoryPage
| field | type | required |
|---|---|---|
data | array of ExpenseCategory | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
ExpenseCategoryPatch
| field | type | required |
|---|---|---|
name | string | |
unit_name | string | null | |
unit_price_cents | integer | null | |
is_active | boolean |
ExpenseInput
| field | type | required |
|---|---|---|
project_id | integer | yes |
expense_category_id | integer | yes |
spent_date | string (date) | yes |
notes | string | null | |
units | number | |
total_cost_cents | integer | |
billable | boolean | |
reimbursable | boolean |
ExpensePage
| field | type | required |
|---|---|---|
data | array of Expense | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
ExpensePatch
| field | type | required |
|---|---|---|
project_id | integer | |
expense_category_id | integer | |
spent_date | string (date) | |
notes | string | null | |
units | number | |
total_cost_cents | integer | |
billable | boolean | |
reimbursable | boolean |
FieldError
| field | type | required |
|---|---|---|
field | string | yes |
code | string | yes |
message | string | yes |
minimum_length | integer |
GeneralMutationInput
Commercial fields listed on GeneralResource require the same commercial authority for create and update, in addition to resource write scope.
{"type":"object","description":"Commercial fields listed on GeneralResource require the same commercial authority for create and update, in addition to resource write scope.","minProperties":1,"additi
GeneralResource
Commercial fields are omitted without finance/admin authority or an explicit billable_rates_manager grant. The same authority is required to set them; resource read/write scopes still apply.
| field | type | required |
|---|---|---|
id | integer | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
GeneralResourceEnvelope
| field | type | required |
|---|---|---|
data | GeneralResource | yes |
links | Links | yes |
GeneralResourcePage
| field | type | required |
|---|---|---|
data | array of GeneralResource | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
IncompleteRecurringInvoiceListEnvelope
| field | type | required |
|---|---|---|
data | array of object | yes |
InstancePalette
{"type":"object","additionalProperties":{"type":"string","pattern":"^#[0-9A-F]{6}$"}}
InstanceTheme
| field | type | required |
|---|---|---|
palette | InstancePalette | yes |
updated_at | string (date-time) | yes |
InstanceThemeEnvelope
| field | type | required |
|---|---|---|
data | InstanceTheme | null | yes |
InstanceThemeInput
| field | type | required |
|---|---|---|
palette | InstancePalette | yes |
Invoice
| field | type | required |
|---|---|---|
id | integer | yes |
client_id | integer | yes |
created_by_user_id | integer | null | yes |
number | string | yes |
subject | string | null | yes |
purchase_order | string | null | yes |
notes | string | null | yes |
currency | string | yes |
issue_date | string (date) | yes |
due_date | string (date) | yes |
payment_terms | upon_receipt | net_15 | net_30 | net_45 | net_60 | custom | yes |
state | draft | open | paid | closed | yes |
version | integer | yes |
close_reason | string | null | yes |
close_write_off_cents | integer | yes |
sent_at | string | null | yes |
paid_at | string | null | yes |
paid_date | string | null | yes |
closed_at | string | null | yes |
period_start | string | null | yes |
period_end | string | null | yes |
project_id | integer | null | yes |
retainer_id | integer | null | yes |
recurring_invoice_id | integer | null | yes |
estimate_id | integer | null | yes |
reminder_policy | InvoiceReminderPolicy | null | yes |
tax_rate_ppm | integer | null | yes |
tax2_rate_ppm | integer | null | yes |
discount_rate_ppm | integer | null | yes |
amount_cents | integer | yes |
due_amount_cents | integer | yes |
tax_amount_cents | integer | yes |
tax2_amount_cents | integer | yes |
discount_amount_cents | integer | yes |
written_off_cents | integer | yes |
payment_options | array of string | yes |
reference_token | string | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
line_items | array of InvoiceLine | yes |
InvoiceCommandEnvelope
| field | type | required |
|---|---|---|
data | InvoiceCommandResponse | yes |
links | Links | yes |
InvoiceCommandResponse
| field | type | required |
|---|---|---|
invoice | Invoice | yes |
command | InvoiceCommandResult | yes |
InvoiceCommandResult
| field | type | required |
|---|---|---|
schema_version | any | yes |
event_ids | array of string | yes |
first_aggregate_sequence | integer | yes |
event_count | integer | yes |
invoice | InvoiceCommandSnapshot | yes |
InvoiceCommandSnapshot
| field | type | required |
|---|---|---|
id | integer | yes |
version | integer | yes |
updated_at | string (date-time) | yes |
state | draft | open | paid | closed | yes |
close_reason | string | null | yes |
close_write_off_cents | integer | yes |
sent_at | string | null | yes |
paid_at | string | null | yes |
paid_date | string | null | yes |
closed_at | string | null | yes |
amount_cents | integer | yes |
due_amount_cents | integer | yes |
written_off_cents | integer | yes |
payment_count | integer | yes |
payment_status | unpaid | partial | paid | yes |
InvoiceDocumentPreferenceEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
InvoicedReport
| field | type | required |
|---|---|---|
from | string (date) | yes |
to | string (date) | yes |
client_id | integer | null | yes |
status | string | null | yes |
totals | array of InvoicedReportTotal | yes |
rows | array of InvoicedReportRow | yes |
InvoicedReportEnvelope
| field | type | required |
|---|---|---|
data | InvoicedReport | yes |
links | Links | yes |
InvoicedReportRow
| field | type | required |
|---|---|---|
invoice_id | integer | yes |
number | string | yes |
state | draft | open | paid | closed | yes |
close_reason | string | null | yes |
issue_date | string (date) | yes |
due_date | string (date) | yes |
client_id | integer | yes |
client_name | string | yes |
subject | string | null | yes |
currency | string | yes |
invoiced_cents | integer | |
paid_cents | integer | |
balance_cents | integer |
InvoicedReportTotal
| field | type | required |
|---|---|---|
currency | string | yes |
invoice_count | integer | yes |
invoiced_cents | integer | |
paid_cents | integer | |
balance_cents | integer |
InvoiceEditInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
client_id | integer | |
number | string | |
subject | string | null | |
purchase_order | string | null | |
notes | string | null | |
currency | string | |
issue_date | string (date) | |
due_date | string (date) | |
payment_terms | upon_receipt | net_15 | net_30 | net_45 | net_60 | custom | |
project_id | integer | null | |
retainer_id | integer | null | |
reminder_policy | InvoiceReminderPolicy | null | |
payment_options | array of string | |
tax_rate_ppm | integer | null | |
tax2_rate_ppm | integer | null | |
discount_rate_ppm | integer | null |
InvoiceEmailDeliveryInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
recipients | array of InvoiceRecipient | yes |
sender_identity_id | integer | |
template_version | integer | |
confirmed | true | yes |
InvoiceGenerationInput
| field | type | required |
|---|---|---|
client_id | integer | yes |
from | string (date) | yes |
to | string (date) | yes |
project_ids | array of integer | yes |
time_summary_type | string | null | yes |
expense_summary_type | string | null | yes |
InvoiceLine
| field | type | required |
|---|---|---|
id | integer | yes |
invoice_id | integer | yes |
position | integer | yes |
kind | string | yes |
description | string | null | yes |
quantity | number | yes |
unit_price_cents | integer | yes |
amount_cents | integer | yes |
taxed | boolean | yes |
taxed2 | boolean | yes |
project_id | integer | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
InvoiceLineInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
position | integer | yes |
kind | string | yes |
description | string | null | |
quantity | number | yes |
unit_price_cents | integer | yes |
taxed | boolean | |
taxed2 | boolean | |
project_id | integer | null |
InvoiceLineUpdateInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
expected_updated_at | string (date-time) | yes |
position | integer | yes |
kind | string | yes |
description | string | null | |
quantity | number | yes |
unit_price_cents | integer | yes |
taxed | boolean | |
taxed2 | boolean | |
project_id | integer | null |
InvoiceMessage
| field | type | required |
|---|---|---|
id | integer | yes |
invoice_id | integer | yes |
sent_by | string | null | yes |
sent_by_email | string | null | yes |
sent_from | string | null | yes |
sent_from_email | string | null | yes |
recipients | array of InvoiceRecipient | yes |
subject | string | null | yes |
body | string | null | yes |
attach_pdf | boolean | yes |
send_me_a_copy | boolean | yes |
thank_you | boolean | yes |
reminder | boolean | yes |
send_reminder_on | string | null | yes |
event_type | string | null | yes |
delivery_status | string | null | yes |
provider_message_id | string | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
InvoiceMessageInput
| field | type | required |
|---|---|---|
event_type | send | draft | cancel | write_off | reopen | re-open | yes |
expected_version | integer | yes |
recipients | array of InvoiceRecipient | |
subject | string | null | |
body | string | null | |
attach_pdf | boolean | |
send_me_a_copy | boolean | |
thank_you | boolean | |
reminder | boolean | |
send_reminder_on | string | null |
InvoiceMessageListEnvelope
| field | type | required |
|---|---|---|
data | array of InvoiceMessage | yes |
links | Links | yes |
InvoicePage
| field | type | required |
|---|---|---|
data | array of Invoice | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
InvoicePayment
| field | type | required |
|---|---|---|
id | integer | yes |
invoice_id | integer | yes |
currency | string | yes |
amount_cents | integer | yes |
paid_at | string | null | yes |
paid_date | string | null | yes |
notes | string | null | yes |
recorded_by_user_id | integer | null | yes |
provider | string | yes |
provider_shape | string | yes |
provider_account_id | integer | null | yes |
provider_transaction_id | string | null | yes |
bank_deposit_id | integer | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
InvoicePaymentInput
{"oneOf":[{"type":"object","required":["expected_version","amount_cents","currency","paid_at"],"properties":{"expected_version":{"type":"integer","minimum":0},"amount_cents":{"type":"integer","minimum
InvoicePaymentLinkEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
InvoicePaymentListEnvelope
| field | type | required |
|---|---|---|
data | array of InvoicePayment | yes |
links | Links | yes |
InvoicePaymentUpdateInput
{"oneOf":[{"type":"object","required":["expected_version","expected_updated_at","amount_cents","paid_at"],"properties":{"expected_version":{"type":"integer","minimum":0},"expected_updated_at":{"type":
InvoiceRecipient
| field | type | required |
|---|---|---|
name | string | yes |
email | string | yes |
InvoiceReminderPolicy
| field | type | required |
|---|---|---|
first_after_days | integer | yes |
every_days | integer | yes |
InvoiceThankYouPreferenceEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
InvoiceTransitionInput
| field | type | required |
|---|---|---|
command | send | draft | cancel | write_off | reopen | re-open | yes |
expected_version | integer | yes |
recipients | array of InvoiceRecipient | |
subject | string | null | |
body | string | null | |
attach_pdf | boolean | |
send_me_a_copy | boolean | |
thank_you | boolean | |
reminder | boolean | |
send_reminder_on | string | null |
IssuedApiToken
{"allOf":[{"$ref":"#/components/schemas/ApiToken"},{"type":"object","required":["token"],"properties":{"token":{"type":"string"}}}]}
IssuedApiTokenEnvelope
| field | type | required |
|---|---|---|
data | IssuedApiToken | yes |
links | Links | yes |
Links
| field | type | required |
|---|---|---|
self | string | yes |
ModuleListEnvelope
| field | type | required |
|---|---|---|
data | array of ModuleState | yes |
links | Links | yes |
ModulePatch
| field | type | required |
|---|---|---|
enabled | boolean | yes |
ModuleState
| field | type | required |
|---|---|---|
module | approval | expenses | own_money | yes |
enabled | boolean | yes |
MonthEndExclusion
| field | type | required |
|---|---|---|
invoice_id | integer | yes |
number | string | yes |
reason | string | yes |
MonthEndItem
| field | type | required |
|---|---|---|
subject_type | string | yes |
subject_id | integer | yes |
description | string | yes |
amount_cents | integer | null | yes |
currency | string | null | yes |
target | string | null | yes |
brand_name | string | null | yes |
cost_cents | integer | null | yes |
margin_cents | integer | null | yes |
MonthEndManifest
| field | type | required |
|---|---|---|
period_start | string (date) | yes |
period_end | string (date) | yes |
items | array of MonthEndItem | yes |
excluded | array of MonthEndExclusion | yes |
MonthEndManifestEnvelope
| field | type | required |
|---|---|---|
data | MonthEndManifest | yes |
links | Links | yes |
MyHoursProject
| field | type | required |
|---|---|---|
project_id | integer | yes |
project_name | string | yes |
project_code | string | yes |
client_id | integer | yes |
client_name | string | yes |
seconds | integer | yes |
rounded_seconds | integer | yes |
billable_seconds | integer | yes |
time_entry_count | integer | yes |
MyHoursReport
| field | type | required |
|---|---|---|
from | string (date) | yes |
to | string (date) | yes |
user_id | integer | yes |
project_id | integer | null | yes |
seconds | integer | yes |
rounded_seconds | integer | yes |
billable_seconds | integer | yes |
time_entry_count | integer | yes |
projects | array of MyHoursProject | yes |
MyHoursReportEnvelope
| field | type | required |
|---|---|---|
data | MyHoursReport | yes |
links | Links | yes |
OrganizationInvoiceDocumentsEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
OrganizationInvoiceRemindersEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
OrganizationInvoiceRemindersInput
| field | type | required |
|---|---|---|
reminder_policy | ReminderPolicy | null | yes |
OrganizationInvoiceThankYouEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
OutboxAggregate
| field | type | required |
|---|---|---|
type | string | yes |
id | integer | yes |
sequence | integer | yes |
OutboxDelivery
| field | type | required |
|---|---|---|
subscriber_id | string | yes |
event_id | string | yes |
event_type | string | yes |
aggregate | OutboxAggregate | yes |
status | pending | processing | delivered | failed | yes |
attempt_count | integer | yes |
next_attempt_at | string | null | yes |
last_error_code | string | null | yes |
delivered_at | string | null | yes |
failed_at | string | null | yes |
occurred_at | string (date-time) | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
OutboxDeliveryEnvelope
| field | type | required |
|---|---|---|
data | OutboxDelivery | yes |
links | Links | yes |
OutboxDeliveryPage
| field | type | required |
|---|---|---|
data | array of OutboxDelivery | yes |
links | Links | yes |
PageLinks
| field | type | required |
|---|---|---|
self | string | yes |
next | string | null | yes |
PageMetadata
| field | type | required |
|---|---|---|
per_page | integer | yes |
next_cursor | string | null | yes |
PasswordResetInput
| field | type | required |
|---|---|---|
token | string | yes |
password | string | yes |
PasswordSignInInput
| field | type | required |
|---|---|---|
email | string (email) | yes |
password | string | yes |
PaymentReceivedReportRow
| field | type | required |
|---|---|---|
payment_id | integer | yes |
payment_date | string (date) | yes |
invoice_id | integer | yes |
invoice_number | string | yes |
client_id | integer | yes |
client_name | string | yes |
currency | string | yes |
provider | string | yes |
invoice_total_cents | integer | |
payment_cents | integer |
PaymentsReceivedReport
| field | type | required |
|---|---|---|
from | string (date) | yes |
to | string (date) | yes |
client_id | integer | null | yes |
totals | array of PaymentsReceivedReportTotal | yes |
rows | array of PaymentReceivedReportRow | yes |
PaymentsReceivedReportEnvelope
| field | type | required |
|---|---|---|
data | PaymentsReceivedReport | yes |
links | Links | yes |
PaymentsReceivedReportTotal
| field | type | required |
|---|---|---|
currency | string | yes |
payment_count | integer | yes |
payment_cents | integer |
PayoutAccount
| field | type | required |
|---|---|---|
id | integer | yes |
user_id | integer | yes |
provider | deel | wise | yes |
external_id | string | yes |
linked_by_user_id | integer | yes |
linked_at | string (date-time) | yes |
verified_at | string | null | yes |
PayoutAccountEnvelope
| field | type | required |
|---|---|---|
data | PayoutAccount | yes |
PayoutAccountInput
| field | type | required |
|---|---|---|
provider | deel | wise | yes |
external_id | string | yes |
PayoutAccountListEnvelope
| field | type | required |
|---|---|---|
data | array of PayoutAccount | yes |
Profile
| field | type | required |
|---|---|---|
user_id | integer | yes |
timezone | string | yes |
ProfilePatch
| field | type | required |
|---|---|---|
timezone | string |
ProfitabilityDimensionRow
| field | type | required |
|---|---|---|
dimension_id | integer | yes |
dimension_name | string | yes |
currency | string | yes |
rounded_seconds | integer | yes |
revenue_cents | integer | null | yes |
cost_cents | integer | null | yes |
profit_cents | integer | null | yes |
return_on_cost_ppm | integer | null | yes |
revenue_fee_cents | integer | yes |
fees_included_in_delivery_cost_cents | integer | yes |
entries_without_billable_rate | integer | yes |
entries_without_cost_rate | integer | yes |
included_in_headline | boolean | yes |
ProfitabilityFilters
| field | type | required |
|---|---|---|
project_status | all | active | archived | yes |
billing_method | string | null | yes |
manager_id | integer | null | yes |
tag_id | integer | null | yes |
ProfitabilityReport
| field | type | required |
|---|---|---|
from | string (date) | yes |
to | string (date) | yes |
organization_currency | string | yes |
rows | array of ProfitabilityRow | yes |
clients | array of ProfitabilityDimensionRow | yes |
teammates | array of ProfitabilityDimensionRow | yes |
tasks | array of ProfitabilityDimensionRow | yes |
trend | array of ProfitabilityTrendRow | yes |
totals | ProfitabilityTotals | yes |
filters | ProfitabilityFilters | yes |
previous_from | string (date) | yes |
previous_to | string (date) | yes |
previous_totals | ProfitabilityTotals | yes |
ProfitabilityReportEnvelope
| field | type | required |
|---|---|---|
data | ProfitabilityReport | yes |
links | Links | yes |
ProfitabilityRow
| field | type | required |
|---|---|---|
project_id | integer | yes |
project_name | string | yes |
project_code | string | yes |
client_id | integer | yes |
client_name | string | yes |
currency | string | yes |
rounded_seconds | integer | yes |
revenue_cents | integer | null | yes |
cost_cents | integer | null | yes |
profit_cents | integer | null | yes |
return_on_cost_ppm | integer | null | yes |
revenue_fee_cents | integer | yes |
fees_included_in_delivery_cost_cents | integer | yes |
entries_without_billable_rate | integer | yes |
entries_without_cost_rate | integer | yes |
ProfitabilityTotals
| field | type | required |
|---|---|---|
rounded_seconds | integer | yes |
revenue_cents | integer | null | yes |
cost_cents | integer | null | yes |
profit_cents | integer | null | yes |
return_on_cost_ppm | integer | null | yes |
revenue_fee_cents | integer | yes |
fees_included_in_delivery_cost_cents | integer | yes |
entries_without_billable_rate | integer | yes |
entries_without_cost_rate | integer | yes |
projects_not_converted | integer | yes |
ProfitabilityTrendRow
{"allOf":[{"$ref":"#/components/schemas/ProfitabilityDimensionRow"},{"type":"object","required":["period_start","period_end","current"],"properties":{"period_start":{"type":"string","format":"date"},"
ProjectBudgetGrain
| field | type | required |
|---|---|---|
source | project | task_assignment | user_assignment | yes |
source_id | integer | yes |
unit | seconds | cents | yes |
calculation | time | billable | cost | yes |
unpriced_entry_count | integer | yes |
budget_seconds | integer | null | |
spent_seconds | integer | |
remaining_seconds | integer | null | |
budget_cents | integer | null | |
spent_cents | integer | |
remaining_cents | integer | null |
ProjectBudgetReport
| field | type | required |
|---|---|---|
project_id | integer | yes |
budget_by | project | project_cost | task | task_fees | person | none | yes |
expenses_included | boolean | yes |
from | string (date) | yes |
to | string (date) | yes |
grains | array of ProjectBudgetGrain | yes |
ProjectBudgetReportEnvelope
| field | type | required |
|---|---|---|
data | ProjectBudgetReport | yes |
links | Links | yes |
ProjectBudgetSummary
| field | type | required |
|---|---|---|
project_id | integer | yes |
currency | string | yes |
budget_by | project | project_cost | task | task_fees | person | none | yes |
unit | seconds | cents | null | yes |
unpriced_entry_count | integer | yes |
budget_seconds | integer | null | |
spent_seconds | integer | |
remaining_seconds | integer | null | |
budget_cents | integer | null | |
spent_cents | integer | |
remaining_cents | integer | null | |
cost_cents | integer |
ProjectBudgetSummaryListEnvelope
| field | type | required |
|---|---|---|
data | array of ProjectBudgetSummary | yes |
links | Links | yes |
QuickBooksAuthorizeEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
QuickBooksConnection
| field | type | required |
|---|---|---|
realm_id | string | yes |
company_name | string | null | yes |
scope | string | yes |
allow_online_payment | boolean | yes |
connected_at | string | yes |
QuickBooksConnectionEnvelope
| field | type | required |
|---|---|---|
data | QuickBooksConnection | null | yes |
QuickBooksSettingsInput
| field | type | required |
|---|---|---|
allow_online_payment | boolean | yes |
QuickBooksStatusEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
ReceivablesReport
| field | type | required |
|---|---|---|
as_of | string (date) | yes |
client_id | integer | null | yes |
totals | array of ReceivablesReportTotal | yes |
rows | array of ReceivablesReportRow | yes |
ReceivablesReportEnvelope
| field | type | required |
|---|---|---|
data | ReceivablesReport | yes |
links | Links | yes |
ReceivablesReportRow
| field | type | required |
|---|---|---|
client_id | integer | yes |
client_name | string | yes |
currency | string | yes |
invoice_count | integer | yes |
invoiced_cents | integer | |
outstanding_cents | integer | |
not_due_cents | integer | |
days_1_to_30_cents | integer | |
days_31_to_60_cents | integer | |
days_61_to_90_cents | integer | |
days_90_plus_cents | integer |
ReceivablesReportTotal
| field | type | required |
|---|---|---|
currency | string | yes |
invoice_count | integer | yes |
invoiced_cents | integer | |
outstanding_cents | integer | |
not_due_cents | integer | |
days_1_to_30_cents | integer | |
days_31_to_60_cents | integer | |
days_61_to_90_cents | integer | |
days_90_plus_cents | integer |
RecurringAmountConfig
{"oneOf":[{"type":"object","required":["schema_version","type","line_items"],"properties":{"schema_version":{"const":1},"type":{"const":"fixed_lines"},"line_items":{"type":"array","minItems":1,"items"
RecurringFixedLine
| field | type | required |
|---|---|---|
kind | string | yes |
description | string | null | yes |
quantity | number | yes |
unit_price_cents | integer | yes |
taxed | boolean | yes |
taxed2 | boolean | yes |
project_id | integer | null | yes |
through | string | null | |
installments | integer | null |
RecurringGeneration
| field | type | required |
|---|---|---|
definition_id | integer | yes |
period | string | yes |
next_issue_on | string | yes |
retainer_drawdown_cents | integer | null | yes |
RecurringGenerationEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
links | Links | yes |
RecurringInvoice
| field | type | required |
|---|---|---|
id | integer | yes |
client_id | integer | yes |
subject_template | string | yes |
notes_template | string | yes |
every_n_months | integer | yes |
day_of_month | integer | yes |
next_issue_on | string (date) | yes |
amount_config | RecurringAmountConfig | yes |
can_draw_from_retainer_id | integer | null | yes |
claims_project_ids | array | null | yes |
claim_mode | all | ceiling | yes |
claim_ceiling_seconds | integer | null | yes |
claim_ceiling_cents | integer | null | yes |
claim_scope | billable | tracked | yes |
cost_alert_basis_points | integer | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
RecurringInvoiceCompletionEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
RecurringInvoiceEnvelope
| field | type | required |
|---|---|---|
data | RecurringInvoice | yes |
links | Links | yes |
RecurringInvoiceInput
| field | type | required |
|---|---|---|
client_id | integer | yes |
subject_template | string | yes |
notes_template | string | yes |
every_n_months | integer | yes |
day_of_month | integer | yes |
next_issue_on | string (date) | yes |
amount_config | RecurringAmountConfig | yes |
can_draw_from_retainer_id | integer | null | |
claims_project_ids | array | null | |
claim_mode | all | ceiling | |
claim_ceiling_seconds | integer | null | |
claim_ceiling_cents | integer | null | |
claim_scope | billable | tracked | |
cost_alert_basis_points | integer | null |
RecurringInvoicePage
| field | type | required |
|---|---|---|
data | array of RecurringInvoice | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
ReleasedTimeEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
ReminderPolicy
| field | type | required |
|---|---|---|
first_after_days | integer | yes |
every_days | integer | yes |
ReportDefinitionPresentation
| field | type | required |
|---|---|---|
result | summary | detailed | yes |
grouped | boolean | yes |
include_zero_values | boolean | yes |
ReportDefinitionRegistry
| field | type | required |
|---|---|---|
fields | array of object | yes |
metrics | array of object | yes |
ReportDefinitionRegistryEnvelope
| field | type | required |
|---|---|---|
data | ReportDefinitionRegistry | yes |
links | Links | yes |
ReportRunnerEnvelope
| field | type | required |
|---|---|---|
data | ReportRunnerResult | yes |
links | Links | yes |
ReportRunnerResult
| field | type | required |
|---|---|---|
definitionId | string | yes |
definitionVersion | integer | yes |
state | ready | empty | too_many_rows | yes |
rows | array of object | yes |
ReportTimeAction
| field | type | required |
|---|---|---|
command_id | string | yes |
action | mark_invoiced | mark_uninvoiced | move | yes |
requested | integer | yes |
changed_entry_ids | array of integer | yes |
ineligible_entry_ids | array of integer | yes |
replayed | boolean | yes |
ReportTimeActionEnvelope
| field | type | required |
|---|---|---|
data | ReportTimeAction | yes |
links | Links | yes |
ReportTimeActionInput
| field | type | required |
|---|---|---|
command_id | string | yes |
action | mark_invoiced | mark_uninvoiced | move | yes |
entry_ids | array of integer | yes |
confirmed | any | yes |
invoice_id | integer | |
project_id | integer | |
task_id | integer |
Retainer
| field | type | required |
|---|---|---|
id | integer | yes |
client_id | integer | null | yes |
project_id | integer | null | yes |
state | ongoing | closed | yes |
denomination | money | hours | yes |
amount_cents | integer | null | yes |
seconds | integer | null | yes |
locked_rate_cents | integer | null | yes |
rate_locked_at | string | null | yes |
period | string | null | yes |
rollover | string | null | yes |
expires_at | string | null | yes |
on_exhaustion | block | warn | overflow | yes |
balance | integer | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
RetainerDrawdownInput
{"oneOf":[{"type":"object","required":["amount_cents","occurred_on","invoice_id"],"properties":{"invoice_id":{"type":"integer","minimum":1},"amount_cents":{"type":"integer","minimum":1,"maximum":90000
RetainerInput
{"oneOf":[{"type":"object","required":["denomination","amount_cents"],"properties":{"client_id":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}]},"project_id":{"anyOf":[{"type":"integer","min
RetainerLedgerEntry
| field | type | required |
|---|---|---|
id | string | yes |
retainer_id | integer | yes |
kind | deposit | drawdown | expiry | reset | adjustment | yes |
unit | cents | seconds | yes |
amount | integer | yes |
invoice_id | integer | null | yes |
occurred_on | string (date) | yes |
notes | string | null | yes |
created_at | string (date-time) | yes |
RetainerLedgerInput
{"oneOf":[{"type":"object","required":["kind","amount_cents","occurred_on","invoice_id"],"properties":{"kind":{"const":"deposit"},"invoice_id":{"type":"integer","minimum":1},"amount_cents":{"type":"in
RetainerLedgerListEnvelope
| field | type | required |
|---|---|---|
data | array of RetainerLedgerEntry | yes |
links | Links | yes |
RetainerLedgerMutation
| field | type | required |
|---|---|---|
entry | RetainerLedgerEntry | yes |
balance | integer | yes |
denomination | money | hours | yes |
RetainerLedgerMutationEnvelope
| field | type | required |
|---|---|---|
data | RetainerLedgerMutation | yes |
links | Links | yes |
RetainerPage
| field | type | required |
|---|---|---|
data | array of Retainer | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
RetainerPatch
| field | type | required |
|---|---|---|
state | ongoing | closed | |
period | string | null | |
rollover | string | null | |
expires_at | string | null | |
on_exhaustion | block | warn | overflow |
SavedReport
| field | type | required |
|---|---|---|
id | string | yes |
name | string | yes |
version | integer | yes |
fields | array of object | yes |
metrics | array of string | yes |
filters | array of object | yes |
group_by | object | null | yes |
presentation | ReportDefinitionPresentation | yes |
owner | object | yes |
is_custom | boolean | yes |
pinned | boolean | yes |
shared | boolean | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
SavedReportEnvelope
| field | type | required |
|---|---|---|
data | SavedReport | yes |
links | Links | yes |
SavedReportInput
| field | type | required |
|---|---|---|
name | string | yes |
fields | array of object | yes |
metrics | array of string | yes |
filters | array of object | yes |
group_by | object | null | yes |
presentation | ReportDefinitionPresentation | yes |
SavedReportListEnvelope
| field | type | required |
|---|---|---|
data | array of SavedReport | yes |
SavedReportUpdate
| field | type | required |
|---|---|---|
version | integer | yes |
name | string | |
fields | array of object | |
metrics | array of string | |
filters | array of object | |
group_by | object | null | |
presentation | ReportDefinitionPresentation |
SenderEvidenceRefreshInput
| field | type | required |
|---|---|---|
expected_evidence_version | integer | yes |
SenderIdentity
| field | type | required |
|---|---|---|
id | integer | yes |
email | string (email) | yes |
display_name | string | yes |
reply_to_email | string | null | yes |
provider | string | yes |
provider_identity | string | yes |
is_default | boolean | yes |
version | integer | yes |
archived_at | string | null | yes |
evidence | SenderIdentityEvidence | null | yes |
created_by_user_id | integer | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
SenderIdentityEnvelope
| field | type | required |
|---|---|---|
data | SenderIdentity | yes |
SenderIdentityEvidence
| field | type | required |
|---|---|---|
version | integer | yes |
source | provider_api | deployment_config | yes |
identity_kind | email_address | domain | yes |
verification_status | pending | verified | failed | temporary_failure | operator_configured | yes |
dkim_status | pending | verified | failed | not_applicable | yes |
mail_from_domain | string | null | yes |
mail_from_status | pending | verified | failed | not_configured | yes |
observed_at | string (date-time) | yes |
SenderIdentityInput
| field | type | required |
|---|---|---|
email | string (email) | yes |
display_name | string | yes |
reply_to_email | string | null | |
provider | string | yes |
provider_identity | string | yes |
SenderIdentityPage
| field | type | required |
|---|---|---|
data | array of SenderIdentity | yes |
links | Links | yes |
SenderIdentityPatch
| field | type | required |
|---|---|---|
expected_version | integer | yes |
display_name | string | |
reply_to_email | string | null |
SenderIdentityVersionInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
Service
| field | type | required |
|---|---|---|
service | any | yes |
version | any | yes |
Session
| field | type | required |
|---|---|---|
id | integer | yes |
created_at | string (date-time) | yes |
last_seen_at | string (date-time) | yes |
idle_expires_at | string (date-time) | yes |
absolute_expires_at | string (date-time) | yes |
revoked_at | string | null | yes |
revocation_reason | string | null | yes |
current | boolean | yes |
SessionAuthentication
| field | type | required |
|---|---|---|
kind | any | yes |
SessionEnvelope
| field | type | required |
|---|---|---|
data | Session | yes |
SignInMethodListEnvelope
| field | type | required |
|---|---|---|
data | array of SignInMethodState | yes |
links | Links | yes |
SignInMethodState
| field | type | required |
|---|---|---|
method | password | magic_link | google | github | apple | yes |
configured | boolean | yes |
enabled | boolean | yes |
SignInResult
{"oneOf":[{"$ref":"#/components/schemas/AuthPrincipal"},{"$ref":"#/components/schemas/TwoFactorChallengeIssued"}]}
SignInResultEnvelope
| field | type | required |
|---|---|---|
data | SignInResult | yes |
SignupInput
| field | type | required |
|---|---|---|
organization_name | string | yes |
first_name | string | yes |
last_name | string | yes |
email | string (email) | yes |
password | string | yes |
SsoDomain
| field | type | required |
|---|---|---|
id | integer | yes |
domain | string | yes |
verified | boolean | yes |
verified_at | string | null | yes |
last_checked_at | string | null | yes |
record_name | string | yes |
record_type | any | yes |
record_value | string | yes |
created_at | string | yes |
updated_at | string | yes |
SsoDomainCheck
{"allOf":[{"$ref":"#/components/schemas/SsoDomain"},{"type":"object","required":["dnssec_validated"],"properties":{"dnssec_validated":{"type":"boolean"}}}]}
SsoDomainCheckEnvelope
| field | type | required |
|---|---|---|
data | SsoDomainCheck | yes |
SsoDomainEnvelope
| field | type | required |
|---|---|---|
data | SsoDomain | yes |
SsoDomainInput
| field | type | required |
|---|---|---|
domain | string | yes |
TeamAssignmentInput
| field | type | required |
|---|---|---|
project_id | integer | yes |
is_project_manager | boolean | yes |
TeamAssignmentReplaceInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
assignments | array of TeamAssignmentInput | yes |
TeamCatalog
| field | type | required |
|---|---|---|
roles | array of TeamNamedRelation | yes |
departments | array of TeamNamedRelation | yes |
projects | array of TeamCatalogProject | yes |
TeamCatalogEnvelope
| field | type | required |
|---|---|---|
data | TeamCatalog | yes |
links | Links | yes |
TeamCatalogProject
| field | type | required |
|---|---|---|
id | integer | yes |
name | string | yes |
code | string | yes |
client_id | integer | yes |
client_name | string | yes |
is_active | boolean | yes |
TeamCommandReceipt
| field | type | required |
|---|---|---|
target_user_id | integer | yes |
version | integer | yes |
resource_id | integer | null | yes |
occurred_at | string (date-time) | yes |
TeamCommandReceiptEnvelope
| field | type | required |
|---|---|---|
data | TeamCommandReceipt | yes |
links | Links | yes |
TeamInactiveNotificationChannels
| field | type | required |
|---|---|---|
email | false | yes |
desktop | false | yes |
slack | false | yes |
TeamNamedRelation
| field | type | required |
|---|---|---|
id | integer | yes |
name | string | yes |
TeamNotificationChannels
| field | type | required |
|---|---|---|
email | boolean | yes |
desktop | boolean | yes |
slack | boolean | yes |
TeamNotificationInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
daily_reminder_enabled | false | yes |
reminder_time | string | null | yes |
reminder_days | array of string | yes |
channels | TeamInactiveNotificationChannels | yes |
include_in_team_reminders | false | yes |
weekly_digest | false | yes |
notify_project_deleted | false | yes |
TeamNotificationPreference
| field | type | required |
|---|---|---|
delivery_active | false | yes |
daily_reminder_enabled | boolean | yes |
reminder_time | string | null | yes |
reminder_days | array of string | yes |
channels | TeamNotificationChannels | yes |
include_in_team_reminders | boolean | yes |
weekly_digest | boolean | yes |
notify_project_deleted | boolean | yes |
updated_at | string (date-time) | yes |
TeamPerson
| field | type | required |
|---|---|---|
id | integer | yes |
first_name | string | yes |
last_name | string | yes |
email | string | null | yes |
telephone | string | null | yes |
employee_id | string | null | yes |
timezone | string | yes |
is_contractor | boolean | yes |
is_active | boolean | yes |
has_access_to_all_future_projects | boolean | yes |
weekly_capacity | integer | yes |
profile | member | project_manager | people_admin | accounting | executive_manager | administrator | yes |
is_owner | boolean | yes |
avatar_url | string | null | yes |
version | integer | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
roles | array of TeamNamedRelation | yes |
departments | array of TeamNamedRelation | yes |
project_assignments | array of TeamProjectAssignment | yes |
billable_rates | array of UserRate | |
cost_rates | array of UserRate | |
notifications | TeamNotificationPreference | yes |
TeamPersonEnvelope
| field | type | required |
|---|---|---|
data | TeamPerson | yes |
links | Links | yes |
TeamPersonPatch
| field | type | required |
|---|---|---|
expected_version | integer | yes |
first_name | string | |
last_name | string | |
telephone | string | null | |
employee_id | string | null | |
timezone | string | |
is_contractor | boolean | |
is_active | boolean | |
has_access_to_all_future_projects | boolean | |
weekly_capacity | integer | |
profile | member | project_manager | people_admin | accounting | executive_manager | administrator | |
role_ids | array of integer | |
department_ids | array of integer |
TeamPersonSummary
| field | type | required |
|---|---|---|
id | integer | yes |
first_name | string | yes |
last_name | string | yes |
email | string | null | yes |
avatar_url | string | null | yes |
profile | member | project_manager | people_admin | accounting | executive_manager | administrator | yes |
is_owner | boolean | yes |
is_contractor | boolean | yes |
is_active | boolean | yes |
weekly_capacity | integer | yes |
total_seconds | integer | yes |
billable_seconds | integer | yes |
nonbillable_seconds | integer | yes |
utilization_ppm | integer | null | yes |
running | boolean | yes |
TeamPersonSummaryPage
| field | type | required |
|---|---|---|
data | array of TeamPersonSummary | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
TeamProjectAssignment
| field | type | required |
|---|---|---|
id | integer | yes |
project_id | integer | yes |
project_name | string | yes |
project_code | string | yes |
client_id | integer | yes |
client_name | string | yes |
is_active | boolean | yes |
is_project_manager | boolean | yes |
use_default_rates | boolean | yes |
hourly_rate_cents | integer | null | |
budget_seconds | integer | null | yes |
updated_at | string (date-time) | yes |
TeamRateInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
kind | billable | cost | yes |
amount_cents | integer | yes |
start_date | string | null | yes |
TeamRateRemovalInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
kind | billable | cost | yes |
TeamStatus
| field | type | required |
|---|---|---|
enabled | boolean | yes |
TeamStatusEnvelope
| field | type | required |
|---|---|---|
data | TeamStatus | yes |
links | Links | yes |
TimeEntry
| field | type | required |
|---|---|---|
id | integer | yes |
user_id | integer | yes |
project_id | integer | yes |
task_id | integer | yes |
user_assignment_id | integer | |
task_assignment_id | integer | |
spent_date | string (date) | yes |
seconds | integer | yes |
seconds_without_timer | integer | |
rounded_seconds | integer | |
is_running | boolean | yes |
timer_started_at | string | null | |
started_time | string | null | |
ended_time | string | null | |
notes | string | null | |
billable | boolean | yes |
budgeted | boolean | yes |
approval_status | unsubmitted | submitted | approved | yes |
source_approval_status | string | null | |
invoice_id | integer | null | |
is_billed | boolean | |
is_locked | boolean | yes |
locked_reason_code | string | null | |
locked_reason | string | null | |
external_ref | object | null | |
calendar_event_ref | object | null | |
minimum_note_length | integer | yes |
billable_rate_cents | integer | null | |
cost_rate_cents | integer | null | |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
TimeEntryInput
| field | type | required |
|---|---|---|
project_id | integer | yes |
task_id | integer | yes |
spent_date | string (date) | |
seconds | integer | |
started_time | string | |
ended_time | string | |
notes | string | null | |
budgeted | boolean | |
external_ref | object | null | |
calendar_event_ref | object | null |
TimeEntryNoteSettings
| field | type | required |
|---|---|---|
required | boolean | yes |
minimum_length | integer | yes |
TimeEntryNoteSettingsEnvelope
| field | type | required |
|---|---|---|
data | TimeEntryNoteSettings | yes |
links | Links | yes |
TimeEntryNoteSettingsPatch
| field | type | required |
|---|---|---|
required | boolean | |
minimum_length | integer |
TimeEntryOption
| field | type | required |
|---|---|---|
project_id | integer | yes |
task_id | integer | yes |
minimum_note_length | integer | yes |
TimeEntryOptionListEnvelope
| field | type | required |
|---|---|---|
data | array of TimeEntryOption | yes |
links | Links | yes |
TimeEntryPage
| field | type | required |
|---|---|---|
data | array of TimeEntry | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
TimeEntryPatch
| field | type | required |
|---|---|---|
project_id | integer | |
task_id | integer | |
spent_date | string (date) | |
seconds | integer | |
started_time | string | |
ended_time | string | |
notes | string | null | |
budgeted | boolean | |
external_ref | object | null | |
calendar_event_ref | object | null |
TimeEntrySettings
| field | type | required |
|---|---|---|
time_entry_mode | duration | start_end | yes |
time_format | decimal | hours_minutes | yes |
clock | 12h | 24h | yes |
week_start_day | saturday | sunday | monday | yes |
TimeEntrySettingsEnvelope
| field | type | required |
|---|---|---|
data | TimeEntrySettings | yes |
links | Links | yes |
TimeReport
| field | type | required |
|---|---|---|
from | string (date) | yes |
to | string (date) | yes |
fixed_fee_included | boolean | yes |
totals | TimeReportTotals | yes |
clients | array of TimeReportClientRow | yes |
projects | array of TimeReportProjectRow | yes |
tasks | array of TimeReportTaskRow | yes |
teammates | array of TimeReportTeammateRow | yes |
TimeReportAmount
| field | type | required |
|---|---|---|
currency | string | yes |
billable_cents | integer | yes |
uninvoiced_cents | integer | yes |
TimeReportClientRow
| field | type | required |
|---|---|---|
seconds | integer | yes |
rounded_seconds | integer | yes |
billable_seconds | integer | yes |
time_entry_count | integer | yes |
unpriced_billable_entry_count | integer | yes |
amounts | array of TimeReportAmount | |
client_id | integer | yes |
client_name | string | yes |
TimeReportEnvelope
| field | type | required |
|---|---|---|
data | TimeReport | yes |
links | Links | yes |
TimeReportProjectRow
| field | type | required |
|---|---|---|
seconds | integer | yes |
rounded_seconds | integer | yes |
billable_seconds | integer | yes |
time_entry_count | integer | yes |
unpriced_billable_entry_count | integer | yes |
amounts | array of TimeReportAmount | |
project_id | integer | yes |
project_name | string | yes |
project_code | string | yes |
client_id | integer | yes |
client_name | string | yes |
TimeReportTaskRow
| field | type | required |
|---|---|---|
seconds | integer | yes |
rounded_seconds | integer | yes |
billable_seconds | integer | yes |
time_entry_count | integer | yes |
unpriced_billable_entry_count | integer | yes |
amounts | array of TimeReportAmount | |
task_id | integer | yes |
task_name | string | yes |
TimeReportTeammateRow
| field | type | required |
|---|---|---|
seconds | integer | yes |
rounded_seconds | integer | yes |
billable_seconds | integer | yes |
time_entry_count | integer | yes |
unpriced_billable_entry_count | integer | yes |
amounts | array of TimeReportAmount | |
user_id | integer | yes |
user_name | string | yes |
is_contractor | boolean | yes |
capacity_seconds | integer | yes |
utilization_ppm | integer | null | yes |
TimeReportTotals
| field | type | required |
|---|---|---|
seconds | integer | yes |
rounded_seconds | integer | yes |
billable_seconds | integer | yes |
time_entry_count | integer | yes |
unpriced_billable_entry_count | integer | yes |
amounts | array of TimeReportAmount |
TimesheetBulkApprovalInput
| field | type | required |
|---|---|---|
submissions | array of object | yes |
TimesheetBulkApprovalResult
| field | type | required |
|---|---|---|
data | array of TimesheetSubmission | yes |
links | Links | yes |
TimesheetDeadline
| field | type | required |
|---|---|---|
day | sunday | monday | tuesday | wednesday | thursday | friday | saturday | yes |
time | string | yes |
TimesheetLockPolicy
| field | type | required |
|---|---|---|
auto_lock | boolean | yes |
timesheet_deadline | TimesheetDeadline | null | yes |
timezone | string | yes |
week_start_day | saturday | sunday | monday | yes |
updated_at | string (date-time) | yes |
TimesheetLockPolicyEnvelope
| field | type | required |
|---|---|---|
data | TimesheetLockPolicy | yes |
links | Links | yes |
TimesheetLockPolicyPatch
| field | type | required |
|---|---|---|
auto_lock | boolean | |
timesheet_deadline | TimesheetDeadline | null | |
timezone | string |
TimesheetLockWindow
| field | type | required |
|---|---|---|
id | integer | yes |
kind | manual | auto | yes |
period_start | string | null | yes |
period_end | string (date) | yes |
reason | string | yes |
locked_by_user_id | integer | null | yes |
locked_at | string (date-time) | yes |
unlocked_by_user_id | integer | null | yes |
unlocked_at | string | null | yes |
unlock_reason | string | null | yes |
active | boolean | yes |
TimesheetLockWindowEnvelope
| field | type | required |
|---|---|---|
data | TimesheetLockWindow | yes |
links | Links | yes |
TimesheetLockWindowPage
| field | type | required |
|---|---|---|
data | array of TimesheetLockWindow | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
TimesheetManualLockInput
| field | type | required |
|---|---|---|
locked_through | string (date) | yes |
reason | string | yes |
TimesheetRejectionInput
| field | type | required |
|---|---|---|
reason | string | yes |
TimesheetSubmission
| field | type | required |
|---|---|---|
id | integer | yes |
user_id | integer | yes |
user_name | string | yes |
period_start | string (date) | yes |
period_end | string (date) | yes |
status | unsubmitted | submitted | approved | yes |
origin | native | harvest_import | legacy_backfill | yes |
source_status | string | null | yes |
source_observed_at | string | null | yes |
submitted_by_user_id | integer | null | yes |
submitted_at | string | null | yes |
reviewed_by_user_id | integer | null | yes |
reviewed_at | string | null | yes |
rejection_reason | string | null | yes |
version | integer | yes |
entry_count | integer | yes |
expense_count | integer | yes |
total_seconds | integer | yes |
billable_seconds | integer | yes |
nonbillable_seconds | integer | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
TimesheetSubmissionDetail
| field | type | required |
|---|---|---|
id | integer | yes |
user_id | integer | yes |
user_name | string | yes |
period_start | string (date) | yes |
period_end | string (date) | yes |
status | unsubmitted | submitted | approved | yes |
origin | native | harvest_import | legacy_backfill | yes |
source_status | string | null | yes |
source_observed_at | string | null | yes |
submitted_by_user_id | integer | null | yes |
submitted_at | string | null | yes |
reviewed_by_user_id | integer | null | yes |
reviewed_at | string | null | yes |
rejection_reason | string | null | yes |
version | integer | yes |
entry_count | integer | yes |
expense_count | integer | yes |
total_seconds | integer | yes |
billable_seconds | integer | yes |
nonbillable_seconds | integer | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
entries | array of TimesheetSubmissionEntry | yes |
expenses | array of TimesheetSubmissionExpense | yes |
TimesheetSubmissionDetailEnvelope
| field | type | required |
|---|---|---|
data | TimesheetSubmissionDetail | yes |
links | Links | yes |
TimesheetSubmissionEntry
| field | type | required |
|---|---|---|
id | integer | yes |
spent_date | string (date) | yes |
project_id | integer | yes |
project_name | string | yes |
task_id | integer | yes |
task_name | string | yes |
seconds | integer | yes |
notes | string | null | yes |
TimesheetSubmissionEnvelope
| field | type | required |
|---|---|---|
data | TimesheetSubmission | yes |
links | Links | yes |
TimesheetSubmissionExpense
| field | type | required |
|---|---|---|
id | integer | yes |
spent_date | string (date) | yes |
project_id | integer | yes |
project_name | string | yes |
expense_category_id | integer | yes |
expense_category_name | string | yes |
total_cost_cents | integer | yes |
currency | string | yes |
notes | string | null | yes |
TimesheetSubmissionInput
| field | type | required |
|---|---|---|
period_start | string (date) | yes |
period_end | string (date) | yes |
TimesheetSubmissionPage
| field | type | required |
|---|---|---|
data | array of TimesheetSubmission | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
TimesheetUnlockInput
| field | type | required |
|---|---|---|
reason | string | yes |
TimesheetWithdrawalInput
| field | type | required |
|---|---|---|
reason | string | yes |
TokenAuthentication
| field | type | required |
|---|---|---|
kind | any | yes |
token_id | integer | yes |
scopes | array of string | yes |
TwoFactorChallengeAccepted
| field | type | required |
|---|---|---|
status | authenticated | yes |
TwoFactorChallengeAcceptedEnvelope
| field | type | required |
|---|---|---|
data | TwoFactorChallengeAccepted | yes |
TwoFactorChallengeInput
| field | type | required |
|---|---|---|
code | string | yes |
challenge | string |
TwoFactorChallengeIssued
| field | type | required |
|---|---|---|
status | two_factor_required | yes |
challenge | string | yes |
expires_at | string | yes |
TwoFactorCodeInput
| field | type | required |
|---|---|---|
code | string | yes |
TwoFactorEnrolment
| field | type | required |
|---|---|---|
secret | string | yes |
otpauth_uri | string | yes |
recovery_codes | array of string | yes |
TwoFactorEnrolmentEnvelope
| field | type | required |
|---|---|---|
data | TwoFactorEnrolment | yes |
links | Links | yes |
TwoFactorStatus
| field | type | required |
|---|---|---|
enrolled | boolean | yes |
pending_confirmation | boolean | yes |
recovery_codes_remaining | integer | yes |
TwoFactorStatusEnvelope
| field | type | required |
|---|---|---|
data | TwoFactorStatus | yes |
links | Links | yes |
UninvoicedCurrencyTotal
| field | type | required |
|---|---|---|
currency | string | yes |
rounded_seconds | integer | yes |
time_entry_count | integer | yes |
unpriced_time_entry_count | integer | yes |
expense_count | integer | yes |
time_cents | integer | |
expense_cents | integer | |
total_cents | integer |
UninvoicedProjectRow
| field | type | required |
|---|---|---|
client_id | integer | yes |
client_name | string | yes |
project_id | integer | yes |
project_name | string | yes |
project_code | string | yes |
totals | array of UninvoicedCurrencyTotal | yes |
UninvoicedReport
| field | type | required |
|---|---|---|
from | string (date) | yes |
to | string (date) | yes |
client_id | integer | null | yes |
project_id | integer | null | yes |
totals | array of UninvoicedCurrencyTotal | yes |
projects | array of UninvoicedProjectRow | yes |
UninvoicedReportEnvelope
| field | type | required |
|---|---|---|
data | UninvoicedReport | yes |
links | Links | yes |
UserEmailAcceptedEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
UserEmailInput
| field | type | required |
|---|---|---|
email | string | yes |
UserRate
| field | type | required |
|---|---|---|
id | integer | yes |
user_id | integer | yes |
amount_cents | integer | yes |
start_date | string | null | yes |
end_date | string | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
UserRateInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
amount_cents | integer | yes |
start_date | string | null |
UserRatePage
| field | type | required |
|---|---|---|
data | array of UserRate | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
VersionedRowDeleteInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
expected_updated_at | string (date-time) | yes |
Whoami
| field | type | required |
|---|---|---|
user_id | integer | yes |
profile | member | project_manager | people_admin | accounting | executive_manager | administrator | yes |
manager_grants | array of string | yes |
authentication | any | yes |
WiseConnection
| field | type | required |
|---|---|---|
profile_id | string | yes |
profile_name | string | null | yes |
payable_recipients | integer | yes |
webhooks_verifiable | boolean | yes |
WiseContactEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
WiseContactInput
| field | type | required |
|---|---|---|
user_id | integer | yes |
identifier | string | yes |
currency | string | yes |
WiseDestinationEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
WiseLinkEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
WiseLinkInput
| field | type | required |
|---|---|---|
user_id | integer | yes |
recipient_id | string | yes |
WiseOnboardInput
| field | type | required |
|---|---|---|
user_id | integer | yes |
email | string | yes |
legal_name | string | yes |
currency | string | yes |
WiseProposal
| field | type | required |
|---|---|---|
user_id | integer | yes |
name | string | yes |
payroll_email | string | null | yes |
matches | array of WiseRecipient | yes |
WiseProposalListEnvelope
| field | type | required |
|---|---|---|
data | array of WiseProposal | yes |
WiseRecipient
| field | type | required |
|---|---|---|
id | string | yes |
holder_name | string | null | yes |
currency | string | yes |
type | string | yes |
masked_summary | string | null | yes |
email | string | null | yes |
WiseRecipientListEnvelope
| field | type | required |
|---|---|---|
data | array of WiseRecipient | yes |
WiseStatusEnvelope
| field | type | required |
|---|---|---|
data | object | yes |