BillMore API (1.0.0)

Download OpenAPI specification:

REST API for BillMore invoicing and business data.

Base URL: https://api.billmore.com/v1

Authentication

All endpoints (including /health) require an API key. You can create and manage API keys in the BillMore web app under Extensions → API.

Pass the key in the Authorization header as a Bearer token on every request:

Authorization: Bearer <your-api-key>

Example:

curl https://api.billmore.com/v1/company \
  -H "Authorization: Bearer 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"

System

Health check

Returns the API health status. Requires a valid API key.

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "status": "ok"
}

Usage

Get document usage

Returns the document usage and quota for the authenticated company's current billing period. When the plan has unlimited documents, maxDocuments and remainingDocuments are null and unlimitedDocuments is true.

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
Example
{
  • "status": "active",
  • "maxDocuments": 500,
  • "usedDocuments": 127,
  • "remainingDocuments": 373,
  • "unlimitedDocuments": false
}

Company

Get company information

Returns the company details and settings for the authenticated company. Includes identity, address, legal, payment, and tax configuration.

Authorizations:
bearerAuth

Responses

Response samples

Content type
application/json
{
  • "name": "Muster GmbH",
  • "name2": "string",
  • "countryCode": "DE",
  • "address": {
    },
  • "legalInfo": {
    },
  • "contactInfo": {
    },
  • "paymentInfo": {
    },
  • "taxNumbers": [
    ],
  • "currency": "EUR",
  • "vat": {
    }
}

Documents

List documents

Returns a paginated list of documents for the authenticated company. Supports filtering by document type, date range, status flags, and client, plus configurable sorting.

Date-range filters operate on the document date field and are interpreted in the company's local timezone.

Authorizations:
bearerAuth
query Parameters
type
string
Enum: "invoice" "estimate" "delivery-note" "purchase-order" "order-confirmation"

Filter by document type

from
string <date> ^\d{4}-\d{2}-\d{2}$
Example: from=2026-01-01

Inclusive lower bound on the document date (calendar day). Time-of-day is not accepted. Boundaries are interpreted in the company's local timezone.

to
string <date> ^\d{4}-\d{2}-\d{2}$
Example: to=2026-01-31

Inclusive upper bound on the document date (calendar day). Time-of-day is not accepted. Boundaries are interpreted in the company's local timezone.

paid
boolean

Filter by the paid status flag.

sent
boolean

Filter by the sent status flag.

finalized
boolean

Filter by the finalized status flag.

cancelled
boolean

Filter by the cancelled status flag.

clientId
string

Filter by the linked client. Only matches documents that were created with clientId; documents created with an inline client body are not matched.

sort
string
Default: "-createdAt"
Example: sort=-date,createdAt

Comma-separated list of fields to sort by. Prefix a field with - for descending order. Allowed fields: createdAt, date. Default: -createdAt.

limit
integer [ 1 .. 100 ]
Default: 20

Number of results per page (max 100)

skip
integer >= 0
Default: 0

Number of results to skip for pagination

Responses

Response samples

Content type
application/json
{
  • "results": [
    ],
  • "total": 0,
  • "limit": 0,
  • "skip": 0,
  • "hasMore": true
}

Create a document

Creates a new document with automatic PDF generation. The document number can be provided or auto-generated based on company settings. A PDF is generated using the company's default layout and uploaded to storage.

For exportType: factur-x and exportType: xrechnung, the e-invoicing artifact is generated on every save, regardless of the finalized flag, and validated. The request fails with 422 if validation fails. To save a draft without e-invoice validation, use exportType: pdf and switch to factur-x / xrechnung later.

Prerequisites for exportType: factur-x:

  • Your company profile must have a countryCode.
  • The client must have name and countryCode.

Prerequisites for exportType: xrechnung:

  • Your company profile must have a countryCode.
  • The client must have name, countryCode, email, and clientNumber.
  • priceLayout: gross is not supported.
Authorizations:
bearerAuth
Request Body schema: application/json
required
type
required
string
Enum: "invoice" "estimate" "delivery-note" "purchase-order" "order-confirmation"

Document type

language
string
Default: "de"
Enum: "de" "en"

Language for PDF generation (affects labels and date formatting)

number
string

Document number. If omitted, auto-generated from company settings.

