API reference
The native ezacto v1 contract. Contract and generated clients are deterministic build artifacts. An operator can switch whole modules off (SSO_ENABLED, BACKUPS_ENABLED, INVOICES_ENABLED, ACCOUNTING_ENABLED, each `true` or `false`): every operation of a switched-off module answers 403 `module_disabled`, makes no provider call and leaves its data untouched. 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/status
Get Activity log module availability for navigation
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/activity-log
List activity recorded from delivered domain events (403 `module_disabled` when the module is off)
Newest first, a page at a time, ordered by when each entry was recorded and then its event id. Every filter narrows together; a value that is not valid is a 422, never an empty page. aggregate_id needs aggregate_type. Sign-in, token and account-deletion events are left out unless the reader is an administrator.
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
from | query | string | |
to | query | string | |
event_type | query | string | |
actor_id | query | integer | |
aggregate_type | query | string | |
aggregate_id | query | integer |
Responses
200 ActivityLogPage
Authentication
bearerAuth or cookieSession
GET/api/v1/activity-log/export
Download the filtered Activity log as CSV (403 `module_disabled` when the module is off)
The same filters as the list, applied together, and the same entries a reader may see. At most 5000 entries, newest first; a longer log is cut and the file ends with a Truncated line, with the x-export-truncated response header set to true. Event payloads are not included.
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | string | |
to | query | string | |
event_type | query | string | |
actor_id | query | integer | |
aggregate_type | query | string | |
aggregate_id | query | integer |
Responses
200 —
Authentication
bearerAuth or cookieSession
GET/api/v1/activity-log/rolls
List the finished years the Activity log can still roll (administrator session; 403 `module_disabled` when the module is off)
Responses
200 RollableActivityYearsEnvelope
Authentication
cookieSession
POST/api/v1/activity-log/rolls
Roll a finished year of the Activity log into its own table (administrator session; 403 `module_disabled` when the module is off)
Nothing is deleted: the year's entries move to activity_log_
Request body
RollActivityYearInput (required)
Responses
201 ActivityYearRolledEnvelope
Authentication
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
POST/api/v1/admin/retention-policy
Publish an operator erasure and retention policy version
Request body
AccountRetentionPublication (required)
Responses
Authentication
cookieSession
GET/api/v1/admin/retention-reviews
List due retained-record and downstream review obligations
Parameters
| name | in | required | type |
|---|---|---|---|
after | query | string |
Responses
200 RetentionReviewListEnvelope
Authentication
cookieSession
GET/api/v1/admin/deletion-requests/{id}/retention-reviews
Read recorded retention and cleanup evidence
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Responses
200 RetentionReviewListEnvelope
Authentication
cookieSession
PATCH/api/v1/admin/deletion-requests/{id}/retention-reviews/{area}
Record an operator review with evidence and compare-and-swap
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
area | path | yes | string |
Request body
RetentionReviewInput (required)
Responses
Authentication
cookieSession
POST/api/v1/admin/deletion-requests/{id}/completion
Confirm a reviewed request outcome with remaining retention disclosed
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Request body
DeletionCompletionInput (required)
Responses
200 DeletionCompletionEnvelope
Authentication
cookieSession
GET/api/v1/admin/deletion-requests/{id}/closure
Review actual account data before irreversible access closure
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Responses
200 AccountClosurePreviewEnvelope
Authentication
cookieSession
POST/api/v1/admin/deletion-requests/{id}/closure
Erase local credentials and optional profile under reviewed retention decisions
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Request body
AccountClosureInput (required)
Responses
200 AccountClosureRecordEnvelope
Authentication
cookieSession
POST/api/v1/admin/deletion-requests/{id}/apple-cleanup
Retry server-managed Apple cleanup after local account closure
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Request body
EmptyObject (required)
Responses
200 AppleCleanupStatusEnvelope
Authentication
cookieSession
GET/api/v1/admin/deletion-requests
List account deletion requests
Parameters
| name | in | required | type |
|---|---|---|---|
after | query | string |
Responses
200 AccountDeletionListEnvelope
Authentication
cookieSession
GET/api/v1/admin/deletion-requests/{id}
Read an account deletion request
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Responses
200 AccountDeletionDetailEnvelope
Authentication
cookieSession
PATCH/api/v1/admin/deletion-requests/{id}
Update request progress without completing erasure
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Request body
AccountDeletionUpdate (required)
Responses
200 AccountDeletionDetailEnvelope
Authentication
cookieSession
POST/api/v1/admin/deletion-requests/{id}/notification
Retry an unavailable or failed administrator notification
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Responses
200 AccountDeletionDetailEnvelope
Authentication
cookieSession
GET/api/v1/settings/notifications
Company settings for the mail the instance sends its own people
Responses
200 NotificationSettingsEnvelope
Authentication
cookieSession
POST/api/v1/settings/notifications
Change the company settings for budget alerts and reminders
Request body
NotificationSettingsInput (required)
Responses
200 NotificationSettingsEnvelope
Authentication
cookieSession
GET/api/v1/settings/timesheet-auto-approval
The automatic timesheet approval policy
Responses
200 TimesheetAutoApprovalEnvelope
Authentication
cookieSession
POST/api/v1/settings/timesheet-auto-approval
Turn automatic timesheet approval on or off, or change its window
Request body
TimesheetAutoApprovalInput (required)
Responses
200 TimesheetAutoApprovalEnvelope
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
PATCH/api/v1/recurring-invoices/{recurringInvoiceId}/attachments/{attachmentId}
Set the last issue date a recurring definition's file goes with
Parameters
| name | in | required | type |
|---|---|---|---|
recurringInvoiceId | path | yes | integer |
attachmentId | path | yes | integer |
Request body
RecurringAttachmentThroughInput (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/recurring-invoices/{recurringInvoiceId}/attachments/{attachmentId}
Stop a file going with the invoices a recurring definition issues
Parameters
| name | in | required | type |
|---|---|---|---|
recurringInvoiceId | path | yes | integer |
attachmentId | path | yes | integer |
Responses
204 —
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/apple/native-capabilities
Check explicit native Apple lifecycle protocol support
Responses
Authentication
none
POST/auth/apple
Verify origin-bound Apple lifecycle custody and native identity before sign-in
Request body
NativeAppleSignInInput (required)
Responses
Authentication
none
POST/auth/apple/deletion-requests/{id}/binding
Bind fresh cleanup-purpose Apple custody to a pending deletion request
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Request body
AppleLifecycleProofInput (required)
Responses
204 —
Authentication
none
POST/auth/apple/deletion-requests/{id}/revocation
Durably accept exact request-bound Apple invalidation evidence
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Request body
AppleLifecycleProofInput (required)
Responses
204 —
Authentication
none
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/two-factor/email-code
Email a verification code for a pending sign-in
Supersedes the earlier challenge: the response carries the new one. Limited to one a minute and five an hour per user. Only a password sign-in can ask.
Request body
TwoFactorEmailCodeInput (required)
Responses
200 TwoFactorChallengeIssuedEnvelope
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
POST/api/v1/backup/offsite/check
Verify the deployment-configured encrypted off-site backup destination
Responses
200 OffsiteBackupCheckEnvelope
Authentication
cookieSession
GET/api/v1/backup/status
The last completed and last failed backup run, and recent history
Responses
Authentication
cookieSession
GET/api/v1/backup/runs
List backup runs, newest first, a page at a time
The history behind the backup status, which holds only the latest runs. page.total counts everything the filters match, not only this page.
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
status | query | string: running | completed | failed | |
trigger | query | string: nightly | manual |
Responses
200 BackupRunPage
Authentication
cookieSession
POST/api/v1/backup/download-links
Create a single-use, ten-minute link that downloads a backup as one ZIP
Administrator session only; an API token is refused. The backup carries credential hashes and authenticator seeds, so the link is a secret: it works once, expires in ten minutes, and the token in url is shown only in this response. Where the administrator has an authenticator enrolled, code must be a current authenticator or recovery code. run_id defaults to the latest completed run. Following the link answers 404 to anything that is not a live link, whatever the reason.
Request body
BackupDownloadLinkInput (required)
Responses
201 BackupDownloadLinkEnvelope
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
capacity
GET/api/v1/organization-holidays
List organization holidays
Organization-wide local calendar dates. Reads require schedule:read. Only administrators with schedule:write may change dates. Each weekday removes one fifth of the person’s current weekly capacity; weekends remove none. Overlapping personal leave and holidays use the larger daily amount, never their sum. No tracked time or invoices are changed.
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | string | |
to | query | string | |
cursor | query | string | |
per_page | query | integer |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/organization-holidays
Add an organization holiday
Organization-wide local calendar dates. Reads require schedule:read. Only administrators with schedule:write may change dates. Each weekday removes one fifth of the person’s current weekly capacity; weekends remove none. Overlapping personal leave and holidays use the larger daily amount, never their sum. No tracked time or invoices are changed.
Request body
OrganizationHolidayInput (required)
Responses
201 OrganizationHolidayEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/organization-holidays/{id}
Read an organization holiday
Organization-wide local calendar dates. Reads require schedule:read. Only administrators with schedule:write may change dates. Each weekday removes one fifth of the person’s current weekly capacity; weekends remove none. Overlapping personal leave and holidays use the larger daily amount, never their sum. No tracked time or invoices are changed.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 OrganizationHolidayEnvelope
Authentication
bearerAuth or cookieSession
PATCH/api/v1/organization-holidays/{id}
Replace holiday fields at their current version
Organization-wide local calendar dates. Reads require schedule:read. Only administrators with schedule:write may change dates. Each weekday removes one fifth of the person’s current weekly capacity; weekends remove none. Overlapping personal leave and holidays use the larger daily amount, never their sum. No tracked time or invoices are changed.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
OrganizationHolidayUpdateInput (required)
Responses
200 OrganizationHolidayEnvelope
Authentication
bearerAuth or cookieSession
DELETE/api/v1/organization-holidays/{id}
Remove an organization holiday at its current version
Organization-wide local calendar dates. Reads require schedule:read. Only administrators with schedule:write may change dates. Each weekday removes one fifth of the person’s current weekly capacity; weekends remove none. Overlapping personal leave and holidays use the larger daily amount, never their sum. No tracked time or invoices are changed.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
OrganizationHolidayDeleteInput (required)
Responses
200 OrganizationHolidayEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/planning-placeholders
List permitted planning placeholders
Named unassigned project demand, separate from people, capacity, actual time and money. Reads require schedule:read; mutations require schedule:write. Current management authority and project access are rechecked, including within native writes. Ordinary members cannot list organization-wide unassigned demand. Project managers are confined to managed work. Every edit or archive requires its saved version; a conflict preserves the saved state. Archiving a placeholder archives its remaining open demand without removing assigned person allocations.
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
is_active | query | boolean |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/planning-placeholders
Create a named planning placeholder
Named unassigned project demand, separate from people, capacity, actual time and money. Reads require schedule:read; mutations require schedule:write. Current management authority and project access are rechecked, including within native writes. Ordinary members cannot list organization-wide unassigned demand. Project managers are confined to managed work. Every edit or archive requires its saved version; a conflict preserves the saved state. Archiving a placeholder archives its remaining open demand without removing assigned person allocations.
Request body
PlanningPlaceholderInput (required)
Responses
201 PlanningPlaceholderEnvelope
Authentication
bearerAuth or cookieSession
PATCH/api/v1/planning-placeholders/{id}
Rename a planning placeholder at its current version
Named unassigned project demand, separate from people, capacity, actual time and money. Reads require schedule:read; mutations require schedule:write. Current management authority and project access are rechecked, including within native writes. Ordinary members cannot list organization-wide unassigned demand. Project managers are confined to managed work. Every edit or archive requires its saved version; a conflict preserves the saved state. Archiving a placeholder archives its remaining open demand without removing assigned person allocations.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
PlanningPlaceholderUpdateInput (required)
Responses
200 PlanningPlaceholderEnvelope
Authentication
bearerAuth or cookieSession
DELETE/api/v1/planning-placeholders/{id}
Archive a placeholder and its open unassigned demand
Named unassigned project demand, separate from people, capacity, actual time and money. Reads require schedule:read; mutations require schedule:write. Current management authority and project access are rechecked, including within native writes. Ordinary members cannot list organization-wide unassigned demand. Project managers are confined to managed work. Every edit or archive requires its saved version; a conflict preserves the saved state. Archiving a placeholder archives its remaining open demand without removing assigned person allocations.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
PlanningVersionInput (required)
Responses
200 PlanningPlaceholderEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/placeholder-allocations
List scoped unassigned allocation records
Named unassigned project demand, separate from people, capacity, actual time and money. Reads require schedule:read; mutations require schedule:write. Current management authority and project access are rechecked, including within native writes. Ordinary members cannot list organization-wide unassigned demand. Project managers are confined to managed work. Every edit or archive requires its saved version; a conflict preserves the saved state. Archiving a placeholder archives its remaining open demand without removing assigned person allocations.
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
project_id | query | integer | |
state | query | string: open | assigned | archived | |
from | query | string | |
to | query | string |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/placeholder-allocations
Plan unassigned project work
Named unassigned project demand, separate from people, capacity, actual time and money. Reads require schedule:read; mutations require schedule:write. Current management authority and project access are rechecked, including within native writes. Ordinary members cannot list organization-wide unassigned demand. Project managers are confined to managed work. Every edit or archive requires its saved version; a conflict preserves the saved state. Archiving a placeholder archives its remaining open demand without removing assigned person allocations.
Request body
PlaceholderAllocationInput (required)
Responses
201 PlaceholderAllocationEnvelope
Authentication
bearerAuth or cookieSession
PATCH/api/v1/placeholder-allocations/{id}
Edit open unassigned work at its current version
Named unassigned project demand, separate from people, capacity, actual time and money. Reads require schedule:read; mutations require schedule:write. Current management authority and project access are rechecked, including within native writes. Ordinary members cannot list organization-wide unassigned demand. Project managers are confined to managed work. Every edit or archive requires its saved version; a conflict preserves the saved state. Archiving a placeholder archives its remaining open demand without removing assigned person allocations.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
PlaceholderAllocationUpdateInput (required)
Responses
200 PlaceholderAllocationEnvelope
Authentication
bearerAuth or cookieSession
DELETE/api/v1/placeholder-allocations/{id}
Archive open unassigned work at its current version
Named unassigned project demand, separate from people, capacity, actual time and money. Reads require schedule:read; mutations require schedule:write. Current management authority and project access are rechecked, including within native writes. Ordinary members cannot list organization-wide unassigned demand. Project managers are confined to managed work. Every edit or archive requires its saved version; a conflict preserves the saved state. Archiving a placeholder archives its remaining open demand without removing assigned person allocations.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
PlanningVersionInput (required)
Responses
200 PlaceholderAllocationEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/placeholder-allocations/{id}/assign
Atomically assign unassigned demand to a person
Named unassigned project demand, separate from people, capacity, actual time and money. Reads require schedule:read; mutations require schedule:write. Current management authority and project access are rechecked, including within native writes. Ordinary members cannot list organization-wide unassigned demand. Project managers are confined to managed work. Every edit or archive requires its saved version; a conflict preserves the saved state. Archiving a placeholder archives its remaining open demand without removing assigned person allocations. One explicit command creates one person allocation and marks the open placeholder allocation assigned, with an audit event and actor-scoped idempotency receipt in the same transaction. Repeat the same key and exact payload to recover its prior result; reusing the key for different input is refused. The expected version, active target and project, current authority and same-person/project overlap are checked. An overlap consumes no demand. Over-allocation produces warnings. Project access and staffing are never granted implicitly; a missing-access prerequisite is returned separately.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
PlaceholderAssignmentInput (required)
Responses
200 PlaceholderAssignmentEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/resource-calendar/context
Read current organization-local calendar context
Requires schedule:read and current native actor authority. Supplies organization-local today, current week, timezone and week start for initial calendar navigation without using the device date. Always no-store; invalid imported organization zones fall back to UTC.
Responses
200 ResourceCalendarContextEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/resource-calendar
Read the scoped project or team resource calendar
Requires schedule:read. A bounded live projection of planned, available and rounded tracked seconds, with separate unassigned demand. Uses current self/managed-person/project authority on every page. Hidden project work is labelled only by aggregate scope; private leave details are never returned. Availability uses full touched organization weeks and current person capacity. Context always contains organization-local today/week and refreshes even if revision is unchanged. No actual time, staffing or accounting mutations. More than the native fact budget is refused with a range_too_large field error; narrow the date range or person filter. Other web profiles remain read-only.
Parameters
| name | in | required | type |
|---|---|---|---|
view | query | yes | string: project | team |
from | query | yes | string |
to | query | yes | string |
project_id | query | integer | |
person_id | query | integer | |
per_page | query | integer | |
cursor | query | string |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/resource-calendar/allocations
Read scoped dated allocation ranges
Requires schedule:read and current self/managed-person/project access. Returns actual saved allocation dates, exact weekly seconds and mutation versions; no ranges are inferred from weekly aggregates. Snaps the query to full organization weeks, at most 53. Archived people and plans on archived projects are omitted. Project view requires project_id. The live signed cursor is independently scoped to this query. No hidden project identities, time-off detail, rates or actual-time writes.
Parameters
| name | in | required | type |
|---|---|---|---|
view | query | yes | string: project | team |
from | query | yes | string |
to | query | yes | string |
project_id | query | integer | |
person_id | query | integer | |
per_page | query | integer | |
cursor | query | string |
Responses
200 ResourceCalendarAllocationPage
Authentication
bearerAuth or cookieSession
GET/api/v1/resource-calendar/projects
List project identities visible to the resource calendar
Requires schedule:read. Current administrators/executive managers see all projects; project managers see managed projects; members see assigned historical/current project identities. Optional is_active narrows the catalog; archived identities remain available to label retained actuals. Pagination is bounded at 100; current authority is rechecked for every page.
Parameters
| name | in | required | type |
|---|---|---|---|
is_active | query | boolean | |
per_page | query | integer | |
cursor | query | string |
Responses
200 ResourceCalendarProjectPage
Authentication
bearerAuth or cookieSession
GET/api/v1/calendar-feeds
List owned advisory calendar subscriptions
Responses
200 CalendarFeedList
Authentication
cookieSession
POST/api/v1/calendar-feeds
Issue a scoped expiring calendar subscription password
Request body
CalendarFeedInput (required)
Responses
Authentication
cookieSession
POST/api/v1/calendar-feeds/{id}/rotate
Replace a subscription password while retaining stable event IDs
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Responses
Authentication
cookieSession
DELETE/api/v1/calendar-feeds/{id}
Revoke a calendar subscription immediately
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Responses
204 —
Authentication
cookieSession
GET/api/v1/calendar-feeds/{id}/download
Download the current authorized advisory calendar
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Responses
200 —
Authentication
cookieSession
client-rate-cards
GET/api/v1/clients/{id}/rate-card
Get the rate card attached to a client
The card attached directly to this client, with every version, oldest first; inheritance is not applied (use the effective lookup for that). 404 rate_card_not_found when the client has no card. Billable rates are money: only the profiles that may see billable rates (administrator, accounting, executive manager, and a project manager granted billable_rates_manager) read a card, and everyone else is 403 money_forbidden.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/clients/{id}/rate-card
Attach a named rate card to a client
A client has at most one card (409 rate_card_exists); change its rates by adding a version. The card starts with no versions and prices nothing until one is added. Same visibility rule as reading, and the caller must also be allowed to write clients.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
ClientRateCardInput (required)
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/clients/{id}/rate-card/versions
Append a version to a client's rate card
Versions are append-only and effective-dated: the version in force on a date is the one with the latest start_date on or before it, and a null start_date means all prior dates. A new version must start after every existing one (409 rate_card_version_order); a correction is simply a later version. A line with a null task_id is the card default; a task line wins for that task. An empty lines array retires the card, so it is skipped and the next ancestor's card applies. Adding a version prices work resolved afterwards; it never changes an existing entry, snapshot or invoice, and existing entries change only through the audited reprice.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
ClientRateCardVersionInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/clients/{id}/effective-rate-card
Look up the card rate that prices a task for a client
Walks the client and its ancestors through parent_client_id only (never the bill-to client), nearest first, with the same rules the rate resolver uses: a card with no version in force, an empty version, or no line for the task and no default line is skipped. supplied_by_client_id is the node whose card priced it and depth how far up that node sits (0 is the client itself). The card prices only projects billed by people that use default rates. spent_date defaults to today in the instance time zone. 404 rate_card_not_found when no card prices it.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
task_id | query | yes | integer |
spent_date | query | string |
Responses
200 EffectiveClientRateCardEnvelope
Authentication
bearerAuth or 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
csv-import
GET/api/v1/csv-import-capabilities
Discover private CSV staging support
Responses
200 CsvImportCapabilitiesEnvelope
Authentication
none
POST/api/v1/csv-imports
Stream CSV bytes into private administrator staging
Parameters
| name | in | required | type |
|---|---|---|---|
X-CSV-SHA256 | header | yes | string |
X-CSV-Bytes | header | yes | integer |
Request body
CsvImportUploadBytes (required)
Responses
Authentication
cookieSession
GET/api/v1/csv-imports/{runId}/mapping
Read current administrator-owned source and mapping choices
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
Responses
200 CsvImportMappingStateEnvelope
Authentication
cookieSession
PATCH/api/v1/csv-imports/{runId}/mapping
Explicitly register the workspace and set source, zone, mapping and exclusions
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
Request body
CsvImportMapping (required)
Responses
Authentication
cookieSession
POST/api/v1/csv-imports/{runId}/preview
Compute an immutable preview without writing organization rows
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
Request body
Responses
Authentication
cookieSession
GET/api/v1/csv-imports/{runId}
Read private run status, tallies and retention deadline
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
Responses
Authentication
cookieSession
GET/api/v1/csv-imports/{runId}/errors
Read paginated static physical-line diagnostics
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
preview_id | query | string | |
cursor | query | string | |
per_page | query | integer | |
kind | query | string: invalid | unsupported | warning |
Responses
200 CsvImportErrorPageEnvelope
Authentication
cookieSession
GET/api/v1/csv-imports/{runId}/catalog
Read immutable private source labels and explicit destination candidates
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
preview_id | query | string | |
cursor | query | string | |
per_page | query | integer | |
kind | query | yes | string: people | clients | projects | tasks |
source_key | query | string |
Responses
200 CsvImportCatalogPageEnvelope
Authentication
cookieSession
GET/api/v1/csv-imports/{runId}/diagnostics
Download static diagnostics JSON without CSV cells or notes
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
preview_id | query | string |
Responses
200 —
Authentication
cookieSession
DELETE/api/v1/csv-imports/{runId}/input
Purge private input and diagnostics, preserving minimal dedup facts and imported time
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
Responses
204 —
Authentication
cookieSession
csv-imports
POST/api/v1/csv-imports/{runId}/apply
Confirm and queue the immutable reviewed CSV selection
Container-only administrator session operation. Current native session, owned stage and target incarnation are checked before content. No source values or credentials are returned. Cancel stops future writes and retains committed time and setup.
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
Idempotency-Key | header | yes | string |
Request body
CsvImportApplyCommand (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/csv-imports/{runId}/apply
Recover authoritative CSV progress and a pending command receipt
Container-only administrator session operation. Current native session, owned stage and target incarnation are checked before content. No source values or credentials are returned. Cancel stops future writes and retains committed time and setup.
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
command_id | query | string |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/csv-imports/{runId}/resume
Explicitly resume the same sealed selection under a current session
Container-only administrator session operation. Current native session, owned stage and target incarnation are checked before content. No source values or credentials are returned. Cancel stops future writes and retains committed time and setup.
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
Idempotency-Key | header | yes | string |
Request body
CsvImportApplyCommand (required)
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/csv-imports/{runId}/cancel
Stop future CSV writes without rolling back committed rows
Container-only administrator session operation. Current native session, owned stage and target incarnation are checked before content. No source values or credentials are returned. Cancel stops future writes and retains committed time and setup.
Parameters
| name | in | required | type |
|---|---|---|---|
runId | path | yes | string |
Idempotency-Key | header | yes | string |
Request body
CsvImportCancelCommand (required)
Responses
Authentication
bearerAuth or cookieSession
deel-sync
GET/api/v1/deel-sync
Deel time sync mode, schedule and recent runs
The sync is manual unless an administrator sets it to automatic. Automatic runs once a day at run_time in the organization timezone, through the hourly cron. Nothing is sent to Deel unless configured is true.
Responses
200 DeelSyncStatus
Authentication
cookieSession
PATCH/api/v1/deel-sync/settings
Set the Deel sync mode and automatic run time
Request body
DeelSyncSettingsCommand (required)
Responses
204 —
Authentication
cookieSession
POST/api/v1/deel-sync/preview
Preview the timesheets a Deel sync would create, without sending any
Request body
DeelSyncWindow (required)
Responses
200 DeelSyncPreview
Authentication
cookieSession
POST/api/v1/deel-sync/runs
Send the timesheets from a preview to Deel
Sends only when the plan still holds exactly the entry_ids from the preview. If the plan has changed, nothing is sent and the response is 409 deel_sync_stale; preview again.
Request body
DeelSyncRunCommand (required)
Responses
Authentication
cookieSession
POST/api/v1/deel-staging/payment-status
Refresh provider payment status for previously staged timesheets
Request body
DeelPaymentStatusMonth (required)
Responses
200 DeelPaymentStatusRefreshEnvelope
Authentication
cookieSession
GET/api/v1/deel-staging
Inspect configured administrator-reviewed hour staging availability
Responses
Authentication
cookieSession
POST/api/v1/deel-staging/preview
Review stopped hours for selected Deel people
Request body
DeelStageSelection (required)
Responses
Authentication
cookieSession
POST/api/v1/deel-staging/commands
Stage administrator-reviewed hours once; payment completes in Deel
Parameters
| name | in | required | type |
|---|---|---|---|
Idempotency-Key | header | yes | string |
Request body
DeelStageCommand (required)
Responses
Authentication
cookieSession
POST/api/v1/deel-staging/status
Recover the status of an exact staging command without sending hours
Request body
DeelStageCommand (required)
Responses
Authentication
cookieSession
GET/api/v1/email-log
List outbound email delivery outcomes
Newest first, or oldest first with order=oldest, a page at a time. The first page fixes the traversal to the mail that existed when it was read: mail sent after it does not appear on later pages of the same traversal. The filters combine. from and to are calendar days in the organization's timezone, both included. q matches part of a recipient's address or name in To or Cc, ignoring case. page.total counts everything the filters match, not only this page.
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
status | query | string: queued | sent | bounced | complained | failed | |
kind | query | string: invoice | invoice_preview | reminder | thank_you | sign_in | account | |
from | query | string | |
to | query | string | |
q | query | string | |
order | query | string: newest | oldest |
Responses
200 EmailLogPage
Authentication
cookieSession
GET/api/v1/email-suppressions
List suppressed recipients with immutable provider evidence
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer |
Responses
Authentication
cookieSession
POST/api/v1/email-suppressions/{id}/lift
Allow future delivery after reviewing the current suppression evidence
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
Responses
200 EmailSuppressionLiftEnvelope
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
POST/api/v1/estimates
Create a new estimate draft
Requires invoices:write and an idempotency key. Copies content into independent quote rows, with explicit client, number and issue date. Never sends, accepts, charges or converts. Optional template provenance must still be current and active.
Parameters
| name | in | required | type |
|---|---|---|---|
Idempotency-Key | header | yes | string |
Request body
EstimateDraftInput (required)
Responses
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
PATCH/api/v1/estimates/{id}/expiry
Set or clear the last day a customer can answer an estimate
The expiry is the last day the estimate can still be answered, to the end of that day in the instance timezone; null clears it and the organization's estimate validity applies. Moving it does not change the content version a customer was shown. Asking for the expiry the estimate already has changes nothing.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
EstimateExpiryInput (required)
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
GET/api/v1/estimate-templates
List reusable quote content
Requires invoices:write. Archived templates remain visible for audit; only active templates can create drafts. At most 1000 rows with an explicit truncated indicator.
Responses
200 EstimateTemplateListEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/estimate-templates
Save reusable quote content
Creates audited reusable content without customer, document or delivery identity.
Request body
EstimateTemplateInput (required)
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/estimate-templates/{id}
Edit or archive reusable quote content
Requires the current version; changes never rewrite estimates already created. Archiving is final.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Request body
EstimateTemplateUpdateInput (required)
Responses
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/reconciliation
Differences between our invoices and the QuickBooks company, listed and never corrected
Responses
200 QuickBooksReconciliationEnvelope
Authentication
cookieSession
GET/api/v1/invoices/{id}/quickbooks
Whether this invoice and its payments are mirrored in QuickBooks, and how the last attempt went
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
cookieSession
POST/api/v1/invoices/{id}/quickbooks/sync
Mirror this invoice and its unmirrored payments to QuickBooks now
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
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-elevations
POST/api/v1/invoice-elevations/email-code
Send a second-factor code and rotate its bound elevation challenge
Requires the original administrator API token and pending challenge. The replacement remains bound to its original password verification, base token and invoice. Use the returned challenge token; the earlier one is no longer valid.
Request body
InvoiceElevationEmailInput (required)
Responses
200 InvoiceElevationChallengeEnvelope
Authentication
bearerAuth
POST/api/v1/invoice-elevations
Reauthenticate an administrator for temporary draft invoice edits
Requires an administrator API token with invoices:write, live password authentication, and the same verified user credentials. Confirmed authenticator or email MFA requires a bound second step. The returned capability belongs to this base token and invoice, lasts at most 15 minutes, and is returned once. Credential responses cannot be replayed from the HTTP cache.
Request body
InvoiceElevationInput (required)
Responses
201 InvoiceElevationStartEnvelope, 202 InvoiceElevationStartEnvelope
Authentication
bearerAuth
POST/api/v1/invoice-elevations/verify
Complete the bound second factor for a draft invoice elevation
A valid MFA challenge can only be completed by its original administrator and base API token. The verified capability never creates a browser session.
Request body
InvoiceElevationVerifyInput (required)
Responses
201 InvoiceElevationIssuedEnvelope
Authentication
bearerAuth
DELETE/api/v1/invoice-elevations/{id}
Revoke this administrator token’s temporary invoice capability
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Responses
204 —
Authentication
bearerAuth
POST/api/v1/invoices/{id}/unlink-time
Atomically unlink selected time from one draft invoice
Administrator API token only; requires invoices:write, time_entries:write and X-Ezacto-Invoice-Elevation bound to this invoice. All selected stopped entries must still belong to the same current draft. The whole command and its before/after audit commit together. Invoice line amounts remain unchanged.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
X-Ezacto-Invoice-Elevation | header | yes | string |
Request body
ElevatedInvoiceTimeUnlinkInput (required)
Responses
200 ElevatedInvoiceTimeUnlinkEnvelope
Authentication
bearerAuth
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
One email: To the recipients, Cc the copies, the organization's always-Cc addresses and, when send_me_a_copy is true, the person sending. The subject and message are templates; the body is the message followed by the invoice summary.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
InvoiceEmailDeliveryInput (required)
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/invoices/{id}/deliveries/preview
Compose the invoice email a delivery would send, without sending or recording anything
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
InvoiceEmailPreviewInput (required)
Responses
200 InvoiceEmailPreviewEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/invoices/{id}/deliveries/preview/document
Download the invoice PDF a delivery would carry, stamped PREVIEW on every page
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
append_pdfs | query | string: true | false |
Responses
200 —
Authentication
bearerAuth or cookieSession
POST/api/v1/invoices/{id}/deliveries/preview/send
Send the invoice email, stamped PREVIEW, to the signed-in user only
Not a delivery: no invoice message, no delivery record, no event. Limited to a few per invoice per hour.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
InvoiceEmailPreviewInput (required)
Responses
202 InvoiceEmailPreviewSentEnvelope
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
Newest first: by issue_date, latest first; then by number, highest first -- compared as a number when it is made of digits alone (leading zeros ignored) and as text, by Unicode code point, otherwise, with all-digit numbers ahead of the rest on a day that has both; then by id, highest first, so no two invoices tie. The first page fixes the traversal to the invoices that existed when it was read: an invoice created after it does not appear on later pages of the same traversal, and is listed by a new one. Editing an invoice's issue_date or number moves it in the order, so a traversal already under way may miss it or list it twice. The number parameter narrows the list to the invoice with exactly that number, compared as text, so 089 is not 89; numbers are unique, so the page holds that invoice or nothing. The sort parameter orders by issue_date, due_date, number, amount or balance, with - in front for descending (the default is -issue_date, the order above). The chosen column ranks first, then the number, then the id, all in the one direction. A cursor belongs to the sort it was issued under and is refused under another.
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
state | query | string | |
client_id | query | string | |
number | query | string | |
sort | 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
API-token edits require an administrator and X-Ezacto-Invoice-Elevation bound to this base token and draft invoice. Browser sessions retain their existing policy.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
X-Ezacto-Invoice-Elevation | header | string |
Request body
InvoiceEditInput (required)
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/invoice-generations
Create one draft invoice from tracked work, a flat fee covering tracked work, or a blank free-form draft
Parameters
| name | in | required | type |
|---|---|---|---|
Idempotency-Key | header | yes | string |
Request body
InvoiceGenerationInput (required)
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/invoices/{id}/line-items
Add a parent-owned invoice line
API-token edits require an administrator and X-Ezacto-Invoice-Elevation bound to this base token and draft invoice. Browser sessions retain their existing policy.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
X-Ezacto-Invoice-Elevation | header | string |
Request body
InvoiceLineInput (required)
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/invoices/{id}/line-items/{lineId}
Update a parent-owned invoice line
API-token edits require an administrator and X-Ezacto-Invoice-Elevation bound to this base token and draft invoice. Browser sessions retain their existing policy.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
lineId | path | yes | integer |
Idempotency-Key | header | yes | string |
X-Ezacto-Invoice-Elevation | header | string |
Request body
InvoiceLineUpdateInput (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/invoices/{id}/line-items/{lineId}
Delete a parent-owned invoice line
API-token edits require an administrator and X-Ezacto-Invoice-Elevation bound to this base token and draft invoice. Browser sessions retain their existing policy.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
lineId | path | yes | integer |
Idempotency-Key | header | yes | string |
X-Ezacto-Invoice-Elevation | header | string |
Request body
VersionedRowDeleteInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/invoices/{id}/provider-alerts
List verified Stripe refund and dispute reports without changing receipts
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoiceProviderAlertListEnvelope
Authentication
cookieSession
POST/api/v1/invoices/{id}/provider-alerts/{alertId}/review
Mark a provider report reviewed without an accounting mutation
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
alertId | path | yes | string |
Request body
ReviewInvoiceProviderAlertInput (required)
Responses
200 InvoiceProviderAlertEnvelope
Authentication
cookieSession
GET/api/v1/bank-feed-status
Read configured bank feed health without exposing credentials
Responses
Authentication
cookieSession
POST/api/v1/bank-feeds/sync
Read due bank feed pages without creating invoice payments
Request body
BankFeedSyncInput (required)
Responses
Authentication
cookieSession
GET/api/v1/bank-deposit-accounts
List bank feed accounts visible to the review queue
Responses
200 BankDepositAccountsEnvelope
Authentication
cookieSession
GET/api/v1/bank-deposits
Review staged credits without creating receipts
Parameters
| name | in | required | type |
|---|---|---|---|
state | query | string: unmatched | suggested | confirmed | rejected | |
page | query | integer | |
per_page | query | integer |
Responses
Authentication
cookieSession
GET/api/v1/bank-deposits/{id}/invoices
Find same-currency invoices for an explicit assignment
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
query | query | string |
Responses
200 BankDepositInvoicesEnvelope
Authentication
cookieSession
POST/api/v1/bank-deposits/{id}/assign
Choose the invoice to review for this credit
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
BankDepositAssignInput (required)
Responses
Authentication
cookieSession
POST/api/v1/bank-deposits/{id}/reject
Reject this credit without altering an invoice
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
BankDepositDecisionInput (required)
Responses
Authentication
cookieSession
POST/api/v1/bank-deposits/{id}/reopen
Reopen a rejected credit for review
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
BankDepositDecisionInput (required)
Responses
Authentication
cookieSession
POST/api/v1/bank-deposits/{id}/confirm
Explicitly confirm one credit against one invoice
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
BankDepositConfirmInput (required)
Responses
Authentication
cookieSession
POST/api/v1/bank-deposits/{id}/verify-source
Record an administrator verification of an uncertain external credit
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
BankDepositVerifyInput (required)
Responses
Authentication
cookieSession
migration
GET/api/v1/migration-loads/{id}
Read migration progress (administrator session)
Reports safe aggregate progress and an error code. During import quarantine the operator uses Cloudflare CLI status; ordinary application traffic remains unavailable.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Responses
200 MigrationLoadStatusEnvelope
Authentication
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 |
Request body
InvoiceDocumentPreferenceInput (required)
Responses
200 InvoiceDocumentPreferenceEnvelope
Authentication
cookieSession
GET/api/v1/invoices/{id}/email-defaults
What the Send dialog opens on for this invoice: subject, message, To, Cc, copies, and whether email can be delivered
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoiceEmailDefaultsEnvelope
Authentication
cookieSession
GET/api/v1/clients/{id}/invoice-sending
Who this client's invoices go to and what they carry
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 ClientInvoiceSendingEnvelope
Authentication
cookieSession
POST/api/v1/clients/{id}/invoice-sending
Save who this client's invoices go to and what they carry
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
ClientInvoiceSendingInput (required)
Responses
200 ClientInvoiceSendingEnvelope
Authentication
cookieSession
GET/api/v1/settings/invoice-sending
The addresses copied on every invoice email
Responses
200 OrganizationInvoiceSendingEnvelope
Authentication
cookieSession
POST/api/v1/settings/invoice-sending
Set the addresses copied on every invoice email
Request body
OrganizationInvoiceSendingInput (required)
Responses
200 OrganizationInvoiceSendingEnvelope
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
Request body
OrganizationInvoiceDocumentsInput (required)
Responses
200 OrganizationInvoiceDocumentsEnvelope
Authentication
cookieSession
GET/api/v1/invoices/{id}/hours-report
Download the hours an invoice billed as a PDF, CSV or Excel workbook
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
format | query | yes | string: pdf | csv | xlsx |
detail | query | string: detailed | summary |
Responses
200 —
Authentication
bearerAuth or cookieSession
GET/api/v1/invoices/{id}/hours-reconciliation
Compare the hours an invoice bills with the time entries it claims
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoiceHoursReconciliationEnvelope
Authentication
bearerAuth or cookieSession
POST/api/v1/invoices/{id}/hours-reconciliation/release
Explicitly release selected whole entries from a saved draft line to match its billed hours
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
Responses
200 InvoiceLineTimeReleaseEnvelope
Authentication
cookieSession
GET/api/v1/settings/invoice-defaults
The company information invoices print and the values new drafts start with
Responses
Authentication
cookieSession
POST/api/v1/settings/invoice-defaults
Change the company information or the default notes and subject
Request body
InvoiceDefaultsInput (required)
Responses
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/invoices/{id}/reminder-preference
Whether this invoice will be reminded, and when the next one is booked
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 InvoiceReminderPreferenceEnvelope
Authentication
cookieSession
POST/api/v1/invoices/{id}/reminder-preference
Switch reminders off for this invoice, back on, or follow the organization
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
InvoiceReminderPreferenceInput (required)
Responses
200 InvoiceReminderPreferenceEnvelope
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
Newest first, or oldest first with order=oldest, a page at a time, by when the delivery was created. from and to are calendar days in the organization's timezone, both included. page.total counts everything the filters match, not only this page.
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
status | query | string: pending | processing | delivered | failed | |
event_type | query | string | |
from | query | string | |
to | query | string | |
order | query | string: newest | oldest |
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
outbound-webhooks
GET/api/v1/webhook-subscriptions
List subscriptions and webhook configuration
Administrator session only. Events contain identifiers, resource sequence and relative API links. Secret issuance is returned once and cannot be replayed from the idempotency cache. Public demo delivery is disabled.
Responses
200 WebhookSubscriptionsEnvelope
Authentication
cookieSession
POST/api/v1/webhook-subscriptions
Create an endpoint and issue its signing secret once
Administrator session only. Events contain identifiers, resource sequence and relative API links. Secret issuance is returned once and cannot be replayed from the idempotency cache. Public demo delivery is disabled.
Parameters
| name | in | required | type |
|---|---|---|---|
Idempotency-Key | header | string |
Request body
WebhookCreateInput (required)
Responses
Authentication
cookieSession
PATCH/api/v1/webhook-subscriptions/{id}
Pause or resume an endpoint at its current version
Administrator session only. Events contain identifiers, resource sequence and relative API links. Secret issuance is returned once and cannot be replayed from the idempotency cache. Public demo delivery is disabled.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Idempotency-Key | header | string |
Request body
WebhookActiveInput (required)
Responses
200 WebhookSubscriptionEnvelope
Authentication
cookieSession
DELETE/api/v1/webhook-subscriptions/{id}
Delete an endpoint and erase its sealed signing secrets
Administrator session only. Events contain identifiers, resource sequence and relative API links. Secret issuance is returned once and cannot be replayed from the idempotency cache. Public demo delivery is disabled.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Idempotency-Key | header | string |
Request body
WebhookVersionInput (required)
Responses
200 WebhookSubscriptionEnvelope
Authentication
cookieSession
POST/api/v1/webhook-subscriptions/{id}/rotate-secret
Rotate a signing secret with a bounded overlap
Administrator session only. Events contain identifiers, resource sequence and relative API links. Secret issuance is returned once and cannot be replayed from the idempotency cache. Public demo delivery is disabled.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Idempotency-Key | header | string |
Request body
WebhookRotateInput (required)
Responses
Authentication
cookieSession
GET/api/v1/webhook-deliveries
Page through webhook delivery results
Administrator session only. Events contain identifiers, resource sequence and relative API links. Secret issuance is returned once and cannot be replayed from the idempotency cache. Public demo delivery is disabled.
Parameters
| name | in | required | type |
|---|---|---|---|
subscription_id | query | string | |
status | query | string: pending | processing | delivered | failed | |
per_page | query | integer | |
cursor | query | string |
Responses
Authentication
cookieSession
POST/api/v1/webhook-deliveries/{id}/replay
Replay a settled delivery from the last seven days
Administrator session only. Events contain identifiers, resource sequence and relative API links. Secret issuance is returned once and cannot be replayed from the idempotency cache. Public demo delivery is disabled.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Idempotency-Key | header | string |
Request body
WebhookReplayInput (required)
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
GET/api/v1/payout-providers
The payout providers an administrator has made available
Responses
200 PayoutProviderListEnvelope
Authentication
cookieSession
PATCH/api/v1/payout-providers/{provider}
Enable or disable a payout provider for new links
Disabling a provider stops new links to it. Accounts already linked are kept.
Parameters
| name | in | required | type |
|---|---|---|---|
provider | path | yes | string: deel | wise |
Request body
PayoutProviderSettingInput (required)
Responses
204 —
Authentication
cookieSession
GET/api/v1/users/{id}/payout-preference
A person's default payout provider, and the organization's
Their own choice, or an administrator's. effective_provider is the default used for their payouts: their choice, else the organization default.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
cookieSession
PATCH/api/v1/users/{id}/payout-preference
Choose a person's default payout provider
A person chooses their own; an administrator may choose it for them. Only a provider the person holds and the instance has enabled. Null returns to the organization default. expected_version must match the current version, or the answer is 409.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
PayoutPreferenceInput (required)
Responses
204 —
Authentication
cookieSession
GET/api/v1/payout-preferences
Every person's default payout provider, for administrators
Responses
200 PayoutPreferenceRosterEnvelope
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
GET/api/v1/profile/notifications
The signed-in user's own reminder and digest preferences
Responses
200 ProfileNotificationEnvelope
Authentication
cookieSession
POST/api/v1/profile/notifications
Change the signed-in user's own reminder and digest preferences
Request body
ProfileNotificationInput (required)
Responses
200 ProfileNotificationEnvelope
Authentication
cookieSession
POST/api/v1/profile/deletion-request
Ask the administrators to delete the signed-in user's own account
Request body
Responses
202 AccountDeletionRequestEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/profile/deletion-request
Read your deletion request and original policy disclosure
Responses
200 AccountDeletionStatusEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/profile/retention-policy
Read the operator's published erasure and retention disclosure
Requires a staff session or a token with time_entries:read.
Responses
Authentication
bearerAuth or cookieSession
POST/account-deletion/requests/{id}/status
Read minimal deletion status with its private tracking capability
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Request body
AccountDeletionTrackingInput (required)
Responses
200 AccountDeletionTrackingEnvelope
Authentication
none
projects
POST/api/v1/projects/{id}/missing-rates
Preview or explicitly repair missing project-rate snapshots on open time
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
ProjectMissingRatesInput (required)
Responses
200 ProjectMissingRatesEnvelope
Authentication
cookieSession
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-views
Save the report on screen: a report kind and its address, private to the author
Request body
SavedReportViewInput (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 a saved report you own, or any saved report as an administrator
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 | |
due_state | query | string: not_due | past_due |
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 |
|---|---|---|---|
self | query | boolean | |
include_fixed_fee | query | boolean | |
direct_client_only | query | boolean | |
contractors_only | query | boolean | |
currency | query | string | |
project_status | query | string: all | active | archived | |
billing_method | query | string: non_billable | time_materials | fixed_fee | |
manager_id | query | integer | |
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 | |
audience | query | string: internal | client | |
invoice_state | query | string: all | invoiced | uninvoiced | |
active_projects_only | query | boolean | |
notes | query | string |
Responses
200 DetailedTimeReportEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/reports/detailed-time/export
Download the detailed time report as a PDF, CSV or Excel workbook
Takes every filter of getDetailedTimeReport, with the same defaults but one: an absent audience is client, so only the notes a client may read are in the file unless audience=internal is asked for. Hours only. The file is named detailed-time-
Parameters
| name | in | required | type |
|---|---|---|---|
self | query | boolean | |
include_fixed_fee | query | boolean | |
direct_client_only | query | boolean | |
contractors_only | query | boolean | |
currency | query | string | |
project_status | query | string: all | active | archived | |
billing_method | query | string: non_billable | time_materials | fixed_fee | |
manager_id | query | integer | |
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 | |
audience | query | string: internal | client | |
invoice_state | query | string: all | invoiced | uninvoiced | |
active_projects_only | query | boolean | |
notes | query | string | |
format | query | yes | string: pdf | csv | xlsx |
Responses
200 —
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
schedule
GET/api/v1/allocations
List planned allocations
Planned hours per week for a person on a project over a range of dates. Administrators and executive managers read all of them; a project manager reads their own and those for the people and projects they manage; everyone else reads only their own. from and to keep the allocations that reach into that span of days. A plan is not work: it is separate from time entries and never billed.
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
user_id | query | integer | |
project_id | query | integer | |
from | query | string | |
to | query | string |
Responses
200 AllocationPage
Authentication
bearerAuth or cookieSession
POST/api/v1/allocations
Plan hours for a person on a project
Administrators, executive managers and project managers only, a project manager only for people and projects they manage. Dates are plain local days, both included; the figure counts in full for every week the range touches. An end before the start is 422 invalid_range, an archived or unknown person or project is 422 inactive_user, inactive_project, unknown_user or unknown_project, and a range that overlaps another for the same person and project is 409 allocation_overlap. Planning more than a person's capacity is allowed: the capacity view flags it.
Request body
AllocationInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/allocations/{id}
Get an allocation
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
PATCH/api/v1/allocations/{id}
Update an allocation
Dates and hours only: the person and project of a plan do not change, so to move one, delete it and make another. The same rules as creating apply, and a plan changed by someone else in the meantime is 409 allocation_changed.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
AllocationPatch (required)
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/allocations/{id}
Delete an allocation
Send the version last read in the JSON body. A stale version is 409; omitted versions are deprecated until the 2027-01-22 sunset, then refused.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/capacity
Read planned hours against capacity and tracked time, person by week
Read-only. Weeks begin on the organization's week start day and run from the week holding from through the week holding to, at most 53. Per person and week: planned_seconds (the sum of the allocations touching that week, on active projects), weekly_capacity_seconds (the person's current weekly capacity, so part-time is honoured), tracked_seconds (rounded time actually logged, a separate figure and never changed by the plan) and over_allocated when planned exceeds capacity, which is a flag and never a refusal. Archived people are left out. Administrators and executive managers see everyone, a project manager the people they manage, everyone else only themselves.
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | yes | string |
to | query | yes | string |
Responses
200 CapacityEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/time-off
List time off
Days a person is away, entered by an administrator. Administrators and executive managers read all of it; a project manager reads their own and that of the people they manage; everyone else reads only their own. from and to keep the entries that reach into that span of days. Time off reduces the capacity the capacity view counts as available; it is not work, is never billed, and has no approval step.
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
user_id | query | integer | |
from | query | string | |
to | query | string |
Responses
200 TimeOffPage
Authentication
bearerAuth or cookieSession
POST/api/v1/time-off
Enter time off for a person
Administrators, executive managers and project managers only, a project manager only for the people they manage. Dates are plain local days, both included; only Monday to Friday remove capacity. seconds_per_day null is a whole day (a fifth of the person's weekly capacity); a figure is that many seconds away on each working day. An end before the start or an unknown kind is 422, an archived or unknown person is 422 inactive_user or unknown_user, and a range that overlaps other time off for the same person is 409 time_off_overlap, so a day is never taken off twice.
Request body
TimeOffInput (required)
Responses
201 TimeOffEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/time-off/{id}
Get time off
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 TimeOffEnvelope
Authentication
bearerAuth or cookieSession
PATCH/api/v1/time-off/{id}
Update time off
Dates, kind and hours only: the person does not change, so to move time off to someone else, delete it and make another. The same rules as creating apply, and an entry changed by someone else in the meantime is 409 time_off_changed.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
TimeOffPatch (required)
Responses
200 TimeOffEnvelope
Authentication
bearerAuth or cookieSession
DELETE/api/v1/time-off/{id}
Delete time off
Send the version last read in the JSON body. A stale version is 409; omitted versions are deprecated until the 2027-01-22 sunset, then refused.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
Responses
200 TimeOffEnvelope
Authentication
bearerAuth or cookieSession
scheduled-jobs
GET/api/v1/scheduled-jobs
List monthly job definitions and their latest proposal status
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer |
Responses
Authentication
cookieSession
POST/api/v1/scheduled-jobs
Create a monthly job requiring authenticated confirmation
Request body
ScheduledJobCreate (required)
Responses
Authentication
cookieSession
GET/api/v1/scheduled-jobs/{id}
Read a month-end job definition
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
cookieSession
PATCH/api/v1/scheduled-jobs/{id}
Update or pause a job against its reviewed version
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
ScheduledJobPatch (required)
Responses
Authentication
cookieSession
scheduled-runs
POST/api/v1/scheduled-runs/{id}/review-link
Record the single authenticated opening of an expiring email review link; never confirm or execute
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
Responses
200 ScheduledReviewLinkEnvelope
Authentication
cookieSession
GET/api/v1/scheduled-runs/{id}/items/{itemId}/report
Download the exact saved report an administrator is reviewing
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
itemId | path | yes | integer |
Responses
200 —
Authentication
cookieSession
POST/api/v1/scheduled-runs/{id}/retry
Authorize another bounded attempt window for exhausted failed items only
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
cookieSession
GET/api/v1/scheduled-runs/{id}
Read a proposed run and the concrete items it would act on
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
cookieSession
POST/api/v1/scheduled-runs/{id}/confirm
Confirm a proposed run; a second confirmation changes nothing
Refused with 409 once the run has lapsed, which also settles it as expired, or if it was cancelled.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
Responses
Authentication
cookieSession
POST/api/v1/scheduled-runs/{id}/cancel
Cancel a proposed run that has not been confirmed
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
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
staff-payments
GET/api/v1/staff-payments/actuals
Review captured contractor time and cost rates for a work month
Parameters
| name | in | required | type |
|---|---|---|---|
month | query | string |
Responses
Authentication
cookieSession
POST/api/v1/staff-payments/actuals
Confirm reviewed contractor actuals as the monthly amount owed
Request body
ConfirmPaymentActuals (required)
Responses
204 —
Authentication
cookieSession
GET/api/v1/staff-payments/reconciliation
Propose contractor earnings for a work month with missing-rate and changed-source exceptions
Parameters
| name | in | required | type |
|---|---|---|---|
month | query | string |
Responses
200 PaymentReconciliationEnvelope
Authentication
cookieSession
POST/api/v1/staff-payments/provider-settings
Set the organization payout provider or a person override
Request body
StaffPaymentProviderCommand (required)
Responses
204 —
Authentication
cookieSession
GET/api/v1/staff-payments
Monthly staff payment register and audit history
Parameters
| name | in | required | type |
|---|---|---|---|
month | query | string |
Responses
200 StaffPaymentReportEnvelope
Authentication
cookieSession
POST/api/v1/staff-payments/events
Record a staff payment, obligation, correction, or historical settlement
Request body
StaffPaymentCommand (required)
Responses
204 —
Authentication
cookieSession
GET/api/v1/staff-payments/allocations
Reconcile earned, paid, reserved and remaining by month, project and entry
Parameters
| name | in | required | type |
|---|---|---|---|
month | query | string |
Responses
200 PaymentAllocationReportEnvelope
Authentication
cookieSession
POST/api/v1/staff-payments/allocations
Allocate part of a payment to a month, project, or reviewed time entry and hours
Request body
AllocatePayment (required)
Responses
204 —
Authentication
cookieSession
POST/api/v1/staff-payments/allocations/preview
Preview what a payment allocation would record and what remains, without saving
Request body
AllocatePayment (required)
Responses
200 PaymentAllocationPreviewEnvelope
Authentication
cookieSession
POST/api/v1/staff-payments/allocations/reversals
Reverse a payment allocation with a reason, keeping its history
Request body
ReversePaymentAllocation (required)
Responses
204 —
Authentication
cookieSession
GET/api/v1/me/payments
Own payment summary and upcoming payments for the signed-in person
Parameters
| name | in | required | type |
|---|---|---|---|
month | query | string |
Responses
Authentication
cookieSession
GET/api/v1/payment-runs/report
Payment ledger and individual transfer outcomes over a period range
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | string | |
to | query | string |
Responses
Authentication
cookieSession
POST/api/v1/payment-runs/preview
Prepare a payment run for review without sending money
Request body
PaymentRunCommand (required)
Responses
Authentication
cookieSession
POST/api/v1/payment-runs/{id}/approve
Authorize and reserve a payment run for immediate or scheduled execution
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Request body
PaymentRunApproval (required)
Responses
Authentication
cookieSession
POST/api/v1/payment-runs/{id}/cancel
Cancel payments that have not entered transfer creation
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
Responses
Authentication
cookieSession
POST/api/v1/payment-runs/{id}/items/{itemId}/reconcile
Request a status check without initiating a replacement transfer
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | string |
itemId | path | yes | string |
Responses
Authentication
cookieSession
GET/api/v1/payment-runs/advances
Reconcile contractor advance credit by settlement and application date
Parameters
| name | in | required | type |
|---|---|---|---|
from | query | string | |
to | query | string |
Responses
200 AdvanceCreditReportEnvelope
Authentication
cookieSession
POST/api/v1/payment-runs/advances/applications
Apply settled advance credit to reviewed earnings without moving funds
Request body
ApplyAdvanceCredit (required)
Responses
204 —
Authentication
cookieSession
POST/api/v1/payment-runs/advances/reversals
Reverse an advance application and restore credit
Request body
ReverseAdvanceCredit (required)
Responses
204 —
Authentication
cookieSession
POST/api/v1/payment-runs/advances/returns
Record a confirmed return of unapplied advance credit
Request body
ReturnAdvanceCredit (required)
Responses
204 —
Authentication
cookieSession
GET/api/v1/staff-invoices
Reconcile contractor payable invoices against existing reviewed earnings
Parameters
| name | in | required | type |
|---|---|---|---|
month | query | string |
Responses
200 StaffInvoiceReportEnvelope
Authentication
cookieSession
POST/api/v1/staff-invoices
Record an immutable contractor invoice version without changing amounts owed
Request body
SaveStaffInvoice (required)
Responses
Authentication
cookieSession
GET/api/v1/me/staff-invoices
Read only your received payable invoices when own-money viewing is enabled
Parameters
| name | in | required | type |
|---|---|---|---|
month | query | string |
Responses
200 StaffInvoiceReportEnvelope
Authentication
cookieSession
POST/api/v1/staff-invoices/{invoiceId}/documents
Stage a contractor invoice document for explicit inclusion in a version
Parameters
| name | in | required | type |
|---|---|---|---|
invoiceId | path | yes | integer |
month | query | yes | string |
Idempotency-Key | header | yes | string |
Request body
AttachmentUploadInput (required)
Responses
201 StaffInvoiceDocumentEnvelope
Authentication
cookieSession
GET/api/v1/staff-invoices/{invoiceId}/documents/{documentId}/content
Download an authorized contractor invoice document
Parameters
| name | in | required | type |
|---|---|---|---|
invoiceId | path | yes | integer |
documentId | path | yes | string |
Responses
200 —
Authentication
cookieSession
GET/api/v1/staff-payments/contractor-review
Review contractor earnings, invoices, existing payments, advance credit and allocation proposals without executing them
Parameters
| name | in | required | type |
|---|---|---|---|
month | query | string |
Responses
Authentication
cookieSession
GET/api/v1/staff-payments/contractor-review/acceptances
Read immutable contractor reconciliation confirmations
Parameters
| name | in | required | type |
|---|---|---|---|
month | query | string |
Responses
200 ContractorAcceptancesEnvelope
Authentication
cookieSession
POST/api/v1/staff-payments/contractor-review/acceptances
Explicitly confirm monthly receipt allocations and settled advance credit without authorizing a transfer
Request body
Responses
200 ContractorAcceptanceEnvelope
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
Save a person's reminder and digest preferences
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
POST/api/v1/team/people/{id}/cost-rate-backfill
Rehearse or apply a cost rate over hours tracked before the person had one
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Idempotency-Key | header | yes | string |
Request body
CostRateBackfillInput (required)
Responses
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
PATCH/api/v1/time-entry-rounding-settings
Update the organization's time rounding rule
A direction and an increment, either or both. Nothing already saved changes: the rule rounds time saved from now on, and open time is re-rounded only by /time-rounding-recalculation, after a preview. Executive managers and administrators only.
Request body
TimeRoundingPatch (required)
Responses
Authentication
cookieSession
GET/api/v1/time-rounding-recalculation
Preview re-rounding open time under the current rules
What the apply would change, writing nothing: how many open entries change, their rounded hours before and after, a breakdown by project, the date span, and what is left alone and why. Open means the same as for a single edit: stopped, not invoiced, not approved, on an unlocked date, under an active client, project and task. The fingerprint names exactly this set. Executive managers and administrators only.
Parameters
| name | in | required | type |
|---|---|---|---|
project_id | query | integer | |
from | query | string | |
to | query | string |
Responses
200 TimeRoundingRecalculationPreviewEnvelope
Authentication
cookieSession
POST/api/v1/time-rounding-recalculation
Re-round open time under the current rules
Applies the preview whose fingerprint is sent, for the same scope. If anything has changed since that preview, nothing is written and the answer is 409 preview_stale. Executive managers and administrators only.
Request body
TimeRoundingRecalculationRequest (required)
Responses
200 TimeRoundingRecalculationAppliedEnvelope
Authentication
cookieSession
GET/api/v1/time-entry-options
List the active project and task combinations a user may log time against
The acting user's unless user_id names somebody else, which only an administrator may do (403 row_forbidden otherwise).
Parameters
| name | in | required | type |
|---|---|---|---|
user_id | query | integer |
Responses
200 TimeEntryOptionListEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/time-entries
List time entries
The acting user's unless user_id names somebody else, which only an administrator may do (403 row_forbidden otherwise). An administrator may also read, update, stop and delete any entry by id; everyone else reaches only their own.
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
started_time with ended_time logs a stopped start/end entry in either organization mode, its seconds derived from the two times (an end before the start is past midnight); seconds beside them is 422 mode_mismatch. Without times the organization's time_entry_mode decides: in duration, seconds logs a stopped entry and leaving it out starts a timer; in start_end, leaving out ended_time starts a timer at the current local time and seconds is 422 mode_mismatch. A timer in a duration organization never carries times, so started_time without ended_time there is 422 mode_mismatch. Stopped entries must have a positive rounded duration; zero-hour entries are refused. Entries may overlap; each counts its own full duration.
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
An entry keeps the shape it was created with, whatever the organization's mode: a start/end entry takes started_time and ended_time and re-derives seconds, a duration entry takes seconds, and the other is 422 mode_mismatch.
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
GET/api/v1/calendar-proposals
List the acting user's calendar events offered as time
Only the acting user's own, administrators included. A proposal is a calendar event held beside the timesheet, not a time entry: it reaches no report, lock or invoice until it is accepted. status defaults to proposed, what is waiting for a decision. from and to are calendar days on the user's own calendar, both included, and filter on the day the event starts.
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
from | query | string | |
to | query | string | |
status | query | string: proposed | accepted | discarded | cancelled |
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/calendar-proposals/{id}/accept
Accept a calendar proposal as a time entry
Creates the entry through the same path as POST /time-entries, so rounding, timesheet locks, approval membership, assignment and note rules all apply, and marks the proposal accepted in the same write. In a duration organization the entry carries the event's length and no times; in start_end it carries the event's times on the user's own clock, and an event that runs past local midnight is 422 spans_days. notes defaults to the event's title. The proposal's time_entry_id and the Location header name the entry. A proposal already decided is 409 proposal_not_open, and nothing is created.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
CalendarProposalAcceptInput (required)
Responses
Authentication
bearerAuth or cookieSession
POST/api/v1/calendar-proposals/{id}/discard
Discard a calendar proposal
A discarded event is not offered again when the calendar is read again. A proposal already decided is 409 proposal_not_open.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/calendar-connections/{provider}/cleanup
List the acting user’s manual Microsoft cleanup records
Parameters
| name | in | required | type |
|---|---|---|---|
provider | path | yes | string: google | microsoft |
Responses
Authentication
cookieSession
POST/api/v1/calendar-connections/{provider}/cleanup/confirm
Record the owner’s confirmation of Microsoft permission removal
This is a user attestation, not provider verification. Only the acting user’s current-incarnation disconnect or reauthorization record can be resolved.
Parameters
| name | in | required | type |
|---|---|---|---|
provider | path | yes | string: google | microsoft |
Request body
CalendarManualCleanupInput (required)
Responses
204 —
Authentication
cookieSession
POST/api/v1/calendar-connections/{provider}/authorize
Begin personal read-only calendar consent
Parameters
| name | in | required | type |
|---|---|---|---|
provider | path | yes | string: google | microsoft |
Request body
CalendarAuthorizationInput (required)
Responses
200 CalendarAuthorizationEnvelope
Authentication
cookieSession
GET/api/v1/calendar-connections/{provider}/callback
Complete native-session-bound calendar consent
Parameters
| name | in | required | type |
|---|---|---|---|
provider | path | yes | string: google | microsoft |
Responses
204 no content
Authentication
cookieSession
GET/api/v1/calendar-cleanup-status
Show unresolved calendar cleanup counts across retained incarnations
Responses
Authentication
cookieSession
GET/api/v1/calendar-connections
List the acting user’s private calendar connection status
Responses
Authentication
cookieSession
DELETE/api/v1/calendar-connections/{provider}
Disconnect the acting user’s calendar and cancel open proposals
Parameters
| name | in | required | type |
|---|---|---|---|
provider | path | yes | string: google | microsoft |
Request body
CalendarDisconnectInput (required)
Responses
204 —
Authentication
cookieSession
POST/api/v1/calendar-connections/{provider}/refresh
Refresh proposals from an available calendar provider
No time entry is created or changed. Returns unavailable until an approved provider adapter is configured. No token may be supplied.
Parameters
| name | in | required | type |
|---|---|---|---|
provider | path | yes | string: google | microsoft |
Request body
CalendarRefreshInput (required)
Responses
Authentication
cookieSession
GET/api/v1/admin/calendar-cleanup
Review retained old-incarnation and closed-account calendar cleanup
Parameters
| name | in | required | type |
|---|---|---|---|
after | query | string |
Responses
200 CalendarOperatorCleanupList
Authentication
cookieSession
POST/api/v1/admin/calendar-cleanup/confirm
Record administrator evidence of exact calendar permission removal
Operator attestation only; never provider verification. Requires the complete reviewed custody identity.
Request body
CalendarOperatorCleanupInput (required)
Responses
200 CalendarOperatorCleanupReceiptEnvelope
Authentication
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
POST/api/v1/two-factor/email
Turn on the emailed second factor
Needs a verified email address. A code is mailed at password sign-in; magic-link and federated sign-in never use this factor.
Responses
Authentication
cookieSession
DELETE/api/v1/two-factor/email
Turn off the emailed second factor
Responses
Authentication
cookieSession
GET/api/v1/users/{id}/two-factor/email
Whether a user has the emailed second factor on (administrator)
Lets an administrator see the state before turning it off. Administrators only; session only.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 TwoFactorEmailStateEnvelope
Authentication
cookieSession
DELETE/api/v1/users/{id}/two-factor/email
Turn off a user's emailed second factor (administrator)
Lockout recovery for a user who lost their mailbox. Administrators only; the change is recorded in the activity log.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 TwoFactorEmailDisabledEnvelope
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
work-items
GET/api/v1/work-items/github/setup/callback
Finish the private GitHub App registration
Parameters
| name | in | required | type |
|---|---|---|---|
state | query | yes | string |
code | query | yes | string |
Responses
204 no content
Authentication
cookieSession
GET/api/v1/work-items/github/installations
List read-enabled App installations
Parameters
| name | in | required | type |
|---|---|---|---|
page | query | integer |
Responses
200 GithubReaderInstallationsEnvelope
Authentication
cookieSession
GET/api/v1/work-items/github/repositories
List repository names available to the selected installation
Parameters
| name | in | required | type |
|---|---|---|---|
installation_id | query | yes | string |
page | query | integer |
Responses
200 GithubReaderRepositoriesEnvelope
Authentication
cookieSession
POST/api/v1/work-items/github/repositories
Verify an App installation repository and map it to a local task
Request body
GithubReaderMapRequest (required)
Responses
Authentication
cookieSession
POST/api/v1/work-items/github/setup
Prepare a private read-only GitHub App manifest
Request body
GithubReaderSetupRequest (required)
Responses
Authentication
cookieSession
GET/api/v1/work-items/github/status
Inspect GitHub issue synchronization and deferred retries
Responses
200 GithubReaderStatusEnvelope
Authentication
cookieSession
POST/api/v1/work-items/github/disconnect
Fence GitHub reads and deliveries while retaining local links
Request body
GithubReaderDisconnectRequest (required)
Responses
200 GithubReaderDisconnectEnvelope
Authentication
cookieSession
POST/api/v1/work-items/github/reconcile
Schedule a bounded GitHub metadata reconciliation
Request body
GithubReaderReconcileRequest (required)
Responses
204 —
Authentication
cookieSession
GET/api/v1/work-item-links/{id}/github
Read verified issue metadata for an authorized local time link
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 GithubReaderMetadataEnvelope
Authentication
bearerAuth or cookieSession
GET/api/v1/work-items/github/publication
Inspect opted-in GitHub time publication
Responses
200 GithubPublicationsEnvelope
Authentication
cookieSession
GET/api/v1/work-items/github/publication/preview/{id}
Preview date and duration before publication consent
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 GithubPublicationPreviewEnvelope
Authentication
cookieSession
POST/api/v1/work-items/github/publication/policy
Explicitly enable or disable verified Issues-write publication
Request body
GithubPublicationPolicyRequest (required)
Responses
204 —
Authentication
cookieSession
POST/api/v1/work-items/github/publication/consent
Opt one reviewed time link into publication
Request body
GithubPublicationConsentRequest (required)
Responses
204 —
Authentication
cookieSession
POST/api/v1/work-items/github/publication/{id}/actions
Resolve a publication conflict or retry decision
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Request body
GithubPublicationActionRequest (required)
Responses
204 —
Authentication
cookieSession
GET/api/v1/settings/work-item-connections
List the issue trackers this instance has connected
Administrators in a session only. credential_configured says whether the deployment holds the provider's credential; the credential itself is never returned.
Responses
200 WorkItemConnectionListEnvelope
Authentication
cookieSession
POST/api/v1/settings/work-item-connections
Connect an issue tracker
Administrators in a session only, recorded in the activity log. The credential is a deployment secret chosen by the server, never sent here: a provider with no secret configured is 409 credential_not_configured. Connecting a provider that was disconnected revives its row, so earlier links stay attached.
Request body
WorkItemConnectionInput (required)
Responses
201 WorkItemConnectionEnvelope
Authentication
cookieSession
POST/api/v1/settings/work-item-connections/{id}/disconnect
Disconnect an issue tracker
Administrators in a session only, recorded in the activity log. Drops the connection's credential reference and keeps the connection and every link made through it. Disconnecting one already disconnected changes nothing.
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
200 WorkItemConnectionEnvelope
Authentication
cookieSession
GET/api/v1/work-item-links
List links between time or projects and issue tracker items
Administrators see every link; everyone else sees links on their own time entries only.
Parameters
| name | in | required | type |
|---|---|---|---|
cursor | query | string | |
per_page | query | integer | |
connection_id | query | integer | |
time_entry_id | query | integer | |
project_id | query | integer | |
item_id | query | string |
Responses
200 WorkItemLinkPage
Authentication
bearerAuth or cookieSession
POST/api/v1/work-item-links
Link a time entry or project to an issue tracker item
Name exactly one of time_entry_id or project_id. A time entry links to one item per connection (409 work_item_link_exists otherwise). Administrators may link any entry or project; everyone else only their own entries, and an entry that is not theirs is 404. The item is recorded as given and is not yet checked with the tracker. A disconnected connection is 409 work_item_connection_inactive.
Request body
WorkItemLinkInput (required)
Responses
Authentication
bearerAuth or cookieSession
GET/api/v1/work-item-links/{id}
Get one work item link
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
Authentication
bearerAuth or cookieSession
DELETE/api/v1/work-item-links/{id}
Remove a work item link
Parameters
| name | in | required | type |
|---|---|---|---|
id | path | yes | integer |
Responses
204 —
Authentication
bearerAuth or cookieSession
Schemas
AcceptContractorReview
| field | type | required |
|---|---|---|
id | string | yes |
user_id | integer | yes |
month | string | yes |
currency | string | yes |
review_version | string | yes |
source_revision | string | yes |
apply_allocations | boolean | yes |
apply_credits | boolean | yes |
reason | string | yes |
AccountClosureInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
expected_policy_version | integer | yes |
review_token | string | yes |
acknowledged | boolean | yes |
AccountClosureInventoryItem
| field | type | required |
|---|---|---|
location | string | yes |
count | integer | yes |
category | time_and_worker_attribution | billing_and_payments | audit_and_security | legal_hold | yes |
AccountClosurePreview
| field | type | required |
|---|---|---|
apple_cleanup_retry_available | boolean | |
request_id | string | yes |
user_id | integer | yes |
request_version | integer | yes |
review_token | string | yes |
policy_version | integer | null | yes |
policy_snapshot | AccountRetentionPolicy | null | yes |
inventory | array of AccountClosureInventoryItem | yes |
uncovered_categories | array of string | yes |
owner_transfer_required | boolean | yes |
running_timer | boolean | yes |
closure | AccountClosureRecord | null | yes |
AccountClosurePreviewEnvelope
| field | type | required |
|---|---|---|
data | AccountClosurePreview | yes |
AccountClosureRecord
| field | type | required |
|---|---|---|
request_id | string | yes |
user_id | integer | yes |
actor_user_id | integer | yes |
closed_at | string (date-time) | yes |
policy_version | integer | yes |
policy_snapshot | AccountRetentionPolicy | yes |
inventory | array of AccountClosureInventoryItem | yes |
retained_identity | boolean | yes |
calendar_cleanup | CalendarCleanupStatus | |
apple_cleanup | AppleCleanupStatus | yes |
AccountClosureRecordEnvelope
| field | type | required |
|---|---|---|
data | AccountClosureRecord | yes |
AccountDeletionClosureDisclosure
| field | type | required |
|---|---|---|
retained_records | array of AccountDeletionRetainedDisclosure | yes |
backup_handling | string | yes |
user_notice | string | yes |
operator_contact | string | yes |
AccountDeletionDetailEnvelope
| field | type | required |
|---|---|---|
data | AccountDeletionRecord | yes |
links | Links | yes |
AccountDeletionListEnvelope
| field | type | required |
|---|---|---|
data | array of AccountDeletionRecord | yes |
links | Links | yes |
AccountDeletionRecord
| field | type | required |
|---|---|---|
calendar_cleanup | CalendarCleanupStatus | |
apple_cleanup | AppleCleanupStatus | |
id | string | yes |
user_id | integer | yes |
requested_at | string (date-time) | yes |
policy_version | integer | null | yes |
policy_snapshot | AccountRetentionPolicy | null | yes |
policy_reviewed | boolean | yes |
status | pending | in_progress | action_required | completed | yes |
version | integer | yes |
message | string | yes |
response_target_at | string | null | yes |
expected_completion_at | string | null | yes |
completed_at | string | null | yes |
completion_confirmation | string | null | yes |
notification | pending | sending | queued | failed | unavailable | yes |
notification_updated_at | string (date-time) | yes |
notification_delivery_id | integer | null | yes |
updated_at | string (date-time) | yes |
AccountDeletionRequest
| field | type | required |
|---|---|---|
user_id | integer | yes |
requested_at | string (date-time) | yes |
AccountDeletionRequestEnvelope
| field | type | required |
|---|---|---|
data | AccountDeletionRecord | AccountDeletionRequest | yes |
links | Links | yes |
status_access | AccountDeletionStatusAccess |
AccountDeletionRetainedDisclosure
| field | type | required |
|---|---|---|
category | string | yes |
reason | string | yes |
period | string | yes |
review_after_days | integer | yes |
review_due | string (date-time) | yes |
AccountDeletionStatusAccess
| field | type | required |
|---|---|---|
token | string | yes |
expires_at | string (date-time) | yes |
url | string | yes |
AccountDeletionStatusEnvelope
| field | type | required |
|---|---|---|
data | AccountDeletionRecord | null | yes |
links | Links | yes |
AccountDeletionSubmission
| field | type | required |
|---|---|---|
expected_policy_version | integer | null |
AccountDeletionTrackingEnvelope
| field | type | required |
|---|---|---|
data | AccountDeletionTrackingStatus | yes |
AccountDeletionTrackingInput
| field | type | required |
|---|---|---|
token | string | yes |
AccountDeletionTrackingStatus
| field | type | required |
|---|---|---|
calendar_cleanup | CalendarCleanupStatus | |
apple_cleanup | AppleCleanupStatus | |
request_id | string | yes |
status | pending | in_progress | action_required | completed | yes |
requested_at | string (date-time) | yes |
expected_completion_at | string | null | yes |
closed_at | string | null | yes |
completed_at | string | null | yes |
message | string | yes |
completion_confirmation | string | null | yes |
policy_version | integer | null | yes |
policy_snapshot | AccountRetentionPolicy | null | yes |
policy_reviewed | boolean | yes |
closure_disclosure | AccountDeletionClosureDisclosure | null | yes |
operator_contact | string | null | yes |
expires_at | string (date-time) | yes |
AccountDeletionUpdate
| field | type | required |
|---|---|---|
expected_version | integer | yes |
status | pending | in_progress | action_required | yes |
message | string | yes |
expected_completion_at | string | null | yes |
AccountRetentionEnvelope
| field | type | required |
|---|---|---|
data | AccountRetentionRecord | null | yes |
links | Links | yes |
AccountRetentionPolicy
| field | type | required |
|---|---|---|
frameworks | array of string | yes |
retained_records | array of AccountRetentionRule | yes |
response_target_days | integer | yes |
operator_contact | string (email) | yes |
user_notice | string | yes |
backup_handling | string | yes |
acknowledged | true | yes |
AccountRetentionPublication
| field | type | required |
|---|---|---|
expected_version | integer | yes |
policy | AccountRetentionPolicy | yes |
AccountRetentionRecord
| field | type | required |
|---|---|---|
version | integer | yes |
policy | AccountRetentionPolicy | yes |
published_at | string (date-time) | yes |
AccountRetentionRule
| field | type | required |
|---|---|---|
category | time_and_worker_attribution | billing_and_payments | audit_and_security | legal_hold | yes |
reason | string | yes |
period | string | yes |
review_after_days | integer | yes |
ActivityLog
| field | type | required |
|---|---|---|
event_id | string | yes |
event_type | string | yes |
aggregate | OutboxAggregate | yes |
actor | ActivityLogActor | null | yes |
payload | object | yes |
occurred_at | string (date-time) | yes |
available_at | string (date-time) | yes |
recorded_at | string (date-time) | yes |
ActivityLogActor
Who caused the event. type and id are what the event recorded; name is resolved when the log is read, so it is the person's current name. name is null for a system actor and for an id that no user or contact carries any more.
| field | type | required |
|---|---|---|
type | user | contact | system | yes |
id | integer | null | yes |
name | string | null | yes |
ActivityLogPage
| field | type | required |
|---|---|---|
data | array of ActivityLog | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
ActivityLogStatus
| field | type | required |
|---|---|---|
enabled | boolean | yes |
ActivityLogStatusEnvelope
| field | type | required |
|---|---|---|
data | ActivityLogStatus | yes |
links | Links | yes |
ActivityYearRolled
| field | type | required |
|---|---|---|
year | integer | yes |
rolled | boolean | yes |
ActivityYearRolledEnvelope
| field | type | required |
|---|---|---|
data | ActivityYearRolled | yes |
links | Links | yes |
AdvanceCredit
| field | type | required |
|---|---|---|
advance_item_id | string | yes |
user_id | integer | yes |
name | string | yes |
currency | string | yes |
month | string | yes |
advance_project_id | integer | null | yes |
advance_reason | string | yes |
state | string | yes |
amount_cents | integer | yes |
settled_cents | integer | yes |
settled_at | string | null | yes |
applied_cents | integer | yes |
returned_cents | integer | yes |
reserved_cents | integer | yes |
available_cents | integer | yes |
opening_cents | integer | yes |
period_settled_cents | integer | yes |
period_applied_cents | integer | yes |
period_returned_cents | integer | yes |
closing_cents | integer | yes |
applications | array of AdvanceCreditApplication | yes |
returns | array of AdvanceCreditReturn | yes |
AdvanceCreditApplication
| field | type | required |
|---|---|---|
id | string | yes |
reason | string | yes |
advance_item_id | string | yes |
user_id | integer | yes |
currency | string | yes |
month | string | yes |
amount_cents | integer | yes |
scope | month | project | entry | yes |
project_id | integer | null | yes |
entry_id | integer | null | yes |
actor_id | integer | yes |
recorded_at | string | yes |
reversed_at | string | null | yes |
reversal_reason | string | null | yes |
AdvanceCreditReport
| field | type | required |
|---|---|---|
from | string | yes |
to | string | yes |
advances | array of AdvanceCredit | yes |
AdvanceCreditReportEnvelope
| field | type | required |
|---|---|---|
data | AdvanceCreditReport | yes |
AdvanceCreditReturn
| field | type | required |
|---|---|---|
id | string | yes |
reason | string | yes |
advance_item_id | string | yes |
amount_cents | integer | yes |
reference | string | yes |
actor_id | integer | yes |
recorded_at | string | yes |
AllocatePayment
| field | type | required |
|---|---|---|
id | string | yes |
payment_kind | event | run_item | yes |
payment_id | string | yes |
user_id | integer | yes |
month | string | yes |
scope | month | project | entry | yes |
project_id | integer | null | yes |
entry_id | integer | null | yes |
seconds | integer | null | yes |
amount_cents | integer | null | yes |
reason | string | yes |
Allocation
| field | type | required |
|---|---|---|
version | integer | yes |
id | integer | yes |
user_id | integer | yes |
project_id | integer | yes |
start_date | string (date) | yes |
end_date | string (date) | yes |
planned_seconds_per_week | integer | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
AllocationEnvelope
| field | type | required |
|---|---|---|
data | Allocation | yes |
links | Links | yes |
AllocationInput
| field | type | required |
|---|---|---|
user_id | integer | yes |
project_id | integer | yes |
start_date | string (date) | yes |
end_date | string (date) | yes |
planned_seconds_per_week | integer | yes |
AllocationPage
| field | type | required |
|---|---|---|
data | array of Allocation | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
AllocationPatch
| field | type | required |
|---|---|---|
version | integer | |
start_date | string (date) | |
end_date | string (date) | |
planned_seconds_per_week | integer |
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 |
AppleCleanupStatus
{"type":"string","enum":["not_linked","pending","revoked","manual_required"]}
AppleCleanupStatusEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
AppleLifecycleProofInput
| field | type | required |
|---|---|---|
receipt | string | yes |
ApplyAdvanceCredit
| field | type | required |
|---|---|---|
id | string | yes |
reason | string | yes |
advance_item_id | string | yes |
user_id | integer | yes |
currency | string | yes |
month | string | yes |
amount_cents | integer | yes |
scope | month | project | entry | yes |
project_id | integer | null | yes |
entry_id | integer | 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 |
through | string | null |
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 |
BackupDownloadLinkEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
BackupDownloadLinkInput
| field | type | required |
|---|---|---|
run_id | integer | |
code | string |
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 |
BackupRunPage
| field | type | required |
|---|---|---|
data | array of BackupRun | yes |
links | PageLinks | yes |
page | CountedPageMetadata | 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 |
BankDeposit
| field | type | required |
|---|---|---|
id | integer | yes |
account_id | integer | yes |
account_name | string | yes |
provider | mercury | wise | yes |
provider_transaction_id | string | yes |
currency | string | yes |
posted_at | string | yes |
amount_cents | integer | yes |
memo | string | null | yes |
counterparty | string | null | yes |
state | unmatched | suggested | confirmed | rejected | yes |
version | integer | yes |
suggested_invoice | BankReviewInvoice | null | yes |
source_status | final | pending | reversed | ineligible | unknown | yes |
classification | external_credit | internal_transfer | ambiguous_credit | yes |
source_reason | string | null | yes |
verified_at | string | null | yes |
verified_by_user_id | integer | null | yes |
verification_reference | string | null | yes |
confirmation_basis | string | null | yes |
confirmation_ready | boolean | yes |
payment_id | integer | null | yes |
confirmed_invoice_id | integer | null | yes |
BankDepositAccountsEnvelope
| field | type | required |
|---|---|---|
data | array of BankFeedAccount | yes |
BankDepositAssignInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
invoice_id | integer | yes |
BankDepositConfirmInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
invoice_id | integer | yes |
expected_invoice_version | integer | yes |
confirm_overpayment | boolean | yes |
BankDepositDecisionInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
BankDepositEnvelope
| field | type | required |
|---|---|---|
data | BankDeposit | yes |
BankDepositInvoicesEnvelope
| field | type | required |
|---|---|---|
data | array of BankReviewInvoice | yes |
BankDepositListEnvelope
| field | type | required |
|---|---|---|
data | array of BankDeposit | yes |
page | integer | yes |
per_page | integer | yes |
total | integer | yes |
BankDepositVerifyInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
verification_reference | string | yes |
confirm_posted_funds | any | yes |
confirm_external_credit | any | yes |
BankFeedAccount
| field | type | required |
|---|---|---|
id | integer | yes |
provider | mercury | wise | yes |
name | string | yes |
BankFeedStatusEnvelope
| field | type | required |
|---|---|---|
data | array of object | yes |
BankFeedSyncEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
BankFeedSyncInput
{"type":"object","required":[],"properties":{},"additionalProperties":false}
BankReviewInvoice
| field | type | required |
|---|---|---|
id | integer | yes |
number | string | yes |
currency | string | yes |
due_amount_cents | integer | yes |
version | integer | yes |
state | string | 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 |
CalendarAuthorizationEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
CalendarAuthorizationInput
| field | type | required |
|---|---|---|
generation | integer | yes |
CalendarCleanupEnvelope
| field | type | required |
|---|---|---|
data | CalendarCleanupStatus | yes |
CalendarCleanupStatus
| field | type | required |
|---|---|---|
pending | integer | yes |
manual_required | integer | yes |
revoked | integer | yes |
manual_confirmed | integer | |
operator_confirmed | integer |
CalendarConnectionList
| field | type | required |
|---|---|---|
data | array of object | yes |
CalendarDisconnectInput
| field | type | required |
|---|---|---|
generation | integer | yes |
CalendarFeed
| field | type | required |
|---|---|---|
scope | self | project | team | yes |
project_id | integer | null | yes |
from_date | string | yes |
through_date | string | yes |
include_names | boolean | yes |
id | string | yes |
issued_at | string | yes |
expires_at | string | yes |
revoked_at | string | null | yes |
credential_generation | integer | yes |
CalendarFeedInput
| field | type | required |
|---|---|---|
scope | self | project | team | yes |
project_id | integer | null | yes |
from_date | string | yes |
through_date | string | yes |
include_names | boolean | yes |
expires_at | string |
CalendarFeedIssued
| field | type | required |
|---|---|---|
data | object | yes |
CalendarFeedList
| field | type | required |
|---|---|---|
data | array of CalendarFeed | yes |
CalendarManualCleanupInput
| field | type | required |
|---|---|---|
obligation_id | string | yes |
generation | integer | yes |
credential_revision | integer | yes |
confirm_removed | any | yes |
CalendarManualCleanupList
| field | type | required |
|---|---|---|
data | array of object | yes |
CalendarOperatorCleanupInput
| field | type | required |
|---|---|---|
id | string | yes |
user_id | integer | yes |
provider | google | microsoft | yes |
instance_nonce | string | yes |
generation | integer | yes |
credential_revision | integer | yes |
key_id | string | yes |
request_id | string | null | yes |
reason | disconnect | closure | reauth | restore | reset | yes |
review_instance | string | yes |
expected_status | pending | manual_required | yes |
evidence_reference | string | yes |
confirm_provider_removed | boolean | yes |
CalendarOperatorCleanupList
| field | type | required |
|---|---|---|
data | array of object | yes |
page | object | yes |
CalendarOperatorCleanupReceiptEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
CalendarProposal
| field | type | required |
|---|---|---|
id | integer | yes |
provider | google | microsoft | yes |
calendar_id | string | yes |
event_id | string | yes |
occurrence | string | yes |
title | string | yes |
starts_at | string (date-time) | yes |
ends_at | string (date-time) | yes |
status | proposed | accepted | discarded | cancelled | yes |
time_entry_id | integer | null | yes |
decided_at | string | null | yes |
source_changed_at | string | null | |
source_cancelled_at | string | null | |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
CalendarProposalAcceptInput
| field | type | required |
|---|---|---|
project_id | integer | yes |
task_id | integer | yes |
notes | string | null | |
budgeted | boolean |
CalendarProposalEnvelope
| field | type | required |
|---|---|---|
data | CalendarProposal | yes |
links | Links | yes |
CalendarProposalPage
| field | type | required |
|---|---|---|
data | array of CalendarProposal | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
CalendarRefreshInput
| field | type | required |
|---|---|---|
past_days | integer | |
future_days | integer |
CalendarRefreshResult
| field | type | required |
|---|---|---|
data | object | yes |
Capacity
| field | type | required |
|---|---|---|
week_start_day | saturday | sunday | monday | yes |
weeks | array of string | yes |
people | array of CapacityPerson | yes |
CapacityPerson
| field | type | required |
|---|---|---|
user_id | integer | yes |
first_name | string | yes |
last_name | string | yes |
weekly_capacity_seconds | integer | yes |
weeks | array of CapacityWeek | yes |
CapacityWeek
| field | type | required |
|---|---|---|
week_start | string (date) | yes |
planned_seconds | integer | yes |
time_off_seconds | integer | yes |
available_capacity_seconds | integer | yes |
tracked_seconds | integer | yes |
over_allocated | boolean | 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 |
ClientInvoiceSendingEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
ClientInvoiceSendingInput
| field | type | required |
|---|---|---|
recipients | InvoiceRecipientLists | null | |
attach_pdf | boolean | null | |
append_pdfs | boolean | null | |
attach_files | boolean | null | |
attach_journal | null | null | |
journal_formats | JournalFormats | null |
ClientRateCard
| field | type | required |
|---|---|---|
id | integer | yes |
client_id | integer | yes |
name | string | yes |
created_at | string (date-time) | yes |
versions | array of ClientRateCardVersion | yes |
ClientRateCardEnvelope
| field | type | required |
|---|---|---|
data | ClientRateCard | yes |
links | Links | yes |
ClientRateCardInput
| field | type | required |
|---|---|---|
name | string | yes |
ClientRateCardLine
| field | type | required |
|---|---|---|
task_id | integer | null | yes |
amount_cents | integer | yes |
ClientRateCardVersion
| field | type | required |
|---|---|---|
id | integer | yes |
start_date | string | null | yes |
lines | array of ClientRateCardLine | yes |
created_at | string (date-time) | yes |
ClientRateCardVersionInput
| field | type | required |
|---|---|---|
start_date | string | null | yes |
lines | array of ClientRateCardLine | 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 |
ConfirmPaymentActuals
| field | type | required |
|---|---|---|
id | string | yes |
user_id | integer | yes |
month | string | yes |
expected_version | integer | yes |
currency | string | yes |
entries | array of object | yes |
note | string | yes |
ContractorAcceptance
| field | type | required |
|---|---|---|
id | string | yes |
user_id | integer | yes |
month | string | yes |
currency | string | yes |
review_version | string | yes |
reason | string | yes |
actor_id | integer | yes |
recorded_at | string | yes |
allocation_ids | array of string | yes |
credit_application_ids | array of string | yes |
state | completed | yes |
ContractorAcceptanceEnvelope
| field | type | required |
|---|---|---|
data | ContractorAcceptance | yes |
ContractorAcceptancesEnvelope
| field | type | required |
|---|---|---|
data | array of ContractorAcceptance | yes |
ContractorAllocationProposal
| field | type | required |
|---|---|---|
payment_kind | event | run_item | yes |
payment_id | string | yes |
amount_cents | integer | yes |
scope | month | 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 |
ContractorCreditProposal
| field | type | required |
|---|---|---|
advance_item_id | string | yes |
amount_cents | integer | yes |
scope | month | yes |
ContractorCurrencyReview
| field | type | required |
|---|---|---|
currency | string | yes |
recorded_earnings_cents | integer | null | yes |
proposed_earnings_cents | integer | null | yes |
paid_cents | integer | yes |
reserved_cents | integer | yes |
available_to_pay_cents | integer | null | yes |
available_credit_cents | integer | yes |
proposed_credit_cents | integer | yes |
remaining_after_credit_cents | integer | null | yes |
invoices | array of StaffInvoice | yes |
advances | array of AdvanceCredit | yes |
allocations | array of PaymentAllocation | yes |
allocation_proposals | array of ContractorAllocationProposal | yes |
credit_proposals | array of ContractorCreditProposal | yes |
items | array of ContractorReviewItem | yes |
proposal_blocked | boolean | yes |
flags | array of string | yes |
ContractorEarningsReview
| field | type | required |
|---|---|---|
id | string | yes |
user_id | integer | yes |
currency | string | yes |
amount_cents | integer | yes |
expected_version | integer | yes |
actor_id | integer | yes |
note | string | yes |
recorded_at | string | yes |
ContractorReview
| field | type | required |
|---|---|---|
month | string | yes |
completed | boolean | yes |
credit_period | object | yes |
version | string | yes |
people | array of ContractorReviewPerson | yes |
ContractorReviewEarnings
| field | type | required |
|---|---|---|
user_id | integer | yes |
name | string | yes |
proposed_cents | integer | yes |
confirmed_cents | integer | null | yes |
status | new | converged | differs | attention | yes |
exceptions | array of object | yes |
ContractorReviewEntry
| field | type | required |
|---|---|---|
entry_id | integer | yes |
project_id | integer | yes |
project_name | string | yes |
spent_date | string | yes |
rounded_seconds | integer | yes |
cost_rate_cents | integer | null | yes |
selected_seconds | integer | yes |
ContractorReviewEnvelope
| field | type | required |
|---|---|---|
data | ContractorReview | yes |
ContractorReviewItem
| field | type | required |
|---|---|---|
id | string | yes |
run_id | string | yes |
run_name | string | yes |
purpose | earnings | advance | yes |
amount_cents | integer | yes |
state | draft | queued | creating | funding | processing | paid | failed | attention | cancelled | yes |
phase | draft | queued | processing | settled | failed | attention | cancelled | yes |
failure | string | null | yes |
attempts | integer | yes |
ContractorReviewPerson
| field | type | required |
|---|---|---|
user_id | integer | yes |
name | string | yes |
active | boolean | yes |
ledger_version | integer | null | yes |
settled_through | string | null | yes |
ledger_events | array of StaffPaymentEvent | yes |
phase | review | queued | processing | settled | failed | attention | yes |
latest_review | ContractorEarningsReview | null | yes |
earnings | ContractorReviewEarnings | null | yes |
entries | array of ContractorReviewEntry | yes |
currencies | array of ContractorCurrencyReview | yes |
source_revision | string | |
review_version | string |
CostRateBackfill
| field | type | required |
|---|---|---|
run_id | string | yes |
applied | boolean | yes |
user_id | integer | yes |
from | string (date) | yes |
to | string (date) | yes |
cost_rate_cents | integer | yes |
entry_count | integer | yes |
seconds | integer | yes |
cost_cents | integer | yes |
periods | array of CostRateBackfillPeriod | yes |
captured_entry_count | integer | yes |
running_entry_count | integer | yes |
CostRateBackfillEnvelope
| field | type | required |
|---|---|---|
data | CostRateBackfill | yes |
links | Links | yes |
CostRateBackfillInput
| field | type | required |
|---|---|---|
from | string (date) | yes |
to | string (date) | yes |
cost_rate_cents | integer | yes |
reason | string | yes |
replace_captured | boolean | |
apply | boolean |
CostRateBackfillPeriod
| field | type | required |
|---|---|---|
month | string | yes |
entry_count | integer | yes |
seconds | integer | yes |
cost_cents | integer | yes |
CountedPageMetadata
| field | type | required |
|---|---|---|
per_page | integer | yes |
next_cursor | string | null | yes |
total | integer | yes |
CreateApiTokenInput
| field | type | required |
|---|---|---|
name | string | yes |
scopes | array of string | yes |
expires_at | string | null |
CsvImportApplyCommand
| field | type | required |
|---|---|---|
preview_id | string | yes |
command_id | string (uuid) | yes |
version | integer | yes |
expected_selected_rows | integer | yes |
expected_source_seconds | integer | yes |
expected_destination_seconds | integer | yes |
acknowledge_exclusions | boolean | yes |
acknowledge_destination_difference | boolean | yes |
acknowledge_new_people | boolean | yes |
CsvImportApplyEnvelope
| field | type | required |
|---|---|---|
data | CsvImportApplyRun | yes |
CsvImportApplyRun
| field | type | required |
|---|---|---|
stage_id | string | yes |
preview_id | string | null | yes |
state | not_confirmed | queued | running | paused | partial | completed | cancelled | failed | superseded | yes |
code | string | null | yes |
command_id | string | null | yes |
command_known | boolean | yes |
pending_command | CsvImportApplyCommand | null | yes |
file_rows | integer | yes |
selected_rows | integer | yes |
excluded_rows | integer | yes |
committed_rows | integer | yes |
inserted_rows | integer | yes |
already_imported_rows | integer | yes |
created_setup | integer | yes |
source_seconds_total | integer | null | yes |
source_seconds_committed | integer | yes |
destination_seconds | integer | yes |
destination_delta_seconds | integer | yes |
deleted_imported_rows | integer | yes |
retention_deadline | string | null | yes |
retryable | boolean | yes |
allowed_actions | array of string | yes |
CsvImportCancelCommand
| field | type | required |
|---|---|---|
command_id | string (uuid) | yes |
CsvImportCandidate
| field | type | required |
|---|---|---|
id | integer | yes |
name | string | yes |
parent_id | integer | null | yes |
parent_name | string | null | yes |
is_active | boolean | yes |
selectable | boolean | yes |
currency | string | null | yes |
CsvImportCapabilities
| field | type | required |
|---|---|---|
runtime | container | worker | yes |
staging_supported | boolean | yes |
browser_ready | boolean | yes |
apply_supported | boolean | yes |
max_csv_bytes | integer | yes |
max_mapping_bytes | integer | yes |
raw_retention_hours | any | yes |
CsvImportCapabilitiesEnvelope
| field | type | required |
|---|---|---|
data | CsvImportCapabilities | yes |
CsvImportCatalogPage
| field | type | required |
|---|---|---|
items | array of any | yes |
total | integer | yes |
next_cursor | string | null | yes |
preview_id | string | null | yes |
CsvImportCatalogPageEnvelope
| field | type | required |
|---|---|---|
data | CsvImportCatalogPage | yes |
CsvImportChoices
| field | type | required |
|---|---|---|
workspace_identity | string | yes |
source_id | string | yes |
adapter_id | string | yes |
date_format | iso | yes |
exporter_zone | string | yes |
destination_interpretation | source_wall_time | yes |
currency_policy | destination_rates | yes |
excluded_lines | array of integer | yes |
mapping | object | yes |
CsvImportErrorPage
| field | type | required |
|---|---|---|
items | array of CsvImportLineError | yes |
total | integer | yes |
next_cursor | string | null | yes |
preview_id | string | null | yes |
CsvImportErrorPageEnvelope
| field | type | required |
|---|---|---|
data | CsvImportErrorPage | yes |
CsvImportLineError
| field | type | required |
|---|---|---|
line | integer | yes |
scope | file | row | yes |
excludable | boolean | yes |
kind | invalid | unsupported | warning | yes |
code | string | yes |
message | string | yes |
CsvImportMapping
| field | type | required |
|---|---|---|
workspace_identity | string | yes |
exporter_zone | string | yes |
date_format | iso | yes |
destination_interpretation | source_wall_time | yes |
currency_policy | destination_rates | yes |
excluded_lines | array of integer | yes |
mapping | object | yes |
version | integer | yes |
CsvImportMappingState
| field | type | required |
|---|---|---|
version | integer | yes |
choices | CsvImportChoices | null | yes |
preview_id | string | null | yes |
CsvImportMappingStateEnvelope
| field | type | required |
|---|---|---|
data | CsvImportMappingState | yes |
CsvImportPreview
| field | type | required |
|---|---|---|
organization_name | string | yes |
preview_id | string | yes |
run | CsvImportRun | yes |
choices | CsvImportChoices | yes |
tallies | CsvImportTallies | yes |
CsvImportPreviewEnvelope
| field | type | required |
|---|---|---|
data | CsvImportPreview | yes |
CsvImportPreviewRequest
| field | type | required |
|---|---|---|
preview_id | string |
CsvImportRun
| field | type | required |
|---|---|---|
id | string | yes |
status | uploading | staged | previewed | confirmed | completed | failed | cancelled | expired | purged | yes |
version | integer | yes |
file_sha256 | string | yes |
bytes | integer | yes |
staging_expires_at | string | yes |
retention_deadline | string | null | yes |
purge_allowed | boolean | yes |
allowed_actions | array of string | yes |
retryable | boolean | yes |
preview_id | string | null | yes |
preview_stale | boolean | yes |
source_id | string | null | yes |
tallies | CsvImportTallies | null | yes |
CsvImportRunEnvelope
| field | type | required |
|---|---|---|
data | CsvImportRun | yes |
CsvImportSourceEntity
| field | type | required |
|---|---|---|
kind | people | clients | projects | tasks | yes |
source_key | string | yes |
label | string | yes |
parent_source_key | string | null | yes |
parents | array of object | yes |
state | matched | new | rejected | excluded | yes |
selected_id | integer | null | yes |
selected_destination | CsvImportCandidate | null | yes |
ambiguous | boolean | yes |
CsvImportTallies
| field | type | required |
|---|---|---|
file_rows | integer | yes |
selected_rows | integer | yes |
new_rows | integer | yes |
already_imported_rows | integer | yes |
rejected_row_count | integer | yes |
diagnostic_count | integer | yes |
file_error_count | integer | yes |
invalid_rows | integer | yes |
unsupported_rows | integer | yes |
source_seconds | integer | yes |
destination_seconds | integer | yes |
destination_delta_seconds | integer | yes |
deleted_imported_rows | integer | yes |
organization_currency | string | yes |
unpriced | any | yes |
ignored_columns | array of string | yes |
ignored_column_count | integer | yes |
warning_count | integer | yes |
people | object | yes |
clients | object | yes |
projects | object | yes |
tasks | object | yes |
assignments | object | yes |
CsvImportUploadBytes
{"type":"string","format":"binary"}
DeelPaymentStatusMonth
| field | type | required |
|---|---|---|
month | string | yes |
DeelPaymentStatusRefreshEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
DeelStageCommand
| field | type | required |
|---|---|---|
from | string | yes |
to | string | yes |
user_ids | array of integer | yes |
command_id | string (uuid) | yes |
preview_fingerprint | string | yes |
DeelStagePerson
| field | type | required |
|---|---|---|
user_id | integer | yes |
contract_id | string | null | yes |
seconds | integer | yes |
entries | integer | yes |
DeelStagePreview
| field | type | required |
|---|---|---|
status | any | yes |
from | string | yes |
to | string | yes |
user_ids | array of integer | yes |
preview_fingerprint | string | yes |
entry_ids | array of integer | yes |
seconds | integer | yes |
timesheets | integer | yes |
already_staged | integer | yes |
already_staged_entry_ids | array of integer | yes |
people | array of DeelStagePerson | yes |
conflict_entry_ids | array of integer | yes |
unsyncable_entry_ids | array of integer | yes |
zero_duration_entry_ids | array of integer | yes |
unmatched | array of DeelStageUnmatched | yes |
unresolved_entry_ids | array of integer | yes |
DeelStagePreviewEnvelope
| field | type | required |
|---|---|---|
data | DeelStagePreview | yes |
DeelStageResult
| field | type | required |
|---|---|---|
status | staged | attention | running | stale | busy | yes |
command_id | string | yes |
run_id | integer | null | yes |
timesheets_staged | integer | yes |
entries_staged | integer | yes |
already_staged | integer | yes |
unresolved_entry_ids | array of integer | yes |
code | string | null | yes |
DeelStageResultEnvelope
| field | type | required |
|---|---|---|
data | DeelStageResult | yes |
DeelStageSelection
| field | type | required |
|---|---|---|
from | string | yes |
to | string | yes |
user_ids | array of integer | yes |
DeelStageStatusEnvelope
| field | type | required |
|---|---|---|
data | DeelStageResult | null | yes |
DeelStageUnmatched
| field | type | required |
|---|---|---|
user_id | integer | yes |
reason | string | yes |
DeelStagingStatusEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
DeelSyncPreview
| field | type | required |
|---|---|---|
status | ready | yes |
window | object | yes |
entry_ids | array of integer | yes |
timesheets | integer | yes |
already_transferred | integer | yes |
conflicts | array of any | yes |
unsyncable | array of any | yes |
unmatched | array of any | yes |
DeelSyncRun
| field | type | required |
|---|---|---|
id | integer | yes |
started_at | string | yes |
finished_at | string | null | yes |
outcome | running | completed | failed | yes |
timesheets_submitted | integer | yes |
entries_transferred | integer | yes |
detail | null | null | yes |
DeelSyncRunCommand
| field | type | required |
|---|---|---|
from | string | yes |
to | string | yes |
entry_ids | array of integer | yes |
DeelSyncRunResult
| field | type | required |
|---|---|---|
status | completed | failed | yes |
run_id | integer | yes |
timesheets_submitted | integer | yes |
entries_transferred | integer | yes |
failed | array of any | yes |
reconciliation | null | null | yes |
error | string | null | yes |
DeelSyncSettingsCommand
| field | type | required |
|---|---|---|
mode | manual | automatic | yes |
run_time | string | yes |
DeelSyncStatus
| field | type | required |
|---|---|---|
configured | boolean | yes |
reason | string | null | yes |
mode | manual | automatic | yes |
run_time | string | yes |
updated_at | string | yes |
updated_by_user_id | integer | null | yes |
runs | array of DeelSyncRun | yes |
DeelSyncWindow
| field | type | required |
|---|---|---|
from | string | yes |
to | string | yes |
DeletionCompletionEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
DeletionCompletionInput
| field | type | required |
|---|---|---|
apple_historical_manual_verified | boolean | |
expected_request_version | integer | yes |
expected_reviews | object | yes |
acknowledged | boolean | yes |
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 |
DetailedTimeFacet
| field | type | required |
|---|---|---|
id | integer | yes |
name | string | yes |
DetailedTimeFacets
| field | type | required |
|---|---|---|
people | array of DetailedTimeFacet | yes |
tasks | array of DetailedTimeFacet | yes |
roles | array of DetailedTimeFacet | yes |
tags | array of DetailedTimeFacet | 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 |
facets | DetailedTimeFacets | 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 | |
invoice_number | string | null | |
notes | string | null | |
project_active | boolean |
EffectiveClientRateCard
| field | type | required |
|---|---|---|
client_id | integer | yes |
supplied_by_client_id | integer | yes |
depth | integer | yes |
card_id | integer | yes |
card_name | string | yes |
version_start_date | string | null | yes |
task_id | integer | null | yes |
amount_cents | integer | yes |
EffectiveClientRateCardEnvelope
| field | type | required |
|---|---|---|
data | EffectiveClientRateCard | yes |
links | Links | yes |
EffectiveTimeRounding
The rule an entry on a project is saved under, and whose it is.
| field | type | required |
|---|---|---|
mode | exact | up | down | nearest | yes |
minutes | 6 | 10 | 15 | 20 | 30 | 60 | yes |
source | organization | project | yes |
ElevatedInvoiceTimeUnlink
| field | type | required |
|---|---|---|
invoice_id | integer | yes |
command_id | string | yes |
elevation_id | string | yes |
released_entry_ids | array of integer | yes |
recorded_at | string (date-time) | yes |
replayed | boolean | yes |
ElevatedInvoiceTimeUnlinkEnvelope
| field | type | required |
|---|---|---|
data | ElevatedInvoiceTimeUnlink | yes |
ElevatedInvoiceTimeUnlinkInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
entry_ids | array of integer | yes |
confirmed | boolean | yes |
EmailHealth
| field | type | required |
|---|---|---|
reputation | EmailReputationSnapshot | yes |
identities | array of EmailIdentityReputation | yes |
EmailHealthEnvelope
| field | type | required |
|---|---|---|
data | EmailHealth | yes |
links | Links | yes |
EmailIdentityReputation
| field | type | required |
|---|---|---|
sender | string | yes |
sent | integer | yes |
bounced | integer | yes |
complained | integer | yes |
failed | integer | yes |
bounce_rate_ppm | integer | yes |
complaint_rate_ppm | integer | 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 |
cc | 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 |
viewed_at | string | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
EmailLogPage
| field | type | required |
|---|---|---|
data | array of EmailLog | yes |
links | PageLinks | yes |
page | CountedPageMetadata | 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 |
EmailSuppression
| field | type | required |
|---|---|---|
id | integer | yes |
address | string (email) | yes |
reason | bounce | complaint | yes |
first_seen_at | string (date-time) | yes |
last_seen_at | string (date-time) | yes |
event_count | integer | yes |
EmailSuppressionLift
| field | type | required |
|---|---|---|
id | integer | yes |
address | string (email) | yes |
through_event_id | integer | yes |
actor_user_id | integer | yes |
note | string | yes |
complaint_acknowledged | boolean | yes |
lifted_at | string (date-time) | yes |
EmailSuppressionLiftEnvelope
| field | type | required |
|---|---|---|
data | EmailSuppressionLift | yes |
links | Links | yes |
EmailSuppressionLiftInput
| field | type | required |
|---|---|---|
note | string | yes |
confirmation | string |
EmailSuppressionsPage
| field | type | required |
|---|---|---|
data | array of EmailSuppression | yes |
links | PageLinks | yes |
page | PageMetadata | 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 |
EmptyObject
{"type":"object","additionalProperties":false,"properties":{}}
ErrorDetail
| field | type | required |
|---|---|---|
currentVersion | integer | |
current | any | |
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 |
expires_on | string | null | yes |
effective_expires_on | string | null | yes |
line_items | array of EstimateLine | yes |
EstimateContent
| field | type | required |
|---|---|---|
subject | string | null | yes |
notes | string | null | yes |
currency | string | yes |
tax_rate_ppm | integer | null | yes |
tax2_rate_ppm | integer | null | yes |
discount_rate_ppm | integer | null | yes |
lines | array of EstimateContentLine | yes |
EstimateContentLine
| field | type | required |
|---|---|---|
kind | string | yes |
description | string | null | yes |
quantity | number | yes |
unit_price_cents | integer | yes |
taxed | boolean | yes |
taxed2 | boolean | 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 |
EstimateDraftEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
EstimateDraftInput
| field | type | required |
|---|---|---|
client_id | integer | yes |
number | string | yes |
issue_date | string (date) | yes |
content | EstimateContent | yes |
template_id | string | null | |
template_version | integer | null |
EstimateExpiryInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
expires_on | string | null | 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 |
contact_id | integer | null | yes |
content_hash | string | null | yes |
estimate_version | integer | 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 |
EstimateTemplate
| field | type | required |
|---|---|---|
id | string | yes |
name | string | yes |
version | integer | yes |
archived | boolean | yes |
content | EstimateContent | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
EstimateTemplateEnvelope
| field | type | required |
|---|---|---|
data | EstimateTemplate | yes |
links | Links | yes |
EstimateTemplateInput
| field | type | required |
|---|---|---|
name | string | yes |
content | EstimateContent | yes |
EstimateTemplateListEnvelope
| field | type | required |
|---|---|---|
data | array of EstimateTemplate | yes |
truncated | boolean | yes |
EstimateTemplateUpdateInput
| field | type | required |
|---|---|---|
name | string | yes |
content | EstimateContent | yes |
expected_version | integer | yes |
archived | boolean |
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 |
GithubPublicationActionRequest
| field | type | required |
|---|---|---|
expected_version | integer | yes |
action | retry | adopt | restore | unlink | yes |
confirm | boolean | yes |
command_id | string (uuid) | yes |
GithubPublicationConsentRequest
| field | type | required |
|---|---|---|
link_id | integer | yes |
source_version | string | yes |
command_id | string (uuid) | yes |
GithubPublicationPolicyRequest
| field | type | required |
|---|---|---|
connection_id | string | yes |
expected_generation | integer | yes |
enabled | boolean | yes |
confirm_permission | boolean | yes |
command_id | string (uuid) | yes |
GithubPublicationPreviewEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
GithubPublicationsEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
GithubReaderConnection
| field | type | required |
|---|---|---|
id | string | yes |
generation | integer | yes |
installation_id | string | yes |
state | active | disconnecting | disconnected | revoked | yes |
deferred_until | integer | null | yes |
failure_codes | array of string | yes |
resources | array of GithubReaderResource | yes |
GithubReaderDisconnectEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
GithubReaderDisconnectRequest
| field | type | required |
|---|---|---|
command_id | string (uuid) | yes |
expected_generation | integer | yes |
connection_id | string | yes |
GithubReaderInstallationsEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
GithubReaderMapEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
GithubReaderMapRequest
| field | type | required |
|---|---|---|
command_id | string (uuid) | yes |
expected_generation | integer | yes |
installation_id | string | yes |
repository_id | string | yes |
project_id | integer | yes |
task_id | integer | yes |
GithubReaderMetadataEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
GithubReaderReconcileRequest
{"type":"object","properties":{},"required":[],"additionalProperties":false}
GithubReaderRepositoriesEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
GithubReaderResource
| field | type | required |
|---|---|---|
repository_id | string | yes |
full_name | string | null | yes |
project_id | integer | null | yes |
task_id | integer | null | yes |
state | active | renamed | transferred | deleted | access_lost | yes |
checkpoint_status | idle | running | complete | yes |
attempts | integer | yes |
next_retry_at | integer | yes |
failure_code | string | null | yes |
items_visible | integer | yes |
items_unavailable | integer | yes |
GithubReaderSetupEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
GithubReaderSetupRequest
| field | type | required |
|---|---|---|
organization | string |
GithubReaderStatusEnvelope
| field | type | required |
|---|---|---|
data | object | 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 |
InvoiceBandClaim
| field | type | required |
|---|---|---|
claimed_entry_count | integer | yes |
claimed_seconds | integer | yes |
billed_entry_count | integer | yes |
billed_seconds | integer | 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 |
InvoiceDefaults
| field | type | required |
|---|---|---|
company_name | string | yes |
company_address | string | null | yes |
notes | string | null | yes |
subject | string | null | yes |
estimate_validity_days | integer | null | yes |
view_receipts | boolean | yes |
InvoiceDefaultsEnvelope
| field | type | required |
|---|---|---|
data | InvoiceDefaults | yes |
links | Links | yes |
InvoiceDefaultsInput
| field | type | required |
|---|---|---|
company_name | string | |
company_address | string | null | |
notes | string | null | |
subject | string | null | |
estimate_validity_days | integer | null | |
view_receipts | boolean |
InvoiceDocumentPreferenceEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
InvoiceDocumentPreferenceInput
| field | type | required |
|---|---|---|
attach_pdf | boolean | null | |
attach_files | boolean | null | |
append_pdfs | boolean | null | |
attach_journal | null | null | |
journal_formats | JournalFormats | null |
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 |
InvoiceElevationChallenge
| field | type | required |
|---|---|---|
status | string | yes |
challenge_token | string | yes |
expires_at | string (date-time) | yes |
methods | array of string | yes |
InvoiceElevationChallengeEnvelope
| field | type | required |
|---|---|---|
data | InvoiceElevationChallenge | yes |
InvoiceElevationEmailInput
| field | type | required |
|---|---|---|
challenge_token | string | yes |
InvoiceElevationInput
| field | type | required |
|---|---|---|
invoice_id | integer | yes |
email | string (email) | yes |
password | string | yes |
InvoiceElevationIssued
| field | type | required |
|---|---|---|
status | string | yes |
credential | string | yes |
id | string | yes |
invoice_id | integer | yes |
expires_at | string (date-time) | yes |
scope | string | yes |
InvoiceElevationIssuedEnvelope
| field | type | required |
|---|---|---|
data | InvoiceElevationIssued | yes |
InvoiceElevationStartEnvelope
| field | type | required |
|---|---|---|
data | InvoiceElevationIssued | InvoiceElevationChallenge | yes |
InvoiceElevationVerifyInput
| field | type | required |
|---|---|---|
challenge_token | string | yes |
code | string | yes |
InvoiceEmailDefaultsEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
InvoiceEmailDeliveryInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
recipients | array of InvoiceRecipient | yes |
cc | array of InvoiceRecipient | |
subject | string | |
message | string | |
send_me_a_copy | boolean | |
sender_identity_id | integer | |
template_version | integer | |
confirmed | true | yes |
InvoiceEmailPreviewAttachment
| field | type | required |
|---|---|---|
kind | invoice | journal | file | yes |
filename | string | yes |
content_type | string | yes |
byte_size | integer | yes |
appended | array of string | yes |
not_appended | string | null | yes |
InvoiceEmailPreviewEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
links | object | yes |
InvoiceEmailPreviewInput
| field | type | required |
|---|---|---|
expected_version | integer | |
recipients | array of InvoiceRecipient | yes |
cc | array of InvoiceRecipient | |
subject | string | |
message | string | |
send_me_a_copy | boolean | |
sender_identity_id | integer | |
template_version | integer | |
attach_pdf | boolean | |
attach_files | boolean | |
append_pdfs | boolean | |
attach_journal | any | |
journal_formats | JournalFormats |
InvoiceEmailPreviewSentEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
InvoiceGenerationEnvelope
| field | type | required |
|---|---|---|
data | Invoice | yes |
band | InvoiceBandClaim | |
links | Links | yes |
InvoiceGenerationInput
{"oneOf":[{"type":"object","required":["client_id","to","project_ids","time_summary_type","expense_summary_type"],"properties":{"kind":{"const":"tracked"},"client_id":{"type":"integer","minimum":1},"f
InvoiceHoursReconciliationEnvelope
| field | type | required |
|---|---|---|
data | object | 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 |
InvoiceLineTimeReleaseEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
InvoiceLineTimeReleaseInput
| field | type | required |
|---|---|---|
command_id | string | yes |
line_id | integer | yes |
expected_version | integer | yes |
hours_version | string | yes |
entry_ids | array of integer | yes |
confirmed | true | yes |
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 |
cc | 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":
InvoiceProviderAlert
| field | type | required |
|---|---|---|
id | string | yes |
event_type | string | yes |
kind | refund | dispute | yes |
amount_cents | integer | yes |
currency | string | yes |
provider_status | string | yes |
occurred_at | string | yes |
reviewed_at | string | null | yes |
reviewed_by | integer | null | yes |
InvoiceProviderAlertEnvelope
| field | type | required |
|---|---|---|
data | InvoiceProviderAlert | yes |
InvoiceProviderAlertListEnvelope
| field | type | required |
|---|---|---|
data | array of InvoiceProviderAlert | yes |
InvoiceQuickBooksEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
InvoiceRecipient
| field | type | required |
|---|---|---|
name | string | yes |
email | string | yes |
InvoiceRecipientLists
| field | type | required |
|---|---|---|
to | array of InvoiceRecipient | yes |
cc | array of InvoiceRecipient | yes |
InvoiceReminderPolicy
| field | type | required |
|---|---|---|
first_after_days | integer | yes |
every_days | integer | yes |
InvoiceReminderPreferenceEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
InvoiceReminderPreferenceInput
| field | type | required |
|---|---|---|
reminders | boolean | null | 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 |
JournalFormats
{"type":"array","items":{"type":"string","enum":["pdf","csv","xlsx"]},"minItems":1,"maxItems":3,"uniqueItems":true}
Links
| field | type | required |
|---|---|---|
self | string | yes |
MigrationLoadStatus
| field | type | required |
|---|---|---|
id | string (uuid) | yes |
status | ready | queued | running | completed | failed | cancelled | yes |
snapshot_sha256 | string | yes |
source_rows | integer | yes |
resource | string | null | yes |
rows_done | integer | yes |
sequence | integer | yes |
attempts | integer | yes |
error_code | string | null | yes |
created_at | string (date-time) | yes |
started_at | string | null | yes |
completed_at | string | null | yes |
source_cleaned_at | string | null | yes |
updated_at | string (date-time) | yes |
MigrationLoadStatusEnvelope
| field | type | required |
|---|---|---|
data | MigrationLoadStatus | yes |
links | Links | 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 | activity_log | 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 |
MyPayments
| field | type | required |
|---|---|---|
month | string | yes |
hours_seconds | integer | yes |
status | pending_review | in_progress | pending | partial | paid | settled | yes |
owed | object | null | yes |
paid_cents | integer | yes |
balance_cents | integer | null | yes |
payments | array of object | yes |
upcoming | array of object | yes |
MyPaymentsEnvelope
| field | type | required |
|---|---|---|
data | MyPayments | yes |
NativeAppleCapabilities
| field | type | required |
|---|---|---|
available | boolean | yes |
lifecycle_version | integer | yes |
NativeAppleSignInEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
NativeAppleSignInInput
| field | type | required |
|---|---|---|
identityToken | string | yes |
bindingReceipt | string | yes |
fullName | object |
NotificationSettingsEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
NotificationSettingsInput
| field | type | required |
|---|---|---|
budget_alerts_include_admins | boolean | |
submission_reminder | SubmissionReminderSchedule | null |
OffsiteBackupCheckEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
OffsiteBackupRun
| field | type | required |
|---|---|---|
id | string | yes |
backup_run_id | integer | yes |
status | pending | running | completed | failed | yes |
started_at | string (date-time) | yes |
completed_at | string | null | yes |
uploaded_objects | integer | yes |
total_objects | integer | yes |
error_message | string | null | yes |
OffsiteBackupStatus
| field | type | required |
|---|---|---|
configured | boolean | yes |
state | disabled | misconfigured | waiting | running | completed | failed | yes |
destination | string | null | yes |
last_completed | OffsiteBackupRun | null | yes |
latest | OffsiteBackupRun | null | yes |
error | object | null | yes |
OrganizationHoliday
| field | type | required |
|---|---|---|
id | integer | yes |
date | string (date) | yes |
name | string | yes |
version | integer | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
OrganizationHolidayDeleteInput
| field | type | required |
|---|---|---|
version | integer | yes |
OrganizationHolidayEnvelope
| field | type | required |
|---|---|---|
data | OrganizationHoliday | yes |
links | object | yes |
OrganizationHolidayInput
| field | type | required |
|---|---|---|
date | string (date) | yes |
name | string | yes |
OrganizationHolidayPage
| field | type | required |
|---|---|---|
data | array of OrganizationHoliday | yes |
links | object | yes |
page | object | yes |
OrganizationHolidayUpdateInput
| field | type | required |
|---|---|---|
date | string (date) | yes |
name | string | yes |
version | integer | yes |
OrganizationInvoiceDocumentsEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
OrganizationInvoiceDocumentsInput
| field | type | required |
|---|---|---|
attach_pdf | boolean | |
attach_files | boolean | |
append_pdfs | boolean | |
attach_journal | any | |
journal_formats | JournalFormats |
OrganizationInvoiceRemindersEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
OrganizationInvoiceRemindersInput
| field | type | required |
|---|---|---|
reminder_policy | ReminderPolicy | null | yes |
OrganizationInvoiceSendingEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
OrganizationInvoiceSendingInput
| field | type | required |
|---|---|---|
always_cc | array of InvoiceRecipient | 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 | PageLinks | yes |
page | CountedPageMetadata | 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 |
PaymentActualsEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
PaymentAllocation
| field | type | required |
|---|---|---|
id | string | yes |
payment_kind | event | run_item | yes |
payment_id | string | yes |
user_id | integer | yes |
month | string | yes |
currency | string | yes |
scope | month | project | entry | yes |
project_id | integer | null | yes |
project_name | string | null | yes |
entry_id | integer | null | yes |
seconds | integer | null | yes |
rate_cents | integer | null | yes |
amount_cents | integer | yes |
state | applied | reserved | released | reversed | yes |
reason | string | yes |
actor_id | integer | yes |
recorded_at | string | yes |
PaymentAllocationEntry
| field | type | required |
|---|---|---|
entry_id | integer | yes |
spent_date | string | yes |
selected_seconds | integer | yes |
rate_cents | integer | null | yes |
reviewed_rounded_seconds | integer | yes |
current_rounded_seconds | integer | null | yes |
current_rate_cents | integer | null | yes |
earned_cents | integer | yes |
applied_cents | integer | yes |
reserved_cents | integer | yes |
applied_seconds | integer | yes |
reserved_seconds | integer | yes |
remaining_cents | integer | yes |
remaining_seconds | integer | yes |
source_changed | boolean | yes |
over_allocated | boolean | yes |
PaymentAllocationPerson
| field | type | required |
|---|---|---|
user_id | integer | yes |
name | string | yes |
currency | string | null | yes |
earned_cents | integer | yes |
paid_cents | integer | yes |
reserved_cents | integer | yes |
allocated_applied_cents | integer | yes |
allocated_reserved_cents | integer | yes |
remaining_cents | integer | yes |
projects | array of PaymentAllocationProject | yes |
unallocated_payments | array of UnallocatedPayment | yes |
allocations | array of PaymentAllocation | yes |
PaymentAllocationPreview
| field | type | required |
|---|---|---|
scope | month | project | entry | yes |
currency | string | yes |
seconds | integer | null | yes |
rate_cents | integer | null | yes |
amount_cents | integer | yes |
payment_cents | integer | yes |
payment_allocated_cents | integer | yes |
payment_remaining_cents | integer | yes |
earning_cents | integer | yes |
earning_allocated_cents | integer | yes |
earning_remaining_cents | integer | yes |
earning_remaining_seconds | integer | null | yes |
PaymentAllocationPreviewEnvelope
| field | type | required |
|---|---|---|
data | PaymentAllocationPreview | yes |
PaymentAllocationProject
| field | type | required |
|---|---|---|
project_id | integer | yes |
project_name | string | yes |
earned_cents | integer | yes |
applied_cents | integer | yes |
reserved_cents | integer | yes |
remaining_cents | integer | yes |
entries | array of PaymentAllocationEntry | yes |
PaymentAllocationReport
| field | type | required |
|---|---|---|
month | string | yes |
people | array of PaymentAllocationPerson | yes |
PaymentAllocationReportEnvelope
| field | type | required |
|---|---|---|
data | PaymentAllocationReport | yes |
PaymentDestination
| field | type | required |
|---|---|---|
id | integer | yes |
external_id | string | yes |
kind | account | contact | yes |
PaymentItem
| field | type | required |
|---|---|---|
user_id | integer | yes |
month | string | yes |
amount_cents | integer | yes |
expected_version | integer | yes |
purpose | earnings | advance | yes |
advance_project_id | integer | null | yes |
advance_reason | string | null | yes |
id | string | yes |
run_id | string | yes |
name | string | yes |
currency | string | yes |
destination | PaymentDestination | yes |
quote | PaymentQuote | yes |
execution_quote | PaymentQuote | null | yes |
max_source_cents | integer | yes |
state | draft | queued | creating | funding | processing | paid | failed | attention | cancelled | yes |
transfer_id | string | null | yes |
provider_status | string | null | yes |
failure | string | null | yes |
attempts | integer | yes |
next_attempt_at | string | yes |
updated_at | string | yes |
version | integer | yes |
lease_token | string | null | yes |
lease_until | string | null | yes |
PaymentQuote
| field | type | required |
|---|---|---|
id | string | yes |
profile_id | string | yes |
recipient_id | string | yes |
recipient_name | string | yes |
source_currency | string | yes |
target_currency | string | yes |
target_cents | integer | yes |
source_cents | integer | yes |
fee_cents | integer | yes |
rate | number | yes |
expires_at | string | yes |
estimated_arrival | string | null | 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 |
PaymentReconciliationEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
PaymentRun
| field | type | required |
|---|---|---|
id | string | yes |
name | string | yes |
source_currency | string | yes |
scheduled_at | string | yes |
timezone | string | yes |
state | draft | approved | cancelled | yes |
actor_id | integer | yes |
approved_by | integer | null | yes |
created_at | string | yes |
approved_at | string | null | yes |
request_id | string | yes |
items | array of PaymentItem | yes |
PaymentRunApproval
| field | type | required |
|---|---|---|
limits | array of object | yes |
PaymentRunCommand
| field | type | required |
|---|---|---|
id | string | yes |
name | string | yes |
source_currency | string | yes |
scheduled_at | string | yes |
timezone | string | yes |
items | array of PaymentSelection | yes |
PaymentRunEnvelope
| field | type | required |
|---|---|---|
data | PaymentRun | yes |
PaymentRunReport
| field | type | required |
|---|---|---|
from | string | yes |
to | string | yes |
ledgers | array of StaffPaymentReport | yes |
runs | array of PaymentRun | yes |
PaymentRunReportEnvelope
| field | type | required |
|---|---|---|
data | PaymentRunReport | yes |
PaymentSelection
| field | type | required |
|---|---|---|
user_id | integer | yes |
month | string | yes |
amount_cents | integer | yes |
expected_version | integer | yes |
purpose | earnings | advance | |
currency | string | |
advance_project_id | integer | null | |
advance_reason | string | null |
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 |
PayoutPreference
| field | type | required |
|---|---|---|
user_id | integer | yes |
provider | string | null | yes |
effective_provider | deel | wise | yes |
organization_default | deel | wise | yes |
version | integer | yes |
set_by | string | null | yes |
linked_providers | array of string | yes |
PayoutPreferenceEnvelope
| field | type | required |
|---|---|---|
data | PayoutPreference | yes |
PayoutPreferenceInput
| field | type | required |
|---|---|---|
provider | string | null | yes |
expected_version | integer | yes |
PayoutPreferenceRosterEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
PayoutProviderListEnvelope
| field | type | required |
|---|---|---|
data | array of PayoutProviderSetting | yes |
PayoutProviderSetting
| field | type | required |
|---|---|---|
provider | deel | wise | yes |
enabled | boolean | yes |
PayoutProviderSettingInput
| field | type | required |
|---|---|---|
enabled | boolean | yes |
PlaceholderAllocation
| field | type | required |
|---|---|---|
id | integer | yes |
placeholder_id | integer | yes |
name | string | yes |
project_id | integer | yes |
project_name | string | yes |
start_date | string (date) | yes |
end_date | string (date) | yes |
planned_seconds_per_week | integer | yes |
state | open | assigned | archived | yes |
version | integer | yes |
assigned_allocation_id | integer | null | yes |
PlaceholderAllocationEnvelope
| field | type | required |
|---|---|---|
data | PlaceholderAllocation | yes |
PlaceholderAllocationInput
| field | type | required |
|---|---|---|
placeholder_id | integer | yes |
project_id | integer | yes |
start_date | string (date) | yes |
end_date | string (date) | yes |
planned_seconds_per_week | integer | yes |
PlaceholderAllocationPage
| field | type | required |
|---|---|---|
data | array of PlaceholderAllocation | yes |
links | object | yes |
page | object | yes |
PlaceholderAllocationUpdateInput
| field | type | required |
|---|---|---|
version | integer | yes |
start_date | string (date) | |
end_date | string (date) | |
planned_seconds_per_week | integer |
PlaceholderAssignment
| field | type | required |
|---|---|---|
allocation | object | yes |
placeholder | PlaceholderAllocation | yes |
warnings | array of object | yes |
prerequisites | array of object | yes |
PlaceholderAssignmentEnvelope
| field | type | required |
|---|---|---|
data | PlaceholderAssignment | yes |
PlaceholderAssignmentInput
| field | type | required |
|---|---|---|
version | integer | yes |
user_id | integer | yes |
idempotency_key | string | yes |
PlanningPlaceholder
| field | type | required |
|---|---|---|
id | integer | yes |
name | string | yes |
is_active | boolean | yes |
version | integer | yes |
PlanningPlaceholderEnvelope
| field | type | required |
|---|---|---|
data | PlanningPlaceholder | yes |
PlanningPlaceholderInput
| field | type | required |
|---|---|---|
name | string | yes |
PlanningPlaceholderPage
| field | type | required |
|---|---|---|
data | array of PlanningPlaceholder | yes |
links | object | yes |
page | object | yes |
PlanningPlaceholderUpdateInput
| field | type | required |
|---|---|---|
name | string | yes |
version | integer | yes |
PlanningRevisionInput
| field | type | required |
|---|---|---|
version | integer |
PlanningVersionInput
| field | type | required |
|---|---|---|
version | integer | yes |
Profile
| field | type | required |
|---|---|---|
user_id | integer | yes |
first_name | string | |
last_name | string | |
email | string | null | |
timezone | string | yes |
effective_timezone | string | |
invoice_copy_to_self | boolean |
ProfileNotificationEnvelope
| field | type | required |
|---|---|---|
data | TeamNotificationPreference | yes |
ProfileNotificationInput
| field | type | required |
|---|---|---|
daily_reminder_enabled | boolean | yes |
reminder_time | string | null | yes |
reminder_days | array of string | yes |
channels | TeamNotificationChannelsInput | yes |
include_in_team_reminders | boolean | yes |
weekly_digest | boolean | yes |
notify_project_deleted | false | yes |
ProfilePatch
| field | type | required |
|---|---|---|
timezone | string | |
invoice_copy_to_self | boolean |
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 |
ProjectMissingRates
| field | type | required |
|---|---|---|
project_id | integer | yes |
hourly_rate_cents | integer | yes |
currency | string | yes |
entry_count | integer | yes |
seconds | integer | yes |
earliest_date | string | yes |
latest_date | string | yes |
fingerprint | string | yes |
applied_entries | integer | yes |
ProjectMissingRatesEnvelope
| field | type | required |
|---|---|---|
data | ProjectMissingRates | yes |
ProjectMissingRatesInput
| field | type | required |
|---|---|---|
fingerprint | string |
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 |
QuickBooksReconciliationEnvelope
| field | type | required |
|---|---|---|
data | object | 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"
RecurringAttachmentThroughInput
| field | type | required |
|---|---|---|
through | string | null | yes |
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 |
purchase_order | string | 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 | |
purchase_order | string | 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 |
ResourceCalendar
| field | type | required |
|---|---|---|
context | ResourceCalendarContext | yes |
view | project | team | yes |
revision | string | yes |
week_starts | array of string | yes |
people | array of ResourceCalendarPerson | yes |
unassigned | array of ResourceCalendarUnassigned | yes |
unassigned_truncated | boolean | yes |
has_other_scope | boolean | yes |
ResourceCalendarAllocation
| field | type | required |
|---|---|---|
id | integer | yes |
version | integer | yes |
user_id | integer | yes |
project_id | integer | yes |
project_name | string | yes |
start_date | string (date) | yes |
end_date | string (date) | yes |
planned_seconds_per_week | integer | yes |
ResourceCalendarAllocationPage
| field | type | required |
|---|---|---|
data | array of ResourceCalendarAllocation | yes |
links | object | yes |
page | object | yes |
ResourceCalendarContext
| field | type | required |
|---|---|---|
time_zone | string | yes |
week_start_day | saturday | sunday | monday | yes |
today | string (date) | yes |
current_week_start | string (date) | yes |
ResourceCalendarContextEnvelope
| field | type | required |
|---|---|---|
data | ResourceCalendarContext | yes |
links | object | yes |
ResourceCalendarEnvelope
| field | type | required |
|---|---|---|
data | ResourceCalendar | yes |
links | object | yes |
page | object | yes |
ResourceCalendarPerson
| field | type | required |
|---|---|---|
person_id | integer | yes |
name | string | yes |
weeks | array of ResourceCalendarWeek | yes |
ResourceCalendarProject
| field | type | required |
|---|---|---|
id | integer | yes |
name | string | yes |
is_active | boolean | yes |
ResourceCalendarProjectHours
| field | type | required |
|---|---|---|
project_id | integer | yes |
planned_seconds | integer | yes |
ResourceCalendarProjectPage
| field | type | required |
|---|---|---|
data | array of ResourceCalendarProject | yes |
links | object | yes |
page | object | yes |
ResourceCalendarUnassigned
| field | type | required |
|---|---|---|
week_start | string (date) | yes |
placeholder_id | integer | yes |
name | string | yes |
project_id | integer | yes |
planned_seconds | integer | yes |
ResourceCalendarWeek
| field | type | required |
|---|---|---|
week_start | string (date) | yes |
planned_seconds | integer | yes |
available_seconds | integer | yes |
tracked_seconds | integer | yes |
person_planned_seconds | integer | yes |
person_other_scope_planned_seconds | integer | yes |
over_allocated | boolean | yes |
projects | array of ResourceCalendarProjectHours | yes |
other_scope_planned_seconds | integer | yes |
other_scope_tracked_seconds | integer | yes |
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 |
RetentionReview
| field | type | required |
|---|---|---|
request_id | string | yes |
area | string | yes |
kind | retained_category | downstream | yes |
original_reason | string | yes |
original_period | string | yes |
decision | pending | retain | removed | not_applicable | failed | release_hold | yes |
basis | string | yes |
release_condition | string | yes |
evidence | string | yes |
next_review_at | string | null | yes |
hold_active | boolean | yes |
version | integer | yes |
reviewed_at | string | null | yes |
actor_user_id | integer | null | yes |
RetentionReviewEnvelope
| field | type | required |
|---|---|---|
data | RetentionReview | yes |
RetentionReviewInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
decision | retain | removed | not_applicable | failed | release_hold | yes |
basis | string | yes |
release_condition | string | yes |
evidence | string | yes |
next_review_at | string | null | yes |
acknowledged | boolean | yes |
RetentionReviewListEnvelope
| field | type | required |
|---|---|---|
data | array of RetentionReview | yes |
ReturnAdvanceCredit
| field | type | required |
|---|---|---|
id | string | yes |
reason | string | yes |
advance_item_id | string | yes |
amount_cents | integer | yes |
reference | string | yes |
ReverseAdvanceCredit
| field | type | required |
|---|---|---|
id | string | yes |
reason | string | yes |
application_id | string | yes |
ReversePaymentAllocation
| field | type | required |
|---|---|---|
id | string | yes |
allocation_id | string | yes |
reason | string | yes |
ReviewInvoiceProviderAlertInput
{"type":"object","properties":{},"required":[],"additionalProperties":false}
RollableActivityYears
| field | type | required |
|---|---|---|
rollable | array of object | yes |
RollableActivityYearsEnvelope
| field | type | required |
|---|---|---|
data | RollableActivityYears | yes |
links | Links | yes |
RollActivityYearInput
| field | type | required |
|---|---|---|
year | integer | yes |
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 |
view | SavedReportAddress | null | yes |
shared_with | object | yes |
owned_by_viewer | boolean | yes |
can_delete | boolean | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
SavedReportAddress
| field | type | required |
|---|---|---|
report | string | yes |
query | string | 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 | |
view | SavedReportAddress | |
presentation | ReportDefinitionPresentation |
SavedReportViewInput
| field | type | required |
|---|---|---|
name | string | yes |
view | SavedReportAddress | yes |
SaveStaffInvoice
| field | type | required |
|---|---|---|
id | string | yes |
invoice_id | integer | null | yes |
expected_version | integer | yes |
user_id | integer | yes |
month | string | yes |
currency | string | yes |
reference | string | yes |
kind | draft | received | void | yes |
from_review | boolean | yes |
lines | array of StaffInvoiceLine | yes |
document_id | string | null | yes |
reason | string | yes |
acknowledge_paid_history | boolean | yes |
ScheduledJob
| field | type | required |
|---|---|---|
action | string | yes |
name | string | yes |
scope | any | yes |
cadence | string | yes |
confirmation | required | none | yes |
confirm_within_minutes | integer | yes |
is_active | boolean | yes |
id | integer | yes |
version | integer | yes |
created_by | integer | yes |
created_at | string | yes |
updated_at | string | yes |
last_checked_at | string | null | yes |
last_error | string | null | yes |
last_run_id | integer | null | yes |
ScheduledJobCreate
| field | type | required |
|---|---|---|
action | string | |
name | string | yes |
scope | object | |
cadence | string | |
confirmation | string | |
confirm_within_minutes | integer | |
is_active | boolean |
ScheduledJobEnvelope
| field | type | required |
|---|---|---|
data | ScheduledJob | yes |
ScheduledJobPatch
| field | type | required |
|---|---|---|
action | string | |
name | string | |
scope | object | |
cadence | string | |
confirmation | string | |
confirm_within_minutes | integer | |
is_active | boolean | |
expected_version | integer | yes |
ScheduledJobsPage
| field | type | required |
|---|---|---|
data | array of ScheduledJob | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
ScheduledReviewLinkEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
ScheduledReviewLinkInput
| field | type | required |
|---|---|---|
token | string | yes |
ScheduledRun
| field | type | required |
|---|---|---|
id | integer | yes |
job_id | integer | yes |
occurrence_key | string | yes |
state | proposed | confirmed | cancelled | expired | completed | yes |
proposed_at | string | yes |
expires_at | string | yes |
confirmed_by | integer | null | yes |
confirmed_at | string | null | yes |
settled_reason | string | null | yes |
items | array of ScheduledRunItem | yes |
ScheduledRunConfirmInput
| field | type | required |
|---|---|---|
acknowledge_report_warnings | boolean |
ScheduledRunEnvelope
| field | type | required |
|---|---|---|
data | ScheduledRun | yes |
ScheduledRunItem
| field | type | required |
|---|---|---|
report_people | array of object | yes |
report_name | string | null | yes |
report_warnings | array of object | yes |
attempt_limit | integer | yes |
delivery_id | integer | null | yes |
delivery_status | string | null | yes |
id | integer | yes |
subject_type | string | yes |
subject_id | integer | yes |
description | string | yes |
amount_cents | integer | null | yes |
currency | string | null | yes |
target | string | null | yes |
quantity_seconds | integer | null | yes |
client_name | string | null | yes |
state | pending | running | done | failed | yes |
attempt_count | integer | yes |
failure_reason | string | null | yes |
completed_at | string | null | yes |
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 |
StaffInvoice
| field | type | required |
|---|---|---|
id | integer | yes |
user_id | integer | yes |
month | string | yes |
currency | string | yes |
reference | string | yes |
versions | array of StaffInvoiceVersion | yes |
matched_cents | integer | yes |
flags | array of string | yes |
line_flags | array of array | yes |
StaffInvoiceDocumentEnvelope
| field | type | required |
|---|---|---|
data | StaffInvoiceDocumentInfo | yes |
StaffInvoiceDocumentInfo
| field | type | required |
|---|---|---|
id | string | yes |
invoice_id | integer | yes |
name | string | yes |
byte_size | integer | yes |
content_type | string | yes |
StaffInvoiceEnvelope
| field | type | required |
|---|---|---|
data | StaffInvoice | yes |
StaffInvoiceLine
| field | type | required |
|---|---|---|
description | string | yes |
project_id | integer | null | yes |
entry_id | integer | null | yes |
seconds | integer | yes |
rate_cents | integer | yes |
StaffInvoicePerson
| field | type | required |
|---|---|---|
user_id | integer | yes |
name | string | yes |
currency | string | null | yes |
earned_cents | integer | null | yes |
paid_cents | integer | yes |
invoiced_cents | integer | yes |
matched_invoice_cents | integer | yes |
uninvoiced_cents | integer | null | yes |
invoices | array of StaffInvoice | yes |
StaffInvoiceReport
| field | type | required |
|---|---|---|
month | string | yes |
people | array of StaffInvoicePerson | yes |
StaffInvoiceReportEnvelope
| field | type | required |
|---|---|---|
data | StaffInvoiceReport | yes |
StaffInvoiceVersion
| field | type | required |
|---|---|---|
command_id | string | yes |
version | integer | yes |
month | string | yes |
currency | string | yes |
kind | draft | received | void | yes |
lines | array of StaffInvoiceLine | yes |
amount_cents | integer | yes |
review_id | string | null | yes |
document_id | string | null | yes |
reason | string | yes |
actor_id | integer | yes |
recorded_at | string | yes |
paid_cents_at_recording | integer | yes |
has_payment_history | boolean | yes |
StaffPaymentCommand
| field | type | required |
|---|---|---|
id | string | yes |
user_id | integer | yes |
month | string | yes |
expected_version | integer | yes |
kind | amount | payment | void | opening | reopen | note | yes |
amount_cents | integer | null | yes |
currency | string | null | yes |
paid_on | string | null | yes |
due_on | string | null | yes |
reference | string | yes |
note | string | yes |
payment_id | string | null | yes |
source | wise | deel | historical | yes |
StaffPaymentEvent
| field | type | required |
|---|---|---|
id | string | yes |
user_id | integer | yes |
month | string | yes |
expected_version | integer | yes |
kind | amount | payment | void | opening | reopen | note | yes |
amount_cents | integer | null | yes |
currency | string | null | yes |
paid_on | string | null | yes |
due_on | string | null | yes |
reference | string | yes |
note | string | yes |
payment_id | string | null | yes |
source | wise | deel | historical | advance_credit | yes |
version | integer | yes |
actor_id | integer | yes |
actor_name | string | yes |
recorded_at | string | yes |
request_id | string | yes |
StaffPaymentProviderCommand
| field | type | required |
|---|---|---|
id | string | yes |
user_id | integer | null | yes |
expected_version | integer | yes |
provider | string | null | yes |
note | string | yes |
StaffPaymentProviderEvent
| field | type | required |
|---|---|---|
id | string | yes |
user_id | integer | null | yes |
expected_version | integer | yes |
provider | string | null | yes |
note | string | yes |
version | integer | yes |
actor_id | integer | yes |
actor_name | string | yes |
recorded_at | string | yes |
request_id | string | yes |
StaffPaymentProviderSettings
| field | type | required |
|---|---|---|
default_provider | wise | deel | yes |
version | integer | yes |
events | array of StaffPaymentProviderEvent | yes |
StaffPaymentReport
| field | type | required |
|---|---|---|
month | string | yes |
as_of | string | yes |
rows | array of StaffPaymentRow | yes |
provider_settings | StaffPaymentProviderSettings | yes |
StaffPaymentReportEnvelope
| field | type | required |
|---|---|---|
data | StaffPaymentReport | yes |
StaffPaymentRow
| field | type | required |
|---|---|---|
deel_staging | object | |
is_contractor | boolean | yes |
user_id | integer | yes |
name | string | yes |
active | boolean | yes |
wise_ready | boolean | yes |
deel_ready | boolean | yes |
payout_provider | wise | deel | yes |
provider_override | string | null | yes |
provider_version | integer | yes |
month | string | yes |
version | integer | yes |
amount_cents | integer | null | yes |
currency | string | null | yes |
has_hours | boolean | yes |
amount_basis | ledger | contractor_cost | yes |
paid_cents | integer | yes |
balance_cents | integer | null | yes |
reserved_cents | integer | yes |
available_cents | integer | null | yes |
due_on | string | null | yes |
settled_through | string | null | yes |
status | in_progress | pending | partial | paid | settled | yes |
overdue | boolean | yes |
events | array of StaffPaymentEvent | yes |
SubmissionReminderSchedule
| field | type | required |
|---|---|---|
day | monday | tuesday | wednesday | thursday | friday | saturday | sunday | yes |
time | 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 |
TeamNamedRelation
| field | type | required |
|---|---|---|
id | integer | yes |
name | string | yes |
TeamNotificationChannels
| field | type | required |
|---|---|---|
email | boolean | yes |
desktop | boolean | yes |
slack | boolean | yes |
TeamNotificationChannelsInput
| field | type | required |
|---|---|---|
email | boolean | yes |
desktop | false | yes |
slack | false | yes |
TeamNotificationInput
| field | type | required |
|---|---|---|
expected_version | integer | yes |
daily_reminder_enabled | boolean | yes |
reminder_time | string | null | yes |
reminder_days | array of string | yes |
channels | TeamNotificationChannelsInput | yes |
include_in_team_reminders | boolean | yes |
weekly_digest | boolean | yes |
notify_project_deleted | false | yes |
TeamNotificationPreference
| field | type | required |
|---|---|---|
delivery_active | true | 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 |
|---|---|---|
user_id | integer | |
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 |
time_rounding | EffectiveTimeRounding | 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_rounding | TimeRounding | yes |
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 |
TimeOff
| field | type | required |
|---|---|---|
version | integer | yes |
id | integer | yes |
user_id | integer | yes |
start_date | string (date) | yes |
end_date | string (date) | yes |
kind | vacation | sick | holiday | other | yes |
seconds_per_day | integer | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
TimeOffInput
| field | type | required |
|---|---|---|
user_id | integer | yes |
start_date | string (date) | yes |
end_date | string (date) | yes |
kind | vacation | sick | holiday | other | yes |
seconds_per_day | integer | null |
TimeOffPage
| field | type | required |
|---|---|---|
data | array of TimeOff | yes |
links | PageLinks | yes |
page | PageMetadata | yes |
TimeOffPatch
| field | type | required |
|---|---|---|
version | integer | |
start_date | string (date) | |
end_date | string (date) | |
kind | vacation | sick | holiday | other | |
seconds_per_day | integer | null |
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 |
TimeRounding
| field | type | required |
|---|---|---|
mode | exact | up | down | nearest | yes |
minutes | 6 | 10 | 15 | 20 | 30 | 60 | yes |
TimeRoundingEnvelope
| field | type | required |
|---|---|---|
data | TimeRounding | yes |
links | Links | yes |
TimeRoundingPatch
| field | type | required |
|---|---|---|
mode | exact | up | down | nearest | |
minutes | 6 | 10 | 15 | 20 | 30 | 60 |
TimeRoundingRecalculationApplied
| field | type | required |
|---|---|---|
recalculated_entries | integer | yes |
preview | TimeRoundingRecalculationPreview | yes |
TimeRoundingRecalculationAppliedEnvelope
| field | type | required |
|---|---|---|
data | TimeRoundingRecalculationApplied | yes |
links | Links | yes |
TimeRoundingRecalculationPreview
| field | type | required |
|---|---|---|
scope | TimeRoundingRecalculationScope | yes |
open_entries | integer | yes |
changed_entries | integer | yes |
rounded_seconds_before | integer | yes |
rounded_seconds_after | integer | yes |
earliest_spent_date | string | null | yes |
latest_spent_date | string | null | yes |
projects | array of TimeRoundingRecalculationProject | yes |
kept | object | yes |
fingerprint | string | yes |
TimeRoundingRecalculationPreviewEnvelope
| field | type | required |
|---|---|---|
data | TimeRoundingRecalculationPreview | yes |
links | Links | yes |
TimeRoundingRecalculationProject
| field | type | required |
|---|---|---|
project_id | integer | yes |
project_name | string | yes |
time_rounding | EffectiveTimeRounding | yes |
changed_entries | integer | yes |
rounded_seconds_before | integer | yes |
rounded_seconds_after | integer | yes |
TimeRoundingRecalculationRequest
| field | type | required |
|---|---|---|
project_id | integer | |
from | string (date) | |
to | string (date) | |
fingerprint | string | yes |
TimeRoundingRecalculationScope
| field | type | required |
|---|---|---|
project_id | integer | null | yes |
from | string | null | yes |
to | string | null | yes |
TimesheetAutoApprovalEnvelope
| field | type | required |
|---|---|---|
data | object | yes |
TimesheetAutoApprovalInput
| field | type | required |
|---|---|---|
enabled | boolean | |
window_days | integer |
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 |
automatic_approval | object | |
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 |
methods | array of string | yes |
TwoFactorChallengeIssuedEnvelope
| field | type | required |
|---|---|---|
data | TwoFactorChallengeIssued | yes |
TwoFactorCodeInput
| field | type | required |
|---|---|---|
code | string | yes |
TwoFactorEmailCodeInput
| field | type | required |
|---|---|---|
challenge | string |
TwoFactorEmailDisabled
| field | type | required |
|---|---|---|
user_id | integer | yes |
email_enabled | false | yes |
TwoFactorEmailDisabledEnvelope
| field | type | required |
|---|---|---|
data | TwoFactorEmailDisabled | yes |
TwoFactorEmailState
| field | type | required |
|---|---|---|
user_id | integer | yes |
email_enabled | boolean | yes |
TwoFactorEmailStateEnvelope
| field | type | required |
|---|---|---|
data | TwoFactorEmailState | 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 |
email_enabled | boolean | yes |
pending_confirmation | boolean | yes |
recovery_codes_remaining | integer | yes |
TwoFactorStatusEnvelope
| field | type | required |
|---|---|---|
data | TwoFactorStatus | yes |
links | Links | yes |
UnallocatedPayment
| field | type | required |
|---|---|---|
payment_kind | event | run_item | yes |
payment_id | string | yes |
amount_cents | integer | yes |
allocated_cents | integer | yes |
unallocated_cents | integer | yes |
state | applied | reserved | 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 |
WebhookActiveInput
| field | type | required |
|---|---|---|
version | integer | yes |
is_active | boolean | yes |
WebhookCreateInput
| field | type | required |
|---|---|---|
url | string | yes |
events | array of string | yes |
WebhookDelivery
| field | type | required |
|---|---|---|
id | string | yes |
subscription_id | string (uuid) | yes |
event_id | string | yes |
event_type | invoice.created | invoice.sent | invoice.viewed | invoice.updated | invoice.drafted | invoice.reopened | invoice.cancelled | invoice.written_off | invoice.closed | invoice.unpaid | invoice.partially_paid | invoice.paid | payment.recorded | payment.updated | payment.deleted | time_entry.created_on_behalf | time_entry.updated_on_behalf | time_entry.stopped_on_behalf | time_entry.deleted_on_behalf | yes |
payload_json | string | yes |
status | pending | processing | delivered | failed | yes |
attempt_count | integer | yes |
cycle_attempts | integer | yes |
replay_count | integer | yes |
last_status | integer | null | yes |
last_error_code | string | null | yes |
next_attempt_at | string | null | yes |
last_attempt_at | string | null | yes |
delivered_at | string | null | yes |
failed_at | string | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
WebhookDeliveryEnvelope
| field | type | required |
|---|---|---|
data | WebhookDelivery | yes |
WebhookDeliveryPage
| field | type | required |
|---|---|---|
data | array of WebhookDelivery | yes |
links | object | yes |
page | object | yes |
WebhookReplayInput
{"type":"object","properties":{},"required":[],"additionalProperties":false}
WebhookRotateInput
| field | type | required |
|---|---|---|
version | integer | yes |
overlap_seconds | integer |
WebhookSecretEnvelope
| field | type | required |
|---|---|---|
data | WebhookSubscription | yes |
signing_secret | string | yes |
WebhookSubscription
| field | type | required |
|---|---|---|
id | string (uuid) | yes |
url | string (uri) | yes |
events | array of string | yes |
is_active | boolean | yes |
version | integer | yes |
generation | integer | yes |
previous_valid_until | string | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
deleted_at | string | null | yes |
WebhookSubscriptionEnvelope
| field | type | required |
|---|---|---|
data | WebhookSubscription | yes |
WebhookSubscriptionsEnvelope
| field | type | required |
|---|---|---|
data | array of WebhookSubscription | yes |
configuration | object | yes |
links | object | yes |
WebhookVersionInput
| field | type | required |
|---|---|---|
version | integer | 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 |
WorkItemConnection
| field | type | required |
|---|---|---|
id | integer | yes |
provider | github | yes |
status | active | disconnected | yes |
owner_user_id | integer | yes |
credential_configured | boolean | yes |
connected_at | string (date-time) | yes |
disconnected_at | string | null | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
WorkItemConnectionEnvelope
| field | type | required |
|---|---|---|
data | WorkItemConnection | yes |
WorkItemConnectionInput
| field | type | required |
|---|---|---|
provider | github | yes |
WorkItemConnectionListEnvelope
| field | type | required |
|---|---|---|
data | array of WorkItemConnection | yes |
links | Links | yes |
WorkItemLink
| field | type | required |
|---|---|---|
id | integer | yes |
connection_id | integer | yes |
provider | github | yes |
time_entry_id | integer | null | yes |
project_id | integer | null | yes |
item_id | string | yes |
url | string | null | yes |
created_by | integer | yes |
created_at | string (date-time) | yes |
updated_at | string (date-time) | yes |
WorkItemLinkEnvelope
| field | type | required |
|---|---|---|
data | WorkItemLink | yes |
links | Links | yes |
WorkItemLinkInput
| field | type | required |
|---|---|---|
connection_id | integer | yes |
time_entry_id | integer | |
project_id | integer | |
item_id | string | yes |
url | string | null |
WorkItemLinkPage
| field | type | required |
|---|---|---|
data | array of WorkItemLink | yes |
links | PageLinks | yes |
page | PageMetadata | yes |