diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,17 @@
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [0.7.2.0] - 2022-03-15
+
+### Added
+
+ - Add getJobSource to resolve extraInputs in hci
+ - `PagedResponse`
+ - `SimpleProject`
+ - `SimpleRepo`
+ - `ImmutableGitInput`
+ - `JobType`
+
 ## [0.7.1.0] - 2021-09-06
 
 ### Added
diff --git a/hercules-ci-api.cabal b/hercules-ci-api.cabal
--- a/hercules-ci-api.cabal
+++ b/hercules-ci-api.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.12
 name:               hercules-ci-api
-version:            0.7.1.0
+version:            0.7.2.0
 synopsis:           Hercules CI API definition with Servant
 homepage:           https://github.com/hercules-ci/hercules-ci-agent#readme
 bug-reports:        https://github.com/hercules-ci/hercules-ci-agent/issues
@@ -60,6 +60,8 @@
     Hercules.API.Evaluation.AttributeError
     Hercules.API.Evaluation.Evaluation
     Hercules.API.Health
+    Hercules.API.Inputs.ImmutableGitInput
+    Hercules.API.Inputs.ImmutableInput
     Hercules.API.Labels
     Hercules.API.Message
     Hercules.API.Organizations
@@ -68,6 +70,7 @@
     Hercules.API.Organizations.Organization
     Hercules.API.Organizations.PaymentLink
     Hercules.API.Orphans
+    Hercules.API.Paging
     Hercules.API.Projects
     Hercules.API.Projects.CreateProject
     Hercules.API.Projects.CreateUserEffectTokenResponse
@@ -75,9 +78,11 @@
     Hercules.API.Projects.PatchProject
     Hercules.API.Projects.Project
     Hercules.API.Projects.SimpleJob
+    Hercules.API.Projects.SimpleProject
     Hercules.API.Repos
     Hercules.API.Repos.Repo
     Hercules.API.Repos.RepoKey
+    Hercules.API.Repos.SimpleRepo
     Hercules.API.Result
     Hercules.API.Servant.Status
     Hercules.API.SourceHostingSite.SimpleSite
@@ -113,7 +118,7 @@
     -fwarn-name-shadowing -fwarn-incomplete-patterns
 
   build-depends:
-      aeson
+      aeson >= 2
     , base                     >=4.7    && <5
     , bytestring
     , containers
