diff --git a/samples/gan/README.txt b/samples/gan/README.txt
new file mode 100644
index 0000000..27a789e
--- /dev/null
+++ b/samples/gan/README.txt
@@ -0,0 +1,4 @@
+Python Sample Code for the Google Affiliate Network APIs
+--------------------------------------------------------
+See API docs at https://code.google.com/apis/gan/index.html
+for system/dependency requirements and more information.
diff --git a/samples/gan/advertisers/advertisers.py b/samples/gan/advertisers/advertisers.py
new file mode 100644
index 0000000..4fc9411
--- /dev/null
+++ b/samples/gan/advertisers/advertisers.py
@@ -0,0 +1,189 @@
+#!/usr/bin/python2.4
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Google Inc.
+
+"""Sample for retrieving advertiser information from GAN."""
+
+__author__ = 'leadpipe@google.com (Luke Blanshard)'
+
+import apiclient
+import gflags
+import httplib2
+import json
+import logging
+import os
+import stat
+import sys
+
+from django.conf import settings
+from django.template import Template, Context
+from django.template.loader import get_template
+
+from apiclient.discovery import build
+from oauth2client.file import Storage
+from oauth2client.client import AccessTokenRefreshError
+from oauth2client.client import flow_from_clientsecrets
+from oauth2client.tools import run
+
+settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
+    TEMPLATE_DIRS=('.'))
+
+
+FLAGS = gflags.FLAGS
+
+# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
+# application, including client_id and client_secret, which are found
+# on the API Access tab on the Google APIs
+# Console <http://code.google.com/apis/console>
+CLIENT_SECRETS = '../client_secrets.json'
+
+# Helpful message to display in the browser if the CLIENT_SECRETS file
+# is missing.
+MISSING_CLIENT_SECRETS_MESSAGE = """
+WARNING: Please configure OAuth 2.0
+
+To make this sample run you will need to populate the client_secrets.json file
+found at:
+
+   %s
+
+with information from the APIs Console <https://code.google.com/apis/console>.
+
+""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS)
+
+# Set up a Flow object to be used if we need to authenticate.
+FLOW = flow_from_clientsecrets(CLIENT_SECRETS,
+    scope='https://www.googleapis.com/auth/gan.readonly',
+    message=MISSING_CLIENT_SECRETS_MESSAGE)
+
+
+# The gflags module makes defining command-line options easy for
+# applications. Run this program with the '--help' argument to see
+# all the flags that it understands.
+gflags.DEFINE_enum('logging_level', 'DEBUG',
+    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
+    'Set the level of logging detail.')
+
+gflags.DEFINE_enum("request_type", 'LIST', ['GET', 'LIST'],
+                   'Type of request to be made')
+
+gflags.DEFINE_enum("output_type", 'STDOUT', ['BOTH', 'HTML', 'STDOUT'],
+                   'Set how to output the results received from the API')
+
+gflags.DEFINE_string('credentials_filename', '../credentials.dat',
+                     'File to store credentials in', short_name='cf')
+
+API_FLAGS = {'relationshipStatus':None, 'advertiserId':None, 'role':None,
+             'roleId':None, 'category':None, 'minSevenDayEpc':None,
+             'minNinetyDayEpc':None, 'minPayoutRank':None}
+
+gflags.DEFINE_enum(
+    'relationshipStatus', None,
+    ['APPROVED', 'AVAILABLE', 'PENDING', 'DECLINED', 'DEACTIVATED'],
+    'Status of the relationship')
+
+gflags.DEFINE_string(
+    'advertiserId', None,
+    'Advertiser ID to lookup (get requests only).')
+
+gflags.DEFINE_string('category', None,
+                     'Caret delimited set of advertiser categories to include'
+                     + ' (list requests only).')
+
+gflags.DEFINE_string('minSevenDayEpc', None,
+                     'Minimum value for the advertiser\'s seven day EPC'
+                     + ' (list requests only).')
+
+gflags.DEFINE_string('minNinetyDayEpc', None,
+                     'Minimum value for the advertiser\'s ninety day EPC'
+                     + ' (list requests only).')
+
+gflags.DEFINE_enum('minPayoutRank', None, ['1', '2', '3', '4'],
+                   'Minimum value for the advertiser\'s payout rank'
+                   + ' (list requests only)')
+
+def usage(argv):
+  print 'Usage: %s <role> <role-id>\n%s' % (argv[0], FLAGS)
+  sys.exit(1)
+
+
+def main(argv):
+  # Let the gflags module process the command-line arguments
+  try:
+    argv = FLAGS(argv)
+  except gflags.FlagsError, e:
+    print e
+    usage(argv)
+
+  if len(argv) != 3:
+    usage(argv)
+  params = {
+    'role': argv[1],
+    'roleId': argv[2]
+  }
+
+  # Set the logging according to the command-line flag
+  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
+
+  # If the Credentials don't exist or are invalid run through the native client
+  # flow. The Storage object will ensure that if successful the good
+  # Credentials will get written back to a file.
+  storage = Storage(FLAGS.credentials_filename)
+  credentials = storage.get()
+  if credentials is None or credentials.invalid:
+    credentials = run(FLOW, storage)
+
+  # Create an httplib2.Http object to handle our HTTP requests and authorize it
+  # with our good Credentials.
+  http = httplib2.Http()
+  http = credentials.authorize(http)
+
+  service = build('gan', 'v1beta1', http=http)
+
+  advertisers = service.advertisers()
+
+  # Filter out all params that aren't set.
+  for key in FLAGS:
+    if key in API_FLAGS and FLAGS[key].value != None:
+      params[key] = FLAGS[key].value
+
+  # Retrieve the relevant advertisers.
+  stdout = {}
+  html = {}
+  try:
+    if FLAGS.request_type == "GET":
+      get_call = advertisers.get(**params)
+
+      stdout = get_call.execute()
+      html['items'] = [stdout['item']]
+    else:
+      all_items = []
+      request = advertisers.list(**params)
+      while request:
+        response = request.execute()
+        if 'items' in response:
+          all_items.extend(response['items'])
+        request = advertisers.list_next(request, response)
+
+      html['items'] = all_items
+      stdout = html
+  except apiclient.errors.HttpError, e:
+    print json.dumps(e.__dict__, sort_keys=True, indent=4)
+
+  if FLAGS.output_type in ["BOTH", "HTML"]:
+    template = get_template('advertisers_template.html')
+    context = Context(html)
+
+    out = open("output.html", 'w')
+    out.write(template.render(context).encode('UTF-8'))
+    os.fchmod(out.fileno(), stat.S_IROTH|stat.S_IRGRP|stat.S_IRUSR|stat.S_IWUSR)
+    out.close()
+
+    print 'Wrote output.html'
+
+  if FLAGS.output_type in ["BOTH", "STDOUT"]:
+    print json.dumps(stdout, sort_keys=True, indent=4)
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/samples/gan/advertisers/advertisers_template.html b/samples/gan/advertisers/advertisers_template.html
new file mode 100644
index 0000000..576109d
--- /dev/null
+++ b/samples/gan/advertisers/advertisers_template.html
@@ -0,0 +1,85 @@
+<html>
+  <head>
+    <title>Advertiser Response</title>
+    <style>
+      h2 {
+      margin: 3ex 0 1ex;
+      }
+      th {
+      background-color: grey;
+      }
+      td {
+      vertical-align: top;
+      overflow: auto;
+      }
+      tr.details td {
+      padding: 0 3ex;
+      }
+      td pre {
+      margin: 3ex 3em;
+      width: 500px;
+      }
+    </style>
+    <script>
+      function toggleDisplay(id) {
+      el = document.getElementById(id);
+      if (el.style.display == "none") {
+      el.style.display = "block"
+      } else {
+      el.style.display = "none"
+      }
+      }
+    </script>
+  </head>
+  <body>
+    <h1>Advertisers</h1>
+    <table border="1" cellspacing="0">
+    {% for item in items %}
+      <tr>
+        <th>Advertiser ID</th>
+        {% if item.status %}<th>Relationship Status</th>{% endif %}
+        <th>Advertiser Name</th>
+        <th>Advertiser Category</th>
+        {% if item.joinDate %}<th>Join Date</th>{% endif %}
+        {% if item.epcSevenDayAverage %}<th>EPC Seven Day Average</th>{% endif %}
+        {% if item.epcNinetyDayAverage %}<th>EPC Ninety Day Average</th>{% endif %}
+        {% if item.payoutRank %}<th>Payout Rank</th>{% endif %}
+        {% if item.siteUrl %}<th>Site Url</th>{% endif %}
+        {% if item.productFeedsEnabled %}<th>Product Feeds Enabled</th>{% endif %}
+        {% if item.commissionDuration %}<th>Commission Duration</th>{% endif %}
+        {% if item.logoUrl %}<th>Logo Url</th>{% endif %}
+        {% if item.contactEmail %}<th>Contact Email</th>{% endif %}
+        {% if item.contactPhone %}<th>Contact Phone</th>{% endif %}
+      </tr>
+      <tr class="advertiserInfo">
+        <td>{{ item.id }}</td>
+        {% if item.status %}<td>{{ item.status }}</td>{% endif %}
+        <td>{{ item.name }}</td>
+        <td>{{ item.category }}</td>
+        {% if item.joinDate %}<td>{{ item.joinDate }}</td>{% endif %}
+        {% if item.epcSevenDayAverage %}<td>{{ item.epcSevenDayAverage }}</td>{% endif %}
+        {% if item.epcNinetyDayAverage %}<td>{{ item.epcNinetyDayAverage }}</td>{% endif %}
+        {% if item.payoutRank %}<td>{{ item.payoutRank }}</td>{% endif %}
+        {% if item.siteUrl %}<td>{{ item.siteUrl }}</td>{% endif %}
+        {% if item.productFeedsEnabled %}<td>{{ item.productFeedsEnabled }}</td>{% endif %}
+        {% if item.commissionDuration %}<td>{{ item.commissionDuration }}</td>{% endif %}
+        {% if item.logoUrl %}<td>{{ item.logoUrl }}</td>{% endif %}
+        {% if item.contactEmail %}<td>{{ item.contactEmail }}</td>{% endif %}
+        {% if item.contactPhone %}<td>{{ item.contactPhone }}</td>{% endif %}
+      </tr>
+      {% if item.description %}
+      <tr class="description">
+        <th>Description</th>
+        <td colspan="13">{{ item.description }}</td>
+      </tr>
+      {% endif %}
+      {% empty %}
+      <tr>
+        <td>
+          <p style="padding:10px">No advertisers fit that criteria. Try searching for modifying your search.</p>
+        </td>
+      </tr>
+      {% endfor %}
+    </table>
+  </body>
+</html>
diff --git a/samples/gan/ccoffers/offers.py b/samples/gan/ccoffers/offers.py
index 6e5168c..ddc967a 100644
--- a/samples/gan/ccoffers/offers.py
+++ b/samples/gan/ccoffers/offers.py
@@ -21,7 +21,8 @@
 
 from apiclient.discovery import build
 from oauth2client.file import Storage
-from oauth2client.client import OAuth2WebServerFlow
+from oauth2client.client import AccessTokenRefreshError
+from oauth2client.client import flow_from_clientsecrets
 from oauth2client.tools import run
 
 settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
@@ -30,20 +31,30 @@
 
 FLAGS = gflags.FLAGS
 
-# Set up a Flow object to be used if we need to authenticate. This
-# sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with
-# the information it needs to authenticate. Note that it is called
-# the Web Server Flow, but it can also handle the flow for native
-# applications <http://code.google.com/apis/accounts/docs/OAuth2.html#IA>
-# The client_id client_secret are copied from the API Access tab on
-# the Google APIs Console <http://code.google.com/apis/console>. When
-# creating credentials for this application be sure to choose an Application
-# type of "Installed application".
-FLOW = OAuth2WebServerFlow(
-    client_id='767567128246-ti2q06i1neqm5boe2m1pqdc2riivhk41.apps.googleusercontent.com',
-    client_secret='UtdXI8nKD2SEcQRLQDZPkGT9',
+# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
+# application, including client_id and client_secret, which are found
+# on the API Access tab on the Google APIs
+# Console <http://code.google.com/apis/console>
+CLIENT_SECRETS = '../client_secrets.json'
+
+# Helpful message to display in the browser if the CLIENT_SECRETS file
+# is missing.
+MISSING_CLIENT_SECRETS_MESSAGE = """
+WARNING: Please configure OAuth 2.0
+
+To make this sample run you will need to populate the client_secrets.json file
+found at:
+
+   %s
+
+with information from the APIs Console <https://code.google.com/apis/console>.
+
+""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS)
+
+# Set up a Flow object to be used if we need to authenticate.
+FLOW = flow_from_clientsecrets(CLIENT_SECRETS,
     scope='https://www.googleapis.com/auth/gan.readonly',
-    user_agent='gan-ccoffers-sample/1.0')
+    message=MISSING_CLIENT_SECRETS_MESSAGE)
 
 # The gflags module makes defining command-line options easy for
 # applications. Run this program with the '--help' argument to see
