NAV Navbar
shell ruby objective_c swift
  • Let's Get On Board
  • Analytics
  • Application Settings & SMS Channel Configuration
  • SDK Integration Guide
  • FAQ
  • API Discovery
  • Errors
  • Let's Get On Board

    Welcome to HOLLER, a Mobile Marketing Automation (MMA) provides you full marketing solution to start engaging your user. Haven't had our account, register now at here.

    After register new account successful, you should see the following screen

    alt text

    Congrats! You registered new account successful, soon you will be received a confirmation email which is sent automatically by HOLLER. Check your mailbox for it and follow the instructions to finish account registration like the figure below

    alt text

    Click on "Confirm Signup & Login" to finish your registration and start loging into HOLLER dashboard and get on-board our great features.

    After you're authenticated successful, system redirects you to App Listing screen. Right here, HOLLER supports multi-application which enables your application management with ease. By default, HOLLER created a application for you that is named "Untitled Application". You can use them right away in App Settings. But lets us brief you on our dashboard first.

    Dashboard Overview

    Welcome to HOLLER 2.0, if you're familiar with our version 1.0 it could take time for you to get familiar with our new dashboard. But it provides you a better view on how your application attract your user and help you can navigate between our new feature with ease.

    alt text

    Onboarding Status

    At fresh, an application progress is indicated by Onboarding Progress which measure how far have you done with your application in HOLLER. It includes Account Settings, SDK Integration Progress, App Activity and Automate your first campaign with HOLLER. Unless you finish all these steps, it keep reminding you by displaying these progress after you pick application.

    Analytics

    "Bring out your raw data and help make sense to business world"

    Yes that's how we help you on your raw mobile data. HOLLER is backed by next-generation technology empowers Mobile Analytics also Campaign's True Impact to help marketer gets a fast overview on their engagement campaign. Not only support marketer with specialised metric, it also helps developer can comprehend engagement results with significant metric's included in HOLLER's dashboard.

    alt text

    Lifetime Metric & Lifetime Session

    Lifetime Metric is well-known as mobile's data collects at the beginning of every HOLLER's app accumulatively. These informations help marketer and developer can easily observe about app's usage, mobile session also their audience.

    Lifetime User is total user who downloaded and have used app till today, this number is calculated at the beginning app was created and use.

    alt text

    Lifetime Session is total mobile session that was generated on audience's mobile device. As same as Lifetime User, this's also calculates at the beginning app was created and manage by HOLLER!

    alt text

    Moreover, every mobile app's health status is indicated by 6 vital mobile metrics include:

    Daily Active User (DAU)

    You know how many app downloads you’ve had, but just how indispensable is your app for those who’ve installed it? The daily active users metric will tell you just that. Because this refers to each individual person using your app, not to the number of sessions, each person is counted just one time, regardless of if they use the app once per day or hundreds of times per day.

    alt text

    Monthly Active User (MAU)

    Like DAU, monthly active users tells you the unique number of people who used your app, only obviously, MAU is concerned with either a specific month, or the prior 30 days. Some mobile marketing automation platforms are set to automatically capture MAU, based on one of these approaches.

    alt text

    Daily Session Per DAU

    Sessions per DAU gives you an idea of how often your customers make use of your app within a single day. This can help you determine whether your customers are returning to your app as often as you’d like them to be. Social media apps, for instance, might like to see their active users opening the app for a couple sessions a day.

    alt text

    Stickiness

    “Sticky”—it’s not just a clever way of describing how often people come back to your app, it’s also a formula. What does using this formula tell you?

    alt text

    The higher this percentage, the more often your users return to your app (and the more you and your colleagues can congratulate each other). The closer your daily active user count is to your monthly active user count, the higher the stickiness—or engagement—is for your app, and the more frequently your MAUs are using the app.

    New User & User

    Some people gloss over this metric, but tracking your users is fundamental to creating deeper engagement, like segmenting audiences, tracking specific behavior and launching successful app marketing campaigns.

    alt text

    Once you know your user base and current active users, you have a baseline for improving engagement to increase users across channels, those who have dropped out of a desired funnel, or those within your market space who haven’t yet downloaded your app. You also gain greater insight into the monetisation behavior of users, including the degree of usage, who makes in-app purchases, and who clicks through to ads.

    Application Settings & SMS Channel Configuration

    HOLLER empowers every mobile app with push capability and built-in analytic system. Our analytic system not only support developer with easy-integration also help marketer can get an overview on their app performance as well. Before start to engage mobile audience, you need to configure your app on our platform also mange your subscription. No worries! We help these with one-click settings and it takes around 5 minutes.

    Display Settings

    You can rename your default app, also upload new app image

    alt text

    Push Notification Configurations

    Push Notification need a bit security configuration. Along this guide, we'll help you how get push certificate from Apple Developer. With Android, HOLLER supports Firebase Cloud Messaging (FCM) you simply copy credential key from Google Developer Console and paste it here.

    alt text

    APNs Certificate

    APNs stands for Apple Push Notification Service, an exclusive feature from Apple to support developer with push notification. First, you need a Apple Developer Account. Choose "Account", it should look like the below screenshot

    alt text

    Input your username and password and click on Login button to be redirected to Dashboard. You're going to see a developer dashboard, then access Certificates, ID & Profiles.

    alt text

    Click on "Certificates, Identifiers & Profile". If you haven't register an identifier for you app, let create one and remember to enable Push Notification ability. Apple support Development and Production mode, they enables two independent environment for developer for testing and release. At this step, for development you can enable Development or both and don't forgot to download your Push Notification certificate, its extension is .cert. Then finish create your app identifier.

    Then you have to export your certificate from .cert to .p12. HOLLER Setting requires .p12 to enable your push service to Apple. Use Apple Keychain to export it to .p12 file, you also can set password for it but we strongly recommend bypass this step by press "Return" or "Enter".

    Last step, open HOLLER's App Setting. Choose either Development or Production and upload respective certificate you got from Apple Developer. If your certificate have password, input them in the textfield below and click Save button. If your certificate is valid, system soon show information about your certificate.

    alt text

    You also can remove your uploaded certificate and upload a replacement by click on "Delete" button to remove it and try another one.

    SMS Channel Configuration

    HOLLER provides you "opened" service configurator, it means we offer 3rd service provider for SMS, in case you'd like to engage your user with this channel. Currently we only support Twillio and Nexmo, but soon will provide more service to diversify your choice

    alt text

    You only activate one 3rd service provider, when you active the other, the service you have activated will be deactivated. And of course, you can activate it back to use. To active a new SMS serivice, click on + Add New button within SMS service you'd like to use. System will need you to fill in credential which is provided by service as the follow screen

    alt text

    Click on Save button to confirm your configuration, and wait for service to be activated.

    SDK Integration Guide

    Installing the HOLLER iOS SDK will provide you with our basic but strong analytics feature, as well as the ability to work in Marketing Automation and User Engagement, which will help you to pick the right time to deliver content to the correct user.

    iOS Cocoapod Installation

    Step 1: Installing Latest Cocoapods

    HOLLER iOS SDK is provided officially on our Resource corner as well as on CocoaPods - a favorite open source 3rd library and framework of many developers. Before you begin integrating HOLLER iOS SDK through CocoaPods, please make sure that your machine is currently using Ruby version 2.0. Do not worry if you are not familiar to Ruby syntax.

    Simply run the following snippet command in Terminal to get started:

    $ sudo gem install cocoapods
    

    Note: If you are prompted to overwrite the rake executable, please refer to the Getting Started Directions section on CocoaPods.org for more information.

    Note: If you have issues regarding CocoaPods, please refer to the CocoaPods Troubleshooting guide.

    Step 2: Build Your Podfile

    Congrats! You installed the CocoaPods Ruby Gem. Your next step is to build your specifications file of Pods in your Xcode project's directory named 'Podfile'

    If you are using Xcode 7.x or later, add the following line to your Podfile:

    pod 'Holler-iOS'
    

    By using this line of code, you will be using the latest version of HOLLER iOS SDK. If you want to use older versions, specify the version by adding 'xx.yy.zz'

    If you are not going to use Swift, please comment this line in your Podfile:

    user_frameworks!
    

    Step 3: Install Holler Dependency

    To install HOLLER iOS SDK from CocoaPods, you simply navigate to the directory of your Xcode project within Terminal.

    In terminal, copy the follow snippet command and press Enter:

    pod install
    

    Once done, our HOLLER iOS SDK will be "pod-ed" from the CocoaPods repository to your local machine and linked to your Xcode project. At this point, please navigate to the directory of your project and open the new Xcode workspace created by CocoaPods. This workspace includes your Xcode project and our SDK, managed by the Pods Xcode project.

    Objective-C Initialisation

    Step 4: Initialise Holler SDK

    Let's open your AppDelegate class and add the following code:

    Let import Holler module of SDK

    #import <Holler/Holler.h>
    

    Within the AppDelegate.m file, add the following snippet within your callback method from UIApplicationDelegate. Be sure to update your application ID and access ID correctly from the App Settings of HOLLER

    Start initialising Holler SDK

    [Holler startHolleringWithApplicationId:@"ApplicationId" accessId:@"AccessId"];
    

    HOLLER iOS SDK supports two methods to initialise HOLLER services. You can supply the application Id and access Id or simply specified these keys in info.plist of your default files.

    alt text

    By supplying both application ID and access ID in the info.plist file, you can use the following snippet instead of previous one:

    [Holler didLaunchAppWithOptions:launchOptions];
    

    Now you have completed the SDK installation and initialisation to use HOLLER to empower your iOS application. In the next step, we would like to introduce how to install HOLLER SDK to your Swift Xcode project.

    Swift Compatability & Installation

    If you are familiar with Swift, it has a few steps involved in using SDK. Firstly, if you do not have a bridging header file, create one in the directory of your Xcode project.

    Name it as: yourProjectBridgingHeader.h

    Then add the following line of code to your bridging header file:

    import Holler
    

    And start initialising Holler SDK by the following code snippet:

    Holler.startHolleringWithApplicationId("ApplicationId", accessId: "AccessKey")
    

    Move to the Build Settings tab of your Xcode project and look for "Objective-C Bridging Header" under "Swift Compiler - Code Generation."

    Here is where your header file should be:

    alt text

    Now that you have finished the SDK installation, you can play around with HOLLER SDK now!

    Dynamic Framework Installation & Notices

    Haven't worked with CocoaPods and have no experience with dependency injections? No worries! We also provide dynamic framework in our Developer Corner. You can download it from here (note: we strongly recommend to use CocoaPods for easier installation and to update our framework):

    After finishing the download, you can find our SDK in the Downloads directory:

    alt text

    Move (or copy) it to your Xcode project directory. Then open your Xcode project. Move it to the Build Phases tab and link our SDK under "Link Binary with Libraries."

    Now, you are two-thirds of the way done! The last part is very important. HOLLER supports iOS app from 8.0 so please remember that older versions will not work properly. This is due to HOLLER iOS SDK's dynamic framework. The dynamic framework is compiled dynamically and thus is linked in runtime. Unless you have gotten this when trying to run your project with HOLLER iOS SDK, make sure the version is newer than 8.0.

    Your IDE probably show this to warn about such issue

    yld: Library not loaded: @rpath/Holler.framework/Holler
      Referenced from: /Users/rml/Library/Developer/CoreSimulator/Devices/558EBB68-B94A-4B92-BEA5-2758DE3718E8/data/Containers/Bundle/Application/B9B8DA9A-1373-4CCE-BF12-B9DE83D5E5CE/Holler_SDK_Testing_Swift.app/Holler_SDK_Testing_Swift
      Reason: image not found
    

    But don't worry! Navigate to the "General" tab of your Xcode project, under Embedded Binaries, and add HOLLER iOS SDK under it. Clean and compile, then run your project. It would run well from here.

    alt text

    We hope you enjoy HOLLER iOS SDK and that it adds new capability and empower your app. Then you have to configure your app in Xcode to enable push capability. We're going to guide you to last step.

    Xcode Configuration

    Open Xcode, and of course you must have a either project or workspace. Open it and click on your project.

    alt text

    On the right side, click on Capabilities tab. Look for Push Notification option, turn it on to enable push notification capability. And a little tricky tip here, to enable push notification even when app is killed or not running in background you have to enable Background service for push notification. Look for Background Modes and check Remote Notifications

    alt text

    Now you can start sending push notification from HOLLER dashboard and blast your audience with attracted message.

    FAQ

    Can I change plan?

    Of course. Anytime you can upgrade or cancel subscription.

    Can I cancel my subscription?

    Yes you can cancel your subscription any time you want, but only eligible with monthly subscription. Unfortunately, you can't cancel annual subscription. Annual subscription offers a cheaper price, cancelling it doesn't mean you can get money back. Non-refundable.

    Which payment method can I use?

    Currently, we offer online Payment with Stripe (https://stripe.com). Very secured, fast and transparent. We accept: Visa, Master and American Express (Amex).

    What happen if my credit card is insufficient balance?

    Our partner - Stripe will inform us as soon as possible about problem with auto debiting your account. We'll intimate you via email, cellphone number (use for account registration), in mean time our system keeps your service in 30 days. At 31st date, if your subscription won't be extended, your plan will be downgrade to Free plan.

    Does HOLLER provide invoice based billing?

    Yes. Only customer who have opted our Enterprise plan.

    Does HOLLER require credit card for Free plan?

    Definitely no. You can use our free plan until want to upgrade to another plans require credit card.

    Which feature is included in Free Plan?

    -Campaign Dashboard Centralization. -Analytic Dashboard. -1 Free Active Campaign. -Free Push Notification. -Free Daily/Weekly/Monthly Report. -Free first 1.000 MAU.

    How can I reach HOLLER's Discount & Promotion?

    To be quickly updated about our Discount & Promotion, you can reach us at: -Subscriber to our newsletter at: https://appholler.com/contact-us/ Like & follow us on social network: -Facebook: https://www.facebook.com/RainmakerLabs/ -Twitter: https://twitter.com/rainmakerlabssg -Google Plus: https://plus.google.com/+Rainmaker-Labs/posts

    Typically how long it takes to integration HOLLER's service to our mobile app?

    Typically it takes around 15 mins to integrate HOLLER's service to every mobile app. We offer out library officially on Cocoapods for iOS development & Gradle for Android development. These dependency managements can help you start install our library shortly to start integrate our service.

    How many step do developer have to start engage audience?

    Fortunately, developer simply do the following steps: -Step 1: Register HOLLER account & get secret codes includes appId and access key for integration -Step 2: Install library via Cocoapods or Gradle -Step 3: Start integrating with secret code -Step 4: Go to dashboard and start engage audience with Campaign Dashboard.

    Well, It takes around 15 minutes to empower mobile app with our capabilities.

    Is my data secured?

    Of course. We are hosted on Amazon Web Service with complicated Digital Signature Authentication & Authorization. No one else other than administrator of accounts can access the data

    Does HOLLER provides hosted solution?

    Unfortunately, we currently doesn't provide this.

    How marketer can engage audience?

    We have comprehended User Guide document for Marketer. This help every Marketer can quickly start audience engagement.

    What's Intelligent Delivery?

    HOLLER offers Intelligent Delivery, new generation of technology that engage audience by smart way. Self-make decision empower this feature work independently and autonomously.

    Does HOLLER provide Re-Engagement?

    Of course! HOLLER system backed by a real-time system that means it can keep track every movement of user and can start re-engagement if needs.

    Does HOLLER support Rich Push?

    Coming soon. Our team currently build this feature and release soon.

    Yes. HOLLER supports Deeplink with Web URL or Mobile App Scheme. You can discover it in Campaign Dashboard.

    Is Push system secured?

    Yes our system is built on Apple Push Notification Service (APNs) and FireBase Cloud Message (FCM)'s security compliances from Apple & Google.

    Is HOLLER's Push Service free?

    Yes our Push Service is free. Please mind about your MAU. Checkout our Pricing Plan for details.

    How can I use Email & SMS?

    Different to Push Service, Email & SMS is pay-per-use service and coming soon. You can consider about cost of them by contact our Sale Team, our team will get in touch soon to support.

    Does HOLLER support Email Template?

    Unfortunately we're building it. Coming soon. Subscribe for newsletter to get updates.

    API Discovery

    Get All Subscriber

    This endpoint retrieves a list of all subscriber which is managed by HOLLER

    GET http://appholler.com/api/subscribers

    curl "http://appholler.com/api/subscribers"
      -x GET
      -H "HOLLER-APP-ID     : XXXXXXXXXXX"
      -H "HOLLER-ACCESS-KEY : YYYYYYYYYYY"
    

    The above command returns JSON structured like this:

    {
      "count": 2,
      "next": "1",
      "previous": "0",
      "results": [
        {
          "id": 1,
          "username": "stevelee2k12",
          "email": "stevelee2k12@gmail.com",
          "first_name": "Steve",
          "last_name": "Lee",
          "phone": "65 8190 7627",
          "address": "Orchard Rd",
          "test_device": true,
          "is_active": true,
          "import_file": "",
          "created_at": "2016-01-08",
          "updated_at": "2016-09-08",
          "custom_attributes": {
            "code_name": ""
          },
          "info": {
            "gender": "male",
            "date_of_birth": "2012-10-09",
            "timezone": "Asia/Singapore",
            "country": "Singapore",
            "gps_latitude": 0,
            "gps_longitude": 0
          }
        }
      ]
    }
    

    Register Subscriber

    This endpoint register a new subscriber under given data

    POST http://appholler.com/api/subscribers/register

    curl "http://appholler.com/api/subscribers/register"
      -x POST
      -H "HOLLER-APP-ID     : XXXXXXXXXXX"
      -H "HOLLER-ACCESS-KEY : YYYYYYYYYYY"
      {
        "username": "stevelee",
        "email": "stevelee@gmail.com",
        "first_name": "Steve",
        "last_name": "Lee",
        "phone": "65 8190 7628",
        "address": "Ordchard Rd, Singapore",
        "is_active": true,
        "custom_attributes": {
          "code_name": ""
        },
        "info": {
          "gender": "male",
          "date_of_birth": "2012-10-09",
          "country": "Singapore",
          "timezone": "Asia/Singapore",
          "gps_latitude": 0,
          "gps_longitude": 0
        }
    }
    
        HLSubscriber *subscriber = [[HLSubscriber alloc] init];
        [subscriber setSubscriberUsername:@"stevelee"];
        [subscriber setSubscriberEmail:@"stevelee@gmail.com"];
        [subscriber setSubscriberFirstName:@"Steve"];
        [subscriber setSubscriberLastName:@"Lee"];
        [subscriber setSubscriberCellphoneNumber:@"65 8190 7628"];
        [subscriber setSubscriberAddress:@"Ordchard Rd, Singapore"];
        NSDictionary *informations = @{@"gps_latitude": @0,
                                       @"gps_longitude": @0,
                                       @"gender": @"male",
                                       @"date_of_birth": @"2012-10-09",
                                       @"country": @"Singapore",
                                       @"timezone": [HLMiscellaneous receiveCurrenTimezone]};
      [subscriber registerSubscriberOnCompletion:^(BOOL succeed, HLError *errorObject, NSNumber *subscriberId){
            if(succeed){
                //succeed handler
            }else{
                //error encounter
      }];
    
        let subscriber: HLSubscriber = HLSubscriber.init()
            subscriber.subscriberFirstName = "Steve"
            subscriber.subscriberLastName = "Lee"
            subscriber.subscriberEmail = "stevelee@gmail.com"
            subscriber.subscriberUsername = "stevelee"
            subscriber.subscriberCellphoneNumber = "65 8190 7628"
            subscriber.subscriberInformations = ["gps_latitude": 0,
                                                 "gps_longitude": 0,
                                                 "gender": "male",
                                                 "date_of_birth": "2012-10-09",
                                                 "country": "SG",
                                                 "timezone": HLMiscellaneous.receiveCurrenTimezone()]
    
        subscriber.registerSubscriberOnCompletion({(succeed, error, errorObject, subscriberId) in
                if let errObj = errorObject as? HLError{
                    //error encounter
                }else{
                    //succeed handler
                }
            })
    

    The above command returns JSON structured like this:

    {
       "id": 1,
       "username": "stevelee2k12",
       "email": "stevelee2k12@gmail.com",
       "first_name": "Steve",
       "last_name": "Lee",
       "phone": "65 8190 7627",
       "address": "Orchard Rd",
       "test_device": true,
       "is_active": true,
       "import_file": "",
       "created_at": "2016-01-08",
       "updated_at": "2016-09-08",
       "custom_attributes": {
          "code_name": ""
        },
       "info": {
          "gender": "male",
          "date_of_birth": "2012-10-09",
          "timezone": "Asia/Singapore",
          "country": "Singapore",
          "gps_latitude": 0,
          "gps_longitude": 0
        }
      }
    

    Retrieve Specific Subscriber

    This endpoint retrieve specific subscriber's data by given subscriber's id

    POST http://appholler.com/api/subscribers/<ID>

    Query Parameter

    Parameter Description
    ID Specific ID of subscriber, which is retrieved after registration finishes.
    curl "http://appholler.com/api/subscribers/1"
      -x POST
      -H "HOLLER-APP-ID     : XXXXXXXXXXX"
      -H "HOLLER-ACCESS-KEY : YYYYYYYYYYY"
    

    The above command returns JSON structured like this:

    {
       "id": 1,
       "username": "stevelee2k12",
       "email": "stevelee2k12@gmail.com",
       "first_name": "Steve",
       "last_name": "Lee",
       "phone": "65 8190 7627",
       "address": "Orchard Rd",
       "test_device": true,
       "is_active": true,
       "import_file": "",
       "created_at": "2016-01-08",
       "updated_at": "2016-09-08",
       "custom_attributes": {
          "code_name": ""
        },
       "info": {
          "gender": "male",
          "date_of_birth": "2012-10-09",
          "timezone": "Asia/Singapore",
          "country": "Singapore",
          "gps_latitude": 0,
          "gps_longitude": 0
        }
      }
    

    Update Specific Subscriber

    This endpoint update subscriber's data by given subscriber's id

    PUT http://appholler.com/api/subscribers/<ID>

    Query Parameter

    Parameter Description
    ID Specific ID of subscriber, which is retrieved after registration finishes.
    curl "PUT://appholler.com/api/subscribers/1"
      -x POST
      -H "HOLLER-APP-ID     : XXXXXXXXXXX"
      -H "HOLLER-ACCESS-KEY : YYYYYYYYYYY"
      {
       "username": "stevelee2k12",
       "email": "stevelee2k12@gmail.com",
       "first_name": "Steve",
       "last_name": "Lee",
       "phone": "65 8190 7627",
       "address": "Orchard Rd",
       "test_device": true,
       "is_active": true,
       "import_file": "",
       "created_at": "2016-01-08",
       "updated_at": "2016-09-08",
       "custom_attributes": {
          "code_name": ""
        },
       "info": {
          "gender": "male",
          "date_of_birth": "2012-10-09",
          "timezone": "Asia/Singapore",
          "country": "Singapore",
          "gps_latitude": 0,
          "gps_longitude": 0
        }
      }
    

    The above command returns JSON structured like this:

    {
       "id": 1,
       "username": "stevelee2k12",
       "email": "stevelee2k12@gmail.com",
       "first_name": "Steve",
       "last_name": "Lee",
       "phone": "65 8190 7627",
       "address": "Orchard Rd",
       "test_device": true,
       "is_active": true,
       "import_file": "",
       "created_at": "2016-01-08",
       "updated_at": "2016-09-08",
       "custom_attributes": {
          "code_name": ""
        },
       "info": {
          "gender": "male",
          "date_of_birth": "2012-10-09",
          "timezone": "Asia/Singapore",
          "country": "Singapore",
          "gps_latitude": 0,
          "gps_longitude": 0
        }
      }
    

    Update Subscriber's Device Token

    This endpoint updates device token which is match to device owns by user

    POST http://appholler.com/api/subscribers/<ID/device_token>

    Query Parameter

    Parameter Description
    ID Specific ID of subscriber, which is retrieved after registration finishes.
    curl "http://appholler.com/api/subscribers/1/device_token"
      -x POST
      -H "HOLLER-APP-ID     : XXXXXXXXXXX"
      -H "HOLLER-ACCESS-KEY : YYYYYYYYYYY"
      {
        "device_token": "FE66489F304DC75B8D6E8200DFF8A456E8DAEACEC428B427E9518741C92C6660",
        "device_type": "ios",
        "active": true
      }
    

    Total Subscriber

    This endpoint retrieves a number of total subscriber which is registered for service

    POST http://appholler.com/api/subscribers/total>

    curl "http://appholler.com/api/subscribers/1/device_token"
      -x POST
      -H "HOLLER-APP-ID     : XXXXXXXXXXX"
      -H "HOLLER-ACCESS-KEY : YYYYYYYYYYY"
    

    The above command returns JSON structured like this:

    {
      "total": 10
    }
    

    Analytics

    Application activated/deactivate

    This endpoint collect activated/deactivated status of application

    POST http://appholler.com/api/analytic/time_spent>

    To trigger application is activated

    curl "http://appholler.com/api/subscribers/1/device_token"
      -x POST
      -H "HOLLER-APP-ID     : XXXXXXXXXXX"
      -H "HOLLER-ACCESS-KEY : YYYYYYYYYYY"
      {
        "status": "open",
        "subscriber_id": 1,
        "device": "ios",
        "timestamp": 1462356082,
        "remark": "application started 1st session",
        "latitude": 10.79,
        "longitude": 106.67
      }
    

    The above command returns JSON structured like this:

    {
      "message": "event's collected"
    }
    

    To trigger application is deactivated

    curl "http://appholler.com/api/subscribers/1/device_token"
      -x POST
      -H "HOLLER-APP-ID     : XXXXXXXXXXX"
      -H "HOLLER-ACCESS-KEY : YYYYYYYYYYY"
      {
        "status": "close",
        "subscriber_id": 1,
        "device": "ios",
        "timestamp": 1462356082,
        "remark": "application closed 1st session",
        "latitude": 10.79,
        "longitude": 106.67
      }
    

    The above command returns JSON structured like this:

    {
      "message": "event's collected"
    }
    

    Push Delivery

    Push Notification Delivery Callback

    This endpoint updates device token which is match to device owns by user

    POST http://appholler.com/api/pushnotif/update-reached-subscriber/>

    curl "http://appholler.com/api/subscribers/1/device_token"
      -x POST
      -H "HOLLER-APP-ID     : XXXXXXXXXXX"
      -H "HOLLER-ACCESS-KEY : YYYYYYYYYYY"
      {
        "device_token": "FE66489F304DC75B8D6E8200DFF8A456E8DAEACEC428B427E9518741C92C6660",
        "device_type": "ios",
        "communication_id": 1
      }
    

    The above command returns JSON structured like this:

    {
      "message": "update device token successful"
    }
    

    Errors

    HOLLER API uses the following error codes:

    Error Code Meaning
    400 Bad Request -- Your request sucks
    401 Unauthorized -- Your API key is wrong
    403 Forbidden -- The kitten requested is hidden for administrators only
    404 Not Found -- The specified kitten could not be found
    405 Method Not Allowed -- You tried to access a kitten with an invalid method
    406 Not Acceptable -- You requested a format that isn't json
    407 Proxy Authentication Required - Contact Devops for proxy authentication support
    408 Request Timeout - Your request takes too long to response
    409 Conflict - Some data is conflict
    410 Gone -- The kitten requested has been removed from our servers
    411 Length Required
    412 Precondition has failed
    413 Request entity exceeds limits
    414 URI request exceeds limits
    415 Unsupported media file -- Your media file is currently not supported
    416 Requested range not satisfiable
    417 Expectation has failed
    418 I'm a teapot
    422 Unprocessable entity
    423 Locked
    424 Failed Denpendency -- Dependency failure
    429 Too Many Requests -- You're requesting too many kittens! Slow down!
    431 Request header fields exceed limits - Double check out header please
    451 Unavailable for legal reason - Hold on don't go beyond this
    500 Internal Server Error -- We had a problem with our server. Try again later.
    503 Service Unavailable -- We're temporarily offline for maintenance. Please try again later.
    504 Gateway Time out
    505 HTTP version is not supported
    507 Insufficient storage
    511 Network Authentication Is Required