Search records
const url = 'https://invoicing-api.eddish.app/api/search';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://invoicing-api.eddish.app/api/search \ --header 'Authorization: Bearer <token>'Finds clients, projects, invoices, expenses, time entries, tasks and team members whose names, numbers or notes match the words typed, grouped by kind, at most limit of each. The last word matches as a prefix, and accents and case don’t matter. Only kinds the caller may open are searched, and a Member finds only their own time and expenses. A query shorter than two characters finds nothing. Not available to account API keys.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”The words to look for.
Which kinds to search, comma-separated: clients, projects, invoices, expenses, time, tasks, team. Defaults to every kind the caller may open; kinds they may not open are skipped.
The most results of each kind. Defaults to 5, at most 20.
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
One group per kind of record that had a match, in a fixed order: clients, projects, invoices, expenses, time, tasks, team. Kinds with no match are left out.
The matches of one kind of record.
object
The kind of record: clients, projects, invoices, expenses, time, tasks or team.
Whether there are more matches than the ones returned.
For time and expenses, the earliest date among all the matches, not just the ones returned, as yyyy-MM-dd. Empty for other kinds.
For time and expenses, the latest date among all the matches, as yyyy-MM-dd. Empty for other kinds.
The best matches, best first; among equally good ones, the most recent first.
One record that matched.
object
The record’s id. For team, the person’s user id.
The kind of record, the same as its group’s.
The record’s main line: a client, project, task or person’s name; an invoice’s client; an expense’s category; a time entry’s project and task.
A second line: a client’s contact, a project’s client, an invoice’s subject, the notes on an expense or a time entry, a person’s email address.
A short reference: an invoice’s number or a project’s code.
An invoice’s total, only when the caller may see everyone’s amounts, or an expense’s amount, in the account’s currency. Time entries never carry one.
A time entry’s hours.
An invoice’s state: Draft, Open, Paid or Closed.
When an invoice is due, as yyyy-MM-dd.
An expense’s approval state: Open, Submitted, Approved, Returned or Reimbursed.
False for an archived client, project or task. True for every other record.
The record’s date, as yyyy-MM-dd: an invoice’s issue date, or the day an expense or time was spent.
Whose it is: the person on a time entry or an expense, or the person a team result is.
The currency of an invoice’s Amount, as a three-letter code such as USD. Empty for every other record, whose amounts are in the account’s currency.
The display name of the person a time entry or an expense belongs to. Filled only for callers who see everyone’s time and expenses; empty for a Member, who sees only their own, and for other kinds.
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": { "groups": [ { "items": [ { "isActive": true } ] } ] }}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" }}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.