Skip to content

List dunning notices ​

Returns a paginated list of all dunning notices of the company, sorted by internal ID ascending.

Required license

This endpoint requires the Dunning add-on.

Request ​

GET /api/oauth/v2/resource/invoices/dunnings

HeaderValue
AuthorizationBearer {access_token}

Query parameters ​

ParameterTypeRequiredDescription
offsetintegerNoStart position (default: 0)
limitintegerNoNumber of results (default: 50, max: 200)
statusstringNoFilters by status. Allowed values: active, replaced, canceled, all. Comma-separated multiple values are supported, default all. See Conventions
dunningStatusstringNoFilters by the business dunning status. Allowed values: active, replaced, canceled, done
paidStatusstringNoFilters by payment status. Allowed values: open, paid

Required scope: dunnings

Note: An empty value (?status= or ?dunningStatus=) acts like no filter — the API returns the unfiltered list. An invalid value is rejected with 400 validation_error. status and dunningStatus are two different filters and are AND-combined: status is the technical soft-delete status from the Conventions, dunningStatus is the business escalation status.

Response ​

Success (200 OK) ​

json
{
  "data": [
    {
      "id": "c3d4e5f6-a7b8-9012-cdef-234567890123",
      "invoice": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "customer": "f0e1d2c3-b4a5-6789-fedc-ba9876543210",
      "status": "active",
      "text": "Dear Sir or Madam, we would like to remind you of the following open invoice.",
      "printedStatus": "unprinted",
      "paidStatus": "open",
      "dunningType": "7f8e9d0c-1b2a-3456-789a-bcdef0123456",
      "fee": "12.00",
      "latePaymentInterestRate": "4.00",
      "paymentDeadline": 14,
      "totalAmount": "122.35",
      "outstandingTotal": "122.35",
      "totalFee": "12.00",
      "outstandingFee": "12.00",
      "totalInterest": "0.35",
      "outstandingInterest": "0.35",
      "invoiceOutstandingBalance": "110.00",
      "interestCalculateStartDate": "2026-06-16",
      "interestCalculateEndDate": "2026-07-15",
      "createdAt": "2026-07-15T09:00:00+02:00",
      "updatedAt": "2026-07-15T09:00:00+02:00",
      "createdBy": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
      "updatedBy": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
      "deleted": false,
      "deletedAt": null,
      "deletedBy": null,
      "tenancy": "9a8b7c6d-5e4f-3210-9876-543210fedcba"
    },
    {
      "id": "d4e5f6a7-b8c9-0123-defa-345678901234",
      "invoice": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "customer": null,
      "status": "replaced",
      "text": "Dear Sir or Madam, despite our first reminder the invoice is still open.",
      "printedStatus": "printed",
      "paidStatus": "open",
      "dunningType": "0f6b1c4a-8d21-4b7e-9a33-5c81e2f40a17",
      "fee": "5.00",
      "latePaymentInterestRate": "4.00",
      "paymentDeadline": 7,
      "totalAmount": "55.00",
      "outstandingTotal": "55.00",
      "totalFee": "5.00",
      "outstandingFee": "5.00",
      "totalInterest": "0.00",
      "outstandingInterest": "0.00",
      "invoiceOutstandingBalance": "50.00",
      "interestCalculateStartDate": null,
      "interestCalculateEndDate": null,
      "createdAt": "2026-06-30T08:15:00+02:00",
      "updatedAt": "2026-07-15T09:00:00+02:00",
      "createdBy": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
      "updatedBy": "1a2b3c4d-5e6f-7890-abcd-ef1234567890",
      "deleted": false,
      "deletedAt": null,
      "deletedBy": null,
      "tenancy": null
    }
  ],
  "meta": {
    "total": 37,
    "offset": 0,
    "limit": 50
  }
}

Response fields ​

