ExtraFields are now supported in the REST and WCF apis for contact + person.
var row = GetJson("/api/v1/contact/40");
Assert.AreEqual(40, row.ContactId);
Assert.AreEqual("10049", row.Number2);
Assert.AreEqual("[I:123]", row.ExtraFields.x_contact_default_integer);
Assert.AreEqual("[I:0]", row.ExtraFields.x_contact_hidden_integer);
Assert.AreEqual("[I:666]", row.ExtraFields.x_contact_integer);
Assert.AreEqual("This is a big long text with <c>HTML</c>", row.ExtraFields.x_contact_longtext);
Assert.AreEqual("Saab", row.ExtraFields.x_contact_dropdown);
Also available in archives with contact and person entities.
var archiveProvider = ArchiveProviderFactory.Create(PersonProvider.ProviderName);
archiveProvider.SetDesiredColumns("personExtra/x_person_integer", "personExtra/x_person_float", "personExtra/x_person_longtext", "personExtra/x_person_date", "personExtra/x_person_datetime", "personExtra/x_person_time", "personExtra/x_person_boolean", "personExtra/x_person_timespan", "personExtra/x_person_shorttext", "personExtra/x_person_shorttext_list", "personExtra/x_person_user_relation", "personExtra/x_person_category_relation", "personExtra/x_person_priority_relation", "personExtra/x_person_contact_relation", "personExtra/x_person_appointment_relation", "personExtra/x_person_user_relation");
archiveProvider.SetDesiredEntities("person");
archiveProvider.SetRestriction(new ArchiveRestrictionInfo("personId", "=", "95"));
archiveProvider.SetPagingInfo(10, 0);
var rows = archiveProvider.GetRows("").ToArray();
Assert.AreEqual("[I:678]", rows[0].ColumnData["personExtra/x_person_integer"].DisplayValue);
Assert.AreEqual("[F:678.9]", rows[0].ColumnData["personExtra/x_person_float"].DisplayValue);
Assert.AreEqual("Six Seven Eight Six Seven Eight Six Seven Eight Six Seven Eight", rows[0].ColumnData["personExtra/x_person_longtext"].DisplayValue);
Assert.AreEqual("[D:03/28/2019]", rows[0].ColumnData["personExtra/x_person_date"].DisplayValue);
Assert.AreEqual("[DT:03/28/2019 13:52:00.0000000]", rows[0].ColumnData["personExtra/x_person_datetime"].DisplayValue);
Assert.AreEqual("[T:03/28/2019 19:25:00.0000000]", rows[0].ColumnData["personExtra/x_person_time"].DisplayValue);
Assert.AreEqual("[I:1]", rows[0].ColumnData["personExtra/x_person_boolean"].DisplayValue);
Assert.AreEqual("[I:6]", rows[0].ColumnData["personExtra/x_person_timespan"].DisplayValue);
Assert.AreEqual("Black", rows[0].ColumnData["personExtra/x_person_shorttext_list"].DisplayValue);
Assert.AreEqual("Administration", rows[0].ColumnData["personExtra/x_person_category_relation"].DisplayValue);
Assert.AreEqual("High", rows[0].ColumnData["personExtra/x_person_priority_relation"].DisplayValue);
Assert.AreEqual("5te Etage", rows[0].ColumnData["personExtra/x_person_contact_relation"].DisplayValue);
Assert.AreEqual("Discuss test document 2. See doc link.", rows[0].ColumnData["personExtra/x_person_appointment_relation"].DisplayValue);
Assert.AreEqual("SER4", rows[0].ColumnData["personExtra/x_person_user_relation"].DisplayValue);
Extra fields can also be used as restrictions
var archiveProvider = ArchiveProviderFactory.Create(PersonProvider.ProviderName);
archiveProvider.SetDesiredColumns("personId", "personExtra/x_person_integer",
"personExtra/x_person_float", "personExtra/x_person_longtext",
"personExtra/x_person_date", "personExtra/x_person_datetime",
"personExtra/x_person_time", "personExtra/x_person_boolean",
"personExtra/x_person_timespan", "personExtra/x_person_shorttext",
"personExtra/x_person_shorttext_list", "personExtra/x_person_user_relation",
"personExtra/x_person_category_relation", "personExtra/x_person_priority_relation");
archiveProvider.SetDesiredEntities("person");
archiveProvider.SetRestriction(new ArchiveRestrictionInfo("personExtra/x_person_float", "=", "678.9"));
archiveProvider.SetPagingInfo(10, 0);
var rows = archiveProvider.GetRows("").ToArray();
Assert.AreEqual(95, rows[0].ColumnData["personId"].RawValue);