Skip to content
Annuva
Documentation · API reference

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.

API version 1.3.0

billing

POST/api/v1/billing/run

Recurring billing run (draft invoices from due recurring charges)

Parameters

dryRunbodyboolean
untilbodystring (date)

Response

  • 200OKobject

customers

GET/api/v1/customers

List customers

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: Customer[], limit: integer, offset: integer, total: integer}
POST/api/v1/customers

Create customer

Parameters

namerequiredbodystring
channelbody"direct" | "partner" | "own_project" | "internal"
partnerIdbodystring (uuid) | null
statusbody"active" | "paused" | "inactive" | "in_preparation"
languagebody"de" | "en"
contactNamebodystring | null
emailbodystring (email) | null
phonebodystring | null
billingAddressbodystring | null
vatIdbodystring | null
hourlyRatebodynumber | null
hostingSummarybodystring | null
notesbodystring | null

Response

  • 201CreatedCustomer
GET/api/v1/customers/{id}

Get customer

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKCustomer
PATCH/api/v1/customers/{id}

Update customer

Parameters

idrequiredpathstring (uuid)
namebodystring
channelbody"direct" | "partner" | "own_project" | "internal"
partnerIdbodystring (uuid) | null
statusbody"active" | "paused" | "inactive" | "in_preparation"
languagebody"de" | "en"
contactNamebodystring | null
emailbodystring (email) | null
phonebodystring | null
billingAddressbodystring | null
vatIdbodystring | null
hourlyRatebodynumber | null
hostingSummarybodystring | null
notesbodystring | null

Response

  • 200OKCustomer
DELETE/api/v1/customers/{id}

Delete customer

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted
POST/api/v1/customers/{id}/archive

Archive customer

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKCustomer
DELETE/api/v1/customers/{id}/archive

Restore archived customer

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKCustomer

dashboard

GET/api/v1/dashboard

Dashboard data

Parameters

yearqueryinteger
customerquerystring (uuid)

Response

  • 200OKobject

expenses

GET/api/v1/expenses

List expenses

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: Expense[], limit: integer, offset: integer, total: integer}
POST/api/v1/expenses

Create expense

Parameters

daterequiredbodystring
vendorrequiredbodystring
itemrequiredbodystring
categoryrequiredbody"server" | "domain" | "package" | "license" | "hardware" | "software" | "service" | "travel" | "office" | "other"
assignedTorequiredbodystring (uuid)
grossAmountrequiredbodynumber
originalAmountbodynumber | null
originalCurrencybodystring | null
statusbody"receipt" | "expected" | "planned"
receiptFileIdbodystring (uuid) | null

Response

  • 201CreatedExpense
GET/api/v1/expenses/{id}

Get expense

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKExpense
PATCH/api/v1/expenses/{id}

Update expense

Parameters

idrequiredpathstring (uuid)
datebodystring
vendorbodystring
itembodystring
categorybody"server" | "domain" | "package" | "license" | "hardware" | "software" | "service" | "travel" | "office" | "other"
assignedTobodystring (uuid)
grossAmountbodynumber
originalAmountbodynumber | null
originalCurrencybodystring | null
statusbody"receipt" | "expected" | "planned"
receiptFileIdbodystring (uuid) | null

Response

  • 200OKExpense
DELETE/api/v1/expenses/{id}

Delete expense

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted

files

POST/api/v1/files

Upload a file

Parameters

filebodystring (binary)

Response

  • 201Stored fileobject
GET/api/v1/files/{id}

Download a file

Parameters

idrequiredpathstring (uuid)

Response

  • 200File content

invoice-templates

GET/api/v1/invoice-templates

List invoiceTemplates

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: InvoiceTemplate[], limit: integer, offset: integer, total: integer}
POST/api/v1/invoice-templates

Create invoice template

Parameters

namerequiredbodystring
isDefaultbodyboolean | null
logoFileIdbodystring (uuid) | null
senderLinebodystring | null
introTextbodystring | null
closingTextbodystring | null
signatureFileIdbodystring (uuid) | null
signatureNamebodystring | null
footerLeftbodystring | null
footerCenterbodystring | null
footerRightbodystring | null
accentColorbodystring | null
paymentTermDaysbodyinteger

Response

  • 201CreatedInvoiceTemplate
GET/api/v1/invoice-templates/{id}

Get invoice template

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKInvoiceTemplate
PATCH/api/v1/invoice-templates/{id}

Update invoice template

Parameters

