diff --git a/src/Stripe/Api.hs b/src/Stripe/Api.hs
--- a/src/Stripe/Api.hs
+++ b/src/Stripe/Api.hs
@@ -16,6 +16,7 @@
   = "customers" :> CustomerApi
   :<|> "products" :> ProductApi
   :<|> "prices" :> PriceApi
+  :<|> "subscriptions" :> SubscriptionApi
   :<|> "checkout" :> "sessions" :> CheckoutApi
   :<|> "billing_portal" :> "sessions" :> CustomerPortalApi
   :<|> "events" :> EventApi
@@ -38,6 +39,11 @@
   = StripeAuth :> ReqBody '[FormUrlEncoded] PriceCreate :> Post '[JSON] Price
   :<|> StripeAuth :> Capture ":product_id" PriceId :> Get '[JSON] Price
   :<|> StripeAuth :> QueryParam "lookup_keys[]" T.Text :> Get '[JSON] (StripeList Price)
+
+type SubscriptionApi
+  = StripeAuth :> ReqBody '[FormUrlEncoded] SubscriptionCreate :> Post '[JSON] Subscription
+  :<|> StripeAuth :> Capture ":subscription_id" SubscriptionId :> Get '[JSON] Subscription
+  :<|> StripeAuth :> QueryParam "customer" CustomerId :> Get '[JSON] (StripeList Subscription)
 
 type CheckoutApi
   = StripeAuth :> ReqBody '[FormUrlEncoded] CheckoutSessionCreate :> Post '[JSON] CheckoutSession
diff --git a/src/Stripe/Resources.hs b/src/Stripe/Resources.hs
--- a/src/Stripe/Resources.hs
+++ b/src/Stripe/Resources.hs
@@ -10,7 +10,7 @@
   , Product(..), ProductCreate(..)
   , Price(..), PriceRecurring(..), PriceCreate(..), PriceCreateRecurring(..)
     -- * Subscriptions
-  , SubscriptionId(..)
+  , SubscriptionId(..), Subscription(..), SubscriptionItem(..), SubscriptionCreate(..), SubscriptionCreateItem(..)
     -- * Customer Portal
   , CustomerPortalId(..), CustomerPortal(..), CustomerPortalCreate(..)
     -- * Checkout
@@ -52,13 +52,29 @@
     A.withScientific "unix timestamp" $ \sci ->
     pure $ TimeStamp $ posixSecondsToUTCTime (fromRational $ toRational sci)
 
+instance ToHttpApiData TimeStamp where
+  toUrlPiece x =
+    let unix :: Int
+        unix = round . utcTimeToPOSIXSeconds . unTimeStamp $ x
+    in T.pack (show unix)
+
 -- | A 'V.Vector' wrapper with an indication is there are more items available through pagination.
 data StripeList a
   = StripeList
   { slHasMore :: Bool
   , slData :: V.Vector a
-  } deriving (Show, Eq)
+  } deriving (Show, Eq, Functor)
 
+instance Semigroup (StripeList a) where
+ (<>) a b = StripeList (slHasMore a || slHasMore b) (slData a <> slData b)
+
+instance Monoid (StripeList a) where
+  mempty = StripeList False mempty
+
+instance Applicative StripeList where
+  pure = StripeList False . pure
+  (<*>) go x = StripeList (slHasMore go || slHasMore x) (slData go <*> slData x)
+
 newtype CustomerId
   = CustomerId { unCustomerId :: T.Text }
   deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData)
@@ -164,6 +180,43 @@
   = SubscriptionId { unSubscriptionId :: T.Text }
   deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData)
 
+data Subscription
+  = Subscription
+  { sId :: SubscriptionId
+  , sCancelAtPeriodEnd :: Bool
+  , sCurrentPeriodEnd :: TimeStamp
+  , sCurrentPeriodStart :: TimeStamp
+  , sCustomer :: CustomerId
+  , sItems :: StripeList SubscriptionItem
+  , sStatus :: T.Text -- TODO: make enum
+  } deriving (Show, Eq)
+
+newtype SubscriptionItemId
+  = SubscriptionItemId { unSubscriptionItemId :: T.Text }
+  deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData)
+
+data SubscriptionItem
+  = SubscriptionItem
+  { siId :: SubscriptionItemId
+  , siPrice :: Price
+  , siQuantity :: Maybe Int
+  , siSubscription :: SubscriptionId
+  } deriving (Show, Eq)
+
+data SubscriptionCreateItem
+  = SubscriptionCreateItem
+  { sciPrice :: PriceId
+  , sciQuantity :: Maybe Int
+  } deriving (Show, Eq, Generic)
+
+data SubscriptionCreate
+  = SubscriptionCreate
+  { scCustomer :: CustomerId
+  , scItems :: [SubscriptionCreateItem]
+  , scCancelAtPeriodEnd :: Maybe Bool
+  , scTrialEnd :: Maybe TimeStamp
+  } deriving (Show, Eq, Generic)
+
 newtype CheckoutSessionId
   = CheckoutSessionId { unCheckoutSessionId :: T.Text }
   deriving (Show, Eq, ToJSON, FromJSON, ToHttpApiData)
@@ -224,6 +277,8 @@
 $(deriveJSON (jsonOpts 1) ''Price)
 $(deriveJSON (jsonOpts 2) ''PriceRecurring)
 $(deriveJSON (jsonOpts 2) ''Product)
+$(deriveJSON (jsonOpts 1) ''Subscription)
+$(deriveJSON (jsonOpts 2) ''SubscriptionItem)
 $(deriveJSON (jsonOpts 2) ''CustomerPortal)
 
 instance ToForm CustomerCreate where
@@ -254,6 +309,21 @@
        , ("lookup_key", maybeToList $ pcLookupKey pc)
        , ("transfer_lookup_key", [toUrlPiece $ pcTransferLookupKey pc])
        ] <> recurringPiece
+
+instance ToForm SubscriptionCreate where
+  toForm sc =
+    let convertItem (idx, itm) =
+          [ ("items[" <> toUrlPiece idx <> "][price]", [toUrlPiece $ sciPrice itm])
+          , ("items[" <> toUrlPiece idx <> "][quantity]", maybeToList $ toUrlPiece <$> sciQuantity itm)
+          ]
+        lineItems =
+          concatMap convertItem (zip ([0..] :: [Int]) (scItems sc))
+    in Form $ HM.fromList $
+       [ ("customer", [toUrlPiece $ scCustomer sc])
+       , ("cancel_at_period_end", maybeToList $ toUrlPiece <$> scCancelAtPeriodEnd sc)
+       , ("trial_end", maybeToList $ toUrlPiece <$> scTrialEnd sc)
+       ] <> lineItems
+
 
 instance ToForm CheckoutSessionCreate where
   toForm csc =
diff --git a/stripe-servant.cabal b/stripe-servant.cabal
--- a/stripe-servant.cabal
+++ b/stripe-servant.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 44759c17c1b913f08638e1ae86cf9a71e9a090db0772cb4d9da196ae9447d461
+-- hash: 1f5f0b69e2e75cbd3ee8f140d941a1803f791d24425d21b0cdb669d63e9ab462
 
 name:           stripe-servant
-version:        0.1.0.0
+version:        0.1.1.0
 synopsis:       Unofficial Stripe servant types
 description:    Unofficial description of the Stripe API using servant types
 category:       Web