date
string <date>

Primary document date (YYYY-MM-DD). Defaults to today.

serviceDate
string <date>

Service or delivery date (YYYY-MM-DD). Invoice only.

serviceDateEnd
string <date>

End of service period (YYYY-MM-DD). Only valid with serviceDateType 'service-period'. Invoice only.

serviceDateType
string
Enum: "service-date" "delivery-date" "service-period"

Type of service date. Defaults to 'service-date', or 'service-period' if serviceDateEnd is provided.

object

Inline client/recipient data. Mutually exclusive with clientId.

clientId
string

ID of an existing contact. The contact's data will be embedded as a snapshot on the document so later changes to the contact don't change the document. Mutually exclusive with the inline client object.

required
Array of objects non-empty

Document line items. Each line must have either netPrice or grossPrice, not both.

introduction
string

Text above the line items table. Defaults to company setting for this document type.

notes
string

Text below the line items table. Defaults to company setting for this document type.

priceLayout
string
Enum: "net" "gross"

Price display mode. Defaults to company setting.

discountRate
number [ 0 .. 100 ]

Percentage discount (0-100). The only supported discount method.

vatRegulation
string
Default: "standard"
Enum: "standard" "reverse-charge" "intra-community-supply"
exportType
string
Default: "pdf"
Enum: "pdf" "factur-x" "xrechnung"

Export format.

  • pdf — standard PDF.
  • factur-x — PDF/A-3 with embedded CII XML (Factur-X / ZUGFeRD).
  • xrechnung — standalone UBL XML (no PDF).

Factur-X and XRechnung artifacts are generated on every save, regardless of the finalized flag. The XML is validated and the request fails with 422 if validation fails. Use pdf for drafts that should not be validated.

finalized
boolean
Default: false

Whether to finalize the document immediately (prevents future edits)

Responses

Request samples

Content type
application/json
{
  • "type": "invoice",
  • "language": "de",
  • "number": "RE-2026-0042",
  • "date": "2026-02-09",
  • "serviceDate": "2019-08-24",
  • "serviceDateEnd": "2019-08-24",
  • "serviceDateType": "service-date",
  • "client": {
    },
  • "clientId": "string",
  • "lines": [
    ],
  • "introduction": "string",
  • "notes": "string",
  • "priceLayout": "net",
  • "discountRate": 100,
  • "vatRegulation": "standard",
  • "exportType": "pdf",
  • "finalized": false
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "type": "invoice",
  • "number": "string",
  • "date": "2026-02-08",
  • "serviceDate": "2019-08-24",
  • "serviceDateEnd": "2019-08-24",
  • "serviceDateType": "service-date",
  • "client": {
    },
  • "lines": [
    ],
  • "introduction": "string",
  • "notes": "string",
  • "currency": "string",
  • "priceLayout": "net",
  • "exportType": "pdf",
  • "vatRegulation": "standard",
  • "discountRate": 0,
  • "netAmount": 0,
  • "vatAmount": 0,
  • "totalAmount": 0,
  • "references": [
    ],
  • "paid": true,
  • "paidDate": "2019-08-24",
  • "paidNotes": "string",
  • "sent": true,
  • "sentDate": "2019-08-24",
  • "sentNotes": "string",
  • "customStatus": true,
  • "customStatusDate": "2019-08-24",
  • "customStatusName": "string",
  • "customStatusNotes": "string",
  • "finalized": true,
  • "finalizedDate": "2019-08-24",
  • "cancelled": true,
  • "cancelledDate": "2019-08-24",
  • "cancellationReason": "string",
  • "parentId": "string",
  • "createdAt": "2019-08-24T14:15:22Z"
}

Get a document

Returns a single document with all fields and computed totals.

Authorizations:
bearerAuth
path Parameters
id
required
string

