---
title: "One issue dossier"
method: GET
path: "/api/v1/maintenance/{id}"
tags: ["Maintenance"]
---

# One issue dossier

`GET /api/v1/maintenance/{id}`

## Request

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

The reported fault and the whole repair around it: the work orders it raised with the contractor named, the quotes against that work, and the audit trail of everything done about it.

## Path parameters

- `id` string, required

## Response `200`

The dossier.

- object
  - `ok` unknown, required
  - `data` object, required
    - `issue` object, required
      - `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.
    - `workOrders` object[], required: Work raised from this issue, whichever side of the link it was recorded on.
      - `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.
      - `contractorName` string, required: The trading name, or "None" while no contractor is engaged.
    - `quotes` object[], required: Every quote asked for against that work, accepted or not.
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `workOrderId` string, required: Stable record id, e.g. `lse_012`.
      - `contractorId` string, required: Stable record id, e.g. `lse_012`.
      - `requestedAt` string, required: ISO 8601 timestamp.
      - `receivedAt` string: ISO 8601 timestamp.
      - `netAmount` integer, required: Money, always in integer cents. €1,250.00 is 125000.
      - `vatAmount` integer, required: Money, always in integer cents. €1,250.00 is 125000.
      - `total` integer, required: Money, always in integer cents. €1,250.00 is 125000.
      - `validUntil` string: A calendar date, `YYYY-MM-DD`.
      - `leadTimeDays` number
      - `lines` object[], required
        - `description` string, required
        - `amount` integer, required: Money, always in integer cents. €1,250.00 is 125000.
      - `status` 'requested' | 'received' | 'accepted' | 'rejected' | 'expired', required
      - `documentId` string: Stable record id, e.g. `lse_012`.
      - `assessment` string: How this quote reads against the competing ones, written by the AI.
    - `audit` object[], required: Anything the AI did about this issue or the work it raised, newest first. An action nobody can trace back to a record is the thing this product exists to avoid.
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `at` string, required: ISO 8601 timestamp.
      - `action` string, required: `lease.indexed`, `message.sent`, `approval.rejected`…
      - `summary` string, required: Human-readable. Every action the AI takes leaves one.
      - `entity` object, required
        - `kind` string, required: Which kind of record this points at, for example `lease`, `unit` or `invoice`.
        - `id` string, required: Stable record id, e.g. `lse_012`.
        - `label` string, required: How the record reads to a person, so a trail can be followed without a second lookup.
      - `workflowRunId` string: Stable record id, e.g. `lse_012`.
      - `severity` string, required
  - `meta` object, required
    - `requestId` string, required: Echoed in the x-request-id header. Quote it in a bug report.

## Other responses

- `404`: No issue with that id belongs to you.

---

[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)
