API & AI
API reference
All endpoints of the REST API with parameters and responses, generated from the OpenAPI description.
This reference is generated from the OpenAPI description of a running Annuva instance. Your own instance publishes the same document at /api/v1/openapi. Authentication and conventions are described in REST API.
Click an endpoint to see its parameters and response.
billing
POST/api/v1/billing/runRecurring billing run (draft invoices from due recurring charges)
Recurring billing run (draft invoices from due recurring charges)
Parameters
dryRun | body | boolean | |
until | body | string (date) |
Response
- 200OK
object
customers
GET/api/v1/customersList customers
List customers
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: Customer[], limit: integer, offset: integer, total: integer}
POST/api/v1/customersCreate customer
Create customer
Parameters
namerequired | body | string | |
channel | body | "direct" | "partner" | "own_project" | "internal" | |
partnerId | body | string (uuid) | null | |
status | body | "active" | "paused" | "inactive" | "in_preparation" | |
language | body | "de" | "en" | |
contactName | body | string | null | |
email | body | string (email) | null | |
phone | body | string | null | |
billingAddress | body | string | null | |
vatId | body | string | null | |
hourlyRate | body | number | null | |
hostingSummary | body | string | null | |
notes | body | string | null |
Response
- 201Created
Customer
GET/api/v1/customers/{id}Get customer
Get customer
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
Customer
PATCH/api/v1/customers/{id}Update customer
Update customer
Parameters
idrequired | path | string (uuid) | |
name | body | string | |
channel | body | "direct" | "partner" | "own_project" | "internal" | |
partnerId | body | string (uuid) | null | |
status | body | "active" | "paused" | "inactive" | "in_preparation" | |
language | body | "de" | "en" | |
contactName | body | string | null | |
email | body | string (email) | null | |
phone | body | string | null | |
billingAddress | body | string | null | |
vatId | body | string | null | |
hourlyRate | body | number | null | |
hostingSummary | body | string | null | |
notes | body | string | null |
Response
- 200OK
Customer
DELETE/api/v1/customers/{id}Delete customer
Delete customer
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
POST/api/v1/customers/{id}/archiveArchive customer
Archive customer
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
Customer
DELETE/api/v1/customers/{id}/archiveRestore archived customer
Restore archived customer
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
Customer
dashboard
GET/api/v1/dashboardDashboard data
Dashboard data
Parameters
year | query | integer | |
customer | query | string (uuid) |
Response
- 200OK
object
expenses
GET/api/v1/expensesList expenses
List expenses
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: Expense[], limit: integer, offset: integer, total: integer}
POST/api/v1/expensesCreate expense
Create expense
Parameters
daterequired | body | string | |
vendorrequired | body | string | |
itemrequired | body | string | |
categoryrequired | body | "server" | "domain" | "package" | "license" | "hardware" | "software" | "service" | "travel" | "office" | "other" | |
assignedTorequired | body | string (uuid) | |
grossAmountrequired | body | number | |
originalAmount | body | number | null | |
originalCurrency | body | string | null | |
status | body | "receipt" | "expected" | "planned" | |
receiptFileId | body | string (uuid) | null |
Response
- 201Created
Expense
GET/api/v1/expenses/{id}Get expense
Get expense
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
Expense
PATCH/api/v1/expenses/{id}Update expense
Update expense
Parameters
idrequired | path | string (uuid) | |
date | body | string | |
vendor | body | string | |
item | body | string | |
category | body | "server" | "domain" | "package" | "license" | "hardware" | "software" | "service" | "travel" | "office" | "other" | |
assignedTo | body | string (uuid) | |
grossAmount | body | number | |
originalAmount | body | number | null | |
originalCurrency | body | string | null | |
status | body | "receipt" | "expected" | "planned" | |
receiptFileId | body | string (uuid) | null |
Response
- 200OK
Expense
DELETE/api/v1/expenses/{id}Delete expense
Delete expense
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
files
POST/api/v1/filesUpload a file
Upload a file
Parameters
file | body | string (binary) |
Response
- 201Stored file
object
GET/api/v1/files/{id}Download a file
Download a file
Parameters
idrequired | path | string (uuid) |
Response
- 200File content
invoice-templates
GET/api/v1/invoice-templatesList invoiceTemplates
List invoiceTemplates
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: InvoiceTemplate[], limit: integer, offset: integer, total: integer}
POST/api/v1/invoice-templatesCreate invoice template
Create invoice template
Parameters
namerequired | body | string | |
isDefault | body | boolean | null | |
logoFileId | body | string (uuid) | null | |
senderLine | body | string | null | |
introText | body | string | null | |
closingText | body | string | null | |
signatureFileId | body | string (uuid) | null | |
signatureName | body | string | null | |
footerLeft | body | string | null | |
footerCenter | body | string | null | |
footerRight | body | string | null | |
accentColor | body | string | null | |
paymentTermDays | body | integer |
Response
- 201Created
InvoiceTemplate
GET/api/v1/invoice-templates/{id}Get invoice template
Get invoice template
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
InvoiceTemplate
PATCH/api/v1/invoice-templates/{id}Update invoice template
Update invoice template
Parameters
idrequired | path | string (uuid) | |
name | body | string | |
isDefault | body | boolean | null | |
logoFileId | body | string (uuid) | null | |
senderLine | body | string | null | |
introText | body | string | null | |
closingText | body | string | null | |
signatureFileId | body | string (uuid) | null | |
signatureName | body | string | null | |
footerLeft | body | string | null | |
footerCenter | body | string | null | |
footerRight | body | string | null | |
accentColor | body | string | null | |
paymentTermDays | body | integer |
Response
- 200OK
InvoiceTemplate
DELETE/api/v1/invoice-templates/{id}Delete invoice template
Delete invoice template
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
POST/api/v1/invoice-templates/previewPreview an invoice template – also unsaved values – as a sample invoice (admin)
Preview an invoice template – also unsaved values – as a sample invoice (admin)
Parameters
name | body | string | |
isDefault | body | boolean | null | |
logoFileId | body | string (uuid) | null | |
senderLine | body | string | null | |
introText | body | string | null | |
closingText | body | string | null | |
signatureFileId | body | string (uuid) | null | |
signatureName | body | string | null | |
footerLeft | body | string | null | |
footerCenter | body | string | null | |
footerRight | body | string | null | |
accentColor | body | string | null | |
paymentTermDays | body | integer |
Response
- 200Sample invoice as PDF
invoices
GET/api/v1/invoicesList invoices
List invoices
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: Invoice[], limit: integer, offset: integer, total: integer}
POST/api/v1/invoicesCreate draft invoice
Create draft invoice
Parameters
customerIdrequired | body | string (uuid) | |
descriptionrequired | body | string | |
dueDate | body | string | null | |
language | body | "de" | "en" | |
linesrequired | body | object[] | |
notes | body | string | null | |
partnerId | body | string (uuid) | null | |
recipientType | body | "customer" | "partner" | |
serviceDateFrom | body | string | null | |
serviceDateTo | body | string | null | |
templateId | body | string (uuid) | null |
Response
- 201Draft created
Invoice
GET/api/v1/invoices/{id}Get invoice
Get invoice
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
Invoice
PATCH/api/v1/invoices/{id}Update draft invoice
Update draft invoice
Parameters
idrequired | path | string (uuid) | |
customerId | body | string (uuid) | |
description | body | string | |
dueDate | body | string | null | |
language | body | "de" | "en" | |
lines | body | object[] | |
notes | body | string | null | |
partnerId | body | string (uuid) | null | |
recipientType | body | "customer" | "partner" | |
serviceDateFrom | body | string | null | |
serviceDateTo | body | string | null | |
templateId | body | string (uuid) | null |
Response
- 200OK
Invoice
DELETE/api/v1/invoices/{id}Delete draft invoice
Delete draft invoice
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
POST/api/v1/invoices/{id}/issueIssue invoice (number, PDF)
Issue invoice (number, PDF)
Parameters
idrequired | path | string (uuid) | |
date | body | string (date) |
Response
- 200OK
Invoice
POST/api/v1/invoices/{id}/payMark as paid
Mark as paid
Parameters
idrequired | path | string (uuid) | |
paidAt | body | string (date) |
Response
- 200OK
Invoice
POST/api/v1/invoices/{id}/reopenPaid → open
Paid → open
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
Invoice
POST/api/v1/invoices/{id}/cancelCancel via cancellation invoice
Cancel via cancellation invoice
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
Invoice
POST/api/v1/invoices/{id}/sendSend by e-mail
Send by e-mail
Parameters
idrequired | path | string (uuid) | |
message | body | string | |
to | body | string (email) |
Response
- 200OK
Invoice
POST/api/v1/invoices/{id}/remindSend payment reminder
Send payment reminder
Parameters
idrequired | path | string (uuid) | |
message | body | string | |
to | body | string (email) |
Response
- 200OK
Invoice
GET/api/v1/invoices/{id}/pdfInvoice PDF (draft preview or stored PDF)
Invoice PDF (draft preview or stored PDF)
Parameters
idrequired | path | string (uuid) |
Response
- 200PDF
offers
GET/api/v1/offersList offers
List offers
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: Offer[], limit: integer, offset: integer, total: integer}
POST/api/v1/offersCreate offer
Create offer
Parameters
customerIdrequired | body | string (uuid) | |
numberrequired | body | string | |
daterequired | body | string | |
validUntil | body | string | null | |
amountrequired | body | number | |
status | body | "open" | "accepted" | "rejected" | |
description | body | string | null | |
fileId | body | string (uuid) | null |
Response
- 201Created
Offer
GET/api/v1/offers/{id}Get offer
Get offer
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
Offer
PATCH/api/v1/offers/{id}Update offer
Update offer
Parameters
idrequired | path | string (uuid) | |
customerId | body | string (uuid) | |
number | body | string | |
date | body | string | |
validUntil | body | string | null | |
amount | body | number | |
status | body | "open" | "accepted" | "rejected" | |
description | body | string | null | |
fileId | body | string (uuid) | null |
Response
- 200OK
Offer
DELETE/api/v1/offers/{id}Delete offer
Delete offer
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
partners
GET/api/v1/partnersList partners
List partners
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: Partner[], limit: integer, offset: integer, total: integer}
POST/api/v1/partnersCreate partner
Create partner
Parameters
namerequired | body | string | |
email | body | string (email) | null | |
billingAddress | body | string | null | |
notes | body | string | null |
Response
- 201Created
Partner
GET/api/v1/partners/{id}Get partner
Get partner
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
Partner
PATCH/api/v1/partners/{id}Update partner
Update partner
Parameters
idrequired | path | string (uuid) | |
name | body | string | |
email | body | string (email) | null | |
billingAddress | body | string | null | |
notes | body | string | null |
Response
- 200OK
Partner
DELETE/api/v1/partners/{id}Delete partner
Delete partner
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
profile
GET/api/v1/profileOwn profile
Own profile
Parameters
No parameters.
Response
- 200OK
object
PATCH/api/v1/profileUpdate own profile
Update own profile
Parameters
No parameters.
Response
- 200OK
object
GET/api/v1/profile/two-factorTwo-factor status of the own account
Two-factor status of the own account
Parameters
No parameters.
Response
- 200OK
{enabled: boolean, recoveryCodesLeft: integer}
GET/api/v1/tokensOwn API tokens
Own API tokens
Parameters
No parameters.
Response
- 200OK
object
POST/api/v1/tokensCreate API token
Create API token
Parameters
No parameters.
Response
- 201Token (shown once)
recurring-charges
GET/api/v1/recurring-chargesList recurringCharges
List recurringCharges
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: RecurringCharge[], limit: integer, offset: integer, total: integer}
POST/api/v1/recurring-chargesCreate recurring charge
Create recurring charge
Parameters
customerIdrequired | body | string (uuid) | |
servicerequired | body | "hosting" | "domain" | "package" | "maintenance" | "other" | |
description | body | string | null | |
amountPerYearrequired | body | number | |
interval | body | "yearly" | "quarterly" | "monthly" | |
nextInvoiceDaterequired | body | string | |
startsAfterSetup | body | boolean | null |
Response
- 201Created
RecurringCharge
GET/api/v1/recurring-charges/{id}Get recurring charge
Get recurring charge
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
RecurringCharge
PATCH/api/v1/recurring-charges/{id}Update recurring charge
Update recurring charge
Parameters
idrequired | path | string (uuid) | |
customerId | body | string (uuid) | |
service | body | "hosting" | "domain" | "package" | "maintenance" | "other" | |
description | body | string | null | |
amountPerYear | body | number | |
interval | body | "yearly" | "quarterly" | "monthly" | |
nextInvoiceDate | body | string | |
startsAfterSetup | body | boolean | null |
Response
- 200OK
RecurringCharge
DELETE/api/v1/recurring-charges/{id}Delete recurring charge
Delete recurring charge
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
recurring-costs
GET/api/v1/recurring-costsList recurringCosts
List recurringCosts
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: RecurringCost[], limit: integer, offset: integer, total: integer}
POST/api/v1/recurring-costsCreate recurring cost
Create recurring cost
Parameters
namerequired | body | string | |
typerequired | body | "domain" | "package" | "server" | "other" | |
providerrequired | body | string | |
assignedTorequired | body | string (uuid) | |
costPerYearrequired | body | number | |
rebilledPerYear | body | number | |
nextRenewal | body | string | null | |
autoRenew | body | boolean | null | |
endsAt | body | string | null |
Response
- 201Created
RecurringCost
GET/api/v1/recurring-costs/{id}Get recurring cost
Get recurring cost
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
RecurringCost
PATCH/api/v1/recurring-costs/{id}Update recurring cost
Update recurring cost
Parameters
idrequired | path | string (uuid) | |
name | body | string | |
type | body | "domain" | "package" | "server" | "other" | |
provider | body | string | |
assignedTo | body | string (uuid) | |
costPerYear | body | number | |
rebilledPerYear | body | number | |
nextRenewal | body | string | null | |
autoRenew | body | boolean | null | |
endsAt | body | string | null |
Response
- 200OK
RecurringCost
DELETE/api/v1/recurring-costs/{id}Delete recurring cost
Delete recurring cost
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
resources
GET/api/v1/resourcesList resources
List resources
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: Resource[], limit: integer, offset: integer, total: integer}
POST/api/v1/resourcesCreate resource
Create resource
Parameters
customerIdrequired | body | string (uuid) | |
kindrequired | body | "domain" | "container" | "proxy_host" | "package" | "server" | "other" | |
namerequired | body | string | |
location | body | string | null | |
details | body | string | null | |
externalRef | body | string | null |
Response
- 201Created
Resource
GET/api/v1/resources/{id}Get resource
Get resource
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
Resource
PATCH/api/v1/resources/{id}Update resource
Update resource
Parameters
idrequired | path | string (uuid) | |
customerId | body | string (uuid) | |
kind | body | "domain" | "container" | "proxy_host" | "package" | "server" | "other" | |
name | body | string | |
location | body | string | null | |
details | body | string | null | |
externalRef | body | string | null |
Response
- 200OK
Resource
DELETE/api/v1/resources/{id}Delete resource
Delete resource
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
settings
GET/api/v1/settingsBusiness settings
Business settings
Parameters
No parameters.
Response
- 200OK
Settings
PATCH/api/v1/settingsUpdate settings (admin)
Update settings (admin)
Parameters
name | body | string | |
companyName | body | string | null | |
address | body | string | null | |
email | body | string (email) | null | |
phone | body | string | null | |
website | body | string | null | |
taxNumber | body | string | null | |
vatId | body | string | null | |
bankName | body | string | null | |
iban | body | string | null | |
bic | body | string | null | |
vatMode | body | "small_business" | "regular" | |
defaultVatRate | body | number | |
currency | body | string | |
locale | body | "de-DE" | "de-AT" | "de-CH" | "en-GB" | "en-US" | |
timezone | body | string | |
defaultHourlyRate | body | number | |
defaultHostingPerYear | body | number | |
invoiceNumberFormat | body | string | |
recurringInvoiceMonth | body | integer | |
taxPaymentMonth | body | integer | |
serverCostAllocation | body | "equal_among_hosting_customers" | "none" | |
domainPassThrough | body | "at_cost" | "markup" |
Response
- 200OK
Settings
system
GET/api/healthHealth check
Health check
Parameters
No parameters.
Response
- 200Healthy
POST/api/mcpMCP server (Streamable HTTP, JSON-RPC)
MCP server (Streamable HTTP, JSON-RPC)
Parameters
No parameters.
Response
- 200MCP response
tasks
GET/api/v1/tasksList tasks
List tasks
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: Task[], limit: integer, offset: integer, total: integer}
POST/api/v1/tasksCreate task
Create task
Parameters
titlerequired | body | string | |
dueDate | body | string | null | |
customerId | body | string (uuid) | null | |
status | body | "open" | "waiting_for_go" | "done" | |
note | body | string | null |
Response
- 201Created
Task
GET/api/v1/tasks/{id}Get task
Get task
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
Task
PATCH/api/v1/tasks/{id}Update task
Update task
Parameters
idrequired | path | string (uuid) | |
title | body | string | |
dueDate | body | string | null | |
customerId | body | string (uuid) | null | |
status | body | "open" | "waiting_for_go" | "done" | |
note | body | string | null |
Response
- 200OK
Task
DELETE/api/v1/tasks/{id}Delete task
Delete task
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
tax-adjustments
GET/api/v1/tax-adjustmentsList taxAdjustments
List taxAdjustments
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: TaxAdjustment[], limit: integer, offset: integer, total: integer}
POST/api/v1/tax-adjustmentsCreate tax adjustment
Create tax adjustment
Parameters
yearrequired | body | integer | |
descriptionrequired | body | string | |
profitAdjustmentrequired | body | number |
Response
- 201Created
TaxAdjustment
GET/api/v1/tax-adjustments/{id}Get tax adjustment
Get tax adjustment
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
TaxAdjustment
PATCH/api/v1/tax-adjustments/{id}Update tax adjustment
Update tax adjustment
Parameters
idrequired | path | string (uuid) | |
year | body | integer | |
description | body | string | |
profitAdjustment | body | number |
Response
- 200OK
TaxAdjustment
DELETE/api/v1/tax-adjustments/{id}Delete tax adjustment
Delete tax adjustment
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
tax-years
GET/api/v1/tax-yearsList taxYears
List taxYears
Parameters
limit | query | integer | |
offset | query | integer | |
sort | query | string | |
order | query | "asc" | "desc" | |
q | query | string | |
customerId | query | string (uuid) | |
filter[field] | query | string | Equality filter, e.g. filter[status]=open |
Response
- 200OK
{items: TaxYear[], limit: integer, offset: integer, total: integer}
POST/api/v1/tax-yearsCreate tax year
Create tax year
Parameters
yearrequired | body | integer | |
marginalRatePercent | body | number | null | |
profitPerAssessment | body | number | null |
Response
- 201Created
TaxYear
GET/api/v1/tax-years/{id}Get tax year
Get tax year
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
TaxYear
PATCH/api/v1/tax-years/{id}Update tax year
Update tax year
Parameters
idrequired | path | string (uuid) | |
year | body | integer | |
marginalRatePercent | body | number | null | |
profitPerAssessment | body | number | null |
Response
- 200OK
TaxYear
DELETE/api/v1/tax-years/{id}Delete tax year
Delete tax year
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
users
GET/api/v1/usersList users (admin)
List users (admin)
Parameters
No parameters.
Response
- 200OK
object
POST/api/v1/usersCreate user (admin)
Create user (admin)
Parameters
No parameters.
Response
- 201Created
PATCH/api/v1/users/{id}Update user (admin)
Update user (admin)
Parameters
idrequired | path | string (uuid) |
Response
- 200OK
object
DELETE/api/v1/users/{id}Delete user (admin)
Delete user (admin)
Parameters
idrequired | path | string (uuid) |
Response
- 204Deleted
DELETE/api/v1/users/{id}/two-factorReset two-factor authentication of a user (admin)
Reset two-factor authentication of a user (admin)
Parameters
idrequired | path | string (uuid) |
Response
- 204Two-factor authentication switched off