const getRequestDigest = async () => { const res = await fetch(`/pwa/_api/contextinfo`, { method: "POST", headers: { Accept: "application/json;odata=verbose" }, }); const data = await res.json(); return data.d.GetContextWebInformation.FormDigestValue; }; // Search AD via SharePoint's People Picker web service const searchPeoplePicker = async (text, signal) => { const digest = await getRequestDigest(); const res = await fetch( `/pwa/_api/SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.ClientPeoplePickerSearchUser`, { method: "POST", headers: { Accept: "application/json;odata=verbose", "Content-Type": "application/json;odata=verbose", "X-RequestDigest": digest, }, signal, body: JSON.stringify({ queryParams: { __metadata: { type: "SP.UI.ApplicationPages.ClientPeoplePickerQueryParameters", }, AllowEmailAddresses: true, AllowMultipleEntities: false, AllUrlZones: false, MaximumEntitySuggestions: 15, PrincipalSource: 15, // All sources (incl. AD) PrincipalType: 1, // Users only QueryString: text, }, }), }, ); const data = await res.json(); // The result is a JSON string, needs a second parse const parsed = JSON.parse( data.d.ClientPeoplePickerSearchUser, ); return parsed || []; }; await searchPeoplePicker()