function ExecuteStoreApiCall( path, formData, callback, rawCallback = false )
{
	GetStoreSessionID( ( session ) =>
	{
		if( !session.success )
		{
			callback( session );
			return;
		}

		formData.set( 'sessionid', session.sessionID );

		const url = `https://store.steampowered.com/${path}`;

		fetch( url, {
			credentials: 'include',
			method: 'POST',
			body: formData,
			headers: {
				// Specify that we're doing an AJAX request, which will prevent Steam from
				// nuking users' cookies (even though it won't do that for POST requests either way)
				'X-Requested-With': 'SteamDB',
			},
		} )
			.then( async( response ) =>
			{
				// If we get 401 Unauthorized, it's likely that the login cookie has expired,
				// if that's the case, requesting page to get sessionid again should go through
				// login redirect and set a fresh login cookie.
				// Or the sessionid simply changed.
				// Except for ajaxrequestplaytestaccess which actually can return 401 as part of the api
				if( response.status === 401 && !path.startsWith( 'ajaxrequestplaytestaccess/' ) )
				{
					storeSessionId = null;
				}

				// Handle possible family view requirement
				if( response.status === 403 )
				{
					const text = await response.clone().text();

					if( text.includes( 'data-featuretarget="parentalunlock"' ) || text.includes( 'data-featuretarget="parentalfeaturerequest"' ) )
					{
						throw new Error( 'Your account is currently under Family View restrictions. You need to exit Family View by entering your PIN on the Steam store and then retry this action.' );
					}
				}

				return response.json();
			} )
			.then( ( response ) =>
			{
				if( rawCallback )
				{
					callback( response );
					return;
				}

				if( path === 'explore/followgame/' )
				{
					// This API returns just true/false instead of an object
					response = {
						success: response === true,
					};
				}

				if( response?.success )
				{
					callback( { success: true } );

					InvalidateCache();
				}
				else
				{
					callback( { success: false, error: 'Failed to do the action. Are you logged in on the Steam store?\nThis item may not be available in your country.' } );
				}
			} )
			.catch( ( error ) => callback( { success: false, error: error.message } ) );
	} );
}
@param {string} path
@param {FormData} formData
@param {(obj: {success: true}|{success: false, error: string}) => void} callback
@param {boolean} rawCallback