Update approval settings
const url = 'https://invoicing-api.eddish.app/api/team-settings/approvals';const options = { method: 'PUT', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"requireTimeApproval":true,"requireExpenseApproval":true,"onlyApprovedInvoiceable":true,"selfApprovalAllowed":true,"weekStartsOn":1,"reminderDay":1,"reminderHour":1,"timeZone":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url https://invoicing-api.eddish.app/api/team-settings/approvals \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "requireTimeApproval": true, "requireExpenseApproval": true, "onlyApprovedInvoiceable": true, "selfApprovalAllowed": true, "weekStartsOn": 1, "reminderDay": 1, "reminderHour": 1, "timeZone": "example" }'Updates whether time and expenses need approval, and the account’s week start. Admins only.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”The new approval settings.
object
Whether timesheets must be approved.
Whether expenses must be approved.
Whether only approved time and expenses can be invoiced. Stored as off when no approval is required.
Whether people can approve their own work. Stored as off when no approval is required.
The account’s first day of the week, 0 for Sunday through 6 for Saturday.
The day of the week the timesheet reminder goes out, 0 for Sunday through 6 for Saturday. Leave empty to keep the current one.
The hour of the day the reminder goes out, 0 to 23. Leave empty to keep the current one.
The account’s time zone, as an IANA name such as Europe/London. Leave empty to keep the current one.
Example generated
{ "requireTimeApproval": true, "requireExpenseApproval": true, "onlyApprovedInvoiceable": true, "selfApprovalAllowed": true, "weekStartsOn": 1, "reminderDay": 1, "reminderHour": 1, "timeZone": "example"}Responses
Section titled “Responses”OK
Shorthand for the overwhelmingly common ServiceResponse<TData, ErrorResponse>.
C# cannot alias an open generic, so this is expressed as a subclass rather than a using alias.
object
True when the call succeeded and TData? ServiceResponse<TData, TError>.Data is populated.
Payload on success; default on failure.
object
Whether Approvers see billable amounts.
Whether Members see the amounts on their own time.
Whether Approvers can create and change clients, projects, tasks and expense categories.
Whether timesheets must be approved.
Whether expenses must be approved.
Whether only approved time and expenses can be invoiced.
Whether people can approve their own work.
The account’s first day of the week, 0 for Sunday through 6 for Saturday.
The day of the week the timesheet reminder goes out, 0 for Sunday through 6 for Saturday.
The hour of the day the reminder goes out, 0 to 23, in the account’s time zone.
The account’s time zone, as an IANA name such as Europe/London.
Error on failure; default on success. Always serialized, per TData? ServiceResponse<TData, TError>.Data.
object
Stable, machine-readable error identifier (for example account.not_found).
Clients branch on this, never on string ErrorResponse.Message.
Human-readable description of what went wrong. Safe to surface to a User.
Optional per-field validation failures, keyed by field name. Null (and omitted from JSON) for errors that are not validation failures.
Optional machine-readable facts about the failure that a client renders rather than parses
out of string ErrorResponse.Message — e.g. plan.limit_reached’s limit, count and
planName. Null (and omitted from JSON) for errors that carry none.
Example generated
{ "success": true, "data": { "approversSeeAmounts": true, "membersSeeOwnAmounts": true, "approversManageCatalog": true, "requireTimeApproval": true, "requireExpenseApproval": true, "onlyApprovedInvoiceable": true, "selfApprovalAllowed": true, "weekStartsOn": 1, "reminderDay": 1, "reminderHour": 1, "timeZone": "example" }, "error": { "code": "example", "message": "example", "fieldErrors": "example", "details": "example" }}Not signed in, or the credential isn’t recognised, has expired or was revoked: auth.missing_credential, auth.invalid_credential, auth.expired_credential, auth.revoked_credential.
Shorthand for the overwhelmingly common ServiceResponse<TData, ErrorResponse>.
C# cannot alias an open generic, so this is expressed as a subclass rather than a using alias.
object
True when the call succeeded and TData? ServiceResponse<TData, TError>.Data is populated.
Payload on success; default on failure.
The Framework’s default error shape, used as the TError of
ServiceResponse<TData, TError> unless an App genuinely needs its own.
object
Stable, machine-readable error identifier (for example account.not_found).
Clients branch on this, never on string ErrorResponse.Message.
Human-readable description of what went wrong. Safe to surface to a User.
Optional per-field validation failures, keyed by field name. Null (and omitted from JSON) for errors that are not validation failures.
Optional machine-readable facts about the failure that a client renders rather than parses
out of string ErrorResponse.Message — e.g. plan.limit_reached’s limit, count and
planName. Null (and omitted from JSON) for errors that carry none.
Example generated
{ "success": true, "data": "example", "error": { "code": "example", "message": "example", "fieldErrors": "example", "details": "example" }}Not allowed. error.code says why: auth.role_not_permitted (your role doesn’t allow it), auth.read_only_token (the token can only read), app.no_seat (no seat in this App), auth.api_access_not_in_plan (the plan doesn’t include API access), auth.not_a_member (no longer a member of the Account), auth.insufficient_scope (an Account API key without the scope).
Shorthand for the overwhelmingly common ServiceResponse<TData, ErrorResponse>.
C# cannot alias an open generic, so this is expressed as a subclass rather than a using alias.
object
True when the call succeeded and TData? ServiceResponse<TData, TError>.Data is populated.
Payload on success; default on failure.
The Framework’s default error shape, used as the TError of
ServiceResponse<TData, TError> unless an App genuinely needs its own.
object
Stable, machine-readable error identifier (for example account.not_found).
Clients branch on this, never on string ErrorResponse.Message.
Human-readable description of what went wrong. Safe to surface to a User.
Optional per-field validation failures, keyed by field name. Null (and omitted from JSON) for errors that are not validation failures.
Optional machine-readable facts about the failure that a client renders rather than parses
out of string ErrorResponse.Message — e.g. plan.limit_reached’s limit, count and
planName. Null (and omitted from JSON) for errors that carry none.
Example generated
{ "success": true, "data": "example", "error": { "code": "example", "message": "example", "fieldErrors": "example", "details": "example" }}The Account is over its plan’s limits, so changes are refused until an Owner or Admin sorts that out: plan.read_only.
Shorthand for the overwhelmingly common ServiceResponse<TData, ErrorResponse>.
C# cannot alias an open generic, so this is expressed as a subclass rather than a using alias.
object
True when the call succeeded and TData? ServiceResponse<TData, TError>.Data is populated.
Payload on success; default on failure.
The Framework’s default error shape, used as the TError of
ServiceResponse<TData, TError> unless an App genuinely needs its own.
object
Stable, machine-readable error identifier (for example account.not_found).
Clients branch on this, never on string ErrorResponse.Message.
Human-readable description of what went wrong. Safe to surface to a User.
Optional per-field validation failures, keyed by field name. Null (and omitted from JSON) for errors that are not validation failures.
Optional machine-readable facts about the failure that a client renders rather than parses
out of string ErrorResponse.Message — e.g. plan.limit_reached’s limit, count and
planName. Null (and omitted from JSON) for errors that carry none.
Example generated
{ "success": true, "data": "example", "error": { "code": "example", "message": "example", "fieldErrors": "example", "details": "example" }}Too many requests: rate_limit.exceeded. Wait the number of seconds in the Retry-After header.
Shorthand for the overwhelmingly common ServiceResponse<TData, ErrorResponse>.
C# cannot alias an open generic, so this is expressed as a subclass rather than a using alias.
object
True when the call succeeded and TData? ServiceResponse<TData, TError>.Data is populated.
Payload on success; default on failure.
The Framework’s default error shape, used as the TError of
ServiceResponse<TData, TError> unless an App genuinely needs its own.
object
Stable, machine-readable error identifier (for example account.not_found).
Clients branch on this, never on string ErrorResponse.Message.
Human-readable description of what went wrong. Safe to surface to a User.
Optional per-field validation failures, keyed by field name. Null (and omitted from JSON) for errors that are not validation failures.
Optional machine-readable facts about the failure that a client renders rather than parses
out of string ErrorResponse.Message — e.g. plan.limit_reached’s limit, count and
planName. Null (and omitted from JSON) for errors that carry none.
Example generated
{ "success": true, "data": "example", "error": { "code": "example", "message": "example", "fieldErrors": "example", "details": "example" }}Headers
Section titled “Headers”Seconds to wait before trying again.