Tech support sent me here to ask this question.

I would like to set up an ET API call that would return subscriber information (i.e., attributes) for a specific user (using subscriberkey) from a specific list (i.e, NOT all subscribers). I've tried various permutations of using Subscriber and ListSubscriber without any success.

Can anybody direct me to some specific documentation about how to do this?


  • Can you include what you have tried in more detail? – Adrian Larson Aug 27 '15 at 18:49
  • I believe my response on a related post might contain your answer. The post was related to SSJS, but technically it was an API question. ( salesforce.stackexchange.com/questions/88676/… ) FYI, since attributes are related to the subscriber, not the list. They will be the same values regardless of the list your emailing to. – David Devoy Aug 28 '15 at 14:48
  • Profile Attributes are stored at the Subscriber level, so in order to get profile attributes the Subscriber object needs to be used. There are not separate sets of attributes for each list that the subscriber is on. If you want to know if a subscriber is on a specific list, the ListSubscriber object would be the one to use. There is no way to retrieve list membership and attributes using a single request. – Mac Aug 31 '15 at 14:31
  • Here's what I actually need to do. I have 5 lists a user can subscribe to. What I need to do is, on a per list basis, be able to update an attribute field (a date field) in a list whenever a user changes their subscribe status for that list specifically. That field needs to be updated independently for each of the lists. Is that possible? Let me know. Thanks. – Gary Betz Sep 1 '15 at 17:23

A lot of it depends on what you intend to do with this data. There is an unsubEvent REST route that supports GET, but doesnt appear to have a listid property(which would be strange, since unsubs are cardinally list-subscriber level data): https://code.exacttarget.com/apis-sdks/fuel-sdks/tracking/unsubscribe-tracking.html#rubyget . I cant help much with that, but might be worth trying.

Its not really API, but we actually do already track unsub date per list in the Unsubscribe Data view: https://help.exacttarget.com/en-US/documentation/exacttarget/interactions/activities/query_activity/data_view_unsubscribe/

That data view has eventDate(the date of the unsub event) and listid. You could write some simple sql and place in a query activity:

SELECT subscriberkey, eventDate, listid FROM _unsubsubscribe
WHERE eventDate > dateadd(day,datediff(day,1,GETDATE()),0) 
AND eventDate < dateadd(day,datediff(day,0,GETDATE()),0)

You could join in _listSubscribers on subscriberid to get a human-readable list name instead of the listID.

As has been mentioned previously, Profile attributes are at an account level (shared across all lists), so that wouldnt be the place to store unsubscribe data. Subscription status ETC are really system attributes and are stored per list.


My solution is to retrieve ListSubscriber objects by specifying ListID and SubscriberKey in complex filter via SOAP API.

Below is C# example that retrieves Subscriber: test@example.com in List 123 (Assuming you already know the authentication part for SoapClient object m_soapclient):

etAPI.APIObject[] results;
// Create RetrieveRequest
etAPI.RetrieveRequest rr = new etAPI.RetrieveRequest();
rr.ObjectType = "ListSubscriber";
rr.Properties = ["ListID","SubscriberKey","Status"];

rr.ClientIDs = new etAPI.ClientID[1];
rr.ClientIDs[0] = m_etclient;   // ClientID

// Define Complete Filter
ComplexFilterPart cfp = new ComplexFilterPart();

// Filter 1
etAPI.SimpleFilterPart filter1 = new etAPI.SimpleFilterPart();
filter1.Property = "ListID";
filter1.SimpleOperator = etAPI.SimpleOperators.equals;
filter1.Value = new string[] { "123" };

// Filter 2
etAPI.SimpleFilterPart filter2 = new etAPI.SimpleFilterPart();
filter2.Property = "SubscriberKey";
filter2.SimpleOperator = etAPI.SimpleOperators.equals;
filter2.Value = new string[] { "test@example.com" };

cfp.LeftOperand = filter1;
cfp.LogicalOperator = LogicalOperators.AND;
cfp.RightOperand = filter2;

// Set Filter to Complete Filter
rr.Filter = cfp;

string requestID = "";
// Execute RetrieveRequest
String status = m_soapclient.Retrieve(rr, out requestID, out results);

if (status == "OK")
    // loop through results

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.