Skip to content
Swift SDK for the Moltin eCommerce API
Swift Ruby Other
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci Updating the XCode version that we use for circleci Dec 17, 2018
.github Added an issue template to help us more easily help our users with th… Apr 25, 2018
Examples Custom cart items (#46) Mar 6, 2019
Sourcery Customer token requests (#25) Jan 23, 2019
Tests Custom cart items (#46) Mar 6, 2019
docs Prep for 3.1.2 [ci skip] Mar 7, 2019
fastlane Added CircleCI and Fastlane configs Mar 26, 2018
moltin.playground Customer token requests (#25) Jan 23, 2019
moltin.xcodeproj Customer token requests (#25) Jan 23, 2019
moltin.xcworkspace Adds a workaround for XCode 9.3 / Swift 4.1 compiler issues with Codable Apr 9, 2018
scripts Tweak where docs are output too Apr 3, 2018
.gitignore Remove iOS testing from Tv OS Apr 3, 2018
.jazzy.yaml Updated documentation to reference Adyen Apr 26, 2018
.swiftlint.yml Added swiftlint and corrected styling Apr 3, 2018
LICENSE Fleshed out README and added license Mar 26, 2018
Moltin.podspec Prep for 3.1.2 [ci skip] Mar 7, 2019
Package.swift Added manifest for SPM Jun 8, 2018 Prep for 3.1.2 [ci skip] Mar 7, 2019
moltin.png Fleshed out README and added license Mar 26, 2018

Moltin iOS SDK


CocoaPods Compatible Carthage Compatible Twitter

iOS/tvOS/watchOS SDK for the Moltin platform, written in Swift.


  • iOS 10.0+ / tvOS 10.0+ / watchOS 3.0+
  • Swift 4.0+



Add the following to your Podfile:

pod 'Moltin', '~> 3.1.2'

Or, quickly try out our examples:

pod try Moltin


Add the following to your Cartfile:

github "Moltin/ios-sdk" ~> 3.1.2

Swift Package Manager

Add the following to your dependencies value in Package.swift:

dependencies: [
    .package(url: "", from: "3.1.2")


Making a request

let moltin = Moltin(withClientID: "<your client ID>")

moltin.product.all { result in
    switch result {
        case .success(let response):
        case .failure(let error):

moltin.product.get("<product ID>") { result in
    switch result {
        case .success(let response):
        case .failure(let error):

moltin.product.tree { result in
    switch result {
        case .success(let response):
        case .failure(let error):

Checking out & Payment

Paying for a cart is a two step process in Moltin.

First, check out your cart, which will return you an order:

    cart: ...,
    withCustomer: ...,
    withBillingAddress: ...,
    withShippingAddress: ...) { (result) in
    switch result {
        case .success(let order):
        default: break

Now that you have an order, you can pay for your order. Moltin providers several gateways for you to use:

  • Stripe
  • BrainTree
  • Adyen
  • Manual

Once you've chosen your payment gateway, you can fulfil one of Moltin's PaymentMethod's:

let paymentMethod = StripeToken(withStripeToken: ...)

You can then use this payment method to pay for an order:
    withPaymentMethod: paymentMethod) { (result) in


The basic way to set up the Moltin SDK is to create an instance of the Moltin class with your client ID and optionally the locale of the application. However, if you'd like to change additional details of the SDK, such as the URL of your Moltin instance, you can do so by passing in MoltinConfig.

let moltin = Moltin(withClientID: ...) // Takes Locale.current
let moltin = Moltin(withClientID: ..., withLocale: ...)
let config = MoltinConfig(
    clientID: ...,
    scheme: ...,
    host: ...,
    version: ...,
    locale: ...)
let moltin = Moltin(withConfiguration: config)


let config = MoltinConfig.default(
    withClientID: ...,
    withLocale: ...)
let moltin = Moltin(withConfiguration: config)

Available Resources

  • Brands
  • Carts
  • Categories
  • Collections
  • Currencies
  • Files
  • Flows
  • Fields
  • Entries
  • Products


Authentication is handled silently for you as part of the SDK. The SDK will cache credentials to ensure that it is not making unnecessary requests.

The iOS SDK only supports Implicit authentication currently.



  • Filter
  • Sort
  • Offset / Limit
  • Include


moltin.product.filter(operator: .eq, key: "name", value: "ProductName").all {


moltin.product.sort("order").all {
moltin.product.sort("-order").all {

Offset / Limit

moltin.product.limit(10).offset(20).all {


moltin.product.include([.mainImage, .files]).all {

Combining Operations

moltin.product.sort("-name").include([.mainImage]).limit(20).all {


If you've implemented a custom field on a resource by using flows, you can cast this to a type of your choice by type-hinting your result, so long as this type conforms to Codable:

moltin.product.all { (result: Result<PaginatedResponse<[MyCustomProduct]>>) in
    switch result {
        case .success(let response):
            print( // [MyCustomProduct]
        case .failure(_):
moltin.product.get(forID: "<your ID>") { (result: Result<MyCustomProduct>) in
    switch result {
    case .success(let response):
        print(response) // MyCustomProduct
    case .failure(_):

We recommend ensuring that your types extend from our base types for safety, then you implement the required init(from decoder: Decoder):

class MyCustomProduct: moltin.Product {
    let author: Author

    enum ProductCodingKeys : String, CodingKey { 
        case author 

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: ProductCodingKeys.self) = try container.decode(Author.self, forKey: .author)
        try super.init(from: decoder)

This will allow you to add additional types as you need, but ensures the base type, such as product, is still parsed correctly.

Further Documentation

Find more general documentation on the API docs.


  • If you need help with the SDK or the platform, get in touch on the forum
  • If you found a bug with the SDK, open an issue on GitHub
  • If you have a feature request for the SDK, open an issue.
  • If you want to contribute to the SDK, submit a pull request.


Moltin is available under the MIT license. See the LICENSE file for more info.

You can’t perform that action at this time.