Document ID

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "type": "invoice",
  • "number": "string",
  • "date": "2026-02-08",
  • "serviceDate": "2019-08-24",
  • "serviceDateEnd": "2019-08-24",
  • "serviceDateType": "service-date",
  • "client": {
    },
  • "lines": [
    ],
  • "introduction": "string",
  • "notes": "string",
  • "currency": "string",
  • "priceLayout": "net",
  • "exportType": "pdf",
  • "vatRegulation": "standard",
  • "discountRate": 0,
  • "netAmount": 0,
  • "vatAmount": 0,
  • "totalAmount": 0,
  • "references": [
    ],
  • "paid": true,
  • "paidDate": "2019-08-24",
  • "paidNotes": "string",
  • "sent": true,
  • "sentDate": "2019-08-24",
  • "sentNotes": "string",
  • "customStatus": true,
  • "customStatusDate": "2019-08-24",
  • "customStatusName": "string",
  • "customStatusNotes": "string",
  • "finalized": true,
  • "finalizedDate": "2019-08-24",
  • "cancelled": true,
  • "cancelledDate": "2019-08-24",
  • "cancellationReason": "string",
  • "parentId": "string",
  • "createdAt": "2019-08-24T14:15:22Z"
}

Update a document

Partially updates a document. All fields are optional. Three permission tiers apply based on the document state:

Not finalized — all content and status fields can be updated. The document can also be finalized by passing finalized: true.

Finalized (not cancelled) — only status fields: paid, paidDate, paidNotes, sent, sentDate, sentNotes, customStatus, customStatusDate, customStatusName, customStatusNotes.

Finalized and cancelled — only customStatus, customStatusDate, customStatusName, customStatusNotes.

Immutable fields (type, number, currency) cannot be changed. Cancellation uses a dedicated future endpoint.

When content fields change, the PDF is automatically regenerated. When a status boolean (paid/sent/customStatus) is set to true without a corresponding date, today's date is used. Setting it to false unsets the date and notes.

Authorizations:
bearerAuth
path Parameters
id
required
string

Document ID

Request Body schema: application/json
required
date
string <date>

Primary document date (YYYY-MM-DD). Content field.

serviceDate
string <date>

Service or delivery date (YYYY-MM-DD). Invoice only. Content field.

serviceDateEnd
string <date>

End of service period (YYYY-MM-DD). Invoice only. Content field.

serviceDateType
string
Enum: "service-date" "delivery-date" "service-period"

Type of service date. Content field.

object

Inline client data. Mutually exclusive with clientId. Content field.

clientId
string

ID of an existing Client record. Mutually exclusive with client. Content field.

Array of objects non-empty

Document line items. Each line must have either netPrice or grossPrice, not both. Content field.

introduction
string

Text above the line items table. Content field.

notes
string

Text below the line items table. Content field.

language
string
Enum: "de" "en"

Language for PDF generation. Content field.

priceLayout
string
Enum: "net" "gross"

Price display mode. Content field.

discountRate
number [ 0 .. 100 ]

Percentage discount (0-100). Content field.

vatRegulation
string
Enum: "standard" "reverse-charge" "intra-community-supply"

VAT regulation. Content field.

exportType
string
Enum: "pdf" "factur-x" "xrechnung"

Export format. Content field. Cannot be changed once the document is finalized.

finalized
boolean

Set to true to finalize the document (one-way, prevents future content edits).

paid
boolean

Payment status. Status field.

paidDate
string <date>

Payment date (YYYY-MM-DD). Defaults to today when paid is set to true. Status field.

paidNotes
string

Payment notes. Status field.

sent
boolean

Sent status. Status field.

sentDate
string <date>

Sent date (YYYY-MM-DD). Defaults to today when sent is set to true. Status field.

sentNotes
string

Sent notes. Status field.

customStatus
boolean

Custom status flag. Status field (also allowed on cancelled documents).

customStatusDate
string <date>

Custom status date (YYYY-MM-DD). Defaults to today when customStatus is set to true.

customStatusName
string

Custom status label.

customStatusNotes
string

Custom status notes.

Responses

Request samples

