---
title: "The morning briefing, in Dardaris’s own words"
method: GET
path: "/api/v1/briefing"
tags: ["Dardaris"]
---

# The morning briefing, in Dardaris’s own words

`GET /api/v1/briefing`

## Request

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

`said` is the opening, one short paragraph at a time, in the order it is spoken: emergencies, then any bank connection that cannot be read, then money, then what was done today, then the hand-off. Every line is given twice, `text` plain and `marked` with `**bold**` around the tenant, count, amount or date; take `text` unless you render bold. `queue` carries the records behind `needsYou`, so every sentence can be checked against a row rather than believed. `status` is `stood_down` when automation is switched off. `hoursSaved` is deprecated: no record backs the estimate, nothing on screen reads it, and v2 drops it.

## Response `200`

The briefing.

- object
  - `ok` unknown, required
  - `data` object, required: The morning briefing: what is said, in reading order, and the records every line was drawn from.
    - `dateLine` string, required: "Sunday 9 August", said the way a person says a date rather than as `2026-08-09`.
    - `greeting` string, required
    - `status` 'working' | 'stood_down' | 'away', required: `stood_down` means automation is switched off.
    - `statusLine` string, required
    - `handledToday` number, required
    - `handledThisWeek` number, required
    - `hoursSaved` number, required: Estimated owner-hours saved, summed across every workflow. Deprecated: no record backs the estimate and v2 drops it. Nothing on screen reads it.
    - `said` object[], required: The opening, one short paragraph at a time, in the order it is said: emergencies, then any bank connection that cannot be read, then money, then what was done today, then the hand-off.
      - `text` string, required: The sentence as it is spoken. It never carries a mark, so it can be stored, read aloud or logged as it stands.
      - `marked` string, required: The same sentence with `**` around the tenant, count, amount or date a screen sets in bold. Nothing else differs, so read `text` unless you render them.
      - `tone` 'plain' | 'brand' | 'urgent', required
      - `figure` object: The figure the line is about, given separately so a screen can lead with it. `caption` is plain and `marked` is the same caption with its bold runs.
        - `amount` integer, required: Money, always in integer cents. €1,250.00 is 125000.
        - `caption` string, required
        - `marked` string, required
      - `topic` 'setup' | 'work' | 'handoff': What a screen may already show some other way: `setup` the next onboarding step, `work` today's count, `handoff` the queue. A reader that shows none of those reads every line.
    - `needsYou` number, required: How many things are genuinely waiting on a human: approvals, threads, tasks and incoming money nothing has placed.
    - `queue` object, required: The records behind `needsYou` and behind every line that names a tenant, so nothing in the briefing is unverifiable.
      - `approvals` object[], required
        - `id` string, required: Stable record id, e.g. `lse_012`.
        - `workflowRunId` string: Stable record id, e.g. `lse_012`.
        - `workflowId` string: Stable record id, e.g. `lse_012`.
        - `title` string, required
        - `description` string, required: Plain English: what will happen if this is approved.
        - `category` 'rent_collection' | 'arrears' | 'lease_lifecycle' | 'maintenance' | 'compliance' | 'move_in_out' | 'communication' | 'vacancy' | 'finance' | 'short_stay' | 'reporting', required
        - `requestedAt` string, required: ISO 8601 timestamp.
        - `expiresAt` string: When the fallback in `onExpiry` takes over.
        - `onExpiry` 'execute' | 'cancel' | 'hold', required: What happens if the owner never answers.
        - `urgency` 'high' | 'medium' | 'low', required
        - `subject` 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.
        - `preview` object: Exactly what the AI proposes to do, shown before it happens rather than reported after.
          - `kind` 'message' | 'document' | 'payment' | 'work_order' | 'price_change' | 'other', required
          - `content` string, required
          - `editable` boolean, required
          - `recipient` string
          - `amount` integer: Money, always in integer cents. €1,250.00 is 125000.
        - `rationale` string, required: Why the AI recommends this.
        - `alternatives` object[]
          - `label` string, required
          - `description` string, required
        - `status` 'pending' | 'approved' | 'rejected' | 'edited_and_approved' | 'expired' | 'auto_executed' | 'cancelled', required
        - `decidedAt` string: ISO 8601 timestamp.
        - `decidedBy` object
          - `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
        - `decisionNote` string
        - `runsCall` boolean: True where approving runs a call the server holds: decide it at POST /approvals/{id}/decision.
      - `arrears` object[], required
        - `id` string, required: Stable record id, e.g. `lse_012`.
        - `leaseId` string, required: Stable record id, e.g. `lse_012`.
        - `contactId` string, required: Stable record id, e.g. `lse_012`.
        - `openedOn` string, required: A calendar date, `YYYY-MM-DD`.
        - `stage` string, required: How far dunning has gone. `none` and `resolved` are not counted as open.
        - `balance` integer, required: Total outstanding across all overdue invoices, recomputed on read.
        - `oldestDueDate` string, required: A calendar date, `YYYY-MM-DD`.
        - `daysOverdue` number, required
        - `invoiceIds` string[], required
        - `snoozedUntil` string: Pauses automation, e.g. after a payment promise.
        - `closedOn` string: A calendar date, `YYYY-MM-DD`.
      - `threads` object[], required
        - `id` string, required: Stable record id, e.g. `lse_012`.
        - `subject` string, required
        - `channel` 'email' | 'sms' | 'whatsapp' | 'phone' | 'portal' | 'post', required
        - `participantIds` string[], required
        - `unitId` string: Stable record id, e.g. `lse_012`.
        - `buildingId` string: Set where the conversation is about a whole building rather than a lot in it.
        - `leaseId` string: Stable record id, e.g. `lse_012`.
        - `bookingId` string: Stable record id, e.g. `lse_012`.
        - `issueId` string: Stable record id, e.g. `lse_012`.
        - `lastMessageAt` string, required: ISO 8601 timestamp.
        - `messageIds` string[], required
        - `status` 'open' | 'waiting_on_tenant' | 'waiting_on_us' | 'snoozed' | 'closed', required
        - `dueBy` string: When a reply is owed on our side.
        - `snoozedUntil` string: ISO 8601 timestamp.
        - `unread` boolean, required
        - `pinned` boolean, required
        - `labels` string[], required
        - `aiSummary` string: A rolling summary, so a long thread is readable at a glance.
        - `sentiment` 'positive' | 'neutral' | 'frustrated' | 'angry'
        - `escalationRisk` 'none' | 'low' | 'medium' | 'high': How likely this is to turn into a dispute if it is left alone.
      - `tasks` object[], required
        - `id` string, required: Stable record id, e.g. `lse_012`.
        - `title` string, required
        - `description` string
        - `status` 'open' | 'in_progress' | 'blocked' | 'done' | 'cancelled', required
        - `priority` 'high' | 'medium' | 'low', required
        - `dueDate` string: A calendar date, `YYYY-MM-DD`.
        - `assigneeId` string: Stable record id, e.g. `lse_012`.
        - `origin` 'ai' | 'owner' | 'workflow', required: `ai` marks something Dardaris could not do itself and handed to the owner.
        - `category` 'rent_collection' | 'arrears' | 'lease_lifecycle' | 'maintenance' | 'compliance' | 'move_in_out' | 'communication' | 'vacancy' | 'finance' | 'short_stay' | 'reporting' | 'other', required
        - `relatedTo` object
          - `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`.
        - `completedAt` string: ISO 8601 timestamp.
        - `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.
      - `emergencies` 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.
      - `late` object[], required: Leases with a notice past its grace days and past what the bank has reported, longest late first.
        - `leaseId` string, required: Stable record id, e.g. `lse_012`.
        - `unitId` string, required: Stable record id, e.g. `lse_012`.
        - `tenants` object[], required
          - `id` string, required: Stable record id, e.g. `lse_012`.
          - `kind` string, required
          - `firstName` string, required
          - `lastName` string, required
          - `companyName` string
          - `email` string
          - `phone` string
          - `language` string, required
        - `invoiceId` string: The oldest unpaid notice past due, else the latest past due, else the next.
        - `period` object
          - `periodStart` string, required: A calendar date, `YYYY-MM-DD`.
          - `periodEnd` string, required: A calendar date, `YYYY-MM-DD`.
        - `dueDate` string: A calendar date, `YYYY-MM-DD`.
        - `due` integer, required: Money, always in integer cents. €1,250.00 is 125000.
        - `received` integer, required: Money, always in integer cents. €1,250.00 is 125000.
        - `outstanding` integer, required: Money, always in integer cents. €1,250.00 is 125000.
        - `standing` 'paid' | 'part_paid' | 'not_due' | 'unseen' | 'late' | 'disputed' | 'closed': Where that notice stands. Absent while nothing has been called on the lease.
        - `daysLate` number, required
        - `paidOn` string: A calendar date, `YYYY-MM-DD`.
        - `timingDays` number: From the due date to the day it was paid in full. Negative is early.
        - `credit` integer, required: Money from the lease’s payers that no notice has absorbed yet.
        - `waiting` object[], required: Incoming movements from this lease’s payers that nothing has placed yet.
          - `id` string, required: Stable record id, e.g. `lse_012`.
          - `bankAccountId` string, required: Stable record id, e.g. `lse_012`.
          - `date` string, required: A calendar date, `YYYY-MM-DD`.
          - `valueDate` string: A calendar date, `YYYY-MM-DD`.
          - `amount` integer, required: Money, always in integer cents. €1,250.00 is 125000.
          - `currency` string, required
          - `counterpartyName` string
          - `counterpartyIban` string
          - `description` string, required: The raw free text off the bank statement. This is what fuzzy matching works on.
          - `structuredRef` string
          - `direction` 'in' | 'out', required
          - `status` 'unmatched' | 'matched' | 'partially_matched' | 'ignored' | 'suspense', required
          - `matchId` string: Stable record id, e.g. `lse_012`.
          - `importBatchId` string: Stable record id, e.g. `lse_012`.
          - `externalId` string: The bank’s own id for the movement, where the feed gives one. A duplicate is judged on it first.
          - `bankReference` string: The reference the bank printed on the statement line, where it printed one.
          - `origin` 'manual': Set on a movement the owner typed in rather than one a statement or a bank brought.
          - `sequence` integer: Its place among the movements booked on the same day, as the statement printed them.
          - `balanceAfter` integer: The account balance once this movement had landed, in cents.
          - `balanceSource` 'verified' | 'computed': `verified` was printed by the bank and is never overwritten. `computed` is worked out from the movements around it and is recomputed whenever they change.
          - `expectedBalanceAfter` integer: What the movement before it and this amount add up to. A verified balance that differs is where a movement went missing.
        - `arrearsCaseId` string: Stable record id, e.g. `lse_012`.
        - `stage` 'none' | 'grace' | 'reminder_1' | 'reminder_2' | 'formal_notice' | 'payment_plan' | 'guarantor_called' | 'legal_filed' | 'resolved' | 'written_off'
        - `lateCount` number, required: Notices past their grace days whose bank has reported past the due date.
        - `lateTotal` integer, required: Money, always in integer cents. €1,250.00 is 125000.
        - `unseenCount` number, required: Notices past due that the bank has not reported far enough to call late.
      - `unplaced` object[], required: Incoming money nothing has placed and no approval already asks about. History is left out.
        - `tx` object, required
          - `id` string, required: Stable record id, e.g. `lse_012`.
          - `bankAccountId` string, required: Stable record id, e.g. `lse_012`.
          - `date` string, required: A calendar date, `YYYY-MM-DD`.
          - `valueDate` string: A calendar date, `YYYY-MM-DD`.
          - `amount` integer, required: Money, always in integer cents. €1,250.00 is 125000.
          - `currency` string, required
          - `counterpartyName` string
          - `counterpartyIban` string
          - `description` string, required: The raw free text off the bank statement. This is what fuzzy matching works on.
          - `structuredRef` string
          - `direction` 'in' | 'out', required
          - `status` 'unmatched' | 'matched' | 'partially_matched' | 'ignored' | 'suspense', required
          - `matchId` string: Stable record id, e.g. `lse_012`.
          - `importBatchId` string: Stable record id, e.g. `lse_012`.
          - `externalId` string: The bank’s own id for the movement, where the feed gives one. A duplicate is judged on it first.
          - `bankReference` string: The reference the bank printed on the statement line, where it printed one.
          - `origin` 'manual': Set on a movement the owner typed in rather than one a statement or a bank brought.
          - `sequence` integer: Its place among the movements booked on the same day, as the statement printed them.
          - `balanceAfter` integer: The account balance once this movement had landed, in cents.
          - `balanceSource` 'verified' | 'computed': `verified` was printed by the bank and is never overwritten. `computed` is worked out from the movements around it and is recomputed whenever they change.
          - `expectedBalanceAfter` integer: What the movement before it and this amount add up to. A verified balance that differs is where a movement went missing.
        - `reconciliation` object, required
          - `suggestion` object: What placement would do with the movement, where it found anything.
            - `id` string, required: Stable record id, e.g. `lse_012`.
            - `bankTransactionId` string, required: Stable record id, e.g. `lse_012`.
            - `paymentId` string: Stable record id, e.g. `lse_012`.
            - `invoiceIds` string[], required
            - `expenseId` string: The cost this outbound movement paid, where it paid one.
            - `supplierInvoiceId` string: The supplier invoice this outbound movement settled, where it settled one.
            - `mortgageId` string: The loan this outbound movement repaid an instalment of, where it repaid one.
            - `confidence` number, required: 0 to 1. Below the auto-accept threshold the match lands in the review queue instead of posting.
            - `reasons` string[], required: Why the two were matched, in the order the evidence was found.
            - `status` 'suggested' | 'accepted' | 'rejected' | 'needs_review', required
            - `explanation` string, required: The match in plain words, so accepting it is an informed decision.
            - `allocations` object[], required
              - …
            - `provenance` object, required
              - …
            - `kind` 'full' | 'split' | 'partial' | 'overpayment' | 'prepayment', required
            - `contactId` string: Stable record id, e.g. `lse_012`.
            - `residual` integer, required: Left over after allocation: a prepayment, not revenue yet.
            - `shortfall` integer, required: Still open on the notices this match touches, after allocation.
          - `confident` boolean, required: At or above the owner’s threshold. Placing it also needs no hold.
          - `heldBecause` 'deposit' | 'predates_notice' | 'recorded_by_hand' | 'looks_like_a_duplicate' | 'history' | 'undone_by_you' | 'you_declined' | 'approval_lapsed' | 'reversal' | 'same_name' | 'ended_lease' | 'deposit_and_rent' | 'named_period' | 'learned_payer_conflict' | 'second_payment': Why the movement waits for the owner rather than being placed.
          - `leaseId` string: Stable record id, e.g. `lse_012`.
    - `watching` object[], required: Things not yet urgent that the manager is keeping an eye on.
      - `id` string, required
      - `text` string, required
      - `tone` 'neutral' | 'brand' | 'good' | 'warning' | 'serious' | 'critical' | 'info', required
      - `to` string, required
  - `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)
