         ]
 
         self.sessionManager = SessionManager(configuration: configuration)
+    }
+
+    public func days(from start: Date, to end: Date, handler: @escaping APIType.DaysHandler) {
+        var results = [Result<Model.Day, API.Error>]()
+        var date = start
+
+        let days = calendar.dateComponents([.day], from: start, to: end).day ?? 1
+
+        repeat {
+
+            day(at: date) {
+                results.append($0)
+
+                // days would be 0 if start and end is the same day
+                if results.count >= days {
+                    let days = results
+                        .flatMap { $0.value }
+                        .sorted { $0.0.date() < $0.1.date() }
+
+                    handler(.success(days))
+                }
+            }
+
+            date = calendar.date(byAdding: .day, value: 1, to: date)!
+        } while date <= end
+    }
+
+    public func day(at date: Date, handler: @escaping APIType.DayHandler) {
+        request(Router.day(at: date), with: handler)
     }
 
     public func projects(handler: @escaping APIType.ProjectsHandler) {

import Runes

public protocol APIType {
    typealias UserHandler = (_: Result<Model.User, API.Error>) -> Void
    typealias ProjectsHandler = (_: Result<[Model.Project], API.Error>) -> Void

    func user(handler: @escaping UserHandler)
    func projects(handler: @escaping ProjectsHandler)
}

extension API {

        case .today:
            return "/daily"
        case let .day(date):
            let day = calendar.ordinality(of: .day, in: .year, for: date)!
            let year = calendar.component(.year, from: date)
            return "/daily/\(day)/\(year)"
        case .addEntry:
            return "/daily/add"
        }
    }
}

private let calendar = Calendar.current

public enum Model {
    public struct User {
