Record a payment
const url = 'https://invoicing-api.eddish.app/api/Invoices/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/record-payment';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"paidDate":"2026-04-15","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/Invoices/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/record-payment \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "paidDate": "2026-04-15", "note": "example" }'Records an invoice as paid in full. Admins and Finance only.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”When an invoice was paid.
object
The date payment was received, as yyyy-MM-dd.
An optional note kept with this payment in the invoice’s history, at most 1000 characters.
Example generated
{ "paidDate": "2026-04-15", "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 client’s current address. The address shown on the invoice is ToAddressOverride if set, otherwise this.
The invoice number, including any prefix.
The client’s purchase order number.
The invoice total, in CurrencyCode.
What is still owed, in CurrencyCode.
The tax rate, as a percentage.
The tax charged, in CurrencyCode.
The discount, as a percentage.
The discount given, in CurrencyCode.
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.
Draft, Open, Paid or Closed.
The first day of the period the invoice covers, as yyyy-MM-dd.
The last day of the period the invoice covers, as yyyy-MM-dd.
The date on the invoice, as yyyy-MM-dd.
When payment is due, as yyyy-MM-dd. Worked out from the payment term and the issue date.
UponReceipt, Net15, Net30, Net45, Net60 or Custom.
The length of a Custom payment term, counted in the custom unit.
When the invoice was marked as sent.
The date the invoice was sent, as yyyy-MM-dd.
When the invoice was marked as paid.
The date the invoice was paid, as yyyy-MM-dd.
Whether the invoice prints a summary of hours.
True for the template a recurring schedule copies. It is not an invoice anyone owes.
An address to print instead of the business’s own. Empty uses the business address.
An address to print instead of the client’s own. Empty uses the client’s address.
One line on an invoice.
object
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.
Hours or units charged, as a decimal.
The price of one hour or unit, in the invoice’s currency.
The line total, in the invoice’s currency.
Whether tax applies to the line.
True while the line stands for tracked time entries. Editing the line leaves the link alone; removing the line breaks it.
True while the line stands for expenses.
The description the line was generated with. Empty on a line added by hand.
The quantity the line was generated with. Empty on a line added by hand.
The unit price the line was generated with. Empty on a line added by hand.
The recurring schedule that produced the invoice, if any.
object
The repeat pattern in words, such as “Every 2 weeks”.
The date the next invoice is issued, as yyyy-MM-dd.
False once the schedule has been stopped.
The schedule’s subject as entered, with its date placeholders unfilled.
The schedule’s notes as entered, with their date placeholders unfilled.
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": { "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.
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.