idrequiredpathstring (uuid)
namebodystring
isDefaultbodyboolean | null
logoFileIdbodystring (uuid) | null
senderLinebodystring | null
introTextbodystring | null
closingTextbodystring | null
signatureFileIdbodystring (uuid) | null
signatureNamebodystring | null
footerLeftbodystring | null
footerCenterbodystring | null
footerRightbodystring | null
accentColorbodystring | null
paymentTermDaysbodyinteger

Response

  • 200OKInvoiceTemplate
DELETE/api/v1/invoice-templates/{id}

Delete invoice template

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted
POST/api/v1/invoice-templates/preview

Preview an invoice template – also unsaved values – as a sample invoice (admin)

Parameters

namebodystring
isDefaultbodyboolean | null
logoFileIdbodystring (uuid) | null
senderLinebodystring | null
introTextbodystring | null
closingTextbodystring | null
signatureFileIdbodystring (uuid) | null
signatureNamebodystring | null
footerLeftbodystring | null
footerCenterbodystring | null
footerRightbodystring | null
accentColorbodystring | null
paymentTermDaysbodyinteger

Response

  • 200Sample invoice as PDF

invoices

GET/api/v1/invoices

List invoices

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: Invoice[], limit: integer, offset: integer, total: integer}
POST/api/v1/invoices

Create draft invoice

Parameters

customerIdrequiredbodystring (uuid)
descriptionrequiredbodystring
dueDatebodystring | null
languagebody"de" | "en"
linesrequiredbodyobject[]
notesbodystring | null
partnerIdbodystring (uuid) | null
recipientTypebody"customer" | "partner"
serviceDateFrombodystring | null
serviceDateTobodystring | null
templateIdbodystring (uuid) | null

Response

  • 201Draft createdInvoice
GET/api/v1/invoices/{id}

Get invoice

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKInvoice
PATCH/api/v1/invoices/{id}

Update draft invoice

Parameters

idrequiredpathstring (uuid)
customerIdbodystring (uuid)
descriptionbodystring
dueDatebodystring | null
languagebody"de" | "en"
linesbodyobject[]
notesbodystring | null
partnerIdbodystring (uuid) | null
recipientTypebody"customer" | "partner"
serviceDateFrombodystring | null
serviceDateTobodystring | null
templateIdbodystring (uuid) | null

Response

  • 200OKInvoice
DELETE/api/v1/invoices/{id}

Delete draft invoice

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted
POST/api/v1/invoices/{id}/issue

Issue invoice (number, PDF)

Parameters

idrequiredpathstring (uuid)
datebodystring (date)

Response

  • 200OKInvoice
POST/api/v1/invoices/{id}/pay

Mark as paid

Parameters

idrequiredpathstring (uuid)
paidAtbodystring (date)

Response

  • 200OKInvoice
POST/api/v1/invoices/{id}/reopen

Paid → open

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKInvoice
POST/api/v1/invoices/{id}/cancel

Cancel via cancellation invoice

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKInvoice
POST/api/v1/invoices/{id}/send

Send by e-mail

Parameters

idrequiredpathstring (uuid)
messagebodystring
tobodystring (email)

Response

  • 200OKInvoice
POST/api/v1/invoices/{id}/remind

Send payment reminder

Parameters

idrequiredpathstring (uuid)
messagebodystring
tobodystring (email)

Response

  • 200OKInvoice
GET/api/v1/invoices/{id}/pdf

Invoice PDF (draft preview or stored PDF)

Parameters

idrequiredpathstring (uuid)

Response

  • 200PDF

offers

GET/api/v1/offers

List offers

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: Offer[], limit: integer, offset: integer, total: integer}
POST/api/v1/offers

Create offer

Parameters

customerIdrequiredbodystring (uuid)
numberrequiredbodystring
daterequiredbodystring
validUntilbodystring | null
amountrequiredbodynumber
statusbody"open" | "accepted" | "rejected"
descriptionbodystring | null
fileIdbodystring (uuid) | null

Response

  • 201CreatedOffer
GET/api/v1/offers/{id}

Get offer

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKOffer
PATCH/api/v1/offers/{id}

Update offer

Parameters

idrequiredpathstring (uuid)
customerIdbodystring (uuid)
numberbodystring
datebodystring
validUntilbodystring | null
amountbodynumber
statusbody"open" | "accepted" | "rejected"
descriptionbodystring | null
fileIdbodystring (uuid) | null

Response

  • 200OKOffer
DELETE/api/v1/offers/{id}

Delete offer

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted

partners

GET/api/v1/partners

List partners

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: Partner[], limit: integer, offset: integer, total: integer}
POST/api/v1/partners

Create partner

