First of all, I definitely recommend you to take a look at Ivanti SM Web Services Guide v2017.2.
It's a good documentation to start with.
A task always needs a parent object, here's a simple example when using Incident# as the parent object.
class Program { private static FRSHEATIntegration frSvc = new FRSHEATIntegration(); private static string _apiUserName = "HEATAdmin"; private static string _apiPassword = "p@ssw0rd"; private static string _apiTenantId = "yourtenant.contoso.com"; private static string _apiRole = "Admin"; private static string _authSessionKey = String.Empty; static void Main(string[] args) { // Connect to obtain API key var connectResponse = frSvc.Connect(_apiUserName, _apiPassword, _apiTenantId, _apiRole); if (connectResponse.connectionStatus == "Success") { _authSessionKey = connectResponse.sessionKey; } // create Incident object ObjectCommandData dataIncident = new ObjectCommandData(); dataIncident.ObjectType = "Incident#"; List<ObjectCommandDataFieldValue> dataFieldsIncident = new List<ObjectCommandDataFieldValue>(); Dictionary<string, object> fieldsIncident = new Dictionary<string, object> { ["ProfileLink"] = "3734B48625D043B0939456EBF5B07F43", // InternalServices, change as needed ["Subject"] = "Need to swap out the hard disk", ["Service"] = "Desktop-Service", ["Category"] = "Hardware", ["Urgency"] = "Low", ["Impact"] = "Low", ["OwnerTeam"] = "IT", ["Owner"] = "fdeutsch", ["Symptom"] = @"Description" }; foreach (string key in fieldsIncident.Keys) { dataFieldsIncident.Add(new ObjectCommandDataFieldValue() { Name = key, Value = fieldsIncident[key].ToString() }); } dataIncident.Fields = dataFieldsIncident.ToArray(); FRSHEATIntegrationCreateBOResponse result = frSvc.CreateObject(_authSessionKey, _apiTenantId, dataIncident); // create task object var parentObjectRecId = result.recId; var parentObjectType = result.obj.TableRef; ObjectCommandData dataTask = new ObjectCommandData(); dataTask.ObjectType = "Task#Assignment"; List<ObjectCommandDataFieldValue> dataFieldsTask = new List<ObjectCommandDataFieldValue>(); Dictionary<string, object> fieldsTask = new Dictionary<string, object> { ["Subject"] = "Need to swap out the hard disk", ["Details"] = "Task Details", ["OwnerTeam"] = "IT" }; foreach (string key in fieldsTask.Keys) { dataFieldsTask.Add(new ObjectCommandDataFieldValue() { Name = key, Value = fieldsTask[key].ToString() }); } dataTask.Fields = dataFieldsTask.ToArray(); dataTask.LinkToExistent = new LinkEntry[] { // link to the Incident we just created new LinkEntry() { Action = "Link", Relation = "IncidentContainsTask", RelatedObjectType = parentObjectType, RelatedObjectId = parentObjectRecId } }; FRSHEATIntegrationCreateBOResponse taskResult = frSvc.CreateObject(_authSessionKey, _apiTenantId, dataTask); // add attachment ObjectAttachmentCommandData taskAttachmentData = new ObjectAttachmentCommandData() { ObjectId = taskResult.recId, ObjectType = taskResult.obj.TableRef, fileName = "testfile.txt", fileData = File.ReadAllBytes(@"c:\temp\testfile.txt"), }; FRSHEATIntegrationAddAttachmentResponse attachmentResponse = frSvc.AddAttachment(_authSessionKey, _apiTenantId, taskAttachmentData); Console.ReadLine(); } }