             }
         }
     }
+    
+    /**
+     Fetches all labels in a repository
+     - parameter session: RequestKitURLSession, defaults to URLSession.sharedSession()
+     - parameter owner: The user or organization that owns the repository.
+     - parameter repository: The name of the repository.
+     - parameter page: Current page for label pagination. `1` by default.
+     - parameter perPage: Number of labels per page. `100` by default.
+     - parameter completion: Callback for the outcome of the fetch.
+     */
+    @discardableResult
+    func labels(_ session: RequestKitURLSession = URLSession.shared, owner: String, repository: String, page: String = "1", perPage: String = "100", completion: @escaping (_ response: Response<[Label]>) -> Void) -> URLSessionDataTaskProtocol? {
+        let router = LabelRouter.readLabels(configuration, owner, repository, page, perPage)
+        return router.load(session, dateDecodingStrategy: .formatted(Time.rfc3339DateFormatter), expectedResultType: [Label].self) { labels, error in
+            if let error = error {
+                completion(Response.failure(error))
+            } else {
+                if let labels = labels {
+                    completion(Response.success(labels))
+                }
+            }
+        }
+    }
 }
 
 enum LabelRouter: JSONPostRouter {
     case readLabel(Configuration, String, String, String)
+    case readLabels(Configuration, String, String, String, String)
     var method: HTTPMethod {
         switch self {
         default:

    var params: [String : Any] {
        switch self {
        case .readLabel: return [:]
        }
    }
    

        case .readLabel(_, let owner, let repository, let name):
            let name = name.stringByAddingPercentEncodingForRFC3986() ?? name
            return "/repos/\(owner)/\(repository)/labels/\(name)"
        case .readLabels(_, let owner, let repository, _, _):
            return "/repos/\(owner)/\(repository)/labels"
        }
    }
}