FieldTypeDescription
dataArrayList of dunning notices
data[].idstring (UUID) | nullUnique ID of the dunning notice
data[].invoicestring (UUID) | nullID of the dunned invoice, loadable via Get Invoice
data[].customerstring (UUID) | nullID of the customer, loadable via Get Customer
data[].statusstringTechnical status: active, replaced, canceled. See Conventions
data[].textstring | nullDunning text as printed on the letter to the customer
data[].printedStatusstringPrint status: printed, unprinted
data[].paidStatusstringPayment status: open, paid
data[].dunningTypestring (UUID) | nullID of the dunning level, loadable via Get dunning level
data[].feestringDunning fee of this dunning level
data[].latePaymentInterestRatestringLate payment interest rate in percent
data[].paymentDeadlineintegerPayment deadline in days
data[].totalAmountstringTotal amount of the dunning notice
data[].outstandingTotalstringOutstanding total amount
data[].totalFeestringTotal dunning fees
data[].outstandingFeestringOutstanding dunning fees
data[].totalIntereststringTotal late payment interest
data[].outstandingIntereststringOutstanding late payment interest
data[].invoiceOutstandingBalancestringOutstanding amount of the dunned invoice
data[].interestCalculateStartDatestring | nullStart of interest calculation (YYYY-MM-DD)
data[].interestCalculateEndDatestring | nullEnd of interest calculation (YYYY-MM-DD)
data[].createdAtstring (ISO 8601)Creation timestamp
data[].updatedAtstring (ISO 8601)Last change timestamp
data[].createdBystring (UUID) | nullID of the user who created the dunning notice, loadable via Get User
data[].updatedBystring (UUID) | nullID of the user who made the last change
data[].deletedbooleanWhether the dunning notice is deleted
data[].deletedAtstring (ISO 8601) | nullDeletion timestamp
data[].deletedBystring (UUID) | nullID of the user who deleted the dunning notice
data[].tenancystring (UUID) | nullID of the assigned tenancy
meta.totalintegerUpper bound of the total count — see note below
meta.offsetintegerCurrent start position
meta.limitintegerNumber of returned entries

Note on monetary amounts: All monetary amounts and the interest rate come as a JSON string, not as a number ("fee": "12.00"). This affects fee, latePaymentInterestRate, totalAmount, outstandingTotal, totalFee, outstandingFee, totalInterest, outstandingInterest, and invoiceOutstandingBalance. Process the values with a decimal type. If you parse them into a floating-point number, you build in rounding errors. Same behavior as with invoices and cash revenues.

Note: paymentDeadline is a number of days, not a date.

Note on meta.total: total is counted in the database, the permission check happens afterwards. The value is therefore an upper bound, not an exact count — the pages may contain fewer dunning notices than total suggests. A stop condition of "paginate until all total records are received" does not terminate. Paginate until a page is empty instead.

This matters most with restricted permissions: if the owning user of your API access is restricted to locations, dunning notices without a location assignment are invisible to them.

Note on tenancies: If your company works with the Tenancies add-on, the endpoint returns only dunning notices from tenancies the owning user of your API access has access to and where they hold the Mahnwesen: Anzeigen permission. Dunning notices of other tenancies and dunning notices without a tenancy are missing from the list without triggering an error. meta.total counts only the dunning notices of those tenancies. Details: Conventions.

Note on cancellation: A cancellation sets dunningStatus = canceled and the soft-delete flag at the same time. Without a status filter (default all) you get canceled and deleted dunning notices back, recognizable by status = canceled or deleted = true. To exclude them, filter with status=active,replaced.

Beispiele
bash
curl -X GET "https://my.offisy.at/api/oauth/v2/resource/invoices/dunnings?offset=0&limit=50&status=beispiel&dunningStatus=beispiel&paidStatus=b2c3d4e5-f6a7-8901-bcde-f01234567890" \
  -H "Authorization: Bearer {access_token}"
Parameter
Zuerst Token anfordern

Possible errors ​

StatusCodeDescription
400validation_errorInvalid value for status, dunningStatus, or paidStatus
401invalid_clientAccess token invalid or expired
403insufficient_scopeScope dunnings not present
403access_deniedNo permission to read dunning notices
429rate_limit_exceededToo many requests — see Error Handling

Note: If the Authorization header is missing or the token is invalid, the API answers with 401 and the JSON envelope invalid_client. This holds for the OAuth API in general, not just for this endpoint.

Offisy GmbH