@@ -55,10 +66,10 @@
 gflags.DEFINE_enum("output_type", 'STDOUT', ['BOTH', 'HTML', 'STDOUT'],
                    'Set how to output the results received from the API')
 
-gflags.DEFINE_string('credentials_filename', 'offers.dat',
+gflags.DEFINE_string('credentials_filename', '../credentials.dat',
                      'File to store credentials in', short_name='cf')
 
-gflags.DEFINE_multistring('advertiser', None,
+gflags.DEFINE_multistring('advertiser', [],
                           'If given, advertiser we should run as')
 
 
@@ -100,16 +111,15 @@
   ccOffers = service.ccOffers()
 
   # Retrieve the relevant offers.
-  list_call = ccOffers.list(publisher=publisher,
-  # TODO(leadpipe): add back when advertiser is repeated
-  # advertiser=FLAGS.advertiser,
-                            projection='full')
-  list = list_call.execute()
-  list['publisher'] = publisher
+  request = ccOffers.list(publisher=publisher,
+                          advertiser=FLAGS.advertiser,
+                          projection='full')
+  response = request.execute()
+  response['publisher'] = publisher
 
   if FLAGS.output_type in ["BOTH", "HTML"]:
     template = get_template('offers_template.html')
-    context = Context(list)
+    context = Context(response)
 
     fname = '%s.html' % publisher
     out = open(fname, 'w')
@@ -120,7 +130,7 @@
     print 'Wrote %s' % fname
 
   if FLAGS.output_type in ["BOTH", "STDOUT"]:
-    print json.dumps(list, sort_keys=True, indent=4)
+    print json.dumps(response, sort_keys=True, indent=4)
 
 if __name__ == '__main__':
   main(sys.argv)
diff --git a/samples/gan/ccoffers/offers_template.html b/samples/gan/ccoffers/offers_template.html
index 4d1744a..4e52c03 100644
--- a/samples/gan/ccoffers/offers_template.html
+++ b/samples/gan/ccoffers/offers_template.html
@@ -14,6 +14,11 @@
   }
   tr.details td {
     padding: 0 3ex;
+    min-width: 15%;
+    max-width: 33%;
+  }
+  tr.details td img {
+    max-width: 200px;
   }
   td pre {
     margin: 3ex 3em;
@@ -33,7 +38,8 @@
 </head>
 <body>
 <h1>Credit Card Offers for Publisher {{ publisher }}</h1>
-<table>
+{% if items %}
+<table cellspacing=5>
 {% for item in items %}
 <tr>
 <td colspan=3 class="cardName">
@@ -45,18 +51,22 @@
   {% if item.imageUrl %}
   <img src="{{ item.imageUrl }}" title="Image from GAN" />
   {% endif %}
-  {% if item.logoUrl %}
-  <img src="{{ item.logoUrl }}" title="Image from AdConnect" />
-  {% endif %}
-  {% if item.disclaimer %}
-  <div>{{ item.disclaimer }}</div>
-  {% endif %}
 <td>
+  {% if item.aprDisplay %}
   <div>APR: {{ item.aprDisplay }}</div>
+  {% endif %}
+  {% if item.annualFeeDisplay %}
   <div>Annual Fee: {{ item.annualFeeDisplay }}</div>
+  {% endif %}
+  {% if item.gracePeriodDisplay %}
   <div>Grace Period: {{ item.gracePeriodDisplay }}</div>
+  {% endif %}
+  {% if item.latePaymentFee %}
   <div>Late Payment Fee: {{ item.latePaymentFee }}</div>
+  {% endif %}
+  {% if item.creditRatingDisplay %}
   <div>Credit Rating: {{ item.creditRatingDisplay }}</div>
+  {% endif %}
 <td>
   {% if item.introAprDisplay %}
   <div>Intro APR: {{ item.introAprDisplay }}</div>
@@ -88,12 +98,20 @@
   </ul>
 -->
 </tr>
+<tr>
+  <td colspan=3>
+  {% if item.disclaimer %}
+  <div style="font-size:x-small">{{ item.disclaimer }}</div>
+  {% endif %}
+</tr>
 <tr><td colspan=3><pre id="pre{{forloop.counter}}" style="display:none">
 {{ item|pprint|linebreaks }}</pre>
-{% empty %}
 <tr><td>
-<h2>Whoops, {{ publisher }} has no associated credit card offers.</h2>
 {% endfor %}
 </table>
+{% else %}
+<h2>Whoops, {{ publisher }} has no associated credit card offers.</h2>
+{% endif %}
+
 </body>
 </html>
diff --git a/samples/gan/client_secrets.json b/samples/gan/client_secrets.json
new file mode 100644
index 0000000..a232f37
--- /dev/null
+++ b/samples/gan/client_secrets.json
@@ -0,0 +1,9 @@
+{
+  "web": {
+    "client_id": "[[INSERT CLIENT ID HERE]]",
+    "client_secret": "[[INSERT CLIENT SECRET HERE]]",
+    "redirect_uris": [],
+    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
+    "token_uri": "https://accounts.google.com/o/oauth2/token"
+  }
+}
diff --git a/samples/gan/events/events.py b/samples/gan/events/events.py
index 05a42c0..bc45167 100644
--- a/samples/gan/events/events.py
+++ b/samples/gan/events/events.py
@@ -3,7 +3,7 @@
 #
 # Copyright (C) 2011 Google Inc.
 
-"""Sample for retrieving credit-card offers from GAN."""
+"""Sample for retrieving event information from GAN."""
 
 __author__ = 'leadpipe@google.com (Luke Blanshard)'
 
@@ -22,7 +22,8 @@
 
 from apiclient.discovery import build
 from oauth2client.file import Storage
-from oauth2client.client import OAuth2WebServerFlow
+from oauth2client.client import AccessTokenRefreshError
+from oauth2client.client import flow_from_clientsecrets
 from oauth2client.tools import run
 
 settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
@@ -31,20 +32,30 @@
 
 FLAGS = gflags.FLAGS
 
-# Set up a Flow object to be used if we need to authenticate. This
-# sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with
-# the information it needs to authenticate. Note that it is called
-# the Web Server Flow, but it can also handle the flow for native
-# applications <http://code.google.com/apis/accounts/docs/OAuth2.html#IA>
-# The client_id client_secret are copied from the API Access tab on
-# the Google APIs Console <http://code.google.com/apis/console>. When
-# creating credentials for this application be sure to choose an Application
-# type of "Installed application".
-FLOW = OAuth2WebServerFlow(
-    client_id='767567128246-ti2q06i1neqm5boe2m1pqdc2riivhk41.apps.googleusercontent.com',
-    client_secret='UtdXI8nKD2SEcQRLQDZPkGT9',
+# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
+# application, including client_id and client_secret, which are found
+# on the API Access tab on the Google APIs
+# Console <http://code.google.com/apis/console>
+CLIENT_SECRETS = '../client_secrets.json'
+
+# Helpful message to display in the browser if the CLIENT_SECRETS file
+# is missing.
+MISSING_CLIENT_SECRETS_MESSAGE = """
+WARNING: Please configure OAuth 2.0
+
+To make this sample run you will need to populate the client_secrets.json file
+found at:
+
+   %s
+
+with information from the APIs Console <https://code.google.com/apis/console>.
+
+""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS)
+
+# Set up a Flow object to be used if we need to authenticate.
+FLOW = flow_from_clientsecrets(CLIENT_SECRETS,
     scope='https://www.googleapis.com/auth/gan.readonly',
-    user_agent='gan-events-sample/1.0')
+    message=MISSING_CLIENT_SECRETS_MESSAGE)
 
 # The gflags module makes defining command-line options easy for
 # applications. Run this program with the '--help' argument to see
@@ -56,7 +67,7 @@
 gflags.DEFINE_enum("output_type", 'STDOUT', ['BOTH', 'HTML', 'STDOUT'],
                    'Set how to output the results received from the API')
 
-gflags.DEFINE_string('credentials_filename', 'events.dat',
+gflags.DEFINE_string('credentials_filename', '../credentials.dat',
                      'File to store credentials in', short_name='cf')
 
 API_FLAGS = {'eventDateMin':None, 'eventDateMax':None, 'advertiserId':None,
@@ -146,15 +157,22 @@
       params[key] = FLAGS[key].value
 
   # Retrieve the relevant events.
+  all_items = []
   try:
-    list_call = events.list(**params)
-    list = list_call.execute()
+    request = events.list(**params)
+    while request:
+      response = request.execute()
+      if FLAGS.output_type in ["BOTH", "STDOUT"]:
+        print json.dumps(response, sort_keys=True, indent=4)
+      all_items.extend(response['items'])
+      request = events.list_next(request, response)
+
   except apiclient.errors.HttpError, e:
     print json.dumps(e.__dict__, sort_keys=True, indent=4)
 
   if FLAGS.output_type in ["BOTH", "HTML"]:
     template = get_template('events_template.html')
-    context = Context(list)
+    context = Context({'items':items})
 
     out = open("output.html", 'w')
     out.write(template.render(context).encode('UTF-8'))
@@ -163,8 +181,5 @@
 
     print 'Wrote output.html'
 
-  if FLAGS.output_type in ["BOTH", "STDOUT"]:
-    print json.dumps(list, sort_keys=True, indent=4)
-
 if __name__ == '__main__':
   main(sys.argv)
diff --git a/samples/gan/publishers/publishers.py b/samples/gan/publishers/publishers.py
new file mode 100644
index 0000000..5c40955
--- /dev/null
+++ b/samples/gan/publishers/publishers.py
@@ -0,0 +1,188 @@
+#!/usr/bin/python2.4
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2011 Google Inc.
+
+"""Sample for retrieving publisher information from GAN."""
+
+__author__ = 'leadpipe@google.com (Luke Blanshard)'
+
+import apiclient
+import gflags
+import httplib2
+import json
+import logging
+import os
+import stat
+import sys
+
+from django.conf import settings
+from django.template import Template, Context
+from django.template.loader import get_template
+
+from apiclient.discovery import build
+from oauth2client.file import Storage
+from oauth2client.client import AccessTokenRefreshError
+from oauth2client.client import flow_from_clientsecrets
+from oauth2client.tools import run
+
+settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
+    TEMPLATE_DIRS=('.'))
+
+
+FLAGS = gflags.FLAGS
+
+# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
+# application, including client_id and client_secret, which are found
+# on the API Access tab on the Google APIs
+# Console <http://code.google.com/apis/console>
+CLIENT_SECRETS = '../client_secrets.json'
+
+# Helpful message to display in the browser if the CLIENT_SECRETS file
+# is missing.
+MISSING_CLIENT_SECRETS_MESSAGE = """
+WARNING: Please configure OAuth 2.0
+
+To make this sample run you will need to populate the client_secrets.json file
+found at:
+
+   %s
+
+with information from the APIs Console <https://code.google.com/apis/console>.
+
+""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS)
+
+# Set up a Flow object to be used if we need to authenticate.
+FLOW = flow_from_clientsecrets(CLIENT_SECRETS,
+    scope='https://www.googleapis.com/auth/gan.readonly',
+    message=MISSING_CLIENT_SECRETS_MESSAGE)
+
+# The gflags module makes defining command-line options easy for
+# applications. Run this program with the '--help' argument to see
+# all the flags that it understands.
+gflags.DEFINE_enum('logging_level', 'DEBUG',
+    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
+    'Set the level of logging detail.')
+
+gflags.DEFINE_enum("request_type", 'LIST', ['GET', 'LIST'],
+                   'Type of request to be made')
+
+gflags.DEFINE_enum("output_type", 'STDOUT', ['BOTH', 'HTML', 'STDOUT'],
+                   'Set how to output the results received from the API')
+
+gflags.DEFINE_string('credentials_filename', '../credentials.dat',
+                     'File to store credentials in', short_name='cf')
+
+API_FLAGS = {'relationshipStatus':None, 'publisherId':None, 'role':None,
+             'roleId':None, 'category':None, 'minSevenDayEpc':None,
+             'minNinetyDayEpc':None, 'minPayoutRank':None}
+
+gflags.DEFINE_enum(
+    'relationshipStatus', None,
+    ['APPROVED', 'AVAILABLE', 'PENDING', 'DECLINED', 'DEACTIVATED'],
+    'Status of the relationship')
+
+gflags.DEFINE_string(
+    'publisherId', None,
+    'Publisher ID to lookup (get requests only).')
+
+gflags.DEFINE_string('category', None,
+                     'Caret delimited set of publisher categories to include'
+                     + ' (list requests only).')
+
+gflags.DEFINE_string('minSevenDayEpc', None,
+                     'Minimum value for the publisher\'s seven day EPC'
+                     + ' (list requests only).')
+
+gflags.DEFINE_string('minNinetyDayEpc', None,
+                     'Minimum value for the publisher\'s ninety day EPC'
+                     + ' (list requests only).')
+
+gflags.DEFINE_enum('minPayoutRank', None, ['1', '2', '3', '4'],
+                   'Minimum value for the publisher\'s payout rank'
+                   + ' (list requests only)')
+
+def usage(argv):
+  print 'Usage: %s <role> <role-id>\n%s' % (argv[0], FLAGS)
+  sys.exit(1)
+
+
+def main(argv):
+  # Let the gflags module process the command-line arguments
+  try:
+    argv = FLAGS(argv)
+  except gflags.FlagsError, e:
+    print e
+    usage(argv)
+
+  if len(argv) != 3:
+    usage(argv)
+  params = {
+    'role': argv[1],
+    'roleId': argv[2]
+  }
+
+  # Set the logging according to the command-line flag
+  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
+
+  # If the Credentials don't exist or are invalid run through the native client
+  # flow. The Storage object will ensure that if successful the good
+  # Credentials will get written back to a file.
+  storage = Storage(FLAGS.credentials_filename)
+  credentials = storage.get()
+  if credentials is None or credentials.invalid:
+    credentials = run(FLOW, storage)
+
+  # Create an httplib2.Http object to handle our HTTP requests and authorize it
+  # with our good Credentials.
+  http = httplib2.Http()
+  http = credentials.authorize(http)
+
+  service = build('gan', 'v1beta1', http=http)
+
+  publishers = service.publishers()
+
+  # Filter out all params that aren't set.
+  for key in FLAGS:
+    if key in API_FLAGS and FLAGS[key].value != None:
+      params[key] = FLAGS[key].value
+
+  # Retrieve the relevant publishers.
+  stdout = {}
+  html = {}
+  try:
+    if FLAGS.request_type == "GET":
+      get_call = publishers.get(**params)
+
+      stdout = get_call.execute()
+      html['items'] = [stdout['item']]
+    else:
+      all_items = []
+      request = publishers.list(**params)
+      while request:
+        response = request.execute()
+        if 'items' in response:
+          all_items.extend(response['items'])
+        request = publishers.list_next(request, response)
+
+      html['items'] = all_items
+      stdout = html
+  except apiclient.errors.HttpError, e:
+    print json.dumps(e.__dict__, sort_keys=True, indent=4)
+
+  if FLAGS.output_type in ["BOTH", "HTML"]:
+    template = get_template('publishers_template.html')
+    context = Context(html)
+
+    out = open("output.html", 'w')
+    out.write(template.render(context).encode('UTF-8'))
+    os.fchmod(out.fileno(), stat.S_IROTH|stat.S_IRGRP|stat.S_IRUSR|stat.S_IWUSR)
+    out.close()
+
+    print 'Wrote output.html'
+
+  if FLAGS.output_type in ["BOTH", "STDOUT"]:
+    print json.dumps(stdout, sort_keys=True, indent=4)
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/samples/gan/publishers/publishers_template.html b/samples/gan/publishers/publishers_template.html
new file mode 100644
index 0000000..a609999
--- /dev/null
+++ b/samples/gan/publishers/publishers_template.html
@@ -0,0 +1,73 @@
+<html>
+  <head>
+    <title>Publisher Response</title>
+    <style>
+      h2 {
+      margin: 3ex 0 1ex;
+      }
+      th {
+      background-color: grey;
+      }
+      td {
+      vertical-align: top;
+      overflow: auto;
+      }
+      tr.details td {
+      padding: 0 3ex;
+      }
+      td pre {
+      margin: 3ex 3em;
+      width: 500px;
+      }
+    </style>
+    <script>
+      function toggleDisplay(id) {
+      el = document.getElementById(id);
+      if (el.style.display == "none") {
+      el.style.display = "block"
+      } else {
+      el.style.display = "none"
+      }
+      }
+    </script>
+  </head>
+  <body>
+    <h1>Publishers</h1>
+    <table border="1" cellspacing="0">
+    {% for item in items %}
+      <tr>
+        <th>Publisher ID</th>
+        {% if item.status %}<th>Relationship Status</th>{% endif %}
+        <th>Publisher Name</th>
+        <th>Publisher Category</th>
+        {% if item.joinDate %}<th>Join Date</th>{% endif %}
+        {% if item.epcSevenDayAverage %}<th>EPC Seven Day Average</th>{% endif %}
+        {% if item.epcNinetyDayAverage %}<th>EPC Ninety Day Average</th>{% endif %}
+        {% if item.payoutRank %}<th>Payout Rank</th>{% endif %}
+      </tr>
+      <tr class="publisherInfo">
+        <td>{{ item.id }}</td>
+        {% if item.status %}<td>{{ item.status }}</td>{% endif %}
+        <td>{{ item.name }}</td>
+        <td>{{ item.classification }}</td>
+        {% if item.joinDate %}<td>{{ item.joinDate }}</td>{% endif %}
+        {% if item.epcSevenDayAverage %}<td>{{ item.epcSevenDayAverage }}</td>{% endif %}
+        {% if item.epcNinetyDayAverage %}<td>{{ item.epcNinetyDayAverage }}</td>{% endif %}
+        {% if item.payoutRank %}<td>{{ item.payoutRank }}</td>{% endif %}
+      </tr>
+      {% if item.sites %}
+      <tr style="border:1px solid #444">
+        <th class="sites">Sites:</th>
+        <td colspan="11">{{ item.sites }}</td>
+      </tr>
+      {% endif %}
+      {% empty %}
+      <tr>
+        <td>
+          <p style="padding:10px">No publishers fit that criteria. Try searching for modifying your search.</p>
+        </td>
+      </tr>
+      {% endfor %}
+    </table>
+  </body>
+</html>
