Changed
- POST /v1/title-deeds/{titleNumber}/purchase answers
202with aTitleDeedPurchasePendingbody when HM Land Registry accepts the purchase and delivers the title out of band. Treat it as a success: the credits are taken and the purchase stands.money_statereadscharged,expected_response_atcarries the estimate where HM Land Registry supplied one, and GET /v1/title-deeds/{titleNumber}/purchase-status settles into200once the title arrives. A client that branches on200alone, or that treats anything other than200as a failure, needs a branch for this, and a platform reselling a title must not refund its own customer against a202. money_statestates whether an attempt took credits. It is one ofcharged,not_chargedorunknown, and it is stamped where the refund decision is made rather than worked out afterwards. On POST /v1/title-deeds/{titleNumber}/purchase it is on the202, the402, and the404,500,502and503. A200does not repeat what the status already says, and the400and401, refused before a purchase begins, carry the standard error body. GET /v1/title-deeds/{titleNumber}/purchase-status carries it on every response it owns, and on POST /v1/title-deeds/{titleNumber}/purchase-async it is on the402. Read it to decide whether to refund downstream, retry cleanly, or hold for reconciliation:chargedmeans the purchase is live,not_chargedmeans nothing is held and a retry is safe, andunknownmeans hold.- The
404,500,502and503on the synchronous purchase are typed asTitleDeedPurchaseError, which declareserror.type,error.code,error.messageandmoney_state. Regenerate your client from the current specification if it readserror.param,error.doc_urlorerror.suggestionson those four responses, or branches on anerror.typeofrate_limit_errorthere. The API populated none of them on those responses, so no value on the wire changes; the generated types stop declaring them. Rate limiting is still reported as429. money_stateis required onInsufficientCreditsError, so a402always states the position on money. It readsnot_charged: a declined purchase holds nothing, anderror.required_creditson the same body tells you the credits the purchase costs, againsterror.current_balancefor what the account held.