diff --git a/src/Hercules/API/Accounts/SimpleAccount.hs b/src/Hercules/API/Accounts/SimpleAccount.hs
--- a/src/Hercules/API/Accounts/SimpleAccount.hs
+++ b/src/Hercules/API/Accounts/SimpleAccount.hs
@@ -8,7 +8,7 @@
 
 data SimpleAccount = SimpleAccount
   { id :: Id Account,
-    name :: Text,
+    name :: Name Account,
     displayName :: Text,
     typ :: AccountType,
     imageURL :: Text,
diff --git a/src/Hercules/API/Agents/AgentSession.hs b/src/Hercules/API/Agents/AgentSession.hs
--- a/src/Hercules/API/Agents/AgentSession.hs
+++ b/src/Hercules/API/Agents/AgentSession.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE DeriveAnyClass #-}
 {-# LANGUAGE DerivingStrategies #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
 
 module Hercules.API.Agents.AgentSession where
 
diff --git a/src/Hercules/API/Attribute.hs b/src/Hercules/API/Attribute.hs
--- a/src/Hercules/API/Attribute.hs
+++ b/src/Hercules/API/Attribute.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE DeriveAnyClass #-}
 {-# LANGUAGE StandaloneDeriving #-}
-{-# LANGUAGE TypeApplications #-}
 
 module Hercules.API.Attribute where
 
diff --git a/src/Hercules/API/Build/DerivationEvent.hs b/src/Hercules/API/Build/DerivationEvent.hs
--- a/src/Hercules/API/Build/DerivationEvent.hs
+++ b/src/Hercules/API/Build/DerivationEvent.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DisambiguateRecordFields #-}
 {-# LANGUAGE DuplicateRecordFields #-}
 
 module Hercules.API.Build.DerivationEvent where
@@ -32,16 +31,16 @@
   toEncoding = genericToEncoding schemaCompatibleOptions
 
 eventTime :: DerivationEvent -> UTCTime
-eventTime (Queued (DerivationEventQueued {time = t})) = t
-eventTime (DependencyFailed (DerivationEventDependencyFailed {time = t})) = t
-eventTime (Started (DerivationEventStarted {time = t})) = t
-eventTime (Reset (DerivationEventReset {time = t})) = t
-eventTime (Failed (DerivationEventFailed {time = t})) = t
-eventTime (Succeeded (DerivationEventSucceeded {time = t})) = t
-eventTime (Cancelled (DerivationEventCancelled {time = t})) = t
-eventTime (Built (DerivationEventBuilt {time = t})) = t
-eventTime (HasCancelled (DerivationEventHasCancelled {time = t})) = t
-eventTime (HasCancelledForReset (DerivationEventHasCancelledForReset {time = t})) = t
+eventTime (Queued DerivationEventQueued {time = t}) = t
+eventTime (DependencyFailed DerivationEventDependencyFailed {time = t}) = t
+eventTime (Started DerivationEventStarted {time = t}) = t
+eventTime (Reset DerivationEventReset {time = t}) = t
+eventTime (Failed DerivationEventFailed {time = t}) = t
+eventTime (Succeeded DerivationEventSucceeded {time = t}) = t
+eventTime (Cancelled DerivationEventCancelled {time = t}) = t
+eventTime (Built DerivationEventBuilt {time = t}) = t
+eventTime (HasCancelled DerivationEventHasCancelled {time = t}) = t
+eventTime (HasCancelledForReset DerivationEventHasCancelledForReset {time = t}) = t
 
 data DerivationEventQueued = DerivationEventQueued
   { time :: UTCTime,
diff --git a/src/Hercules/API/Effects/EffectEvent.hs b/src/Hercules/API/Effects/EffectEvent.hs
--- a/src/Hercules/API/Effects/EffectEvent.hs
+++ b/src/Hercules/API/Effects/EffectEvent.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE DeriveAnyClass #-}
-{-# LANGUAGE DisambiguateRecordFields #-}
 {-# LANGUAGE DuplicateRecordFields #-}
 
 module Hercules.API.Effects.EffectEvent where
@@ -26,12 +25,12 @@
   toEncoding = genericToEncoding schemaCompatibleOptions
 
 eventTime :: EffectEvent -> UTCTime
-eventTime (Queued (EffectEventQueued {time = t})) = t
-eventTime (DependencyFailed (EffectEventDependencyFailed {time = t})) = t
-eventTime (Started (EffectEventStarted {time = t})) = t
-eventTime (Failed (EffectEventFailed {time = t})) = t
-eventTime (Succeeded (EffectEventSucceeded {time = t})) = t
-eventTime (Cancelled (EffectEventCancelled {time = t})) = t
+eventTime (Queued EffectEventQueued {time = t}) = t
+eventTime (DependencyFailed EffectEventDependencyFailed {time = t}) = t
+eventTime (Started EffectEventStarted {time = t}) = t
+eventTime (Failed EffectEventFailed {time = t}) = t
+eventTime (Succeeded EffectEventSucceeded {time = t}) = t
+eventTime (Cancelled EffectEventCancelled {time = t}) = t
 
 data EffectEventQueued = EffectEventQueued
   { time :: UTCTime
diff --git a/src/Hercules/API/Inputs/ImmutableGitInput.hs b/src/Hercules/API/Inputs/ImmutableGitInput.hs
new file mode 100644
--- /dev/null
+++ b/src/Hercules/API/Inputs/ImmutableGitInput.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Hercules.API.Inputs.ImmutableGitInput where
+
+import Hercules.API.Prelude
+import Hercules.API.Projects.SimpleJob (SimpleJob)
+import Hercules.API.Repos.SimpleRepo (SimpleRepo)
+
+data ImmutableGitInput = ImmutableGitInput
+  { rev :: Text,
+    ref :: Text,
+    sshURL :: Text,
+    httpURL :: Text,
+    repo :: Maybe SimpleRepo,
+    jobs :: Maybe [SimpleJob],
+    historyURL :: Maybe Text
+  }
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
diff --git a/src/Hercules/API/Inputs/ImmutableInput.hs b/src/Hercules/API/Inputs/ImmutableInput.hs
new file mode 100644
--- /dev/null
+++ b/src/Hercules/API/Inputs/ImmutableInput.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Hercules.API.Inputs.ImmutableInput where
+
+import Data.Aeson
+  ( FromJSON (parseJSON),
+    ToJSON (toEncoding, toJSON),
+    genericParseJSON,
+    genericToEncoding,
+    genericToJSON,
+  )
+import Hercules.API.Inputs.ImmutableGitInput
+import Hercules.API.Prelude
+
+data ImmutableInput
+  = GitInput ImmutableGitInput
+  | IgnoreMe ()
+  deriving (Generic, Show, Eq, NFData, ToSchema)
+
+instance FromJSON ImmutableInput where
+  parseJSON = genericParseJSON schemaCompatibleOptions
+
+instance ToJSON ImmutableInput where
+  toJSON = genericToJSON schemaCompatibleOptions
+
+  toEncoding = genericToEncoding schemaCompatibleOptions
diff --git a/src/Hercules/API/Labels.hs b/src/Hercules/API/Labels.hs
--- a/src/Hercules/API/Labels.hs
+++ b/src/Hercules/API/Labels.hs
@@ -1,6 +1,5 @@
 {-# LANGUAGE DerivingStrategies #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
-{-# LANGUAGE TypeApplications #-}
 
 module Hercules.API.Labels where
 
@@ -19,4 +18,4 @@
       NamedSchema (Just "Labels") $
         mempty
           & type_ ?~ SwaggerObject
-          & additionalProperties ?~ (AdditionalPropertiesAllowed True)
+          & additionalProperties ?~ AdditionalPropertiesAllowed True
diff --git a/src/Hercules/API/Paging.hs b/src/Hercules/API/Paging.hs
new file mode 100644
--- /dev/null
+++ b/src/Hercules/API/Paging.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE StandaloneDeriving #-}
+
+module Hercules.API.Paging where
+
+import Hercules.API.Prelude
+
+-- To be used in newtypes only; otherwise the schema will have colliding
+-- PagedResponse types.
+data PagedResponse a = PagedResponse
+  { -- | The items you requested, up to some limit.
+    items :: [a],
+    -- | Whether more items would be returned if it wasn't for the limit.
+    more :: Bool
+  }
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON)
+
+deriving instance ToSchema a => ToSchema (PagedResponse a)
diff --git a/src/Hercules/API/Projects.hs b/src/Hercules/API/Projects.hs
--- a/src/Hercules/API/Projects.hs
+++ b/src/Hercules/API/Projects.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveAnyClass #-}
 
 module Hercules.API.Projects where
 
@@ -8,6 +9,8 @@
   )
 import qualified Hercules.API.Build.FailureGraph as FailureGraph
 import Hercules.API.Build.Log (Log)
+import Hercules.API.Inputs.ImmutableGitInput (ImmutableGitInput)
+import Hercules.API.Paging (PagedResponse)
 import Hercules.API.Prelude
 import Hercules.API.Projects.CreateProject
   ( CreateProject,
@@ -27,8 +30,48 @@
 import Servant.API
 import Servant.API.Generic
 
+data ProjectResourceGroup auth f = ProjectResourceGroup
+  { getJobs ::
+      f :- Summary "Retrieve information about jobs"
+        :> "jobs"
+        :> QueryParam' '[Optional, Description "Constrain the results by git ref, such as refs/heads/my-branch or HEAD"] "ref" Text
+        :> QueryParam' '[Optional, Description "Only return successful jobs, or only failed ones"] "success" Bool
+        :> QueryParam' '[Optional, Description "Return jobs that come \"after\" the provided id in the response order."] "offsetId" (Id Job)
+        :> auth
+        :> Get '[JSON] PagedJobs,
+    getJobSource ::
+      f :- Summary "Get source information from the latest successful job/jobs satisfying the provided requirements."
+        :> Description "The job parameter can be omitted to require all jobs for a commit to succeed. This can have the unexpected effect of reverting when a change in the extraInputs causes a regression. So it is recommended to specify one or more jobs. Common examples are \"onPush.default\" for a pinned build or \"onPush.ci\" for a build using extraInputs to integrate continuously."
+        :> "source"
+        :> QueryParam' '[Optional, Description "Constrain the results by git ref, such as refs/heads/my-branch. Defaults to HEAD."] "ref" Text
+        :> QueryParams "jobs" Text
+        :> auth
+        :> Get '[JSON] ImmutableGitInput
+  }
+  deriving (Generic)
+
 data ProjectsAPI auth f = ProjectsAPI
-  { projectsByOwner ::
+  { byProjectId ::
+      f
+        :- Substitute
+             ( "projects"
+                 :> Capture' '[Required, Strict] "projectId" (Id Project)
+                 :> Placeholder
+             )
+             (ToServantApi (ProjectResourceGroup auth)),
+    byProjectName ::
+      f
+        :- Substitute
+             ( "site"
+                 :> Capture' '[Required, Strict] "site" (Name SourceHostingSite)
+                 :> "account"
+                 :> Capture' '[Required, Strict] "account" (Name Account)
+                 :> "project"
+                 :> Capture' '[Required, Strict] "project" (Name Project)
+                 :> Placeholder
+             )
+             (ToServantApi (ProjectResourceGroup auth)),
+    projectsByOwner ::
       f :- Summary "List all projects owned by an account."
         :> "accounts"
         :> Capture' '[Required, Strict] "accountId" (Id Account)
@@ -63,14 +106,6 @@
         :> auth
         :> "create-user-effect-token"
         :> Post '[JSON] CreateUserEffectTokenResponse,
-    projectJobs ::
-      f :- Summary "List all jobs in a project"
-        :> Description "A list of a project's revisions and their details and status."
-        :> "projects"
-        :> Capture' '[Required, Strict] "project" (Id Project)
-        :> "jobs"
-        :> auth
-        :> Get '[JSON] [Job],
     findJobs ::
       f :- Summary "Find jobs"
         :> "jobs"
@@ -132,3 +167,6 @@
         :> Get '[JSON] Log
   }
   deriving (Generic)
+
+newtype PagedJobs = PagedJobs (PagedResponse Job)
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
diff --git a/src/Hercules/API/Projects/Job.hs b/src/Hercules/API/Projects/Job.hs
--- a/src/Hercules/API/Projects/Job.hs
+++ b/src/Hercules/API/Projects/Job.hs
@@ -1,13 +1,20 @@
 {-# LANGUAGE DeriveAnyClass #-}
 
-module Hercules.API.Projects.Job where
+module Hercules.API.Projects.Job
+  ( module Hercules.API.Projects.Job,
+    JobStatus (..),
+    JobPhase (..),
+  )
+where
 
 import Hercules.API.Accounts.Account (Account)
 import Hercules.API.Evaluation.Evaluation
   ( Evaluation,
   )
+import Hercules.API.Inputs.ImmutableInput (ImmutableInput)
 import Hercules.API.Prelude
 import Hercules.API.Projects.Project (Project)
+import Hercules.API.Projects.SimpleJob (JobPhase (..), JobStatus (..))
 import Hercules.API.Repos.Repo (Repo)
 
 data Job = Job
@@ -25,6 +32,10 @@
     effectsStatus :: JobStatus,
     evaluationId :: Id Evaluation,
     source :: GitCommitSource,
+    -- | This is only correct when querying a single Job.
+    extraInputs :: Map Text ImmutableInput,
+    jobType :: JobType,
+    jobName :: Maybe Text,
     rerunOf :: Maybe (Id Job),
     rerunOfIndex :: Maybe Int,
     startedBy :: Maybe (Id Account),
@@ -34,6 +45,12 @@
   }
   deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
 
+data JobType
+  = Config
+  | Legacy
+  | OnPush
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
+
 data GitCommitSource = GitCommitSource
   { revision :: Text,
     ref :: Text,
@@ -43,36 +60,6 @@
     link :: Text
   }
   deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
-
-data JobPhase
-  = Queued
-  | Evaluating
-  | Building
-  | Effects
-  | Done
-  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
-
-data JobStatus
-  = Pending
-  | Failure
-  | Success
-  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
-
--- | Whichever is "worse": 'Failure' wins out, otherwise 'Pending' wins out, otherwise all are 'Success'.
-instance Semigroup JobStatus where
-  Failure <> _ = Failure
-  _ <> Failure = Failure
-  Pending <> _ = Pending
-  _ <> Pending = Pending
-  Success <> Success = Success
-
--- | @mappend@: Whichever is "worse": 'Failure' wins out, otherwise 'Pending' wins out, otherwise all are 'Success'.
---
--- @mempty@: 'Success'
-instance Monoid JobStatus where
-  mappend = (<>)
-
-  mempty = Success
 
 data ProjectAndJobs = ProjectAndJobs
   { project :: Project,
diff --git a/src/Hercules/API/Projects/SimpleJob.hs b/src/Hercules/API/Projects/SimpleJob.hs
--- a/src/Hercules/API/Projects/SimpleJob.hs
+++ b/src/Hercules/API/Projects/SimpleJob.hs
@@ -1,14 +1,46 @@
+{-# LANGUAGE DataKinds #-}
 {-# LANGUAGE DeriveAnyClass #-}
 
 module Hercules.API.Projects.SimpleJob where
 
 import Hercules.API.Prelude
-import Hercules.API.Projects.Job (Job)
-import Hercules.API.Projects.Project (Project)
+import Hercules.API.Projects.SimpleProject (SimpleProject)
 
 data SimpleJob = SimpleJob
-  { id :: Id Job,
-    project :: Project,
-    index :: Int64
+  { id :: Id "Job",
+    project :: SimpleProject,
+    index :: Int64,
+    status :: JobStatus,
+    phase :: JobPhase
   }
   deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
+
+data JobPhase
+  = Queued
+  | Evaluating
+  | Building
+  | Effects
+  | Done
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
+
+data JobStatus
+  = Pending
+  | Failure
+  | Success
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
+
+-- | Whichever is "worse": 'Failure' wins out, otherwise 'Pending' wins out, otherwise all are 'Success'.
+instance Semigroup JobStatus where
+  Failure <> _ = Failure
+  _ <> Failure = Failure
+  Pending <> _ = Pending
+  _ <> Pending = Pending
+  Success <> Success = Success
+
+-- | @mappend@: Whichever is "worse": 'Failure' wins out, otherwise 'Pending' wins out, otherwise all are 'Success'.
+--
+-- @mempty@: 'Success'
+instance Monoid JobStatus where
+  mappend = (<>)
+
+  mempty = Success
diff --git a/src/Hercules/API/Projects/SimpleProject.hs b/src/Hercules/API/Projects/SimpleProject.hs
new file mode 100644
--- /dev/null
+++ b/src/Hercules/API/Projects/SimpleProject.hs
@@ -0,0 +1,21 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Hercules.API.Projects.SimpleProject where
+
+import Hercules.API.Accounts.SimpleAccount (SimpleAccount)
+import Hercules.API.Prelude
+import Hercules.API.Projects.Project (Project)
+
+data SimpleProject = SimpleProject
+  { id :: Id Project,
+    name :: Name Project,
+    owner :: SimpleAccount,
+    displayName :: Text,
+    imageURL :: Maybe Text,
+    -- | True if no authorization is required for retrieving basic
+    --   information about a project, such as its existence, name,
+    --   job statuses etc.
+    isPublic :: Bool
+  }
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
diff --git a/src/Hercules/API/Repos/Repo.hs b/src/Hercules/API/Repos/Repo.hs
--- a/src/Hercules/API/Repos/Repo.hs
+++ b/src/Hercules/API/Repos/Repo.hs
@@ -14,6 +14,9 @@
     displayName :: Text,
     imageURL :: Maybe Text,
     isPublic :: Bool,
+    defaultBranch :: Maybe Text,
+    httpURL :: Text,
+    sshURL :: Text,
     -- | An installed repo is one that Hercules has permission to.
     --
     -- A non-installed repo is one that is only visible because of the
diff --git a/src/Hercules/API/Repos/SimpleRepo.hs b/src/Hercules/API/Repos/SimpleRepo.hs
new file mode 100644
--- /dev/null
+++ b/src/Hercules/API/Repos/SimpleRepo.hs
@@ -0,0 +1,17 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
+module Hercules.API.Repos.SimpleRepo where
+
+import Hercules.API.Accounts.SimpleAccount (SimpleAccount)
+import Hercules.API.Prelude
+import Hercules.API.Repos.Repo (Repo)
+
+data SimpleRepo = SimpleRepo
+  { id :: Id Repo,
+    name :: Name Repo,
+    owner :: SimpleAccount,
+    displayName :: Text,
+    imageURL :: Maybe Text,
+    isPublic :: Bool
+  }
+  deriving (Generic, Show, Eq, NFData, ToJSON, FromJSON, ToSchema)
