Download OpenAPI specification:
The Conveyancing API is where you quote for, instruct, and manage conveyancing work with Landmark. Whether you're referring work to a panel conveyancer or handling the cases that come your way, you do it through one API and against one shared case record.
The first thing it supports is panel conveyancing through Optimus: as an introducer you create a quote, choose a conveyancer, and instruct them on your client's behalf; as a conveyancer you pick up the cases assigned to you and keep the introducer updated as the work moves forward. That's the workflow this documentation focuses on, though the API will grow to cover more of how you connect to conveyancing over time.
Throughout, a quote becomes a case once instructed. After that, retrieve and list it through the Cases endpoints rather than Quotes. Both sides share one case record, and you only see the cases your account is party to.
Functionality is being made available in UAT as it becomes ready to test. We'll keep this section updated as each drop lands.
The Quotes and Cases endpoints have a settled schema and you can use them as a reference to start your integration work.
Your Landmark contact will confirm what's available to you and when.
The API is a REST service over HTTPS. You send and receive JSON, apart from document uploads, which use multipart/form-data, and PDF or document downloads, which return the file itself.
| Environment | Base URL | Use it for |
|---|---|---|
| UAT | https://uat-api.landmarkcloudservices.com/conveyances |
Building and testing your integration |
| Production | https://api.landmarkcloudservices.com/conveyances |
Live cases |
You'll start with UAT credentials, then move to production once your integration is ready to go live.
The API uses OAuth 2.0 with the client credentials grant. When you're onboarded you'll receive a client ID and secret. These identify your account, so there's no separate account header to send.
1. Get an access token by POSTing your credentials to the token endpoint for your environment:
https://lmkmaster-uat.eu.auth0.com/oauth/tokenhttps://lmkmaster.eu.auth0.com/oauth/token{
"client_id": "your-client-id",
"client_secret": "your-client-secret",
"audience": "https://api.landmarkcloudservices.com",
"grant_type": "client_credentials"
}
You'll get back an access_token (a JWT) and an expires_in value. Cache and reuse the token until it's close to expiring rather than fetching a new one for every call.
2. Send the token on every request:
Authorization: Bearer <access_token>A 401 means your token is missing or invalid. A 403 means your account isn't entitled to that operation; contact support if you think that's wrong.
The API allows 1000 requests per minute per client. That limit is shared across all endpoints - it is not a separate quota per endpoint. If you exceed it you'll receive a 429 Too Many Requests response; wait briefly and retry.
Standard HTTP status codes apply: 400 validation, 401 authentication, 403 not entitled, 404 not found, 429 too many requests, 5xx server error.
When something goes wrong you'll get back a consistent JSON shape:
{
"status": "400",
"code": "40001",
"title": "Validation error",
"messages": [
{ "property": "propertyAddress.postcode", "message": "Postcode is required" }
]
}
Every response includes a traceresponse header that uniquely identifies your request. Quote it when you contact support so we can find it quickly.
Support Contact: TBC
Callbacks notify your system when something changes on a quote or case - for example when a case has been instructed. We POST a JSON payload to an HTTPS endpoint you provide.
Setup: before callbacks can be delivered, tell your Landmark contact which URL we should call and what authentication your endpoint requires (for example an API key header or OAuth client credentials). We'll configure the subscription against your account.
Each callback uses a common envelope. The fields outside content stay the same for every event; only content varies by eventType. See Callback Schemas for the payload of each event. More event types will be added over time with different content shapes.
Documented events include Case Status Changed (request.status-changed) and Task Completed (request.task-completed). When content.status is Instructed on a status-changed callback, the quote has been instructed and is thereafter a case - use the Cases endpoints for that resource.
Quotes are where a job begins. You build a quote for your client's transaction, get back the panel conveyancers available to you with their pricing, and instruct one of them to turn the quote into a live case.
A single request can cover a standalone transaction (one quote) or a combined sale and purchase (two quotes, one for each side). You choose what you're quoting for with a product schema, which sets the questions that apply. See Product Schemas.
To instruct, pass the conveyancerId of one of the conveyancers returned for the quote. That creates the case and makes the details available to the conveyancer you've chosen. Once instructed, the quote becomes a case and is no longer returned by quote retrieval or listing - switch to the Cases endpoints for that resource.
Create a quote for your client's transaction. Provide the property address, the applicants, the account roles, and the product details, and you'll get back the panel conveyancers available to you with their pricing.
Standalone quote: provide a single quote request in the quotes array.
Combined sale and purchase: provide two quote requests in the quotes array, one Sale and one Purchase. Each is independent, with its own productId, applicants, and product details.
Accounts: each quote needs an accounts array naming at least one Originator and at least one Introducer. These can be the same account holding both roles. You're given these account identifiers when you're onboarded.
Contacts: each quote needs a contacts array including the requestor (the person placing the quote on the applicant's behalf). Identify them with contactId or email. Only one contact with role Requestor is allowed per quote.
Products: the product object must match one of the Product Schemas for the product type and property location you're quoting for.
required | Array of objects (QuoteRequest) [ 1 .. 2 ] items Array of quote requests to create.
Each quote is independent with its own accounts, contacts, productId, propertyAddress, persons, and productDetails. |
Example of a standalone Purchase quote request for England/Wales
{- "quotes": [
- {
- "additionalReferences": [
- {
- "type": "Introducer",
- "reference": "purchase - 123456"
}
], - "propertyAddress": {
- "thoroughfare": "High Street",
- "postTown": "London",
- "postcode": "SW1A 1AA",
- "country": "England"
}, - "product": {
- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "propertyLocation": "EnglandWales",
- "productDetails": {
- "property": {
- "value": 350000,
- "tenure": "Freehold",
- "exceedsHeightThreshold": false,
- "isHMO": false,
- "hasHelpToBuyEquityLoan": false,
- "isNewBuild": false
}, - "hasOfferBeenAccepted": true,
- "doesReservationFormApply": false,
- "isRightToBuy": false,
- "isAuctionPurchase": false,
- "isPropertyBeingBoughtWithMortgage": true,
- "lender": "Halifax"
}
}, - "persons": [
- {
- "reference": "a1b2c3d4-e5f6-7890-abcd-ef1234567890a",
- "title": "Mr",
- "firstName": "John",
- "lastName": "Smith",
- "email": "john.smith@example.com",
- "telephoneNumber": "+447123456789",
- "roles": [
- "Applicant"
]
}
], - "accounts": [
- {
- "accountId": "27c4cb1e-0c56-4a68-a2aa-8d6a2a1e6f5c",
- "roles": [
- "Originator"
]
}, - {
- "accountId": "d7eaff45-0c1a-4809-9aa2-49e09fbdc9c9",
- "roles": [
- "Introducer"
]
}
], - "contacts": [
- {
- "contactId": "6a969045-973e-428d-b664-7e51a7d73bf0",
- "roles": [
- "Requestor"
]
}
]
}
]
}{- "quotes": [
- {
- "quoteId": "550e8400-e29b-41d4-a716-446655440000",
- "reference": "10100368",
- "product": {
- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "propertyLocation": "EnglandWales"
}, - "conveyancers": [
- {
- "conveyancerId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "name": "Key Conveyancing LLP",
- "location": "Northampton",
- "overallRating": 4.3,
- "ratingBreakdown": {
- "feedback": 4,
- "complaintRatio": 4,
- "telephoneTime": 5,
- "completionTime": 4
}
}, - {
- "conveyancerId": "b2c3d4e5-f6a7-8901-bcde-f1234567890a",
- "name": "O'Neill Patient Solicitors LLP",
- "location": "Stockport",
- "overallRating": 2,
- "ratingBreakdown": {
- "feedback": 2,
- "complaintRatio": 2,
- "telephoneTime": 3,
- "completionTime": 2
}
}
]
}
]
}Retrieve your quotes, most recently updated first. Once a quote has been instructed it becomes a case and no longer appears here - use GET /cases instead.
Filter, sort, and page the results with the OData-style query parameters below.
| $filter | string <= 1000 characters OData $filter syntax i.e. $filter=status eq 'Quoted' |
| $orderby | string <= 1000 characters Default: "updatedDate desc" OData $orderby syntax i.e. $orderby=updatedDate desc |
| $top | integer <int32> [ 1 .. 999 ] Default: 20 The number of items to return |
| $skip | integer <int32> [ 0 .. 9999999 ] Default: 0 The number of items to skip |
| $count | boolean Default: false Whether or not to return a count of items |
| countOnly | boolean Default: false Return only the count of items |
Example response for retrieving a list of quotes
{- "count": 3,
- "quotes": [
- {
- "quoteId": "550e8400-e29b-41d4-a716-446655440000",
- "reference": "10085402",
- "propertyAddress": {
- "thoroughfare": "High Street",
- "postTown": "London",
- "postcode": "SW1A 1AA"
}, - "product": {
- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "propertyLocation": "EnglandWales"
}, - "createdDate": "2024-01-15T10:30:00Z"
}, - {
- "quoteId": "660e8400-e29b-41d4-a716-446655440001",
- "reference": "10085395",
- "propertyAddress": {
- "thoroughfare": "Oak Avenue",
- "postTown": "Manchester",
- "postcode": "M1 1AA"
}, - "product": {
- "productId": "e5e42a0e-6717-4b45-8cd5-0f3a3b79cf4d",
- "propertyLocation": "EnglandWales"
}, - "createdDate": "2024-01-14T14:20:00Z"
}, - {
- "quoteId": "770e8400-e29b-41d4-a716-446655440002",
- "reference": "10087427",
- "propertyAddress": {
- "thoroughfare": "Highland Way",
- "postTown": "Edinburgh",
- "postcode": "EH1 1AA"
}, - "product": {
- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "propertyLocation": "Scotland"
}, - "createdDate": "2024-01-13T09:15:00Z"
}
]
}Retrieve the full details of one of your quotes: the property, applicants, product details, the available conveyancers, and the pricing breakdown.
After a successful instruct, the quote becomes a case and is no longer available here. Use GET /cases/{caseId} with the same identifier instead.
| quoteId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the quote |
Example response for retrieving a complete quote
{- "quoteId": "550e8400-e29b-41d4-a716-446655440000",
- "reference": "10072716",
- "additionalReferences": [
- {
- "type": "Introducer",
- "reference": "purchase - 123456"
}
], - "propertyAddress": {
- "thoroughfare": "High Street",
- "postTown": "London",
- "postcode": "SW1A 1AA",
- "country": "England"
}, - "product": {
- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "propertyLocation": "EnglandWales",
- "productDetails": {
- "property": {
- "value": 350000,
- "tenure": "Freehold",
- "exceedsHeightThreshold": false,
- "isHMO": false,
- "isNewBuild": false
}, - "referralFee": 150,
- "hasOfferBeenAccepted": true,
- "doesReservationFormApply": false,
- "isRightToBuy": false,
- "isAuctionPurchase": false,
- "isPropertyBeingBoughtWithMortgage": true,
- "lender": "Halifax"
}
}, - "persons": [
- {
- "reference": "a1b2c3d4-e5f6-7890-abcd-ef1234567890a",
- "title": "Mr",
- "firstName": "John",
- "lastName": "Smith",
- "email": "john.smith@example.com",
- "telephoneNumber": "+447123456789",
- "correspondenceAddress": {
- "thoroughfare": "High Street",
- "postTown": "London",
- "county": "Greater London",
- "postcode": "SW1A 1AA",
- "country": "England"
}, - "roles": [
- "Applicant"
]
}
], - "selectedConveyancer": {
- "conveyancerId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "name": "Key Conveyancing LLP"
}, - "conveyancers": [
- {
- "conveyancerId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "name": "Key Conveyancing LLP",
- "location": "Northampton",
- "overallRating": 4.3,
- "ratingBreakdown": {
- "feedback": 4,
- "complaintRatio": 4,
- "telephoneTime": 5,
- "completionTime": 4
}
}, - {
- "conveyancerId": "b2c3d4e5-f6a7-8901-bcde-f1234567890a",
- "name": "O'Neill Patient Solicitors LLP",
- "location": "Stockport",
- "overallRating": 2,
- "ratingBreakdown": {
- "feedback": 2,
- "complaintRatio": 2,
- "telephoneTime": 3,
- "completionTime": 2
}
}
], - "fee": {
- "totalIncVat": 1982.4,
- "breakdown": {
- "legalWork": [
- {
- "description": "Legal Work",
- "excVat": 755,
- "vat": 151,
- "incVat": 906
}
], - "disbursements": [
- {
- "description": "Search Pack",
- "excVat": 345,
- "vat": 69,
- "incVat": 414
}
], - "supplements": [
- {
- "description": "Lender Special Conditions",
- "excVat": 250,
- "vat": 50,
- "incVat": 300
}
]
}
}, - "accounts": [
- {
- "accountId": "27c4cb1e-0c56-4a68-a2aa-8d6a2a1e6f5c",
- "roles": [
- "Originator"
]
}, - {
- "accountId": "d7eaff45-0c1a-4809-9aa2-49e09fbdc9c9",
- "roles": [
- "Introducer"
]
}
], - "contacts": [
- {
- "contactId": "6a969045-973e-428d-b664-7e51a7d73bf0",
- "roles": [
- "Requestor"
]
}
], - "relatedQuote": [
- {
- "quoteId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01"
}
]
}Download a PDF copy of the quote, for example to share with your client.
| quoteId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Example: 550e8400-e29b-41d4-a716-446655440000 Unique identifier for the quote |
{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Instruct a quote to turn it into a live case. Supply the conveyancerId of the conveyancer you're choosing in the request body: it must be one of the conveyancers returned for this quote (see GET /quotes/{quoteId} or the create-quote response). Instructing creates the case and makes the details available to that conveyancer.
After a successful instruct, the quote becomes a case. It is thereafter not retrievable via GET /quotes/{quoteId} or quote listings - use GET /cases/{caseId} and GET /cases instead (the identifier stays the same).
| quoteId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Example: 550e8400-e29b-41d4-a716-446655440000 Unique identifier for the quote |
| conveyancerId required | string <uuid> = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Identifier of the conveyancer to instruct; must equal the |
{- "conveyancerId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01"
}{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Update the property address on a quote. The values you provide replace the current address.
| quoteId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Example: 550e8400-e29b-41d4-a716-446655440000 Unique identifier for the quote |
| thoroughfare required | string <= 60 characters ^.*$ Street name or thoroughfare |
| dependentThoroughfare | string <= 60 characters ^.*$ Dependent thoroughfare |
| dependentLocality | string <= 40 characters ^.*$ Dependent locality |
| doubleDependentLocality | string <= 35 characters ^.*$ Double dependent locality |
| postTown required | string <= 60 characters ^.*$ Post town |
| county | string <= 100 characters ^.*$ County |
| postcode | string <= 10 characters ^.*$ Postcode |
| country required | string <= 200 characters ^([Ee]ngland|[Ww]ales|[Ss]cotland)$ Country |
| buildingNumber | string <= 10 characters ^.*$ Building number |
| buildingName | string <= 50 characters ^.*$ Building name |
| subBuildingName | string <= 30 characters ^.*$ Sub-building name |
| organisationName | string <= 60 characters ^.*$ Organisation name |
| departmentName | string <= 60 characters ^.*$ Department name |
| poBoxNumber | string <= 14 characters ^[A-Za-z0-9.#\s]*$ PO Box number |
| uprn | integer [ 1 .. 999999999999 ] Unique Property Reference Number (up to 12 digits) |
| udprn | integer [ 0 .. 99999999 ] Unique Delivery Point Reference Number |
Example request for updating a quote property address
{- "thoroughfare": "Kelham Road",
- "dependentLocality": "Newark",
- "postTown": "Newark",
- "county": "Nottinghamshire",
- "postcode": "NG24 1BU",
- "country": "England"
}{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Update the product details on a quote. The values you provide replace the current product details.
The request body must match the productDetails object for the quote's product, as defined in Product Schemas. You can't change the quote's productId or propertyLocation here.
| quoteId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Example: 550e8400-e29b-41d4-a716-446655440000 Unique identifier for the quote |
Product-specific details for a quote. Must match the productDetails object structure
for the quote's product as defined in Product Schemas.
Example request for updating product details on a Purchase England/Wales quote
{- "property": {
- "value": 375000,
- "tenure": "Freehold",
- "exceedsHeightThreshold": false,
- "isHMO": false,
- "isNewBuild": false
}, - "referralFee": 150,
- "hasOfferBeenAccepted": true,
- "doesReservationFormApply": false,
- "isRightToBuy": false,
- "isAuctionPurchase": false,
- "isPropertyBeingBoughtWithMortgage": true,
- "lender": "Halifax"
}{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Add a person (applicant) to a quote. A quote can have up to 8 applicants.
| quoteId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Example: 550e8400-e29b-41d4-a716-446655440000 Unique identifier for the quote |
| reference | string <uuid> = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... A value which can be used to refer to a person. Optional when creating or adding a person; a reference is generated automatically if not supplied. Once set, the reference cannot be changed. |
| title | string <= 20 characters Person's title |
| firstName required | string <= 100 characters First name |
| middleName | string <= 100 characters Middle name |
| lastName required | string <= 100 characters Last name |
| email required | string <email> [ 5 .. 254 ] characters Email address |
| telephoneNumber required | string [ 8 .. 20 ] characters Telephone number |
object (Address) Address using PAF Plus format | |
| roles required | Array of strings [ 1 .. 20 ] items Items Value: "Applicant" |
Example request for adding a person to a quote.
reference is omitted; a reference is generated automatically in the response.
{- "title": "Mrs",
- "firstName": "Jane",
- "lastName": "Smith",
- "email": "jane.smith@example.com",
- "telephoneNumber": "+447987654321",
- "roles": [
- "Applicant"
]
}{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Update a person on a quote. The values you provide replace that person's details.
| quoteId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Example: 550e8400-e29b-41d4-a716-446655440000 Unique identifier for the quote |
| personReference required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Example: bf13cb52-6676-4f3d-a27a-b6cafaf52f19 Unique identifier for the person on the quote |
| title | string <= 20 characters Person's title |
| firstName required | string <= 100 characters First name |
| middleName | string <= 100 characters Middle name |
| lastName required | string <= 100 characters Last name |
| email required | string <email> [ 5 .. 254 ] characters Email address |
| telephoneNumber required | string [ 8 .. 20 ] characters Telephone number |
object (Address) Address using PAF Plus format | |
| roles required | Array of strings [ 1 .. 20 ] items Items Value: "Applicant" |
Example request for updating a person on a quote
{- "title": "Mrs",
- "firstName": "Jane",
- "lastName": "Smith",
- "email": "jane.smith@example.com",
- "telephoneNumber": "+447987654321",
- "correspondenceAddress": {
- "thoroughfare": "Kelham Road",
- "dependentLocality": "Newark",
- "postTown": "Newark",
- "county": "Nottinghamshire",
- "postcode": "NG24 1BU",
- "country": "United Kingdom"
}, - "roles": [
- "Applicant"
]
}{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Remove a person from a quote.
| quoteId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Example: 550e8400-e29b-41d4-a716-446655440000 Unique identifier for the quote |
| personReference required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Example: bf13cb52-6676-4f3d-a27a-b6cafaf52f19 Unique identifier for the person on the quote |
{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Once you instruct a quote it becomes a case and is thereafter retrieved and listed through these endpoints rather than Quotes. If you're the conveyancer, these are the cases assigned to you: you work them through to completion and post updates as you go. If you're the introducer, this is how you follow the work you've referred and see how it's progressing. Either way, you only see the cases your account is party to.
From here you can retrieve your cases, read the full detail of one, update its status and handler, work the task hierarchy, follow the activity history, add notes, and exchange documents.
Retrieve your cases, most recently updated first. As a conveyancer these are the cases assigned to you; as an introducer these are the cases you've instructed. Instructed quotes appear here rather than in quote listings.
Filter, sort, and page the results with the OData-style query parameters below.
| $filter | string <= 1000 characters OData $filter syntax i.e. $filter=status eq 'Completed' |
| $orderby | string <= 1000 characters Default: "updatedDate desc" OData $orderby syntax i.e. $orderby=updatedDate desc |
| $top | integer <int32> [ 1 .. 999 ] Default: 20 The number of items to return |
| $skip | integer <int32> [ 0 .. 9999999 ] Default: 0 The number of items to skip |
| $count | boolean Default: false Whether or not to return a count of items |
| countOnly | boolean Default: false Return only the count of items |
Example response for retrieving a list of cases
{- "count": 3,
- "cases": [
- {
- "caseId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "reference": "10085402",
- "status": "In Progress",
- "propertyAddress": {
- "thoroughfare": "High Street",
- "postTown": "London",
- "postcode": "SW1A 1AA"
}, - "product": {
- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "propertyLocation": "EnglandWales"
}, - "lastUpdatedDate": "2024-01-20T14:30:00Z"
}, - {
- "caseId": "b2c3d4e5-f6a7-8901-bcde-f1234567890a",
- "reference": "10085395",
- "status": "On hold",
- "propertyAddress": {
- "thoroughfare": "Oak Avenue",
- "postTown": "Manchester",
- "postcode": "M1 1AA"
}, - "product": {
- "productId": "e5e42a0e-6717-4b45-8cd5-0f3a3b79cf4d",
- "propertyLocation": "EnglandWales"
}, - "lastUpdatedDate": "2024-01-19T10:15:00Z"
}, - {
- "caseId": "c3d4e5f6-a7b8-9012-cdef-1234567890ab",
- "reference": "10087427",
- "status": "Pending Approval",
- "propertyAddress": {
- "thoroughfare": "Highland Way",
- "postTown": "Edinburgh",
- "postcode": "EH1 1AA"
}, - "product": {
- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "propertyLocation": "Scotland"
}, - "lastUpdatedDate": "2024-01-18T09:00:00Z"
}
]
}Retrieve the full detail of one of your cases, including its current status, activities, and documents. Use this after a quote has been instructed - the former quote is retrieved here rather than via GET /quotes/{quoteId}.
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
Example response for retrieving a complete case
{- "caseId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "reference": "10072716",
- "status": "In Progress",
- "additionalReferences": [
- {
- "type": "Introducer",
- "reference": "purchase - 123456"
}
], - "propertyAddress": {
- "thoroughfare": "High Street",
- "postTown": "London",
- "postcode": "SW1A 1AA",
- "country": "England"
}, - "product": {
- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "propertyLocation": "EnglandWales",
- "productDetails": {
- "property": {
- "value": 350000,
- "tenure": "Freehold",
- "exceedsHeightThreshold": false,
- "isHMO": false,
- "isNewBuild": false
}, - "referralFee": 150,
- "hasOfferBeenAccepted": true,
- "doesReservationFormApply": false,
- "isRightToBuy": false,
- "isAuctionPurchase": false,
- "isPropertyBeingBoughtWithMortgage": true,
- "lender": "Halifax"
}
}, - "persons": [
- {
- "reference": "a1b2c3d4-e5f6-7890-abcd-ef1234567890a",
- "title": "Mr",
- "firstName": "John",
- "lastName": "Smith",
- "email": "john.smith@example.com",
- "telephoneNumber": "+447123456789",
- "correspondenceAddress": {
- "thoroughfare": "High Street",
- "postTown": "London",
- "county": "Greater London",
- "postcode": "SW1A 1AA",
- "country": "England"
}, - "roles": [
- "Applicant"
]
}
], - "conveyancer": {
- "conveyancerId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "name": "Key Conveyancing LLP",
- "location": "Northampton",
}, - "documents": [
- {
- "documentId": "d1e2f3a4-b5c6-7890-def1-234567890abc",
- "mimeType": "application/pdf",
- "documentType": "Undefined",
- "fileName": "search-report.pdf",
- "createdDate": "2024-01-20T10:30:00Z"
}, - {
- "documentId": "e2f3a4b5-c6d7-8901-ef12-34567890abcd",
- "mimeType": "image/jpeg",
- "documentType": "Undefined",
- "fileName": "property-photo.jpg",
- "createdDate": "2024-01-21T14:15:00Z"
}
], - "accounts": [
- {
- "accountId": "27c4cb1e-0c56-4a68-a2aa-8d6a2a1e6f5c",
- "roles": [
- "Originator"
]
}, - {
- "accountId": "d7eaff45-0c1a-4809-9aa2-49e09fbdc9c9",
- "roles": [
- "Introducer"
]
}
], - "contacts": [
- {
- "contactId": "6a969045-973e-428d-b664-7e51a7d73bf0",
- "roles": [
- "Requestor"
]
}, - {
- "contactId": "c1d2e3f4-a5b6-7890-cdef-1234567890ab",
- "name": "Sarah Johnson",
- "roles": [
- "CaseHandler"
]
}
], - "relatedCase": [
- {
- "caseId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01"
}
], - "fee": {
- "totalIncVat": 1982.4,
- "breakdown": {
- "legalWork": [
- {
- "description": "Legal Work",
- "excVat": 755,
- "vat": 151,
- "incVat": 906
}, - {
- "description": "Referral fee",
- "excVat": 100,
- "vat": 20,
- "incVat": 120
}
], - "disbursements": [
- {
- "description": "Search Pack",
- "excVat": 345,
- "vat": 69,
- "incVat": 414
}
], - "supplements": [
- {
- "description": "Lender Special Conditions",
- "excVat": 250,
- "vat": 50,
- "incVat": 300
}
]
}
}
}Accept a case that has been instructed to you.
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Reject a case that has been instructed to you. A reason must be provided.
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
| reason required | string <= 1000 characters Reason for rejecting the case |
Example request for rejecting a case
{- "reason": "Unable to take on this case due to capacity constraints"
}{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Update the status of a case — place on hold or resume from hold back to in progress. A reason must be provided for the change.
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
| status required | string Enum: "In Progress" "On Hold" The status to set on the case. Use "On Hold" when the case is in progress. Use "In Progress" to resume a case that is on hold. |
| reason required | string <= 1000 characters Reason for the status change |
Example request for updating a case status
{- "status": "On Hold",
- "reason": "Awaiting additional documentation from the client"
}{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Assign a specific conveyancer to a case, making the responsible contact visible to all parties and tracked in the case history.
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
| contactId required | string <uuid> = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case handler contact |
string <email> [ 5 .. 254 ] characters Email address of the case handler contact |
Example request for adding a case handler by email
{- "email": "case.handler@example.com"
}{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Retrieve the activity history on a case — milestones, notes, task updates, and contact logs. This is how you follow a case's progress.
Results are paged with OData $top / $skip (default $top=50, $skip=0).
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
| $top | integer <int32> [ 1 .. 1000 ] Default: 50 The number of activities to return. Default is 50. |
| $skip | integer <int32> [ 0 .. 9999999 ] Default: 0 The number of activities to skip. Default is 0. |
Example response for retrieving activities on a case
{- "activities": [
- {
- "activityId": "10001234",
- "type": "Note",
- "message": "Case status updated to In Progress",
- "metadata": null,
- "createdByContactId": "c1d2e3f4-a5b6-7890-cdef-1234567890ab",
- "createdDate": "2024-01-20T10:30:00Z"
}, - {
- "activityId": "10001235",
- "type": "Note",
- "message": "Client confirmed they have submitted ID documents.",
- "metadata": null,
- "createdByContactId": "c1d2e3f4-a5b6-7890-cdef-1234567890ab",
- "createdDate": "2024-01-20T14:15:00Z"
}
]
}Retrieve the task hierarchy for a case. Tasks mark key events in the conveyancing lifecycle and are visible to connected parties so they can see progress.
The set is tailored to the case (for example by jurisdiction) and is generated when the case is first created.
Tasks are organised as parents and children. Completing a parent completes all uncompleted children; completing the last uncompleted child completes the parent.
Each task has a reference that is consistent across cases where that task applies. Use reference when mapping events in your own platform; use taskId when completing a specific instance on a case.
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
Example response for retrieving tasks on a case
{- "tasks": [
- {
- "taskId": 1234567,
- "name": "Pre-completion",
- "reference": "PRECOMP",
- "depth": 0,
- "ordinal": 1,
- "status": "In Progress",
- "isComplete": false,
- "metadata": null,
- "children": [
- {
- "taskId": 1234568,
- "name": "Initial review",
- "reference": "INIT",
- "depth": 1,
- "ordinal": 1,
- "status": "Done",
- "isComplete": true,
- "completedDate": "2024-01-20T10:30:00Z",
- "metadata": null,
- "children": [ ]
}
]
}, - {
- "taskId": 1234569,
- "name": "Exchange of contracts",
- "reference": "EXCH",
- "depth": 0,
- "ordinal": 2,
- "status": "To Do",
- "isComplete": false,
- "metadata": null,
- "children": [ ]
}
], - "count": 12
}Mark a task on a case as complete. Completing a parent completes all uncompleted children; completing the last uncompleted child completes the parent.
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
| taskId required | string (LgsReferenceId) ^[0-9]{6,16}$ The |
{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}Retrieve all notes recorded on a case. Notes are visible to all parties on the case.
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
Example response for retrieving notes on a case
{- "notes": [
- {
- "noteId": "10001234",
- "createdByContactId": "c1d2e3f4-a5b6-7890-cdef-1234567890ab",
- "title": "ID documents received",
- "body": "Client confirmed they have submitted ID documents.",
- "createdDate": "2024-01-20T10:30:00Z",
- "modifiedDate": "2024-01-20T10:30:00Z",
- "supersedesNoteId": null
}, - {
- "noteId": "10001235",
- "createdByContactId": "c1d2e3f4-a5b6-7890-cdef-1234567890ab",
- "title": null,
- "body": "Chased the lender for the mortgage offer.",
- "createdDate": "2024-01-21T09:05:00Z",
- "modifiedDate": "2024-01-21T11:20:00Z",
- "supersedesNoteId": null
}
]
}Add a note to a case. Notes are recorded in the case activity history and are visible to all parties on the case.
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
| title | string or null <= 100 characters ^(?=.*\S)[\x20-\x7E]+$ |
| body required | string [ 1 .. 5000 ] characters ^(?=.*\S)[\x09\x0A\x0D\x20-\x7E]+$ |
Example request for adding a note to a case
{- "title": "ID documents received",
- "body": "Client confirmed they have submitted ID documents."
}Example response when a note is added to a case
{- "title": "ID documents received",
- "body": "Client confirmed they have submitted ID documents.",
- "createdDate": "2024-01-20T10:30:00Z"
}Add a document to a case.
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
| documentType required | string Value: "Undefined" Type of document (currently only Undefined; will be expanded in future updates) |
| filename required | string [ 3 .. 250 ] characters ^(?!.*\.\..*)[^\:/\*"\<\>\|]+?\.[a-zA-Z\d]{1,... Name of the file being uploaded |
| file required | string <binary> <= 99614720 characters The document file content |
Example request for uploading a document to a case
{ "mimeType": "application/pdf", "documentType": "Undefined", "filename": "search-report.pdf", "file": "<binary file content>" }
{ }Download a document from a case.
| caseId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique identifier for the case |
| documentId required | string <uuid> (LgsUuid) = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Unique Landmark ID for the document |
{- "status": "400",
- "code": "40000",
- "title": "Invalid content type supplied"
}The request schema for each product and country combination, used when you create or amend a quote.
| productId required | string <uuid> Value: "f7a7438b-fe4e-4361-b00b-d3d709a16d01" Product ID for Purchase in England/Wales |
| propertyLocation required | string Value: "EnglandWales" Property location - must be EnglandWales for this product |
required | object |
{- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "propertyLocation": "EnglandWales",
- "productDetails": {
- "property": {
- "value": 350000,
- "tenure": "Freehold",
- "exceedsHeightThreshold": true,
- "isHMO": true,
- "isNewBuild": true,
- "sharedOwnership": {
- "sharePercentage": 25
}, - "buyToLet": {
- "type": "LimitedCompany",
- "companyName": "Example Property Investments Ltd",
- "numberOfDirectors": 2
}
}, - "referralFee": 150,
- "hasOfferBeenAccepted": true,
- "doesReservationFormApply": true,
- "isRightToBuy": true,
- "isAuctionPurchase": true,
- "isPropertyBeingBoughtWithMortgage": true,
- "lender": "string",
- "numberOfGiftedDeposits": 99,
- "numberOfLifetimeISAs": 99,
- "numberOfHelpToBuyISAs": 99,
- "concessionaryPurchase": {
- "actualPurchasePrice": 300000
}
}
}| productId required | string <uuid> Value: "f7a7438b-fe4e-4361-b00b-d3d709a16d01" Product ID for Purchase in Scotland |
| propertyLocation required | string Value: "Scotland" Property location - must be Scotland for this product |
required | object |
{- "productId": "f7a7438b-fe4e-4361-b00b-d3d709a16d01",
- "propertyLocation": "Scotland",
- "productDetails": {
- "property": {
- "value": 350000,
- "isHMO": true,
- "isNewBuild": true,
- "sharedOwnership": {
- "sharePercentage": 25
}, - "buyToLet": {
- "type": "LimitedCompany",
- "companyName": "Example Property Investments Ltd",
- "numberOfDirectors": 2
}
}, - "referralFee": 150,
- "hasOfferBeenAccepted": true,
- "isRightToBuy": true,
- "isAuctionPurchase": true,
- "isPropertyBeingBoughtWithMortgage": true,
- "lender": "string",
- "numberOfGiftedDeposits": 99,
- "numberOfLifetimeISAs": 99,
- "numberOfHelpToBuyISAs": 99,
- "concessionaryPurchase": {
- "actualPurchasePrice": 300000
}
}
}| productId required | string <uuid> Value: "e5e42a0e-6717-4b45-8cd5-0f3a3b79cf4d" Product ID for Sale in England/Wales |
| propertyLocation required | string Value: "EnglandWales" Property location - must be EnglandWales for this product |
required | object |
{- "productId": "e5e42a0e-6717-4b45-8cd5-0f3a3b79cf4d",
- "propertyLocation": "EnglandWales",
- "productDetails": {
- "property": {
- "value": 250000,
- "tenure": "Freehold",
- "exceedsHeightThreshold": true,
- "isHMO": true,
- "sharedOwnership": {
- "sharePercentage": 25
}
}, - "referralFee": 150,
- "numberOfMortgagesBeingRedeemed": 20,
- "hasOfferBeenAccepted": true,
- "doesReservationFormApply": true,
- "isPropertyInProbate": true,
- "isPropertyBeingSoldWithTenant": true,
- "isThereAnOnwardPurchase": true
}
}| productId required | string <uuid> Value: "e5e42a0e-6717-4b45-8cd5-0f3a3b79cf4d" Product ID for Sale in Scotland |
| propertyLocation required | string Value: "Scotland" Property location - must be Scotland for this product |
required | object |
{- "productId": "e5e42a0e-6717-4b45-8cd5-0f3a3b79cf4d",
- "propertyLocation": "Scotland",
- "productDetails": {
- "property": {
- "value": 250000,
- "isHMO": true,
- "sharedOwnership": {
- "sharePercentage": 25
}
}, - "referralFee": 150,
- "numberOfMortgagesBeingRedeemed": 20,
- "hasOfferBeenAccepted": true,
- "isPropertyInProbate": true,
- "isPropertyBeingSoldWithTenant": true,
- "isThereAnOnwardPurchase": true
}
}| productId required | string <uuid> Value: "1d67bbf2-5054-4dce-a1f4-7fc3fc31234d" Product ID for Fixed Fee Remortgage in England/Wales |
| propertyLocation required | string Value: "EnglandWales" Property location - must be EnglandWales for this product |
required | object |
{- "productId": "1d67bbf2-5054-4dce-a1f4-7fc3fc31234d",
- "propertyLocation": "EnglandWales",
- "productDetails": {
- "property": {
- "value": 350000,
- "tenure": "Freehold",
- "exceedsHeightThreshold": true,
- "isHMO": true,
- "hasHelpToBuyEquityLoan": true,
- "isTransferOfEquity": true,
- "sharedOwnership": {
- "sharePercentage": 25,
- "isStaircasing": false
}, - "buyToLet": {
- "type": "LimitedCompany",
- "companyName": "Example Property Investments Ltd",
- "numberOfDirectors": 2
}
}, - "referralFee": 150,
- "loanValue": 999999999,
- "numberOfMortgagesBeingRedeemed": 20,
- "numberOfDebtsBeingConsolidated": 20,
- "earlyRepaymentChargeDate": "2019-08-24",
- "lender": "string"
}
}| productId required | string <uuid> Value: "1d67bbf2-5054-4dce-a1f4-7fc3fc31234d" Product ID for Fixed Fee Remortgage in Scotland |
| propertyLocation required | string Value: "Scotland" Property location - must be Scotland for this product |
required | object |
{- "productId": "1d67bbf2-5054-4dce-a1f4-7fc3fc31234d",
- "propertyLocation": "Scotland",
- "productDetails": {
- "property": {
- "value": 350000,
- "isHMO": true,
- "hasHelpToBuyEquityLoan": true,
- "isTransferOfEquity": true,
- "sharedOwnership": {
- "sharePercentage": 25,
- "isStaircasing": false
}, - "buyToLet": {
- "type": "LimitedCompany",
- "companyName": "Example Property Investments Ltd",
- "numberOfDirectors": 2
}
}, - "referralFee": 150,
- "loanValue": 999999999,
- "numberOfMortgagesBeingRedeemed": 20,
- "earlyRepaymentChargeDate": "2019-08-24",
- "lender": "string"
}
}| productId required | string <uuid> Value: "611ec5c5-3259-4043-9442-333820712b6a" Product ID for Cashback Remortgage in England/Wales |
| propertyLocation required | string Value: "EnglandWales" Property location - must be EnglandWales for this product |
required | object |
{- "productId": "611ec5c5-3259-4043-9442-333820712b6a",
- "propertyLocation": "EnglandWales",
- "productDetails": {
- "property": {
- "value": 350000,
- "tenure": "Freehold",
- "exceedsHeightThreshold": true,
- "isHMO": true,
- "hasHelpToBuyEquityLoan": true,
- "isTransferOfEquity": true,
- "sharedOwnership": {
- "sharePercentage": 25,
- "isStaircasing": false
}
}, - "referralFee": 150,
- "loanValue": 999999999,
- "numberOfMortgagesBeingRedeemed": 20,
- "earlyRepaymentChargeDate": "2019-08-24",
- "lender": "string",
- "cashbackAmount": 500
}
}Payloads Landmark POSTs to your callback URL when subscribed events occur.
Onboarding: tell your Landmark contact the HTTPS URL to call and the authentication your endpoint requires. We'll configure the subscription for your account.
Every callback shares the same outer envelope (eventType, subscriptionId, communicationDeliveryId, eventDate, sequence, and version). Only content (and the allowed eventType value) varies per event. New events will be added here as they become available.
| eventType required | string Value: "request.status-changed" Event type for this callback. Determines the shape of Use this event with |
| subscriptionId required | string <uuid> = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Identifier of the notification subscription that delivered this callback |
| communicationDeliveryId required | string <uuid> = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Communication delivery identifier for linking this callback to Landmark logs and support traces |
| eventDate required | string <date-time> UTC date-time when the event occurred (Zulu / ISO-8601) |
| sequence required | integer <int64> Ordering value for this message. Use it to process callbacks in order without relying
on |
| version required | string Schema version of this event payload. Subscribe to an event type and version. |
required | object Event-specific payload for a case status change ( |
{- "eventType": "request.status-changed",
- "subscriptionId": "49e5834d-ec1b-4cdc-af13-2a1dcb851ca2",
- "communicationDeliveryId": "60233bfd-cb60-4fb5-a760-fbc6b1403625",
- "eventDate": "2026-08-06T10:15:35Z",
- "sequence": 2003205521,
- "version": "1.0.0",
- "content": {
- "requestId": "f0540466-3f54-420d-a6f3-184584f7057b",
- "status": "Instructed",
- "statusDescription": null
}
}| eventType required | string Value: "request.task-completed" Event type for this callback. Determines the shape of Use this event to detect that a task on a case has been completed.
The |
| subscriptionId required | string <uuid> = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Identifier of the notification subscription that delivered this callback |
| communicationDeliveryId required | string <uuid> = 36 characters ^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[4][0-9A-Fa-f]... Communication delivery identifier for linking this callback to Landmark logs and support traces |
| eventDate required | string <date-time> UTC date-time when the event occurred (Zulu / ISO-8601) |
| sequence required | integer <int64> Ordering value for this message. Use it to process callbacks in order without relying
on |
| version required | string Schema version of this event payload. Subscribe to an event type and version. |
required | object Event-specific payload for a task completion ( |
{- "eventType": "request.task-completed",
- "subscriptionId": "7a3c9e12-4d8b-4f6a-9c1e-2b5d8f3a7e04",
- "communicationDeliveryId": "e8f2a6c1-9b4d-4e7f-a3c2-1d6e8f0b2a59",
- "eventDate": "2026-08-06T10:15:35Z",
- "sequence": 2003205521,
- "version": "1.0.0",
- "content": {
- "requestId": "c7d4e1f2-8a3b-4c5d-9e6f-0a1b2c3d4e5f",
- "taskId": 3120177
}
}