Hi Team,
There is an Usecase where I have to call Business Process from web service. In Creatio, we have 2 types of service: cookie-based & Anonymous. I have tried both type of services to invoke Business Process, but getting below error: 401

Query: Can you guide me how to call BP using Anonymous & Cookie Based Web-service ?
(Cookie-Based Service)
[OperationContract]
[WebGet(UriTemplate = "UnsubscribeStatusBP?ContactId={ContactId}&BulkemailId={BulkemailId}&EndUserResult={EndUserResult}", ResponseFormat = WebMessageFormat.Json)]
public string UnsubscribeStatusBP(string ContactId, string BulkemailId, string EndUserResult)
{
// 1. Get UserConnection from the BaseService context
UserConnection userConnection = UserConnection;
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
// SessionHelper.SpecifyWebOperationIdentity(HttpContextAccessor.GetInstance(), SystemUserConnection.CurrentUser);
// 1. Validate ContactId (GUID)
if (!Guid.TryParse(ContactId, out Guid contactGuid)) {
return JsonConvert.SerializeObject(new { Success = false, Message = "❌ Invalid Parameter ContactId. Must be a valid GUID." });
}
// 2. Validate BulkemailId (GUID)
if (!Guid.TryParse(BulkemailId, out Guid bulkemailGuid)) {
return JsonConvert.SerializeObject(new { Success = false, Message = "❌ Invalid Parameter 'BulkemailId'. Must be a valid GUID." });
}
// 3. Validate EndUserResult (String length, null check, and basic sanitization)
if (string.IsNullOrWhiteSpace(EndUserResult) || EndUserResult.Length > 10) {
return JsonConvert.SerializeObject(new { Success = false, Message = "❌ Invalid Parameter 'EndUserResult'. Must be 1-10 characters." });
}
string sanitizedResult = Regex.Replace(EndUserResult, @"[^a-zA-Z_]", "");
try {
// 1. Prepare parameters
var inputs = new Dictionary {
{ "ContactId", contactGuid },
{ "BulkemailId", bulkemailGuid },
{ "EndUserResult", sanitizedResult }
};
// 2. Execute process via ProcessEngine
userConnection.RunProcess(
"UsrAllManageUnsubscribeStatus",
inputs
);
return JsonConvert.SerializeObject(new { Success = true, Message = "✅ Business Process is triggered." });
}
catch (Exception ex) {
return JsonConvert.SerializeObject(new { Success = false, Message = $"❌ {ex.Message}" });
}
}
(Anonymous Web-Service)
[OperationContract]
[WebGet(UriTemplate = "UnsubscribeStatusBP?ContactId={ContactId}&BulkemailId={BulkemailId}&EndUserResult={EndUserResult}", ResponseFormat = WebMessageFormat.Json)]
public string UnsubscribeStatusBP(string ContactId, string BulkemailId, string EndUserResult)
{
// 1. MUST BE FIRST: Set the identity to SystemUser for anonymous calls
// This connects the "guest" request to a real user account (Supervisor) internally
SessionHelper.SpecifyWebOperationIdentity(HttpContextAccessor.GetInstance(), SystemUserConnection.CurrentUser);
string result = "{}";
// 1. Validate ContactId (GUID)
if (!Guid.TryParse(ContactId, out Guid contactGuid)) {
return JsonConvert.SerializeObject(new { Success = false, Message = "❌ Invalid Parameter ContactId. Must be a valid GUID." });
}
// 2. Validate BulkemailId (GUID)
if (!Guid.TryParse(BulkemailId, out Guid bulkemailGuid)) {
return JsonConvert.SerializeObject(new { Success = false, Message = "❌ Invalid Parameter 'BulkemailId'. Must be a valid GUID." });
}
// 3. Validate EndUserResult (String length, null check, and basic sanitization)
if (string.IsNullOrWhiteSpace(EndUserResult) || EndUserResult.Length > 10) {
return JsonConvert.SerializeObject(new { Success = false, Message = "❌ Invalid Parameter 'EndUserResult'. Must be 1-10 characters." });
}
string sanitizedResult = Regex.Replace(EndUserResult, @"[^a-zA-Z_]", "");
try {
// 1. Prepare parameters
var inputs = new Dictionary<string, object> {
{ "ContactId", contactGuid },
{ "BulkemailId", bulkemailGuid },
{ "EndUserResult", sanitizedResult }
};
// 2. Execute process via ProcessEngine
SystemUserConnection.RunProcess(
"UsrAllManageUnsubscribeStatus",
inputs
);
return JsonConvert.SerializeObject(new { Success = true, Message = "✅ Business Process is triggered." });
}
catch (Exception ex) {
return JsonConvert.SerializeObject(new { Success = false, Message = $"❌ {ex.Message}" });
}
}