From 35b3e7140698434929487ad911e5ce800e9e3bc6 Mon Sep 17 00:00:00 2001 From: Ademar Gonzalez Date: Thu, 24 Sep 2026 22:07:07 -0400 Subject: [PATCH] Document domain and contact transfers in the README Cover the 1.9.0 transfer support: every operation, Period, Password and AuthInfoRoid on DomainTransfer, reading the transfer status and parties, ContactTransfer, and CiraDomainTransfer. Co-Authored-By: Claude Opus 5.5 --- README.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/README.md b/README.md index b423c7a..f209e97 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,48 @@ Our library is a complete implementation of the EPP specification. Have a look a PM> Install-Package EppLib ``` +# Transfers + +`DomainTransfer` and `ContactTransfer` support every transfer operation in RFC 5731 and RFC 5733: `Request` (the default), `Query`, `Approve`, `Reject` and `Cancel`. Put the object's authorization code in `Password`. + +Request a domain transfer, adding a year to the registration: + +```csharp +var request = new DomainTransfer("example.com") +{ + Period = new DomainPeriod(1, "y"), + Password = "2fooBAR" +}; +var response = service.Execute(request); + +var transfer = response.DomainTransferResult; +// transfer.TransferStatus is "pending" until the losing registrar or the registry acts. +``` + +Check on it later, or approve, reject or cancel it, with the same command and a different operation: + +```csharp +var query = new DomainTransfer("example.com") { Operation = TransferOperation.Query, Password = "2fooBAR" }; +var status = service.Execute(query).DomainTransferResult; + +Console.WriteLine($"{status.TransferStatus}: requested by {status.RequestClientId} on {status.RequestDate}, " + + $"action due from {status.ActionClientId} by {status.ActionDate}"); + +// As the losing registrar: +service.Execute(new DomainTransfer("example.com") { Operation = TransferOperation.Approve }); +``` + +When the authorization code belongs to one of the domain's contacts rather than the domain itself, set `AuthInfoRoid` to that contact's repository ID (the `roid` attribute on `pw`). + +Contacts transfer the same way: + +```csharp +var contactTransfer = service.Execute(new ContactTransfer("sh8013") { Password = "2fooBAR" }); +// contactTransfer.ContactId, TransferStatus, RequestClientId, RequestDate, ActionClientId, ActionDate +``` + +Registries that need extra data use their own subclass, such as `CiraDomainTransfer` for .ca, which accepts the same `Operation`, `Period` and `Password`. + # Upgrading Releases 1.4.1 to 1.7.0 change behavior you may depend on. Newest first: