I need to insert a new ContactShare object in apex. Here is a sample of the code I have :

Map<String, Id> mapUserRole = new Map<String, Id>();
    for(UserRole ur : lRoles){
        mapUserRole.put(ur.Name, ur.Id);
List<ContactShare> lContactShareToInsert = new List<ContactShare>(); 

for(Mission__c mission : lMissions){
    for(Contact con : lContacts){
                    if(mission.box__c != con.box__c && mapUserRole.get(mission.box__c) != null){

                        //créer contactShare
                        ContactShare conShare = new ContactShare();
                        conShare.ContactAccessLevel = 'Read';
                        conShare.ContactId = con.Id; 
                        conShare.UserOrGroupId =  mapUserRole.get(mission.box__c);

                        System.debug('### conShare : ' + conShare);


                        System.debug('### lContactShareToInsert : ' + lContactShareToInsert);

 Database.SaveResult[] srContactShare = Database.insert(lContactShareToInsert, false);

    for(Database.SaveResult srS : srContactShare){
        System.debug('### srS : ' + srS);
            System.debug('### srContactShare is insert');

The problem is that I got an error in the debug of srS, so the list of contactShare to insert is not insert because it is not successfill :

srS : Database.SaveResult[getErrors=(Database.Error[getFields=(UserOrGroupId);getMessage=User/Group ID: id value of incorrect type: 00E4E000000Xfj4UAC;getStatusCode=FIELD_INTEGRITY_EXCEPTION;]);getId=null;isSuccess=false;]

  • Make your apex class "without sharing" and then try!
    – Ayub
    May 18, 2018 at 9:03

2 Answers 2


Based on the User, Sharing, and Permission Objects ERD copied below, you will have to identify a single User object that references a selected UserRole and use the Id of that in conShare.UserOrGroupId.

enter image description here


Refer Sharing a Record Using Apex

UserOrGroupId should be either userId or public group id.

According to your code, it is UserRoleId, thats why it is invalid value.

You can create a public group based on the role and use that public group id for sharing the record.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .