I don't have a final answer for you, but I also had problems with the api / 0 / edit-tag API and managed to get them working.
I already used the other parts of the API (api / 0 / stream / items / ids, api / 0 / uncread-count) without any problems, but this process did not work so easily.
After some time, I started by checking the requests sent to Google Reader via their web interface (using Chrome dev tools), and made hard code (you can use this code, and you just need to change the identifiers and the stream for yourself - be careful that they have all the necessary prefixes: feed / for stream and tag: google.com, 2005: reader / item / for id).
String authToken = getGoogleAuthKey(); // I use Jsoup for the requests, but you can use anything you // like - for jsoup you usually just need to include a jar // into your java project Document doc = Jsoup.connect("http://www.google.com/reader/api/0/edit-tag") .header("Authorization", _AUTHPARAMS + authToken) .data( // you don't need the userid, the '-' will suffice "a", "user/-/state/com.google/read", "async", "true", "s", "feed/http://www.gizmodo.com/index.xml", "i", "tag:google.com,2005:reader/item/1a68fb395bcb6947", "T", "//wF1kyvFPIe6JiyITNnMWdA" ) // I also send my API key, but I don't think this is mandatory .userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com") .timeout(10000) // don't forget the post! (using get() will not work) .**post()**;
Here is my last code for marking a specific element from a stream as read (the translateToItemAtomId method is used to convert long integer identifiers returned by api / 0 / stream / items / ids to atom xml identifiers accepted by this API):
String authToken = getGoogleAuthKey(); Document doc = Jsoup.connect("http://www.google.com/reader/api/0/edit-tag") .header("Authorization", _AUTHPARAMS + authToken) .data( "a", "user/-/state/com.google/read", "async", "true", "s", stream, "i", translateToItemAtomId(itemId), "T", getGoogleToken(authToken) ) .userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com") .timeout(10000).post();
Additional code you may need (based on http://www.chrisdadswell.co.uk/android-coding-example-authenticating-clientlogin-google-reader-api/ ):
private static final String _AUTHPARAMS = "GoogleLogin auth="; private static final String _GOOGLE_LOGIN_URL = "https://www.google.com/accounts/ClientLogin"; private static final String _READER_BASE_URL = "http://www.google.com/reader/"; private static final String _API_URL = _READER_BASE_URL + "api/0/"; private static final String _TOKEN_URL = _API_URL + "token"; private static final String _USER_INFO_URL = _API_URL + "user-info"; private static final String _USER_LABEL = "user/-/label/"; private static final String _TAG_LIST_URL = _API_URL + "tag/list"; private static final String _EDIT_TAG_URL = _API_URL + "tag/edit"; private static final String _RENAME_TAG_URL = _API_URL + "rename-tag"; private static final String _DISABLE_TAG_URL = _API_URL + "disable-tag"; private static final String _SUBSCRIPTION_URL = _API_URL + "subscription/edit"; private static final String _SUBSCRIPTION_LIST_URL = _API_URL + "subscription/list"; public static String getGoogleAuthKey() throws IOException { String _USERNAME = "USER_EMAIL@gmail.com"; String _PASSWORD = "USER_PASSWORD"; Document doc = Jsoup .connect(_GOOGLE_LOGIN_URL) .data("accountType", "GOOGLE", "Email", _USERNAME, "Passwd", _PASSWORD, "service", "reader", "source", "[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com") .userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com") .timeout(4000).post();
Hope this helps!