Content type
application/json
{
  • "date": "2019-08-24",
  • "serviceDate": "2019-08-24",
  • "serviceDateEnd": "2019-08-24",
  • "serviceDateType": "service-date",
  • "client": {
    },
  • "clientId": "string",
  • "lines": [
    ],
  • "introduction": "string",
  • "notes": "string",
  • "language": "de",
  • "priceLayout": "net",
  • "discountRate": 100,
  • "vatRegulation": "standard",
  • "exportType": "pdf",
  • "finalized": true,
  • "paid": true,
  • "paidDate": "2019-08-24",
  • "paidNotes": "string",
  • "sent": true,
  • "sentDate": "2019-08-24",
  • "sentNotes": "string",
  • "customStatus": true,
  • "customStatusDate": "2019-08-24",
  • "customStatusName": "string",
  • "customStatusNotes": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "type": "invoice",
  • "number": "string",
  • "date": "2026-02-08",
  • "serviceDate": "2019-08-24",
  • "serviceDateEnd": "2019-08-24",
  • "serviceDateType": "service-date",
  • "client": {
    },
  • "lines": [
    ],
  • "introduction": "string",
  • "notes": "string",
  • "currency": "string",
  • "priceLayout": "net",
  • "exportType": "pdf",
  • "vatRegulation": "standard",
  • "discountRate": 0,
  • "netAmount": 0,
  • "vatAmount": 0,
  • "totalAmount": 0,
  • "references": [
    ],
  • "paid": true,
  • "paidDate": "2019-08-24",
  • "paidNotes": "string",
  • "sent": true,
  • "sentDate": "2019-08-24",
  • "sentNotes": "string",
  • "customStatus": true,
  • "customStatusDate": "2019-08-24",
  • "customStatusName": "string",
  • "customStatusNotes": "string",
  • "finalized": true,
  • "finalizedDate": "2019-08-24",
  • "cancelled": true,
  • "cancelledDate": "2019-08-24",
  • "cancellationReason": "string",
  • "parentId": "string",
  • "createdAt": "2019-08-24T14:15:22Z"
}

Delete a document

Deletes a document. Finalized documents cannot be deleted. An audit log entry is created with a snapshot of the deleted document.

Authorizations:
bearerAuth
path Parameters
id
required
string

Document ID

Responses

Response samples

Content type
application/json
{
  • "error": "Request body is required"
}

Send document by email

Sends a document by email to the given recipient with the document's PDF attached. Documents can be sent in any state (drafts and finalized).

On success, the document is automatically marked as sent unless it was already sent or is cancelled.

Each company has a daily email quota.

Requires the API key to carry the email:send permission.

Authorizations:
bearerAuth
path Parameters
id
required
string

Document ID

Request Body schema: application/json
required
recipient
required
string <email>

Recipient email address.

subject
required
string <= 200 characters

Subject line.

message
required
string <= 10000 characters

Plain-text message body.

sendCopy
boolean
Default: false

When true, you also receive a copy of the email.

Responses

Request samples

Content type
application/json
{
  • "recipient": "recipient@example.com",
  • "subject": "Invoice RE-2026-0042",
  • "message": "string",
  • "sendCopy": false
}

Response samples

Content type
application/json
{
  • "messageId": "string",
  • "replyTo": "user@example.com",
  • "markedAsSent": true,
  • "emailLimitPerDay": 0
}

Cancel an invoice

Cancels a finalized invoice (Stornorechnung). The original document is updated in place — cancelled becomes true, cancelledDate is server-set to the current timestamp, and the optional cancellationReason is stored.

