diff --git a/samples/gan/.hgignore b/samples/gan/.hgignore
new file mode 100644
index 0000000..051c7de
--- /dev/null
+++ b/samples/gan/.hgignore
@@ -0,0 +1,4 @@
+syntax: glob
+
+credentials.dat
+private_client_secrets.json
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/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/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>