Parameters

namerequiredbodystring
emailbodystring (email) | null
billingAddressbodystring | null
notesbodystring | null

Response

  • 201CreatedPartner
GET/api/v1/partners/{id}

Get partner

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKPartner
PATCH/api/v1/partners/{id}

Update partner

Parameters

idrequiredpathstring (uuid)
namebodystring
emailbodystring (email) | null
billingAddressbodystring | null
notesbodystring | null

Response

  • 200OKPartner
DELETE/api/v1/partners/{id}

Delete partner

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted

profile

GET/api/v1/profile

Own profile

Parameters

No parameters.

Response

  • 200OKobject
PATCH/api/v1/profile

Update own profile

Parameters

No parameters.

Response

  • 200OKobject
GET/api/v1/profile/two-factor

Two-factor status of the own account

Parameters

No parameters.

Response

  • 200OK{enabled: boolean, recoveryCodesLeft: integer}
GET/api/v1/tokens

Own API tokens

Parameters

No parameters.

Response

  • 200OKobject
POST/api/v1/tokens

Create API token

Parameters

No parameters.

Response

  • 201Token (shown once)

recurring-charges

GET/api/v1/recurring-charges

List recurringCharges

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: RecurringCharge[], limit: integer, offset: integer, total: integer}
POST/api/v1/recurring-charges

Create recurring charge

Parameters

customerIdrequiredbodystring (uuid)
servicerequiredbody"hosting" | "domain" | "package" | "maintenance" | "other"
descriptionbodystring | null
amountPerYearrequiredbodynumber
intervalbody"yearly" | "quarterly" | "monthly"
nextInvoiceDaterequiredbodystring
startsAfterSetupbodyboolean | null

Response

  • 201CreatedRecurringCharge
GET/api/v1/recurring-charges/{id}

Get recurring charge

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKRecurringCharge
PATCH/api/v1/recurring-charges/{id}

Update recurring charge

Parameters

idrequiredpathstring (uuid)
customerIdbodystring (uuid)
servicebody"hosting" | "domain" | "package" | "maintenance" | "other"
descriptionbodystring | null
amountPerYearbodynumber
intervalbody"yearly" | "quarterly" | "monthly"
nextInvoiceDatebodystring
startsAfterSetupbodyboolean | null

Response

  • 200OKRecurringCharge
DELETE/api/v1/recurring-charges/{id}

Delete recurring charge

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted

recurring-costs

GET/api/v1/recurring-costs

List recurringCosts

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: RecurringCost[], limit: integer, offset: integer, total: integer}
POST/api/v1/recurring-costs

Create recurring cost

Parameters

namerequiredbodystring
typerequiredbody"domain" | "package" | "server" | "other"
providerrequiredbodystring
assignedTorequiredbodystring (uuid)
costPerYearrequiredbodynumber
rebilledPerYearbodynumber
nextRenewalbodystring | null
autoRenewbodyboolean | null
endsAtbodystring | null

Response

  • 201CreatedRecurringCost
GET/api/v1/recurring-costs/{id}

Get recurring cost

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKRecurringCost
PATCH/api/v1/recurring-costs/{id}

Update recurring cost

Parameters

idrequiredpathstring (uuid)
namebodystring
typebody"domain" | "package" | "server" | "other"
providerbodystring
assignedTobodystring (uuid)
costPerYearbodynumber
rebilledPerYearbodynumber
nextRenewalbodystring | null
autoRenewbodyboolean | null
endsAtbodystring | null

Response

  • 200OKRecurringCost
DELETE/api/v1/recurring-costs/{id}

Delete recurring cost

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted

resources

GET/api/v1/resources

List resources

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: Resource[], limit: integer, offset: integer, total: integer}
POST/api/v1/resources

Create resource

Parameters

customerIdrequiredbodystring (uuid)
kindrequiredbody"domain" | "container" | "proxy_host" | "package" | "server" | "other"
namerequiredbodystring
locationbodystring | null
detailsbodystring | null
externalRefbodystring | null

Response

  • 201CreatedResource
GET/api/v1/resources/{id}

Get resource

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKResource
PATCH/api/v1/resources/{id}

Update resource

Parameters

idrequiredpathstring (uuid)
customerIdbodystring (uuid)
kindbody"domain" | "container" | "proxy_host" | "package" | "server" | "other"
namebodystring
locationbodystring | null
detailsbodystring | null
externalRefbodystring | null

Response

  • 200OKResource
DELETE/api/v1/resources/{id}

Delete resource

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted

settings

GET/api/v1/settings

Business settings

