diff --git a/tools/gh_api.py b/tools/gh_api.py
index 8cd798b..22d0bed 100644
--- a/tools/gh_api.py
+++ b/tools/gh_api.py
@@ -119,12 +119,13 @@ def get_pull_request_files(project, num, auth=False):
 element_pat = re.compile(r'<(.+?)>')
 rel_pat = re.compile(r'rel=[\'"](\w+)[\'"]')
 
-def get_paged_request(url, headers=None):
+def get_paged_request(url, headers=None, **params):
     """get a full list, handling APIv3's paging"""
     results = []
+    params.setdefault("per_page", 100)
     while True:
-        print("fetching %s" % url, file=sys.stderr)
-        response = requests.get(url, headers=headers)
+        print("fetching %s with %s" % (url, params), file=sys.stderr)
+        response = requests.get(url, headers=headers, params=params)
         response.raise_for_status()
         results.extend(response.json())
         if 'next' in response.links:
@@ -133,28 +134,32 @@ def get_paged_request(url, headers=None):
             break
     return results
 
-def get_pulls_list(project, state="closed", auth=False):
-    """get pull request list
-    """
-    url = "https://api.github.com/repos/{project}/pulls?state={state}&per_page=100".format(project=project, state=state)
+def get_pulls_list(project, auth=False, **params):
+    """get pull request list"""
+    params.setdefault("state", "closed")
+    url = "https://api.github.com/repos/{project}/pulls".format(project=project)
     if auth:
         headers = make_auth_header()
     else:
         headers = None
-    pages = get_paged_request(url, headers=headers)
+    pages = get_paged_request(url, headers=headers, params=params)
     return pages
 
-def get_issues_list(project, state="closed", auth=False):
-    """get pull request list
-    """
-    url = "https://api.github.com/repos/{project}/pulls?state={state}&per_page=100".format(project=project, state=state)
+def get_issues_list(project, auth=False, **params):
+    """get issues list"""
+    params.setdefault("state", "closed")
+    url = "https://api.github.com/repos/{project}/issues".format(project=project)
     if auth:
         headers = make_auth_header()
     else:
         headers = None
-    pages = get_paged_request(url, headers=headers)
+    pages = get_paged_request(url, headers=headers, **params)
     return pages
 
+def is_pull_request(issue):
+    """Return True if the given issue is a pull request."""
+    return bool(issue.get('pull_request', {}).get('html_url', None))
+
 # encode_multipart_formdata is from urllib3.filepost
 # The only change is to iter_fields, to enforce S3's required key ordering
 
diff --git a/tools/github_stats.py b/tools/github_stats.py
index cc1072b..fdbcd90 100755
--- a/tools/github_stats.py
+++ b/tools/github_stats.py
@@ -13,7 +13,7 @@ import sys
 
 from datetime import datetime, timedelta
 from subprocess import check_output
-from gh_api import get_paged_request, make_auth_header, get_pull_request
+from gh_api import get_paged_request, make_auth_header, get_pull_request, is_pull_request
 
 #-----------------------------------------------------------------------------
 # Globals
@@ -50,12 +50,6 @@ def issues2dict(issues):
         idict[i['number']] = i
     return idict
 
-
-def is_pull_request(issue):
-    """Return True if the given issue is a pull request."""
-    return bool(issue.get('pull_request', {}).get('html_url', None))
-
-
 def split_pulls(all_issues, project="ipython/ipython"):
     """split a list of closed issues into non-PR Issues and Pull Requests"""
     pulls = []