Return an expense
const url = 'https://invoicing-api.eddish.app/api/expenses/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/return';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"note":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://invoicing-api.eddish.app/api/expenses/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/return \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "note": "example" }'Sends a submitted expense back to its owner with a note saying what to fix. Admins, Approvers and Finance.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”Why something is being sent back.
object
What needs fixing. Required.
Example generated
{ "note": "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
The project the expense is on. Empty for an expense that isn’t on a project, which is never billable.
The category’s unit, for showing “47 miles” rather than a bare number.
The category’s price per unit.
The day the money was spent, as yyyy-MM-dd.
The amount, in the account’s currency.
How many units, for a per-unit category. Empty when the amount was entered directly.
True once the expense is on a sent invoice and can’t be changed.
True once the expense is on an invoice.
The invoice the expense is on, if any.
A receipt attached to an expense.
object
The file’s size in bytes.
Whether the money is owed back to the person who spent it.
Open, Submitted, Approved, Returned or Reimbursed. Stays Open unless the account requires expense approval.
When the expense was submitted for approval.
When it was approved or returned.
The note an approver left when sending it back.
When it was marked as paid back.
Whether the caller may approve or return it now.
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
{ "data": { "reimbursable": false, "approvalState": "Open", "canDecide": false }}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.