A separate cancellation artifact (PDF, Factur-X PDF/A-3, or XRechnung XML — driven by the original document's exportType) is generated. Validation rules:

  • Only invoices (type: invoice) can be cancelled.
  • The invoice must be finalized: true.
  • The invoice must not already be cancelled.

For factur-x and xrechnung documents the same e-invoice validation that applies to document creation runs against the cancellation artifact. Validation failures return 422.

Download the generated cancellation artifact via GET /documents/{id}/cancellation/pdf (PDF / Factur-X) or GET /documents/{id}/cancellation/xml (XRechnung).

Authorizations:
bearerAuth
path Parameters
id
required
string

Document ID

Request Body schema: application/json
optional
cancellationReason
string <= 1000 characters

Optional free-text reason for the cancellation. Empty strings are ignored.

Responses

Request samples

Content type
application/json
{
  • "cancellationReason": "Wrong client selected"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "type": "invoice",
  • "number": "string",
  • "date": "2026-02-08",
  • "serviceDate": "2019-08-24",
  • "serviceDateEnd": "2019-08-24",
  • "serviceDateType": "service-date",
  • "client": {
    },
  • "lines": [
    ],
  • "introduction": "string",
  • "notes": "string",
  • "currency": "string",
  • "priceLayout": "net",
  • "exportType": "pdf",
  • "vatRegulation": "standard",
  • "discountRate": 0,
  • "netAmount": 0,
  • "vatAmount": 0,
  • "totalAmount": 0,
  • "references": [
    ],
  • "paid": true,
  • "paidDate": "2019-08-24",
  • "paidNotes": "string",
  • "sent": true,
  • "sentDate": "2019-08-24",
  • "sentNotes": "string",
  • "customStatus": true,
  • "customStatusDate": "2019-08-24",
  • "customStatusName": "string",
  • "customStatusNotes": "string",
  • "finalized": true,
  • "finalizedDate": "2019-08-24",
  • "cancelled": true,
  • "cancelledDate": "2019-08-24",
  • "cancellationReason": "string",
  • "parentId": "string",
  • "createdAt": "2019-08-24T14:15:22Z"
}

Download document PDF

Returns the PDF for a document as a binary response.

Use ?disposition=inline to render the PDF inline in a browser (default is attachment which forces a download).

For cancelled invoices, the cancellation PDF lives at GET /documents/{id}/cancellation/pdf.

Authorizations:
bearerAuth
path Parameters
id
required
string

Document ID

query Parameters
disposition
string
Default: "attachment"
Enum: "attachment" "inline"

Controls the Content-Disposition header.

Responses

Response samples

Content type
application/json
{
  • "error": "Request body is required"
}

Download document XML

Returns the standalone XRechnung (UBL Invoice) XML for a document as a text response.

Only available for documents created with exportType: 'xrechnung'. For Factur-X documents the XML is embedded in the PDF — use GET /documents/{id}/pdf instead.

For cancelled invoices, the cancellation XRechnung XML lives at GET /documents/{id}/cancellation/xml.

Authorizations:
bearerAuth
path Parameters
id
required
string

Document ID

query Parameters
disposition
string
Default: "attachment"
Enum: "attachment" "inline"

Controls the Content-Disposition header.

Responses

Response samples

Content type
application/json
{
  • "error": "Request body is required"
}

Download cancellation PDF

Returns the cancellation-invoice PDF (Stornorechnung) for a cancelled invoice as a binary response.

The cancellation PDF is a separate artifact, generated by POST /documents/{id}/cancel. Only available for invoices that have already been cancelled (cancelled: true).

Use ?disposition=inline to render the PDF inline in a browser (default is attachment which forces a download).

Authorizations:
bearerAuth
path Parameters
id
required
string

Document ID

query Parameters
disposition
string
Default: "attachment"
Enum: "attachment" "inline"

Controls the Content-Disposition header.

Responses

Response samples

Content type
application/json
{
  • "error": "Request body is required"
}

Download cancellation XML

Returns the standalone XRechnung (UBL Invoice) XML for a cancelled invoice as a text response.

The cancellation XML is a separate artifact, generated by POST /documents/{id}/cancel. Only available for cancelled invoices that were created with exportType: 'xrechnung'.

Use ?disposition=inline to render the XML inline in a browser.

Authorizations:
bearerAuth
path Parameters
id
required
string

Document ID

query Parameters
disposition
string
Default: "attachment"
Enum: "attachment" "inline"

Controls the Content-Disposition header.

Responses

Response samples

Content type
application/json
{
  • "error": "Request body is required"
}

Contacts

List contacts

Returns a paginated list of contacts (clients) for the authenticated company. Results are sorted by createdAt descending and include a lightweight subset of fields.

Authorizations:
bearerAuth
query Parameters
limit
integer [ 1 .. 100 ]
Default: 20

Number of results per page (max 100)

skip
integer >= 0
Default: 0

Number of results to skip for pagination

Responses

Response samples

Content type
application/json
{
  • "results": [
    ],
  • "total": 0,
  • "limit": 0,
  • "skip": 0,
  • "hasMore": true
}

Create a contact

Creates a new contact (client) for the authenticated company. The name field is required. All other fields are optional.

If clientNumber is provided, it must be unique across the company's contacts. The API does not auto-generate a clientNumber.

Authorizations:
bearerAuth
Request Body schema: application/json
required
name
required
string

Primary contact name (required)

name2
string

Secondary name line

clientNumber
string

Human-readable contact number. Must be unique within the company if set. Not auto-generated by the API.

creditorNumber
string
debtorNumber
string
address1
string
address2
string
address3
string
countryCode
string

ISO 3166-1 alpha-2 country code (supported EU + CH + GB set)

contactPerson
string
email
string <email>
phone
string
taxNumber
string
vatRegulation
string
Enum: "standard" "reverse-charge" "intra-community-supply"
notes
string
object

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "name2": "string",
  • "clientNumber": "string",
  • "creditorNumber": "string",
  • "debtorNumber": "string",
  • "address1": "string",
  • "address2": "string",
  • "address3": "string",
  • "countryCode": "string",
  • "contactPerson": "string",
  • "email": "user@example.com",
  • "phone": "string",
  • "taxNumber": "string",
  • "vatRegulation": "standard",
  • "notes": "string",
  • "customFields": {
    }
}

