Added

12 November 2026 - Open API 1.12.0

Manage For Sale and To Let boards for sales and lettings properties, and cancel and acknowledge lettings maintenance jobs.

For Sale and To Let boards

Manage the board on a sales or lettings property, as the board management panel in Loop does.

  • GET /v2/sales/properties/{propertyId}/board and GET /v2/lettings/properties/{propertyId}/board: the board up now, the board contractor and every board job, newest first. The contractor is an address book entry (links.contractor). Sales and lettings properties now link to their board (links.board).
  • PUT …/board changes the board. Send boardType and action, and optionally notes, markAsDone and userId. A board job is recorded with the current contractor, and a "Board Type updated" note is added to the property. Changing to notRequired when the property has any other board, or none set yet, is always recorded as needsTakingDown, as in Loop.
  • PUT …/board/contractor sets the board contractor: send contractorId, an entry in the agency's address book, or null to clear it. Jobs already recorded keep the contractor they had.
  • POST …/board/history/{historyId}/done marks a board job done, now or at the dateDone you send. A job that's already done answers 409 Conflict.
  • No emails are sent to the contractor from these calls.
  • Board types are notRequired, forSale, soldSTC and sold for sales, and notRequired, toLet, let and letAgreed for lettings. Actions are needsErecting, needsMoving, needsReErecting and needsTakingDown.
  • Scopes: read:boards and write:boards.
{
  "boardType": "soldSTC",
  "action": "needsMoving",
  "notes": "Add the Sold STC slip to the existing board.",
  "markAsDone": false
}
{
  "propertyId": 12345,
  "boardType": "soldSTC",
  "notes": "Add the Sold STC slip to the existing board.",
  "boardContractorId": 501,
  "history": [
    {
      "id": 9002,
      "boardType": "soldSTC",
      "action": "needsMoving",
      "notes": "Add the Sold STC slip to the existing board.",
      "boardContractorId": 501,
      "creatingAgentId": "3f2b8c1e-0000-4000-8000-000000000001",
      "dateCreated": "2026-11-12T10:15:00",
      "dateDone": null,
      "emailed": false
    },
    {
      "id": 9001,
      "boardType": "forSale",
      "action": "needsErecting",
      "notes": null,
      "boardContractorId": 501,
      "creatingAgentId": "3f2b8c1e-0000-4000-8000-000000000001",
      "dateCreated": "2026-10-01T09:00:00",
      "dateDone": "2026-10-03T14:30:00",
      "emailed": true
    }
  ],
  "links": {
    "self": "/v2/sales/properties/12345/board",
    "property": "/v2/sales/properties/12345",
    "contractor": "/v2/address-book/501"
  }
}

Cancelling and acknowledging maintenance jobs

Two more steps of a lettings maintenance job, as an agent takes them in Loop.

  • POST /v2/lettings/maintenance-jobs/{id}/cancel cancels a job. Send a reason (required, up to 320 characters) and optionally userId, the agent cancelling it. Only a notAcknowledged, pending or approved job can be cancelled; a complete or already cancelled job answers 409 Conflict. The job's quotes are left as they are, and a "Cancelled job" note is added to the job.
  • Every maintenance job now carries cancellation: when it was cancelled, why and by whom. It's null unless the job is cancelled.
  • POST /v2/lettings/maintenance-jobs takes acknowledge. Send true when the agent has already acknowledged the job: it's created as pending, so you can add quotes straight away, and a "Job acknowledged" note is added, credited to the agent recorded as creating it. Without it, the job is notAcknowledged as before.
  • POST /v2/lettings/maintenance-jobs/{id}/acknowledge acknowledges a notAcknowledged job later, with an optional userId. The job becomes pending. Any other job answers 409 Conflict.
  • No emails are sent to the contractor, landlord or tenant from these calls.
  • Scope: write:maintenance, which you already need to report jobs.
{
  "reason": "The tenant has repaired the tap themselves.",
  "userId": "3f2b8c1e-0000-4000-8000-000000000001"
}
{
  "id": 48213,
  "refId": "48213",
  "lettingsPropertyId": 12345,
  "status": "cancelled",
  "summary": "Dripping bathroom tap",
  "completion": {
    "dateCompleted": null,
    "notes": null
  },
  "cancellation": {
    "dateCancelled": "2026-11-12T10:15:00",
    "reason": "The tenant has repaired the tap themselves.",
    "cancelledByAgentId": "3f2b8c1e-0000-4000-8000-000000000001"
  },
  "links": {
    "self": "/v2/lettings/maintenance-jobs/48213",
    "lettingsProperty": "/v2/lettings/properties/12345"
  }
}
{
  "lettingsPropertyId": 12345,
  "subType": "bathroomsToiletsTapDripping",
  "summary": "Dripping bathroom tap",
  "reportedBy": "tenant",
  "userId": "3f2b8c1e-0000-4000-8000-000000000001",
  "acknowledge": true
}
📘

New scopes. read:boards and write:boards aren't on existing keys. Ask us to add them to your key.