Skip to content

List invoices

GET
/api/Invoices
curl --request GET \
--url 'https://invoicing-api.eddish.app/api/Invoices?state=Draft' \
--header 'Authorization: Bearer <token>'

Lists invoices, newest first, without their line items. Recurring-invoice templates are left out. Admins and Finance only.

Also accepts an Account API key granted invoices:read.

clientId
string format: uuid

Only invoices for this client.

state
Allowed values: Draft Open Paid Closed

Only invoices in this state: Draft, Open, Paid or Closed.

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

An invoice. The invoice list leaves out the line items and the recurring schedule.

object
id
required
string format: uuid
clientId
required
string format: uuid
clientName
required
string
clientAddress
required

The client’s current address. The address shown on the invoice is ToAddressOverride if set, otherwise this.

null | string
number
required

The invoice number, including any prefix.

string
purchaseOrder
required

The client’s purchase order number.

null | string
subject
required
null | string
notes
required
null | string
amount
required

The invoice total, in CurrencyCode.

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

What is still owed, in CurrencyCode.

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

The tax rate, as a percentage.

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

The tax charged, in CurrencyCode.

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

The discount, as a percentage.

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

The discount given, in CurrencyCode.

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

The currency every amount on the invoice is in, as a three-letter code such as USD. Set when the invoice is created, from the account’s currency, and kept if the account’s currency changes later.

string
state
required

Draft, Open, Paid or Closed.

Allowed values: Draft Open Paid Closed
periodStart
required

The first day of the period the invoice covers, as yyyy-MM-dd.

null | string format: date
periodEnd
required

The last day of the period the invoice covers, as yyyy-MM-dd.

null | string format: date
issueDate
required

The date on the invoice, as yyyy-MM-dd.

string format: date
dueDate
required

When payment is due, as yyyy-MM-dd. Worked out from the payment term and the issue date.

null | string format: date
paymentTerm
required

UponReceipt, Net15, Net30, Net45, Net60 or Custom.

Allowed values: UponReceipt Net15 Net30 Net45 Net60 Custom
customPaymentTermDays
required

The length of a Custom payment term, counted in the custom unit.

null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
customPaymentTermUnit
required
One of:
null
sentAtUtc
required

When the invoice was marked as sent.

null | string format: date-time
sentDate
required

The date the invoice was sent, as yyyy-MM-dd.

null | string format: date
paidAtUtc
required

When the invoice was marked as paid.

null | string format: date-time
paidDate
required

The date the invoice was paid, as yyyy-MM-dd.

null | string format: date
showHoursSummary
required

Whether the invoice prints a summary of hours.

boolean
isTemplate
required

True for the template a recurring schedule copies. It is not an invoice anyone owes.

boolean
fromAddressOverride
required

An address to print instead of the business’s own. Empty uses the business address.

null | string
toAddressOverride
required

An address to print instead of the client’s own. Empty uses the client’s address.

null | string
lineItems
required
Array<object>

One line on an invoice.

object
id
required
string format: uuid
invoiceId
required
string format: uuid
projectId
required
null | string format: uuid
projectName
required
null | string
kind
required

The label for what the line bills. A line made from tracked time is labelled Service, in the account’s language; a line made from an expense carries its expense category’s name; a line added by hand carries whatever was entered, such as Service or Product.

string
description
required
string
quantity
required

Hours or units charged, as a decimal.

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

The price of one hour or unit, in the invoice’s currency.

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

The line total, in the invoice’s currency.

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

Whether tax applies to the line.

boolean
isLinkedToTime
required

True while the line stands for tracked time entries. Editing the line leaves the link alone; removing the line breaks it.

boolean
isLinkedToExpense
required

True while the line stands for expenses.

boolean
originalDescription
required

The description the line was generated with. Empty on a line added by hand.

null | string
originalQuantity
required

The quantity the line was generated with. Empty on a line added by hand.

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

The unit price the line was generated with. Empty on a line added by hand.

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

Example

{
"data": [
{
"state": "Draft",
"paymentTerm": "UponReceipt",
"customPaymentTermUnit": "Day"
}
]
}

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.