Un esempio in JavaScript per recuperare da un calendario SharePoint 2010 tutti gli eventi, compresi quelli ricorrenti:
var sgart = sgart || {};

sgart.getCalendarItems = function(webUrl, calendarGuid, rowLimit, debug) {
  var wsUrl = webUrl + "_vti_bin/Lists.asmx";
  var xmlSoap = "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>" +
    "<soap:Body>" +
      "<GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'>" +
        "<listName>" + calendarGuid + "</listName>" +
        "<query>" +
          "<Query>" +
            "<Where>" +
              "<DateRangesOverlap>" +
                "<FieldRef Name=\"EventDate\" />" +
                "<FieldRef Name=\"EndDate\" />" +
                "<FieldRef Name=\"RecurrenceID\" />" +
                "<Value Type='DateTime'><Year/></Value>" +
              "</DateRangesOverlap>" +
            "</Where>" +
          "</Query>" +
        "</query>" +
        "<rowLimit>" + rowLimit + "</rowLimit>" +
        "<queryOptions>" +
          "<QueryOptions>" +
            "<ExpandRecurrence>TRUE</ExpandRecurrence>" +
          "</QueryOptions>" +
        "</queryOptions>" +
      "</GetListItems>" +
    "</soap:Body>" +
  "</soap:Envelope>";
  
  $.ajax({
    url: wsUrl,
    type: "POST",
    contentType: "text/xml; charset=\"utf-8\"",
    dataType: "xml",
    data: xmlSoap,
    complete: function (data, status) {
      var result = [];
      if (status === "success") {
        var root = $(data.responseText);
        root.find("listitems").children().children().each(function () {
          var item = $(this);
          var ids= item.attr("ows_UniqueId").split(";")[0];
          var id = ids[0];
          var guid = ids[1];
          var recurrence = item.attr("ows_fRecurrence") === '1' ? true : false;

          result.push({
            startTime: item.attr("ows_EventDate"),
            endTime: item.attr("ows_EndDate"),
            title: item.attr("ows_Title"),
            recurrence: recurrence,
            description: item.attr("ows_Description"),
            guid: guid,
            "id": id
          });
        });
      }
      //solo per debug
      if (debug === true) {
        for (var i = 0; i < result.length; i++) {
          var item = result[i];
          console.log(i + ") " + item.startTime + " - " + item.title);
        }
        console.log(result);  // visualizzo l'oggetto con i risultati
      }

      //TODO: inserire qui la logica di visualizzazione/gestione degli items ritornati

      return result;
    }
  });
};
per recuperare gli items utilizza il web service SAOP Lists.asmx che ritorna un XML con gli eventi.
In JavaScript sia con il client object model, sia con le chiamate REST, non è possibile avere gli eventi ricorrenti.

La funzione può essere richiamata passando la url relativa del web in cui si trova il calendario (webUrl) e il guid della lista (calendarGuid):
sgart.getCalendarItems("/", "{CC7E271C-9B1F-4072-ADFE-53FA542BADED}", 2, true);
inoltre è possibile indicare quanti elementi ritornare (rowLimit) e se visualizzare nella console del browser gli elementi ritornati (debug).