Skip to content

List projects

GET
/api/Projects
curl --request GET \
--url 'https://invoicing-api.eddish.app/api/Projects?includeInactive=false' \
--header 'Authorization: Bearer <token>'

Lists projects, with their hours and budget use. Rates and money figures appear only if the caller may see everyone’s amounts.

Also accepts an Account API key granted projects:read.

clientId
string format: uuid

Only projects for this client.

includeInactive
boolean

Include archived projects. Defaults to false.

OK

Media typeapplication/json

Shorthand for the overwhelmingly common ServiceResponse&lt;TData, ErrorResponse&gt;. C# cannot alias an open generic, so this is expressed as a subclass rather than a using alias.

object
success

True when the call succeeded and TData? ServiceResponse<TData, TError>.Data is populated.

boolean
data

Payload on success; default on failure.

Array<object> | null

A project, with its rates, budget and how much has been worked on it.

object
id
required
string format: uuid
clientId
required
string format: uuid
clientName
required
string
name
required
string
code
required

A short code for the project, such as one from the client’s own system.

null | string
isActive
required
boolean
isBillable
required

Whether time on the project can be billed.

boolean
isFixedFee
required

Whether the project is billed for a fixed fee rather than for hours.

boolean
billBy
required

How hourly rates are set: None, Project, Tasks or People.

Allowed values: None Project Tasks People
hourlyRate
required

The project’s hourly rate, in the account’s currency. Only shown to people who may see everyone’s amounts.

null | number | string format: double
/^-?(?:0|[1-9]\d*)(?:\.\d+)?$/
fee
required

The fixed fee, in the account’s currency. Only shown to people who may see everyone’s amounts.

null | number | string format: double
/^-?(?:0|[1-9]\d*)(?:\.\d+)?$/
notes
required
null | string
startsOn
required

The project’s start date, as yyyy-MM-dd.

null | string format: date
endsOn
required

The project’s end date, as yyyy-MM-dd.

null | string format: date
budgetType

What the budget is measured in: None, Hours or Fees.

default: None
Allowed values: None Hours Fees
budgetAmount

The budget: a number of hours, or an amount in the account’s currency, depending on the budget type.

null | number | string format: double
/^-?(?:0|[1-9]\d*)(?:\.\d+)?$/
budgetResetsMonthly

Whether the budget starts over each month, as for a monthly retainer.

boolean
budgetUsedHours

Hours worked on the project. For a budget that resets monthly, only this month’s.

number | string format: double
0 /^-?(?:0|[1-9]\d*)(?:\.\d+)?$/
budgetUsedFees

Billable value worked on the project, over the same period as the used hours. Only shown to people who may see everyone’s amounts.

null | number | string format: double
/^-?(?:0|[1-9]\d*)(?:\.\d+)?$/
hours

Total hours worked on the project.

number | string format: double
0 /^-?(?:0|[1-9]\d*)(?:\.\d+)?$/
unbilled

Billable time and expenses not yet on an invoice. Only shown to people who may see everyone’s amounts.

null | number | string format: double
/^-?(?:0|[1-9]\d*)(?:\.\d+)?$/
lastEntry

The date of the most recent time entry on the project.

null | string format: date
archivedByPlanLimitAtUtc

Set when the account’s plan limit archived the project automatically.

null | string format: date-time
error
One of:
null

Example

{
"data": [
{
"billBy": "None",
"budgetType": "None",
"budgetResetsMonthly": false,
"budgetUsedHours": 0,
"hours": 0
}
]
}

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.

Media typeapplication/json

Shorthand for the overwhelmingly common ServiceResponse&lt;TData, ErrorResponse&gt;. C# cannot alias an open generic, so this is expressed as a subclass rather than a using alias.

object
success

True when the call succeeded and TData? ServiceResponse<TData, TError>.Data is populated.

boolean
data

Payload on success; default on failure.

error

The Framework’s default error shape, used as the TError of ServiceResponse<TData, TError> unless an App genuinely needs its own.

object
code

Stable, machine-readable error identifier (for example account.not_found). Clients branch on this, never on string ErrorResponse.Message.

string
message

Human-readable description of what went wrong. Safe to surface to a User.

string
fieldErrors

Optional per-field validation failures, keyed by field name. Null (and omitted from JSON) for errors that are not validation failures.

null | object
details

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.

null | object

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).

Media typeapplication/json

Shorthand for the overwhelmingly common ServiceResponse&lt;TData, ErrorResponse&gt;. C# cannot alias an open generic, so this is expressed as a subclass rather than a using alias.

object
success

True when the call succeeded and TData? ServiceResponse<TData, TError>.Data is populated.

boolean
data

Payload on success; default on failure.

error

The Framework’s default error shape, used as the TError of ServiceResponse<TData, TError> unless an App genuinely needs its own.

object
code

Stable, machine-readable error identifier (for example account.not_found). Clients branch on this, never on string ErrorResponse.Message.

string
message

Human-readable description of what went wrong. Safe to surface to a User.

string
fieldErrors

Optional per-field validation failures, keyed by field name. Null (and omitted from JSON) for errors that are not validation failures.

null | object
details

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.

null | object

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.

Media typeapplication/json

Shorthand for the overwhelmingly common ServiceResponse&lt;TData, ErrorResponse&gt;. C# cannot alias an open generic, so this is expressed as a subclass rather than a using alias.

object
success

True when the call succeeded and TData? ServiceResponse<TData, TError>.Data is populated.

boolean
data

Payload on success; default on failure.

error

The Framework’s default error shape, used as the TError of ServiceResponse<TData, TError> unless an App genuinely needs its own.

object
code

Stable, machine-readable error identifier (for example account.not_found). Clients branch on this, never on string ErrorResponse.Message.

string
message

Human-readable description of what went wrong. Safe to surface to a User.

string
fieldErrors

Optional per-field validation failures, keyed by field name. Null (and omitted from JSON) for errors that are not validation failures.

null | object
details

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.

null | object

Example generated

{
"success": true,
"data": "example",
"error": {
"code": "example",
"message": "example",
"fieldErrors": "example",
"details": "example"
}
}
Retry-After
integer

Seconds to wait before trying again.