Download OpenAPI specification:Download
API service for purchasing Nimbus-provided documents, including land registry (HMLR) documents and other property-related documents.
This API enables customers to:
All requests must carry a valid Entra ID Bearer token issued for the Document API audience. Two OAuth 2.0 grant types are supported; choose the one that fits your integration.
Use this flow when your server calls the API on behalf of an authenticated end user. Every purchase and audit record is tied to that user's identity.
docs.read, docs.purchase, and/or docs.webhooks.manageAuthorization: Bearer <token> headerInternally, the API uses the OAuth 2.0 On-Behalf-Of (OBO) flow to exchange the incoming user token for backend-specific tokens when calling HMLR Legacy API and the Ledger service. This is transparent to callers — you only need the delegated scopes listed above.
Use this flow when your server calls the API autonomously, without an end user authenticating in real time. Purchases and audit records are tied to a Nimbus service identity provisioned for your integration.
Authorization: Bearer <token> headerEndpoint access is controlled by app roles granted to your registration. Always request the /.default
scope when acquiring client credentials tokens.
/check-availability to see available documents and costs/purchase with the documents you want to buy/orders/{order_id} to check statusCheck which HMLR documents are available for a given title and the token cost for each. Also returns information about any pending applications on the title.
You can query by either:
Exactly one of these parameters must be provided.
This endpoint:
Results are cached for 5 minutes in Azure API Management.
| title_number | string [ 2 .. 10 ] characters ^[A-Z]{1,3}[0-9]{1,7}$ Example: title_number=AB123456 UK Land Registry title number (e.g., AB123456). Either title_number or title_id must be provided. |
| title_id | string <uuid> Example: title_id=0000a942-3cee-431d-bd71-d07cb27197ec Internal UUID identifier for the title. Either title_number or title_id must be provided. |
{- "data": {
- "title_status": "Title number is valid.",
- "title_status_code": "VALID",
- "title_number": "AB123456",
- "pending_applications": [ ],
- "referred_to_documents": [ ],
- "register": {
- "type": "Register",
- "type_code": "REGISTER",
- "availability": "available for immediate download",
- "availability_code": "IMMEDIATE",
- "backdated": false,
- "token_cost": 7,
- "previously_purchased": null
}, - "title_plan": {
- "type": "Plan",
- "type_code": "TITLEPLAN",
- "availability": "available for immediate download",
- "availability_code": "IMMEDIATE",
- "backdated": false,
- "token_cost": 7,
- "previously_purchased": null
}
}, - "total_token_cost_estimate": 14,
- "current_balance": 150
}Purchase one or more documents for a title.
Prerequisites:
POST /subscribeThis endpoint:
Documents are delivered asynchronously to your subscribed webhook URL when ready.
Use documents for standard HMLR documents (register, title_plan).
Use referred_documents for referred documents (deeds, leases, transfers, etc.).
Each referred document is identified by the three values returned in the
check-availability response: type_code, date, and filed_under.
This allows you to select specific documents precisely — for example, the first
and third lease on a title — rather than ordering all documents of a given type.
At least one of documents or referred_documents must be provided.
| title_number required | string^[A-Z]{1,3}[0-9]{1,7}$ UK Land Registry title number |
| documents | Array of strings <= 2 items Items Enum: "register" "title_plan" Standard HMLR documents to purchase. Only |
Array of objects (ReferredDocumentPurchaseItem) <= 50 items Referred documents (deeds, leases, transfers, etc.) to purchase.
Each item uses the exact | |
| customer_reference | string <= 255 characters Your internal reference for this order |
{- "title_number": "AB123456",
- "documents": [
- "register",
- "title_plan"
], - "customer_reference": "CUST-ORDER-12345"
}{- "order_id": "770e8400-e29b-41d4-a716-446655440002",
- "status": "PROCESSING",
- "title_number": "BK383592",
- "documents_ordered": [
- "register"
], - "referred_documents_ordered": [
- {
- "type_code": "Deed",
- "date": "2021-10-11",
- "filed_under": "BK383592"
}, - {
- "type_code": "Lease",
- "date": "2021-05-18",
- "filed_under": "BK518479"
}
], - "total_tokens_charged": 21,
- "new_balance": 129,
- "estimated_delivery": "2026-01-15T14:35:00Z"
}Download a document from a completed order using its unique document ID.
This endpoint allows you to:
No additional charge - You've already paid for the document.
Documents are stored indefinitely so you can always re-download your previously purchased documents.
Getting the document_id: The unique document ID is provided in the order status response
after the document has been downloaded. Use the document_id field (UUID) from the DocumentDeliveryStatus.
| document_id required | string <uuid> Example: 990e8400-e29b-41d4-a716-446655440003 The unique document ID for the document (UUID from order status response) |
{- "document_id": "990e8400-e29b-41d4-a716-446655440003",
- "document_type_code": "REGISTER",
- "format": "pdf",
- "content": "JVBERi0xLjQKJeLjz9MK...",
- "metadata": {
- "filename": "DN123456-Register.pdf",
- "file_size_bytes": 245680
}, - "downloaded_at": "2026-01-15T14:32:15Z"
}Verify if a named person is the registered proprietor of a property title using HMLR's Online Owner Verification (OOV) service.
Cost: This endpoint charges 1 token per verification.
This endpoint:
This is a verification service, not a discovery service. You must provide the person's name to verify. To discover who owns a property, purchase and review the Official Copy of the Register.
| title_number required | string [ 1 .. 9 ] characters ^[A-Z]{1,3}[0-9]{1,7}$ UK Land Registry title number |
| first_forename required | string non-empty ^[a-zA-Z0-9\-']+$ First forename of the person to verify |
| middle_name | string non-empty ^[a-zA-Z0-9\-\s']+$ Middle name(s) of the person to verify (optional) |
| surname required | string non-empty ^[a-zA-Z0-9\-\s']+$ Surname of the person to verify |
| customer_reference | string <= 25 characters ^[A-Za-z0-9\s~!"@#$%'()*+,\-./:;=>?\[\\\]_\{\... Your reference for tracking this ownership verification |
{- "title_number": "BK126329",
- "first_forename": "Nicolas",
- "surname": "Neate",
- "customer_reference": "VERIFY-001"
}{- "verification_id": "eoov-a6d8f57f84c4",
- "title_number": "BK126329",
- "match_result": "SINGLE_MATCH",
- "property_address": {
- "building_number": "4",
- "street_name": "Ridgeway",
- "city_name": "Reading",
- "postcode": "RG10 8AS",
- "tenure": "freehold"
}, - "surname_match": "MATCH",
- "forename_match": "MATCH",
- "middle_name_match": "NO_MATCH",
- "match_information": {
- "historical_match": false,
- "ownership_type": "Joint"
}, - "customer_reference": "VERIFY-001",
- "tokens_charged": 1,
- "new_balance": 149,
- "verified_at": "2026-02-25T21:04:35Z"
}Retrieve the current status of a document order.
Order statuses:
PENDING_PAYMENT: Payment is being processedPROCESSING: Documents are being ordered from the providerCOMPLETED: Documents have been delivered to webhookFAILED: Order failed (see error_message)WEBHOOK_FAILED: Documents ready but webhook delivery failed| order_id required | string <uuid> Example: 770e8400-e29b-41d4-a716-446655440002 The unique identifier of the order |
{- "order_id": "770e8400-e29b-41d4-a716-446655440002",
- "status": "COMPLETED",
- "customer_reference": "CUST-ORDER-12345",
- "documents": [
- {
- "document_type": "register",
- "document_id": "990e8400-e29b-41d4-a716-446655440003",
- "title_number": "AB123456",
- "status": "DELIVERED",
- "webhook_delivery_status": "SUCCESS",
- "webhook_delivery_attempts": 1
}, - {
- "document_type": "title_plan",
- "document_id": "991e8400-e29b-41d4-a716-446655440004",
- "title_number": "AB123456",
- "status": "DELIVERED",
- "webhook_delivery_status": "SUCCESS",
- "webhook_delivery_attempts": 1
}
], - "total_tokens_charged": 14,
- "created_at": "2026-01-15T14:30:00Z",
- "completed_at": "2026-01-15T14:32:15Z"
}Check the health status of the API service and its dependencies.
Returns 200 if all systems are operational. Returns 503 if any critical dependency is unavailable.
{- "status": "healthy",
- "timestamp": "2026-01-15T14:30:00Z",
- "checks": {
- "database": "ok",
- "redis": "ok",
- "document_provider": "ok",
- "ledger_api": "ok"
}
}Register a webhook endpoint to receive notifications when purchased documents are ready.
The subscription is associated with your authentication credentials. All subsequent document purchases will automatically trigger webhook notifications to this endpoint.
Important: Save the returned secret immediately. It cannot be retrieved later
and is required to verify webhook signatures using HMAC-SHA256.
When documents are ready, you'll receive:
POST {your_webhook_url}
Content-Type: application/json
X-Webhook-Signature: {base64_hmac_sha256_signature}
X-Webhook-Event: document.status_changed
X-Webhook-Id: {unique_event_id}
| webhook_url required | string <uri> HTTPS URL where order completion webhooks will be delivered. Requirements:
The webhook will receive POST requests with:
|
{
}{- "subscription_id": "8f8d2e40-1234-5678-9abc-def012345678",
- "secret": "a7b3c9d2e5f8g1h4i7j0k3l6m9n2o5p8q1r4s7t0u3v6w9x2y5z8"
}Cancel an active webhook subscription. Once cancelled, no further webhook notifications will be delivered for new document purchases.
| subscription_id required | string <uuid> Examples: 8f8d2e40-1234-5678-9abc-def012345678 UUID of the subscription to cancel |
{- "error": {
- "code": "INVALID_REQUEST",
- "message": "Invalid title number format",
- "details": {
- "field": "title_number",
- "value": "INVALID",
- "pattern": "^[A-Z]{1,3}[0-9]{1,7}$"
}
}
}Retrieve a paginated log of webhook delivery attempts for your subscriptions. Useful for debugging missed or failed webhook deliveries.
| start_date | string or null <date-time> Start of date range filter (ISO 8601) |
| end_date | string or null <date-time> End of date range filter (ISO 8601) |
| subscription_id | string or null <uuid> Filter to a specific subscription |
| document_reference | string or null Filter to a specific document reference |
| page_number | integer >= 1 Default: 1 Page number (1-indexed) |
| page_size | integer [ 1 .. 100 ] Default: 20 Number of items per page |
{- "start_date": "2026-04-14T00:00:00Z",
- "end_date": "2026-04-21T23:59:59Z",
- "page_number": 1,
- "page_size": 20
}{- "items": [
- {
- "id": 0,
- "event_id": "a7a26ff2-e851-45b6-9634-d595f45458b7",
- "subscription_id": "aa11a4c2-a467-43db-b413-c4ab0f5cf627",
- "endpoint_url": "string",
- "event_type": "document.status_changed",
- "document_reference": "string",
- "title_number": "string",
- "document_status": 0,
- "document_status_description": "string",
- "attempt_number": 0,
- "http_status_code": 0,
- "is_success": true,
- "error_message": "string",
- "attempted_at": "2019-08-24T14:15:22Z",
- "duration_ms": 0
}
], - "total_count": 0,
- "page_number": 0,
- "page_size": 0,
- "total_pages": 0
}Retrieve all delivery attempts for a specific webhook event, including HTTP response codes and error messages for each attempt.
| event_id required | string <uuid> Examples: 550e8400-e29b-41d4-a716-446655440000 UUID of the webhook event |
{- "event_id": "a7a26ff2-e851-45b6-9634-d595f45458b7",
- "attempts": [
- {
- "id": 0,
- "event_id": "a7a26ff2-e851-45b6-9634-d595f45458b7",
- "subscription_id": "aa11a4c2-a467-43db-b413-c4ab0f5cf627",
- "endpoint_url": "string",
- "event_type": "document.status_changed",
- "document_reference": "string",
- "title_number": "string",
- "document_status": 0,
- "document_status_description": "string",
- "attempt_number": 0,
- "http_status_code": 0,
- "is_success": true,
- "error_message": "string",
- "attempted_at": "2019-08-24T14:15:22Z",
- "duration_ms": 0
}
]
}Retrieve delivery success/failure statistics for a date range. Includes total attempts, success rate, and average delivery duration.
| start_date required | string <date-time> Start of the statistics window (ISO 8601) |
| end_date required | string <date-time> End of the statistics window (ISO 8601) |
{- "start_date": "2026-03-22T00:00:00Z",
- "end_date": "2026-04-21T23:59:59Z"
}{- "total_attempts": 0,
- "successful_deliveries": 0,
- "failed_deliveries": 0,
- "success_rate": 0.97,
- "average_duration_ms": 145.3
}