Response samples

Content type
application/json
{
  • "id": "AbCdEf1234",
  • "type": "client",
  • "name": "Muster GmbH",
  • "name2": "Abteilung Einkauf",
  • "clientNumber": "1042",
  • "creditorNumber": "string",
  • "debtorNumber": "string",
  • "address1": "Musterstraße 1",
  • "address2": "12345 Berlin",
  • "address3": "string",
  • "countryCode": "DE",
  • "contactPerson": "Max Mustermann",
  • "email": "contact@example.com",
  • "phone": "+49 30 123456",
  • "taxNumber": "DE123456789",
  • "vatRegulation": "standard",
  • "notes": "string",
  • "customFields": {
    },
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Get a contact

Returns a single contact with all fields.

Authorizations:
bearerAuth
path Parameters
id
required
string

Contact ID

Responses

Response samples

Content type
application/json
{
  • "id": "AbCdEf1234",
  • "type": "client",
  • "name": "Muster GmbH",
  • "name2": "Abteilung Einkauf",
  • "clientNumber": "1042",
  • "creditorNumber": "string",
  • "debtorNumber": "string",
  • "address1": "Musterstraße 1",
  • "address2": "12345 Berlin",
  • "address3": "string",
  • "countryCode": "DE",
  • "contactPerson": "Max Mustermann",
  • "email": "contact@example.com",
  • "phone": "+49 30 123456",
  • "taxNumber": "DE123456789",
  • "vatRegulation": "standard",
  • "notes": "string",
  • "customFields": {
    },
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Update a contact

Partially updates a contact. All fields are optional. If clientNumber is changed, it must remain unique across the company's contacts.

Immutable fields (id, type, createdAt, updatedAt) cannot be changed.

Authorizations:
bearerAuth
path Parameters
id
required
string

Contact ID

Request Body schema: application/json
required
name
string
name2
string
clientNumber
string

If changed, must remain unique within the company.

creditorNumber
string
debtorNumber
string
address1
string
address2
string
address3
string
countryCode
string

ISO 3166-1 alpha-2 country code (supported EU + CH + GB set)

contactPerson
string
email
string <email>
phone
string
taxNumber
string
vatRegulation
string
Enum: "standard" "reverse-charge" "intra-community-supply"
notes
string
object

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "name2": "string",
  • "clientNumber": "string",
  • "creditorNumber": "string",
  • "debtorNumber": "string",
  • "address1": "string",
  • "address2": "string",
  • "address3": "string",
  • "countryCode": "string",
  • "contactPerson": "string",
  • "email": "user@example.com",
  • "phone": "string",
  • "taxNumber": "string",
  • "vatRegulation": "standard",
  • "notes": "string",
  • "customFields": {
    }
}

Response samples

Content type
application/json
{
  • "id": "AbCdEf1234",
  • "type": "client",
  • "name": "Muster GmbH",
  • "name2": "Abteilung Einkauf",
  • "clientNumber": "1042",
  • "creditorNumber": "string",
  • "debtorNumber": "string",
  • "address1": "Musterstraße 1",
  • "address2": "12345 Berlin",
  • "address3": "string",
  • "countryCode": "DE",
  • "contactPerson": "Max Mustermann",
  • "email": "contact@example.com",
  • "phone": "+49 30 123456",
  • "taxNumber": "DE123456789",
  • "vatRegulation": "standard",
  • "notes": "string",
  • "customFields": {
    },
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Delete a contact

Permanently deletes a contact. An audit log entry is recorded. Existing documents that reference the contact retain their embedded client snapshot and are not affected.

Authorizations:
bearerAuth
path Parameters
id
required
string

Contact ID

Responses

Response samples

Content type
application/json
{
  • "message": "Unauthorized"
}

Products

List products

Returns a paginated list of products for the authenticated company. Results are sorted by createdAt descending and include a lightweight subset of fields.

Authorizations:
bearerAuth
query Parameters
limit
integer [ 1 .. 100 ]
Default: 20

Number of results per page (max 100)

skip
integer >= 0
Default: 0

Number of results to skip for pagination

Responses

Response samples

Content type
application/json
{
  • "results": [
    ],
  • "total": 0,
  • "limit": 0,
  • "skip": 0,
  • "hasMore": true
}

Create a product

Creates a new product for the authenticated company. The title field is required. All other fields are optional.

Either netPrice or grossPrice may be provided (not both). If grossPrice is provided, vatRate is required and the API will compute and store the netPrice. grossPrice is never stored or returned.

Authorizations:
bearerAuth
Request Body schema: application/json
required
title
required
string

Primary product name (required)

title2
string

Secondary name / subtitle

netPrice
number <double>

Net unit price. Mutually exclusive with grossPrice.

grossPrice
number <double>

Gross unit price (VAT included). The API computes and stores the corresponding netPrice using vatRate. Never stored or returned. Mutually exclusive with netPrice.

vatRate
number <double> [ 0 .. 100 ]

VAT rate as a percentage (0–100). Required if grossPrice is provided.

unit
string
barcode
string
notes
string

Responses

Request samples

Content type
application/json
{
  • "title": "string",
  • "title2": "string",
  • "netPrice": 0.1,
  • "grossPrice": 0.1,
  • "vatRate": 100,
  • "unit": "string",
  • "barcode": "string",
  • "notes": "string"
}

Response samples

Content type
application/json
{
  • "id": "AbCdEf1234",
  • "title": "Beratungsstunde",
  • "title2": "Senior Consulting",
  • "netPrice": 150,
  • "vatRate": 19,
  • "unit": "h",
  • "barcode": "string",
  • "notes": "string",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Get a product

Returns a single product with all fields.

Authorizations:
bearerAuth
path Parameters
id
required
string

Product ID

Responses

Response samples

Content type
application/json
{
  • "id": "AbCdEf1234",
  • "title": "Beratungsstunde",
  • "title2": "Senior Consulting",
  • "netPrice": 150,
  • "vatRate": 19,
  • "unit": "h",
  • "barcode": "string",
  • "notes": "string",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Update a product

Partially updates a product. All fields are optional.

Either netPrice or grossPrice may be provided (not both). If grossPrice is provided without vatRate in the same body, the product's currently stored vatRate will be used for the net-price conversion.

Immutable fields (id, createdAt, updatedAt) cannot be changed.

Authorizations:
bearerAuth
path Parameters
id
required
string

Product ID

Request Body schema: application/json
required
title
string
title2
string
netPrice
number <double>
grossPrice
number <double>

Gross unit price (VAT included). The API computes and stores the corresponding netPrice. Never stored or returned.

vatRate
number <double> [ 0 .. 100 ]
unit
string
barcode
string
notes
string

Responses

Request samples

Content type
application/json
{
  • "title": "string",
  • "title2": "string",
  • "netPrice": 0.1,
  • "grossPrice": 0.1,
  • "vatRate": 100,
  • "unit": "string",
  • "barcode": "string",
  • "notes": "string"
}

Response samples

Content type
application/json
{
  • "id": "AbCdEf1234",
  • "title": "Beratungsstunde",
  • "title2": "Senior Consulting",
  • "netPrice": 150,
  • "vatRate": 19,
  • "unit": "h",
  • "barcode": "string",
  • "notes": "string",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "updatedAt": "2019-08-24T14:15:22Z"
}

Delete a product

Permanently deletes a product. An audit log entry is recorded. Existing documents that reference the product retain their line snapshots and are not affected.

Authorizations:
bearerAuth
path Parameters
id
required
string

Product ID

Responses

Response samples

Content type
application/json
{
  • "message": "Unauthorized"
}