I see a lot of query pattern appending with this pattern. This would be nice, maybe in a util class:

    public static void appendFirstQueryParam(StringBuilder sb, String key, String value) {
        if (!Strings.isNullOrEmpty(value) {
            sb.append("?").append(key).append("=").append(value);
        }
    }
    
    public static void appendQueryParam(StringBuilder sb, String key, String value) {
        if (!Strings.isNullOrEmpty(value) {
            sb.append("&").append(key).append("=").append(value);
        }
    }

For example, that would make getAuthorizeUrl look really clean:

    public String getAuthorizeUrl() {
        StringBuilder sb = new StringBuilder(api.getAuthorizeUrl());
        UrlHelper.appendFirstQueryParam(sb, RESPONSE_TYPE, CODE);
        UrlHelper.appendQueryParam(sb, CLIENT_ID, getApiKey());
        UrlHelper.appendQueryParam(sb, STATE, "blah");
        UrlHelper.appendQueryParam(sb, REDIRECT_URL, OAuthUtils.percentEncode(getApiCallback())));
        UrlHelper.appendQueryParam(sb, SCOPE, getScope());
        UrlHelper.appendQueryParam(sb, DURATION, getDuration());
        return sb.toString();
    }