Title Direct
Verified against source (19)
qbo4.Events.QTD/README.mdqbo4.Events.QTD/QTDEndpoints.csqbo4.Events.QTD/QTDIntegration.csqbo4.Events.QTD/QTDStatusMapper.csModels/QTDEndpointPayloads.csInbound/TitleItem.csOperations/RequestTitleOrderOperation.csOperations/UpdateTitleOrderOperation.csdocs/openapi.yaml01 - Title Order Request/request.xml01 - Title Order Request/response.xml01 - Title Order Request/OrderRejection.xml02 - Title Update/request.xml03 - Order Inquiry/request.xml04 - Title Cancel/request.xml04 - Title Cancel/response.xmldocs/QTD_Product_Back_To_Client_Example1.xmldocs/ClientIntegrationGuide.mddocs/AdministratorGuide.md
Title Direct is reached through the Quandis events hub, which accepts your requests, delivers them to Title Direct, and tracks each one as a hub transaction. Requests are JSON; results come back as Title Direct’s XML, plus a typed JSON form. The hub publishes an OpenAPI specification with the full schemas; Quandis provides the host and your API keys at onboarding.
How a request works
Section titled “How a request works”- You submit one of the four operations below.
- The hub answers
202 Acceptedwith atransactionId. Title Direct has not been called yet. - The hub delivers the request to Title Direct in the background, retrying as the operation allows.
- You get the result by polling the transaction, or by subscribing to events (see Events).
Authenticate
Section titled “Authenticate”Send your access key and secret key in the X-ApiKey header, or a bearer token exchanged for them.
X-ApiKey: {accessKey}:{secretKey}Idempotency-Key: 7f3a8e2c-9b41-4d6f-a812-5c93e6fa4d10Content-Type: application/jsonOperations
Section titled “Operations”| Operation | Purpose | Idempotency-Key |
Attempts | Ends at |
|---|---|---|---|---|
| RequestTitleOrder | Place a new title order | Required | 1 | AwaitingCallback, then Completed when the title arrives |
| UpdateTitleOrder | Request an update, such as a date-down or publication endorsement | Required | Up to 3 | Completed |
| OrderInquiry | Send a message about an order | Optional | Up to 6 | Completed |
| CancelTitle | Cancel an order | Required | 1 | Completed |
Generate a new Idempotency-Key (a GUID works) for each new request, and reuse it only to retry the same request. A retry with the same key returns the original transaction instead of placing a second order. If you lose the 202 response, you can look the transaction up by its idempotency key.
Ordering and cancelling get a single attempt because they change state at the vendor. If one fails, Quandis can retry it for you; don’t resubmit with a new key unless you have confirmed the first attempt failed.
Request envelope
Section titled “Request envelope”Every operation takes the same envelope: your own reference in correlationId and the operation’s fields in payload.
{ "correlationId": "your-case-12345", "payload": { }}RequestTitleOrder
Section titled “RequestTitleOrder”{ "correlationId": "your-case-12345", "payload": { "clientTitleID": "T-100045", "orderSource": "Example Servicing System", "agency": "Example Agency", "servicer": "Example Servicer", "servicerSubscriberID": "example.com-Organization-Servicer-100", "attorney": "Example Law Firm", "attorneySubscriberID": "example.com-Organization-Attorney-200", "property": "100045", "address": "123 Main St", "city": "Springfield", "state": "CA", "postalCode": "90000", "propertySubscriberID": "example.com-Property-100045", "loan": "100045", "upbAmount": "150000.00", "originalBalance": "200000.00", "loanSubscriberID": "example.com-Loan-100045", "borrower1": "Doe, Jane", "borrower1SubscriberID": "example.com-Borrower-300", "foreclosure": "FC-100045", "title": "FC - 100045", "titleSubscriberID": "example.com-Title-400", "processType": "Foreclosure", "requestProductCategoryType": "ForeclosureReport", "titleTemplate": "Foreclosure Title", "titleClientSubscriberID": "example.com-Organization-Client-500" }}Every field shown is required except agency. Missing fields return 400 with each one listed.
| Group | Fields | Notes |
|---|---|---|
| Order | clientTitleID, orderSource |
clientTitleID is your own title key (up to 100 characters). It is echoed back on results and events. |
| Agency | agency, agencySubscriberID, agencyContact, agencyFirstName, agencyLastName, agencyAddress, agencyCity, agencyState, agencyPostalCode |
All optional |
| Servicer | servicer, servicerSubscriberID (required); servicerContact, servicerLabelMember, servicerLabelSubscriberID |
|
| Attorney | attorney, attorneySubscriberID (required); attorneyContact, attorneyAddress, attorneyCity, attorneyState, attorneyPostalCode, attorneyPhone, attorneyEmail, attorneyLabelMember, attorneyLabelSubscriberID |
|
| Property | property, address, city, state, postalCode, propertySubscriberID |
All required |
| Loan | loan, upbAmount, originalBalance, loanSubscriberID (required); agencyLoanID, servicerLoanID |
|
| Borrowers | borrower1, borrower1SubscriberID (required); borrower1Contact, borrower1FirstName, borrower1LastName, borrower1USSSN; the same fields for an optional borrower2 |
SSNs are 9 digits, with or without dashes |
| Title | foreclosure, title, titleSubscriberID, processType, requestProductCategoryType, titleTemplate, titleClientSubscriberID (required); titleVendor |
titleVendor is optional free text, up to 255 characters |
| Attachments | attachments[]: content (required), name, fileType, contentType, description, attachmentId, encodingType, binaryEncodingType |
Up to 50 per order, about 10 MB each. content must be Base64 with no line breaks or whitespace. |
The …SubscriberID fields are your stable keys for each party and record. Use the same value every time you refer to the same loan, property, or party.
Order accepted or rejected
Section titled “Order accepted or rejected”When Title Direct accepts the order, it returns its own title ID:
<OrderConfirmation> <TitleID>1978</TitleID> <Status>Order Received</Status></OrderConfirmation>The transaction moves to AwaitingCallback, and the title ID appears as vendorCorrelationId on the transaction and as qtdTitleID in responsePayload.data. Keep it: every later operation on this title needs it as qtdTitleID. Your own correlationId is returned unchanged.
If an order is already open on the property, Title Direct rejects the new one:
<OrderRejection> <TitleID>1978</TitleID> <Status>Error</Status> <Error>Error - Open order exists.</Error></OrderRejection>The transaction then fails with error code QTD_REJECTED, and the QTD.TitleOrderRequested event carries IsRejected: true.
UpdateTitleOrder
Section titled “UpdateTitleOrder”{ "payload": { "clientTitleID": "T-100045", "qtdTitleID": "1978", "title": "FC - 100045", "updateType": "PUBLICATION ENDORSEMENT", "updateInstructions": "Publication endorsement through the scheduled sale date", "scheduledSaleDate": "2026-06-15" }}| Field | Notes |
|---|---|
clientTitleID, qtdTitleID, title |
Required. Identify the title. |
updateType |
Required. The kind of update, such as a publication endorsement or date-down. Agree the values with Quandis. |
updateInstructions |
Required. Up to 4,000 characters. |
scheduledSaleDate |
Optional. |
OrderInquiry
Section titled “OrderInquiry”{ "payload": { "clientTitleID": "T-100045", "qtdTitleID": "1978", "messageID": "MSG-9001", "template": "Order Inquiry", "message": "Status of curative items", "bodyText": "Please confirm when the assignment issue is expected to clear.", "bodyHTML": "<p>Please confirm when the assignment issue is expected to clear.</p>" }}clientTitleID, qtdTitleID, messageID, template, message, and bodyText (up to 8,000 characters) are required. bodyHTML (up to 16,000 characters), object, objectID, subscriberID, and dateAdded are optional. The vendor’s acknowledgement arrives later as a message on the title.
CancelTitle
Section titled “CancelTitle”{ "payload": { "qtdTitleID": "1978", "title": "FC - 100045", "closedReason": "Client Cancellation Request", "agencyLoanID": "100045" }}qtdTitleID, title, and closedReason (up to 500 characters) are required; subscriberID and agencyLoanID are optional.
Updates, inquiries, and cancellations return an import result: success, warning, and error counts, a service request ID, and an entry for each record changed.
Results
Section titled “Results”Title results arrive from Title Direct after the order is placed, often in several deliveries on the same order. Each delivery updates the transaction, which keeps both the typed JSON (responsePayload) and the original XML (rawResponsePayload). A delivery is an ImportCollection, shaped like this (trimmed):
<ImportCollection> <LoanItem> <AgencyLoanID>100045</AgencyLoanID> <Titles> <TitleItem> <TitleID>1978</TitleID> <ClientTitleID>T-100045</ClientTitleID> <Title>FC - 100045</Title> <Status>Complete</Status> <ReceivedDate>2026-03-02T19:50:15</ReceivedDate> <RequestProductCategoryType>ForeclosureReport</RequestProductCategoryType> <RequestActionType>Datedown</RequestActionType> <VendorOrderIdentifier>600001</VendorOrderIdentifier> <TitleClearanceGradeIdentifier>A</TitleClearanceGradeIdentifier> <ProcessType>Foreclosure</ProcessType> <Attachments> <AttachmentItem> <Attachment>Title Product</Attachment> <FileName>TitleProduct.pdf</FileName> <Content>JVBERi0x…</Content> </AttachmentItem> </Attachments> <Contacts>…</Contacts> <Forms>…</Forms> <Ledgers>…</Ledgers> <Messages>…</Messages> </TitleItem> </Titles> <Transactions>…</Transactions> <PublicRecords>…</PublicRecords> </LoanItem> <ObjectLinkItem>…</ObjectLinkItem></ImportCollection>| Element | Contents |
|---|---|
TitleItem |
Title summary: Title Direct’s TitleID, your ClientTitleID, status, product, vendor order number, estimated completion, clearance grade |
Attachments |
Title documents, Base64 in Content |
Contacts |
Parties named on the title, with a ContactType such as Trustor, Mortgagee, or Grantee |
Forms |
Curative items and curative data: status, curing party, notification, follow-up, projected and actual clear dates, notes, vesting, and grades |
Ledgers |
Taxes and fees: balance, good-through date, and lines with type, amount, status, and transaction number |
Messages |
Confirmations, acknowledgements, and date-down results |
Transactions |
Recorded documents: type, document number, recording date, book and page |
PublicRecords |
Public records such as deeds, modifications, and vesting information |
ObjectLinkItem |
Links between recorded documents and their parties |
The results use the same import format as QBO imports, so a QBO installation can import them as title records with their documents and ledgers.
Status on the title drives the transaction status:
Status |
Transaction status |
|---|---|
Complete, Closed |
Completed |
Cancelled |
Cancelled |
Error |
Failed |
| Anything else | In progress |
Events
Section titled “Events”Subscribe to Title Direct events with a webhook subscription. Each subscription names its event types, a target URL, optional headers for your endpoint, and optional dataPointFilters on the event’s data points. Set includePayloads to receive the request and response bodies in the webhook instead of polling for them.
{ "subscriberName": "Title events, California and Texas", "eventTypes": ["QTD.TitleOrderRequested"], "dataPointFilters": { "conditions": [ { "key": "ProcessType", "operator": "EqualTo", "value": "Foreclosure" }, { "key": "State", "operator": "In", "value": "CA,TX" } ] }, "notificationMethod": "Webhook", "targetUrl": "https://example.com/title-events", "targetHeaders": { "X-Example-Auth": "…" }, "retryCount": 3, "retryDelaySeconds": 30, "includePayloads": true}| Event | When | Filter keys |
|---|---|---|
QTD.TitleOrderRequested |
An order was sent to Title Direct (accepted or rejected) | ClientTitleID, State, City, PostalCode, Agency, Servicer, ProcessType, RequestProductCategoryType, IsRejected |
QTD.TitleOrderUpdated |
An update request was sent | ClientTitleID, QTDTitleID |
QTD.OrderInquiryCompleted |
An inquiry was sent | ClientTitleID, QTDTitleID |
QTD.TitleCancelled |
A cancellation was sent | QTDTitleID |
QTD.SubmissionReceived |
Any result delivery arrived | QTDTitleID, ClientTitleID, SequenceNumber, TitleItemStatus |
QTD.OrderUpdated |
The order’s status changed, but it isn’t finished | QTDTitleID, ClientTitleID, SubmissionCount |
QTD.OrderCompleted |
The order reached a completed status | QTDTitleID, ClientTitleID, SubmissionCount |
The general Transaction.Succeeded event also fires when a title order completes, and carries both title IDs in its body, but you can’t filter it on them. Filter on the QTD.* events instead. ClientTitleID can be missing from result events when the delivery didn’t include it.