---
title: "Issues, work orders, maintenance plans and contractors"
method: GET
path: "/api/v1/maintenance"
tags: ["Maintenance"]
---

# Issues, work orders, maintenance plans and contractors

`GET /api/v1/maintenance`

## Request

- Base URL: `http://localhost:5180`
- URL: `http://localhost:5180/api/v1/maintenance`
- Auth: API key in cookie `better-auth.session_token`

The whole repairs desk in one call. Issues come newest first, and every issue and work order carries the unit label a list needs, so drawing the screen takes no second lookup.

## Response `200`

The repairs desk.

- object
  - `ok` unknown, required
  - `data` object, required
    - `issues` object[], required: Everything reported, newest first.
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `reference` string, required
      - `unitId` string, required: Stable record id, e.g. `lse_012`.
      - `buildingId` string, required: Stable record id, e.g. `lse_012`.
      - `leaseId` string: Stable record id, e.g. `lse_012`.
      - `reportedById` string: Stable record id, e.g. `lse_012`.
      - `reportedVia` string, required: The channel it arrived on, or `inspection`, `preventive` or `owner`.
      - `reportedAt` string, required: ISO 8601 timestamp.
      - `title` string, required
      - `description` string, required
      - `category` string, required
      - `urgency` 'emergency' | 'urgent' | 'routine' | 'cosmetic', required
      - `status` 'reported' | 'triaging' | 'awaiting_approval' | 'quoting' | 'scheduled' | 'in_progress' | 'awaiting_invoice' | 'resolved' | 'closed' | 'rejected', required
      - `photoRefs` string[], required
      - `triage` object
        - `diagnosis` string, required
        - `confidence` number, required: 0 to 1. A low number is why a repair goes to review rather than straight to a contractor.
        - `suggestedTrade` string, required
        - `estimatedCost` integer: Money, always in integer cents. €1,250.00 is 125000.
        - `liability` 'owner' | 'tenant' | 'shared' | 'insurance' | 'undetermined', required: Who pays, which is the single most contested call in property management.
        - `liabilityRationale` string, required
        - `selfHelpSuggested` string
        - `slaResponseHours` number, required
        - `slaResolutionHours` number, required
      - `slaBreached` boolean: Set once the response or resolution clock has run out.
      - `firstResponseAt` string: ISO 8601 timestamp.
      - `workOrderIds` string[], required
      - `threadId` string: Stable record id, e.g. `lse_012`.
      - `resolvedAt` string: ISO 8601 timestamp.
      - `resolutionNote` string
      - `costTotal` integer: Money, always in integer cents. €1,250.00 is 125000.
      - `rechargedToTenant` integer: The part of the cost billed on to the tenant.
      - `provenance` object, required
        - `actor` object, required
          - `kind` 'owner' | 'ai' | 'tenant' | 'contractor' | 'system' | 'channel', required: `ai` is Dardaris acting on the owner’s behalf. Everything it touches is marked.
          - `id` string: Stable record id, e.g. `lse_012`.
          - `name` string, required
        - `at` string, required: ISO 8601 timestamp.
        - `workflowRunId` string: Set when an automated run produced this, linking the record back to the run.
        - `reasoning` string: The rationale the AI recorded at the moment it acted.
      - `unitLabel` string, required: The unit as a person says it, resolved so an owner’s building alias is honoured.
      - `reportedByName` string, nullable, required: Who reported it, when that was somebody in the address book: the tenant, for a request that came in on a channel.
    - `workOrders` object[], required
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `reference` string, required
      - `issueId` string: Stable record id, e.g. `lse_012`.
      - `unitId` string, required: Stable record id, e.g. `lse_012`.
      - `buildingId` string, required: Stable record id, e.g. `lse_012`.
      - `contractorId` string: Stable record id, e.g. `lse_012`.
      - `trade` string, required
      - `title` string, required
      - `scope` string, required: What the contractor was actually asked to do.
      - `status` 'draft' | 'awaiting_approval' | 'dispatched' | 'accepted' | 'scheduled' | 'in_progress' | 'completed' | 'invoiced' | 'paid' | 'cancelled', required
      - `priority` 'emergency' | 'urgent' | 'routine' | 'cosmetic', required
      - `spendLimit` integer: The cap communicated to the contractor. Above it they have to come back and re-quote.
      - `quoteIds` string[], required
      - `acceptedQuoteId` string: Stable record id, e.g. `lse_012`.
      - `scheduledFor` string: ISO 8601 timestamp.
      - `accessArrangement` object: How the contractor gets in. An unconfirmed arrangement is the usual reason a visit is wasted.
        - `method` 'tenant_present' | 'key_collection' | 'smart_lock' | 'concierge' | 'owner_present', required
        - `windowStart` string: ISO 8601 timestamp.
        - `windowEnd` string: ISO 8601 timestamp.
        - `tenantConfirmed` boolean, required
        - `notes` string
      - `startedAt` string: ISO 8601 timestamp.
      - `completedAt` string: ISO 8601 timestamp.
      - `completionNotes` string
      - `completionPhotoRefs` string[], required
      - `invoiceExpected` integer: Money, always in integer cents. €1,250.00 is 125000.
      - `supplierInvoiceId` string: Stable record id, e.g. `lse_012`.
      - `actualCost` integer: Money, always in integer cents. €1,250.00 is 125000.
      - `warrantyUntil` string: A calendar date, `YYYY-MM-DD`.
      - `tenantSatisfaction` number
      - `provenance` object, required
        - `actor` object, required
          - `kind` 'owner' | 'ai' | 'tenant' | 'contractor' | 'system' | 'channel', required: `ai` is Dardaris acting on the owner’s behalf. Everything it touches is marked.
          - `id` string: Stable record id, e.g. `lse_012`.
          - `name` string, required
        - `at` string, required: ISO 8601 timestamp.
        - `workflowRunId` string: Set when an automated run produced this, linking the record back to the run.
        - `reasoning` string: The rationale the AI recorded at the moment it acted.
      - `unitLabel` string, required: The unit as a person says it, resolved so an owner’s building alias is honoured.
      - `contractorName` string, required: The trading name, or "None" while no contractor is engaged.
    - `plans` object[], required: Recurring work. A legal obligation cannot be silently skipped.
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `buildingId` string, required: Stable record id, e.g. `lse_012`.
      - `unitId` string: Stable record id, e.g. `lse_012`.
      - `name` string, required
      - `trade` string, required
      - `obligation` 'legal' | 'contractual' | 'best_practice', required: A legal obligation cannot be silently skipped, which is what separates it from good practice.
      - `intervalMonths` number, required
      - `lastDoneOn` string: A calendar date, `YYYY-MM-DD`.
      - `nextDueOn` string, required: A calendar date, `YYYY-MM-DD`.
      - `leadTimeDays` number, required: How far ahead of the due date the work has to be booked.
      - `estimatedCost` integer: Money, always in integer cents. €1,250.00 is 125000.
      - `preferredContractorId` string: Stable record id, e.g. `lse_012`.
      - `producesCertificateType` string: The certificate this service produces, if it produces one.
      - `active` boolean, required
      - `buildingLabel` string, required: The building an owner alias is honoured for.
    - `contractors` object[], required
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `contactId` string, required: Stable record id, e.g. `lse_012`.
      - `businessName` string, required
      - `trades` string[], required: What they do: `plumbing`, `electrical`, `heating`, `roofing` and the rest.
      - `calloutFee` integer: Call-out charge, for estimating before a quote exists.
      - `hourlyRate` integer: Money, always in integer cents. €1,250.00 is 125000.
      - `vatNumber` string
      - `vatRate` number, required: A decimal ratio. 0.21 is 21%.
      - `rating` number: 0 to 5, computed from completed work orders rather than entered by hand.
      - `jobsCompleted` number, required
      - `avgResponseHours` number
      - `onTimeRate` number: A decimal ratio. 0.21 is 21%.
      - `isPreferred` boolean, required
      - `availableOutOfHours` boolean, required
      - `serviceAreas` string[], required: Where they will travel. Empty means no stated limit, which is a real answer and not a missing one.
      - `unitIds` string[]: Present when they are engaged for named lots only. Absent means anywhere in the stated areas.
      - `insurance` object
        - `policyNumber` string, required
        - `validUntil` string, required: A calendar date, `YYYY-MM-DD`.
        - `insurer` string, required
      - `certifications` object[], required
        - `name` string, required
        - `validUntil` string: A calendar date, `YYYY-MM-DD`.
        - `reference` string
      - `notes` string
      - `name` string, required: The person behind the business, resolved from the contact record.
  - `meta` object, required
    - `requestId` string, required: Echoed in the x-request-id header. Quote it in a bug report.

---

[API](https://skmtc.dev/dardaris/apis/dardaris-api.md) · [All operations](https://skmtc.dev/dardaris/apis/dardaris-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dardaris/apis/dardaris-api/revisions/4aff33835c73?raw)