Parameters

No parameters.

Response

  • 200OKSettings
PATCH/api/v1/settings

Update settings (admin)

Parameters

namebodystring
companyNamebodystring | null
addressbodystring | null
emailbodystring (email) | null
phonebodystring | null
websitebodystring | null
taxNumberbodystring | null
vatIdbodystring | null
bankNamebodystring | null
ibanbodystring | null
bicbodystring | null
vatModebody"small_business" | "regular"
defaultVatRatebodynumber
currencybodystring
localebody"de-DE" | "de-AT" | "de-CH" | "en-GB" | "en-US"
timezonebodystring
defaultHourlyRatebodynumber
defaultHostingPerYearbodynumber
invoiceNumberFormatbodystring
recurringInvoiceMonthbodyinteger
taxPaymentMonthbodyinteger
serverCostAllocationbody"equal_among_hosting_customers" | "none"
domainPassThroughbody"at_cost" | "markup"

Response

  • 200OKSettings

system

GET/api/health

Health check

Parameters

No parameters.

Response

  • 200Healthy
POST/api/mcp

MCP server (Streamable HTTP, JSON-RPC)

Parameters

No parameters.

Response

  • 200MCP response

tasks

GET/api/v1/tasks

List tasks

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: Task[], limit: integer, offset: integer, total: integer}
POST/api/v1/tasks

Create task

Parameters

titlerequiredbodystring
dueDatebodystring | null
customerIdbodystring (uuid) | null
statusbody"open" | "waiting_for_go" | "done"
notebodystring | null

Response

  • 201CreatedTask
GET/api/v1/tasks/{id}

Get task

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKTask
PATCH/api/v1/tasks/{id}

Update task

Parameters

idrequiredpathstring (uuid)
titlebodystring
dueDatebodystring | null
customerIdbodystring (uuid) | null
statusbody"open" | "waiting_for_go" | "done"
notebodystring | null

Response

  • 200OKTask
DELETE/api/v1/tasks/{id}

Delete task

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted

tax-adjustments

GET/api/v1/tax-adjustments

List taxAdjustments

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: TaxAdjustment[], limit: integer, offset: integer, total: integer}
POST/api/v1/tax-adjustments

Create tax adjustment

Parameters

yearrequiredbodyinteger
descriptionrequiredbodystring
profitAdjustmentrequiredbodynumber

Response

  • 201CreatedTaxAdjustment
GET/api/v1/tax-adjustments/{id}

Get tax adjustment

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKTaxAdjustment
PATCH/api/v1/tax-adjustments/{id}

Update tax adjustment

Parameters

idrequiredpathstring (uuid)
yearbodyinteger
descriptionbodystring
profitAdjustmentbodynumber

Response

  • 200OKTaxAdjustment
DELETE/api/v1/tax-adjustments/{id}

Delete tax adjustment

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted

tax-years

GET/api/v1/tax-years

List taxYears

Parameters

limitqueryinteger
offsetqueryinteger
sortquerystring
orderquery"asc" | "desc"
qquerystring
customerIdquerystring (uuid)
filter[field]querystringEquality filter, e.g. filter[status]=open

Response

  • 200OK{items: TaxYear[], limit: integer, offset: integer, total: integer}
POST/api/v1/tax-years

Create tax year

Parameters

yearrequiredbodyinteger
marginalRatePercentbodynumber | null
profitPerAssessmentbodynumber | null

Response

  • 201CreatedTaxYear
GET/api/v1/tax-years/{id}

Get tax year

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKTaxYear
PATCH/api/v1/tax-years/{id}

Update tax year

Parameters

idrequiredpathstring (uuid)
yearbodyinteger
marginalRatePercentbodynumber | null
profitPerAssessmentbodynumber | null

Response

  • 200OKTaxYear
DELETE/api/v1/tax-years/{id}

Delete tax year

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted

users

GET/api/v1/users

List users (admin)

Parameters

No parameters.

Response

  • 200OKobject
POST/api/v1/users

Create user (admin)

Parameters

No parameters.

Response

  • 201Created
PATCH/api/v1/users/{id}

Update user (admin)

Parameters

idrequiredpathstring (uuid)

Response

  • 200OKobject
DELETE/api/v1/users/{id}

Delete user (admin)

Parameters

idrequiredpathstring (uuid)

Response

  • 204Deleted
DELETE/api/v1/users/{id}/two-factor

Reset two-factor authentication of a user (admin)

Parameters

idrequiredpathstring (uuid)

Response

  • 204Two-factor authentication switched off
Edit this page on GitHub