Rapidoreach Docs Getting started Callbacks The Callback is the basis by which you can reward your users. The Callback is a GET request that is sent to your processing script upon the conclusion of a transaction - either a complete COMPLETE, screenout TERMINATION, or overquota QUOATAFULL. This request contains important information about which user needs to be rewarded, what offer was taken, and how much virtual currency they should be paid. Setup Callback RapidoReach supports secure hasing on system-to-system callbacks. Please reach out to a RapidoReach account manager to configure the Callback URL. Follow the steps below to complete your setup. How to create a Processing Script Create an endpoint that can receive a GET request to its location. Reward your users for completes and screen-out rewards (if applicable). Store information in your database Respond with a 1 if callback received & processed correctly and 0 if you require us to repeat the callback (can be repeated three more times). Add the Callback to your application Go to Apps section. Select your Application. Click on the Callback section. Click on the Setup Callback button. Enter your Callback URL. Click Save button. Callback Responses Sample processing script location (sometimes referring to a php, aspx, or another script depending on your webapp configuration) app-domain.com/callback Parameters will be appended with their corresponding variables after the processing script location as follows: app-domain.com/callback?cmd=transactionComplete&userId=user123-9370-d163590aa9 &amt=100&offerInvitationId=1234&status=C&oiHash=2ef1130cca32cd030141d8935dec0992 ¤cyAmt=20000&transactionId=4321&endUserId=user123&offerTitle=TestProject &useragent=RapidoReach&profiler=¤cyName=Chachingz&offerType=survey &txnHash=66a2b2987083666c76592d505240748e&program=&transactionSource=iframe& app-domain.com/callback '?cmd=' // QUOTAFULL, COMPLETE, TERMINATION OfferStatus // '&userId=' RORuserId // RapidoReach userId as generated earlier. '&amt=' Dollar_AMT.toFixed(2) // Amount paid in dollars to you for this particular transaction. '&offerInvitationId=' TransactionId // Enables you to remember for which offer a user has been rewarded for. '&status=' OfferStatus // Compete - Disqualified - QuotaFull '&offerHash=' offerHash //32 character hex string = md5(concat(offerInvitationId, applicationKey)) '¤cyAmt=' VC_AMT.toFixed(2) //Payout to user in your virtual currency. Important for screenout rewards. '&transactionId=' TransactionId //Unique ID representing a single user participating in a single survey/offer, '&endUserId=' endUserId '&txnHash=' transHash //md5(concat(transactionId, current TransactionKey)) '&useragent=' 'Rapidoreach' '¤cyName=' app.vc_name '&offerType=' OfferType '&deviceType=' DeviceType '&intergrationMethod=' 'IFRAME'; Callback Parameters cmd will always be transactionComplete userId RapidoReach userId as generated earlier. amt Amount paid in dollars to you for this particular transaction. offerInvitationId Enables you to remember for which offer a user has been rewarded for. status QUOTAFULL - user screened out of survey, the required number of responses from this demographic has already been met. COMPLETE - user successfully completed the transaction. TERMINATION - user screened out of survey, does not have the relevant attributes needed. oidHash 32 character hex string = md5(concat(offerInvitationId, applicationKey)) You should verify oidHash upon receipt of the callback by recomputing it with the callback offerInvitationId and your ApplicationKey. This will secure against users faking their own id and passing it in if by some chance they come across the script. currencyAmt Payout to user in your virtual currency. Important for screenout rewards. integer (default) or float (on request) Indicates how many points the user should get in your site’s virtual currency. Based on your configured conversion rate on the control panel. Negative values indicate chargebacks. transactionId Unique ID representing a single user participating in a single survey/offer, please include if requesting support for a particular transaction. txnHash 32 character hex string = md5(concat(transactionId, current TransactionKey)) You can find your TransactionKey in your Application list. Optional Parameters sub_id Optional alias identifier to track traffic on campaigns, can be used for testing and segmentation purposes. Please ask our team to enable sub_id for you. IP Whitelist We highly recommend whitelisting the following IPs to secure your system from fraudulent callbacks. If the following list is update, you will be notified via email prior to the change. 161.97.78.55, 173.212.227.149 Setup callback IP whitelist Go to Apps section. Select your application. Click on the Callback section. Under the IP Whitelist section click the Copy IP Whitelist button to copy the IPs to your clipboard. How to Test the Callback First ensure that you have whitelisted the IPs listed in the above section. Instructions Go to Apps section. Select your Application. Click on the Callback section. Click on the Test Callback button. Fill out the form with the parameters you want and click the invoke Test Callback button. Get your results. Redirects We support two separate links, one for successful completes, one for everything else If you’d like to setup custom redirect URLs, contact your Rapidoreach account manager. We don’t support redirect hashing; we use secure hasing in our system-to-system Callbacks. We return a handful of query parameters describing the session result in the URL: transactionId Transaction ID userId The three part RapidoReach user ID endUserId The user ID passed in the entry URL status The status of the transaction: C, P, or F. sub_id A custom tracker ID that you may pass with the user in the entry URL. Example https://www.rapidoreach.com/success=true&status=#status#&transactionId=#transactionId#&userId=#userId#&tempId=#tempId#&sub_id=#sub_id# Advanced Redirect Values If you’d like to receive additional data about user sessions, add tcode to your Redirect URL: tcode = #tcode# Below are the possible values you will receive the the tcode parameter. Description Code Matcher Failed 1 Dropout 2 No Prescreeners available 3 Profiler Screenout 4 Transaction C (Complete) 5 Transaction F (Quota Full) 6 Transaction P (Screenout) 7 Internal Error 8 Missing Entry URL Parameters 9 Invalid Hash Code 10 Project Not Launched 11 Under Age User 12 User Already Completed Survey 13 User Banned 14 IP Banned 15 ISP Banned 16 Throttling error 17 No Matches 18 Matcher Timeout 19 Matcher Exception 20 Doesn’t Match Survey 21 Redirects We support two separate links, one for successful completes, one for everything else If you’d like to setup custom redirect URLs, contact your Rapidoreach account manager. We don’t support redirect hashing; we use secure hasing in our system-to-system Callbacks. We return a handful of query parameters describing the session result in the URL: transactionId Transaction ID userId The three part RapidoReach user ID endUserId The user ID passed in the entry URL status The status of the transaction: C, P, or F. sub_id A custom tracker ID that you may pass with the user in the entry URL. Example https://www.rapidoreach.com/success=true&status=#status#&transactionId=#transactionId#&userId=#userId#&tempId=#tempId#&sub_id=#sub_id# Advanced Redirect Values If you’d like to receive additional data about user sessions, add tcode to your Redirect URL: tcode = #tcode# Below are the possible values you will receive the the tcode parameter. Description Code Matcher Failed 1 Dropout 2 No Prescreeners available 3 Profiler Screenout 4 Transaction C (Complete) 5 Transaction F (Quota Full) 6 Transaction P (Screenout) 7 Internal Error 8 Missing Entry URL Parameters 9 Invalid Hash Code 10 Project Not Launched 11 Under Age User 12 User Already Completed Survey 13 User Banned 14 IP Banned 15 ISP Banned 16 Throttling error 17 No Matches 18 Matcher Timeout 19 Matcher Exception 20 Doesn’t Match Survey 21 Iframe Offerwall User Ids Iframe The Reward Center is an iframe embedded on your site containing a list of incentivized surveys and offers. It’s one of our simplest products to integrate and requires zero maintenance. Engage your audience with these earning opportunities and get paid every time your user completes one. Understanding the RapidoReach User ID Every user needs an ID to enter a survey. The UID is made up of three parts: The Internal User ID Application ID (App ID) The Checksum. This 3 part ID isn’t required for the Project API or the Invite API. Example UIDs test123-1sJ57hgit-838ab4b72d221a585af8b4bff7a540231 Marialukeskywalker-7sJ51hghg-838ab4b72d221a585af8b4be7a540232 LucasPrincessLeia-9sh57hgty-238ab4b72d88rj1a585af8b4be7a540235 BuzzLightyear-4sJ17hgih-638ab4b72d2jdfj585af8b4be7a540236 FaMulan621-3sJ47hgis-738ab4b72d221a585asdnb4be7a5402675 1969072078348482-9sJ57hyur-138ab4b72d2sdfa585af8b4be7a540786 Internal User ID The Internal User ID is a case-sensitive alphanumeric string of up to 240 (we recommend keeping them short) characters in length. It should correspond to the user’s ID in your database. Application ID The Application ID (App ID) is your application’s numerical identifier. Each application you create has a unique App ID. You can find your App ID below the application name in the application list. Checksum Generating a checksum is important to keep every transaction secure and protect the integrity of every generated user ID. It is essential for creating a proper user ID. Sequentially, the checksum comes as the third section of the UID. This can be generated in every programming language (e.g. Python, C#, Golang). The Checksum is composed of the first 10 alphanumeric characters of the MD5 hash generated string of the Internal User ID, App ID, and Security Key. Since you already know what the Internal User ID and the App ID is, let us talk a little about your Security Key. Security Key The Security Key is an alphanumeric case sensitive string generated upon the creation of your application. It is unique to every Application and ensures the integrity of the integration. You can find the Security Key in the integration section of the application. User Profiles Depending on the product, you may also register a profile for each of your users. Generate the User Ids Generate the User ID First things you’ll need are the UID ingredients. The Internal User ID (for each of your users), App ID, and Security Key. internalUserID = User123 appID = 1sJ57hgit securityKey = 838ab4b72d221a585af8b4be7a540234 Generate an md5 hash of the combined string using your programming language’s md5 function (using Python 3, it is in a library called hashlib). Then concatenate the first 10 characters of the md5 hash. Make sure the Checksum is lowercase. Generate an md5 hash of the combined string Concatenate the first 10 characters using hexdigest(:10) concat_input = internalUserID + appID + securityKey checksum = hashlib.md5(concat_input).hexdigest()[:10] Combine them all into one to create the PL UID. PL_UID = internalUserID + “-” + appID + “-” + checkSum Repeat this process for each of your users to create their User ID. Examples Here are examples of how to do this process using 3 different programming languages. Python #This Script Produces a PL User ID using Python import hashlib import sys endUserId = "User123" #insert internal user ID here applicationKey = "54dbf08d625158c6d7b055928d6ac0cc" #insert application key here applicationId = "9145" #insert App ID here. checkSum = hashlib.md5(endUserId + applicationId + applicationKey) userId = endUserId + "-" + applicationId + "-" + checkSum.hexdigest()[:10] print(userId) Ruby require 'digest' end_user_id = 'test_user' publisher_id = '1' security_key = '00000000000000000000000000000000' hash = Digest::MD5.hexdigest(end_user_id + publisher_id + publisher_security_key) user_id = "#{end_user_id}-#{publisher_id}-#{hash[0..9]}” C# System.Security.Cryptography; public class Program { public static void Main() { var endUserID = "User123"; //assuming a member id for their user to be 3. Make sure to change it for every user var publisherId = "9165"; var securityKey = "34101a01e1f305b39d16283d5dd05194"; var hash = CalculateMD5Hash(endUserID + publisherId + securityKey); var userId = endUserID + "-" + publisherId + "-" + hash.Substring(0, 10).ToLower(); var iFrameURL = "https://www.rapidoreach.com/offerwall/?userId=" + userId + "&dob=03-03-1979&sex=1"; //make sure to append the correct dob and sex for every user Console.WriteLine("Generated user id is :{0}", userId); Console.WriteLine("Generated iFrameURL is :{0}", iFrameURL); } public static string CalculateMD5Hash(string input) { // step 1, calculate MD5 hash from input MD5 md5 = System.Security.Cryptography.MD5.Create(); byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input); byte[] hash = md5.ComputeHash(inputBytes); // step 2, convert byte array to hex string StringBuilder sb = new StringBuilder(); for (int i = 0; i < hash.Length; i++) { sb.Append(hash[i].ToString("X2")); } return sb.ToString(); } }Embed offerwall iframe Creating your Rewards Center iFrame is easy and simple. You just need a page with enough space to run it on your webpage/webapp. You’ll need to dynamically generate the Rewards Center link based on the RapidoReach UID. This ensures that every user gets the right credit for their activity. First generate the RapidoReach UID using a script on the server, and pass that to the website. Embed the iframe Append the dynamically generated User ID to the end of the User Greeting. userGreeting = https://www.rapidoreach.com/offerwall/?userId= Example: Join User Greeting with the RapidoReach UID: https://www.rapidoreach.com/offerwall/?userId= + 597a0ed87760ae04c29975ee-1sJ57hgit-838ab4b72d221a585af8b4be7a540234 Becomes User Greeting URL: https://www.rapidoreach.com/offerwall/?userId=597a0ed87760ae04c29975ee-1sJ57hgit-838ab4b72d221a585af8b4be7a540234 Enclose your User Greeting URL in the iframe tags as shown below: Integration Methods/Guides iOS SDK RapidoReach iOS Integration Guide Get Your API Key Sign-up for a new developer account and create a new iOS app here and copy your API Key. Install SDK Install via Cocoapods (easiest) pod 'RapidoReachSDK', :git => 'https://github.com/skondgekar/roriossdk.git' To install pod install Flags On the Build Settings tab and type in Other Linker Flags in the search field. Add the following flags. ObjC Set Required Build Settings We utilize Apple's Advertising ID (IDFA) to identify users. When uploading your app we recommend that you check all the boxes to note that your app uses IDFA and receives a smooth approval process. On the Info tab add in a Dictionary called NSAppTransportSecurity. Make sure you add this dictionary on the Top Level Key. Inside this dictionary, add a Boolean called NSAllowsArbitraryLoads and set it to YES. An example of your info.plist can be found here. Initialize After you have finished modifying the project settings, open your AppDelegate.swift file and import the RapidoReach SDK. Replace the YOUR_API_TOKEN with the actual api key found on your app. Replace YOUR_USER_ID with your unique ID for your appuser. If you do not have a unique user ID we recommend just using their Apple Advertising ID (IDFA). If you utilize a server-side callback, this is the user ID that will be passed back to you when a user earns a reward. // AppDelegate.swift import RapidoReachSDK Next initialize the RapidoReach SDK in your applicationDidFinishLaunchingWithOptions method. // AppDelegate.swift static let RapidoReachAPIKey = "" static let RapidoReachUSER = "" RapidoReach.shared.configure(apiKey: AppDelegate.RapidoReachAPIKey, user: AppDelegate.RapidoReachUSER) Reward Center Open the .swift file of the controller where you want your users to have access to RapidoReach Reward Center. Call the presentSurvey method when you are ready to the send the user into the reward center where they can complete surveys in exchange for your virtual currency. We automatically convert the amount of currency a user gets based on the conversion rate specified in your app. // ViewController.swift // Import rapidoreach SDK import RapidoReach // Call for AppUserId // Do any additional setup after loading the view, typically from a nib. RapidoReach.shared.delegate = self // Fetch userId RapidoReach.shared.fetchAppUserID() // Start reward center RapidoReach.shared.setNavigationBarText(for: "Rapidoreach") RapidoReach.shared.presentSurvey() Reward Callback To ensure safety and privacy, we notify you of all awards via a server side callback. In the developer dashboard for your App add the server callback that we should call to notify you when a user has completed an offer. Note the user ID pass into the initialize call will be returned to you in the server side callback. More information about setting up the callback can be found in the developer dashboard. The quantity value will automatically be converted to your virtual currency based on the exchange rate you specified in your app. Currency is always rounded in favor of the app user to improve happiness and engagement. Client Side Award Callback For security purposes we always recommend that developers utilize a server side callback, however we also provide APIs for implementing a client side award notification if you lack the server structure or a server altogether or want more real-time award notification. It's important to only award the user once if you use both server and client callbacks (though your users may not be opposed!). import RapidoReach extension ViewController: RapidoReachDelegate { func didSurveyAvailable(_ available: Bool) { print("ROR: Surveys available "+(available ? "Available" : "Not Available")); } func didOpenRewardCenter() { print("didOpenRewardCenter") } func didClosedRewardCenter() { print("didClosedRewardCenter") } func didGetRewards(_ reward: RapidoReachReward) { print("RapidoReach Rewards Available: \(reward.total_rewards)") self.user?.rewards = reward self.bindReward() } func didGetError(_ error: RapidoReachError) { print("didGetError: "+error.localizedDescription) } } Testing SDK When you initially create your app we automatically set your app to Test mode. While in test mode a survey will always be available. Note - be sure to set your app to Live in your dashboardt before your app goes live or you won't serve any real surveys to your users! Customizing SDK We provide several methods to customize the navigation bar to feel like your app. RapidoReach.shared.setNavigationBarColor(for: "#00796B") RapidoReach.shared.setNavigationBarTextColor(for: "#FFFFFF") RapidoReach.shared.setStatusBarStyle(for: "light") // 'light' or 'dark' depending on what color of Navigation Bar is selectedAndroid SDK RapidoReach Android Integration Guide Get Your API Key Sign-up for a new developer account and create a new Android app here and copy your API Key. Download the SDK Download the latest version of the Android SDK here. Add the RapidoReach-1.0.0.aar file to your projects "libs" folder. Update your module's build.gradle file Include the rapidoreach.aar, Google Play Services and androidx.appcompat in your build.gradle file. A Google Advertising ID helps us serve offers and surveys so we recommend adding the Google Play Services SDK to your project. Be sure your minSdkVersion is set to at least 16. apply plugin: 'com.android.application' ... android { ... defaultConfig { ... minSdkVersion 16 ... } ... } dependencies { ... implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.gms:play-services-ads:19.2.0' implementation (name: 'RapidoReach-1.0.0', ext: 'aar') } Update your projects's build.gradle file Ensure that your project has access to the 'libs' file by including the following in your project level build.gradle file. buildscript... allprojects { repositories { jcenter() flatDir { dirs 'libs' } } } Proguard If you use proguard in your app. Be sure to add this line to your rules file: -keep class rapidoreach.com.** { *; } Import SDK in your android activity (MainActivity.java) import com.rapidoreach.rapidoreachsdk.RapidoReach; import com.rapidoreach.rapidoreachsdk.RapidoReachRewardListener; import com.rapidoreach.rapidoreachsdk.RapidoReachSurveyAvailableListener; import com.rapidoreach.rapidoreachsdk.RapidoReachSurveyListener; Implement interfaces and methods (MainActivity.java) public class MainActivity extends AppCompatActivity implements RapidoReachRewardListener, RapidoReachSurveyListener, RapidoReachSurveyAvailableListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onReward(int i) { } @Override public void rapidoReachSurveyAvailable(boolean b) { } @Override public void onRewardCenterClosed() { } @Override public void onRewardCenterOpened() { } } Initialize RapidoReach In your activity overwrite the onCreate() method and initialize the RapidoReach SDK with the initWithApiKeyAndUserIdAndActivityContext call. And implement the RapidoReach onPause() and onResume() calls. Replace the YOUR_API_TOKEN with the actual api key found on your app. Replace YOUR_USER_ID with your unique ID for your appuser. If you do not have a unique user ID we recommend just using their Google Advertising ID (GPS_ID) //initialize RapidoReach RapidoReach.initWithApiKeyAndUserIdAndActivityContext(`YOUR_API_TOKEN`, `YOUR_USER_ID`, this); //customize navigation header RapidoReach.getInstance().setNavigationBarText("Demo App"); RapidoReach.getInstance().setNavigationBarColor("#211548"); RapidoReach.getInstance().setNavigationBarTextColor("#FFFFFF"); //set reward and survey status listeners RapidoReach.getInstance().setRapidoReachRewardListener(this); RapidoReach.getInstance().setRapidoReachSurveyListener(this); RapidoReach.getInstance().setRapidoReachSurveyAvailableListener(this); Reward Center Next, in your activity, implement the logic to display the reward center. Call the showRewardCenter method when you are ready to the send the user into the reward center where they can complete surveys in exchange for your virtual currency. We automatically convert the amount of currency a user gets based on the conversion rate specified in your app. Button btn = (Button) findViewById(R.id.button); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.d(TAG, "Button is clicked"); if (RapidoReach.getInstance().isSurveyAvailable()) { RapidoReach.getInstance().showRewardCenter(); } } }); Reward Callback To ensure safety and privacy, we notify you of all awards via a server side callback. In the developer dashboard for your App add the server callback that we should call to notify you when a user has completed an offer. Note the user ID pass into the initialize call will be returned to you in the server side callback. More information about setting up the callback can be found in the developer dashboard. The quantity value will automatically be converted to your virtual currency based on the exchange rate you specified in your app. Currency is always rounded in favor of the app user to improve happiness and engagement. Client Side Award Callback For security purposes we always recommend that developers utilize a server side callback, however we also provide APIs for implementing a client side award notification if you lack the server structure or a server altogether or want more real-time award notification. It's important to only award the user once if you use both server and client callbacks (though your users may not be opposed!). public class MyActivity extends Activity implements RapidoReachRewardListener { @Override protected void onCreate(Bundle savedInstanceState) { ... // initialize RapidoReach super.onCreate(); RapidoReach.initWithApiKeyAndUserIdAndActivityContext("YOUR_API_TOKEN", "YOUR_USER_ID", "YOUR_ACTIVITY"); // set RapidoReach client-side reward listener RapidoReach.getInstance().setRapidoReachRewardListener(this); } // implement callback for award notification @Override public void onReward(int i) { Log.d(TAG, "onReward: " + i); } } Reward Center Events You can optionally listen for the onRewardCenterOpened and onRewardCenterClosed events by implementing the RapidoReachSurveyListener interface. public class MyActivity extends Activity implements RapidoReachSurveyListener { @Override protected void onCreate(Bundle savedInstanceState) { ... // initialize RapidoReach super.onCreate(); RapidoReach.initWithApiKeyAndUserIdAndActivityContext("YOUR_API_TOKEN", "YOUR_USER_ID", "YOUR_ACTIVITY"); // set RapidoReach survey event listener RapidoReach.getInstance().RapidoReachSurveyListener(this); } // reward center opened. time to start earning content! @Override public void onRewardCenterOpened() { Log.d(TAG, "onRewardCenterOpened"); } // reward center closed. restart music/app. @Override public void onRewardCenterClosed() { Log.d(TAG, "onRewardCenterClosed"); } } Survey Available Callback If you'd like to be notified when a survey is available you can add a listener: public class MyActivity extends Activity implements RapidoReachSurveyAvailableListener { @Override protected void onCreate(Bundle savedInstanceState) { ... // initialize RapidoReach super.onCreate(); RapidoReach.initWithApiKeyAndUserIdAndActivityContext("YOUR_API_TOKEN", "YOUR_USER_ID", "YOUR_ACTIVITY"); // set RapidoReach survey available listener RapidoReach.getInstance().setRapidoReachSurveyAvailableListener(this); } // implement callback for survey available @Override public void rapidoReachSurveyAvailable(int surveyAvailable) { Log.d(TAG, "rapidoreachSurveyAvailable: " + surveyAvailable); } } Testing SDK When you initially create your app we automatically set your app to Test mode. While in test mode a survey will always be available. Note - be sure to set your app to Live in your dashboard before your app goes live or you won't serve any real surveys to your users! Customizing SDK We provide several methods to customize the navigation bar to feel like your app. RapidoReach.getInstance().setNavigationBarText("Demo App"); RapidoReach.getInstance().setNavigationBarColor("#17b4b3"); RapidoReach.getInstance().setNavigationBarTextColor("#FFFFFF");Unity SDK RapidoReach Unity Integration Guide Get Your API Key Sign-up for a new developer account and create a new Unity app here and copy your API Key. Download the Plugin Download the latest version of the RapidoReach Unity Plugin here. Import the Unity Package From Unity go to Assets menu → Import package → Custom package → choose the unzipped unity package. Android Ensure the RapidoReach-1.0.0.aar and other files were successfully imported with the RapidoReach.cs file in your "Assets/Plugins" folder. In your player settings ensure the minimum API is set to 15 (Jelly Bean) or higher. Initialize RapidoReach We recommend initializing RapidoReach as soon as possible so we can begin preparing surveys for the user. In the Initialize method you'll set your API key and the user's ID that will be passed back into your server side callback when the user has earned currency for completing a survey. #if UNITY_ANDROID || UNITY_IOS // Your GameObject that triggers the Reward Center void Start() { ConfigureRapidoReach(); } public void ConfigureRapidoReach() { #if UNITY_IOS || UNITY_ANDROID RapidoReach.Initialize("d5ece53df8ac97409298325fec81f3f7", "ANDROID_TEST_ID"); RapidoReach.SetListener(gameObject.name); // optional RapidoReach.SetNavigationBarText("RapidoReach Unity N"); RapidoReach.SetNavigationBarColor("#211548"); RapidoReach.SetNavigationBarTextColor("#FFFFFF"); #endif } // call this function to show reward center on button click etc public void showRewardCenter(){ Debug.Log("UNITY: Calling show reward center"); #if UNITY_IOS || UNITY_ANDROID RapidoReach.ShowRewardCenter(); #endif } void OnReward(string quantity) { FindObjectOfType().GetComponent().text = quantity; Debug.Log("RapidoReach OnReward: " + quantity); } void OnRewardCenterOpened() { FindObjectOfType().GetComponent().text = "Loading ..."; Debug.Log("RapidoReach OnRewardCenterOpened!"); } void OnRewardCenterClosed() { Debug.Log("RapidoReach OnRewardCenterClosed!"); } void RapidoReachSurveyAvailable(string available) { Debug.Log("RapidoReach RapidoReachSurveyAvailable: " + available); } #endif Google Play Services A Google Advertising ID helps us serve offers and surveys so we recommend adding Google Play Services to your project. We provide the files to pull this in for you. iOS Ensure the UnityPluginBridge.mm and RapidoReachSDK-Bridging-Header.h files and frameworks folder are in your "Assets/Plugins/iOS" folder and the RapidoReach.cs file is in your "Assets/Plugins" folder. Initialize RapidoReach We recommend initializing RapidoReach as soon as possible so we can begin preparing surveys for the user. In the Initialize method you'll set your API key and the user's ID that will be passed back into your server side callback when the user has earned currency for completing a survey. #if UNITY_ANDROID || UNITY_IOS // Your GameObject that triggers the Reward Center void Start() { ConfigureRapidoReach(); } public void ConfigureRapidoReach() { #if UNITY_IOS || UNITY_ANDROID RapidoReach.Initialize("d5ece53df8ac97409298325fec81f3f7", "ANDROID_TEST_ID"); RapidoReach.SetListener(gameObject.name); // optional RapidoReach.SetNavigationBarText("RapidoReach Unity N"); RapidoReach.SetNavigationBarColor("#211548"); RapidoReach.SetNavigationBarTextColor("#FFFFFF"); #endif } // call this function to show reward center on button click etc public void showRewardCenter(){ Debug.Log("UNITY: Calling show reward center"); #if UNITY_IOS || UNITY_ANDROID RapidoReach.ShowRewardCenter(); #endif } void OnReward(string quantity) { FindObjectOfType().GetComponent().text = quantity; Debug.Log("RapidoReach OnReward: " + quantity); } void OnRewardCenterOpened() { FindObjectOfType().GetComponent().text = "Loading ..."; Debug.Log("RapidoReach OnRewardCenterOpened!"); } void OnRewardCenterClosed() { Debug.Log("RapidoReach OnRewardCenterClosed!"); } void RapidoReachSurveyAvailable(string available) { Debug.Log("RapidoReach RapidoReachSurveyAvailable: " + available); } #endif Libraries We include a post processing script to automatically include all libraries into your project and perform any additional configuration in the build settings. See the iOS guide if you would like to verify your Xcode project setup. Reward Callback To ensure safety and privacy, we notify you of all awards via a server side callback. This callback will be triggered for both Android and iOS apps. In the developer dashboard for your App add the server callback that we should call to notify you when a user has completed an offer. Note the user ID pass into the initialize call will be returned to you in the server side callback. More information about setting up the callback can be found in the developer dashboard. The quantity value will automatically be converted to your virtual currency based on the exchange rate you specified in your app. Currency is always rounded in favor of the app user to improve happiness and engagement. Client Side Award Callback For security purposes we always recommend that developers utilize a server side callback, however we also provide APIs for implementing a client side award notification if you lack the server structure or a server altogether or want more real-time award notification. It's important to only award the user once if you use both server and client callbacks (though your users may not be opposed!). In order to receive notifications you must implement the OnReward method on the GameObject you'd like to receive notifications that a user earned content. Then you must register that gameObject with the SetListener method. Additionally you can also implement OnRewardCenterOpened and OnRewardCenterClosed to listen to events and RapidoReachSurveyAvailable to listen to when a survey is available. #if UNITY_ANDROID || UNITY_IOS // Your GameObject that triggers the Reward Center void Start() { ConfigureRapidoReach(); } public void ConfigureRapidoReach() { #if UNITY_IOS || UNITY_ANDROID RapidoReach.Initialize("d5ece53df8ac97409298325fec81f3f7", "ANDROID_TEST_ID"); RapidoReach.SetListener(gameObject.name); // optional RapidoReach.SetNavigationBarText("RapidoReach Unity N"); RapidoReach.SetNavigationBarColor("#211548"); RapidoReach.SetNavigationBarTextColor("#FFFFFF"); #endif } // call this function to show reward center on button click etc public void showRewardCenter(){ Debug.Log("UNITY: Calling show reward center"); #if UNITY_IOS || UNITY_ANDROID RapidoReach.ShowRewardCenter(); #endif } void OnReward(string quantity) { FindObjectOfType().GetComponent().text = quantity; Debug.Log("RapidoReach OnReward: " + quantity); } #endif Testing SDK When you initially create your app we automatically set your app to Test mode. While in test mode a survey will always be available. Note - be sure to set your app to Live in your dashboardt before your app goes live or you won't serve any real surveys to your users! Customizing SDK We provide several methods to customize the navigation bar to feel like your app. RapidoReach.SetNavigationBarText("RapidoReach Unity N"); RapidoReach.SetNavigationBarColor("#211548"); RapidoReach.SetNavigationBarTextColor("#FFFFFF"); React Native SDK @rapidoreachsdk/react-native-rapidoreach Before you start Get your API key Sign-up for a new developer account and create a new app here and copy your API Key. Getting started $ npm install @rapidoreachsdk/react-native-rapidoreach $ yarn add react-native-webview $ cd ios && pod install && cd .. # CocoaPods on iOS needs this extra step We are all set up! Now let's use the module. Usage Initialize RapidoReach First, you need to initialize the RapidoReach instance with initWithApiKeyAndUserId call. // Import RapidoReach native module import RapidoReach from '@rapidoreachsdk/react-native-rapidoreach'; componentDidMount() { // In your app initialization, initialize RapidoReach RapidoReach.initWithApiKeyAndUserId('YOUR_API_TOKEN', 'YOUR_USER_ID'); } Reward Center Next, implement the logic to display the reward center. Call the showRewardCenter method when you are ready to send the user into the reward center where they can complete surveys in exchange for your virtual currency. We automatically convert the amount of currency a user gets based on the conversion rate specified in your app. onPressShowRewardCenter = () => { RapidoReach.isSurveyAvailable((isAvailable) => { // if a survey is available, show the reward center if (isAvailable) { RapidoReach.showRewardCenter(); } }) } Reward Callback To ensure safety and privacy, we recommend using a server side callback to notify you of all awards. In the developer dashboard for your App add the server callback that we should call to notify you when a user has completed an offer. Note the user ID pass into the initialize call will be returned to you in the server side callback. More information about setting up the callback can be found in the developer dashboard. The quantity value will automatically be converted to your virtual currency based on the exchange rate you specified in your app. Currency is always rounded in favor of the app user to improve happiness and engagement. Client Side Award Callback If you do not have a server to handle server side callbacks we additionally provide you with the ability to listen to client side reward notification. First, import Native Module Event Emitter: import { RapidoReachEventEmitter } from '@rapidoreachsdk/react-native-rapidoreach'; Then, add event listener for award notification (in componentWillMount, for example): this.onRewardListener = RapidoReachEventEmitter.addListener( 'onReward', this.onReward, ); Implement the callback: onReward = (quantity) => { console.log('reward quantity: ', quantity); } Reward Center Events You can optionally listen for the onRewardCenterOpened and onRewardCenterClosed events that are fired when your Reward Center modal is opened and closed. Add event listeners for onRewardCenterOpened and onRewardCenterClosed: this.onRewardCenterOpenedListener = RapidoReachEventEmitter.addListener( 'onRewardCenterOpened', this.onRewardCenterOpened, ); this.onRewardCenterClosedListener = RapidoReachEventEmitter.addListener( 'onRewardCenterClosed', this.onRewardCenterClosed, ); Implement event callbacks: onRewardCenterOpened = () => { console.log('onRewardCenterOpened called!'); } onRewardCenterClosed = () => { console.log('onRewardCenterClosed called!'); } Survey Available Callback If you'd like to be proactively alerted to when a survey is available for a user you can add this event listener. First, import Native Module Event Emitter: import { RapidoReachEventEmitter } from '@rapidoreachsdk/react-native-rapidoreach'; Then, add event listener for award notification (in componentWillMount, for example): this.rapidoreachSurveyAvailableListener = RapidoReachEventEmitter.addListener( 'rapidoreachSurveyAvailable', this.rapidoreachSurveyAvailable, ); Implement the callback: rapidoreachSurveyAvailable = (surveyAvailable) => { if (surveyAvailable == "true") { console.log('rapidoreach survey is available'); } else { console.log('rapidoreach survey is NOT available'); } } Finally, don't forget to remove your event listeners in the componentWillUnmount lifecycle method: componentWillUnmount() { this.onRewardListener.remove(); this.onRewardCenterOpenedListener.remove(); this.onRewardCenterClosedListener.remove(); this.rapidoreachSurveyAvailableListener.remove(); } Contact Please send all questions, concerns, or bug reports to admin@rapidoreach.com. FAQ What do you do to protect privacy? We take privacy very seriously. All data is encrypted before being sent over the network. We also use HTTPS to ensure the integrity and privacy of the exchanged data. What kind of analytics do you provide? Our dashboard will show metrics for sessions, impressions, revenue, and much more. We are constantly enhancing our analytics so we can better serve your needs. What is your fill rate? We have thousands of surveys and add hundreds more every day. Most users will have the opportunity to complete at least one survey on a daily basis. I'm ready to go live! What are the next steps? Let us know! We'd love to help ensure everything flows smoothly and help you achieve your monetisation goals! Following the rewarded and/or theOfferwall approach An example is provided on Github that demonstrates how a publisher can implement the rewarded and/or the Offerwall approach. Upon survey completion, the publisher can reward the user. Limitations / Minimum Requirements This is just an initial version of the plugin. There are still some limitations: You cannot pass custom attributes during initialization No tests implemented yet Minimum iOS is 9.0 and minimum Android version is 16 For other RapidoReach products, see RapidoReach docs. ReactNativeSDKFlutter SDK flutter_rapidoreach A plugin for Flutter that supports rendering surveys using RapidoReach SDKs. You can install rapidoreach flutter plugin from here Note: RapidoReach iOS SDK utilizes Apple's Advertising ID (IDFA) to identify and retarget users with RapidoReach surveys. As of iOS 14 you should initialize RapidoReach Flutter plugin in iOS only if the relevant IDFA permission was granted by the user Initializing the plugin The RapidoReach plugin must be initialized with a RapidoReach API Key. You can retrieve an API key from RapidoReach Dashboard when you sign up and create a new app. Usage Initialize RapidoReach First, you need to initialize the RapidoReach instance with init call. // Import RapidoReach package import 'package:rapidoreach/RapidoReach.dart'; RapidoReach.instance.init(apiKey: 'YOUR_API_TOKEN', userId: 'YOUR_USER_ID') Reward Center Next, implement the logic to display the reward center. Call the show method when you are ready to send the user into the reward center where they can complete surveys in exchange for your virtual currency. We automatically convert the amount of currency a user gets based on the conversion rate specified in your app. RapidoReach.instance.show(), Reward Callback To ensure safety and privacy, we recommend using a server side callback to notify you of all awards. In the developer dashboard for your App add the server callback that we should call to notify you when a user has completed an offer. Note the user ID pass into the initialize call will be returned to you in the server side callback. More information about setting up the callback can be found in the developer dashboard. The quantity value will automatically be converted to your virtual currency based on the exchange rate you specified in your app. Currency is always rounded in favor of the app user to improve happiness and engagement. Client Side Award Callback If you do not have a server to handle server side callbacks we additionally provide you with the ability to listen to client side reward notification. RapidoReach.instance.setOnRewardListener(onRapidoReachReward); Implement the callback: void onRapidoReachReward(int quantity) { print('TR: $quantity'); } Reward Center Events You can optionally listen for the setRewardCenterOpened and setRewardCenterClosed events that are fired when your Reward Center modal is opened and closed. Add event listeners for onRewardCenterOpened and onRewardCenterClosed: RapidoReach.instance .setRewardCenterClosed(onRewardCenterClosed); RapidoReach.instance .setRewardCenterOpened(onRewardCenterOpened); Implement event callbacks: void onRewardCenterOpened() { print('onRewardCenterOpened called!'); } void onRewardCenterClosed() { print('onRewardCenterClosed called!'); } Survey Available Callback If you'd like to be proactively alerted to when a survey is available for a user you can add this event listener. First, import Native Module Event Emitter: RapidoReach.instance .setSurveyAvaiableListener(onRapidoReachSurveyAvailable); Implement the callback: void onRapidoReachSurveyAvailable(int survey) { print('TR: $survey'); } Following the rewarded and/or theOfferwall approach An example is provided on Github that demonstrates how a publisher can implement the rewarded and/or the Offerwall approach. Upon survey completion, the publisher can reward the user. Limitations / Minimum Requirements This is just an initial version of the plugin. There are still some limitations: You cannot pass custom attributes during initialization No tests implemented yet Minimum iOS is 9.0 and minimum Android version is 16 For other RapidoReach products, see RapidoReach docs. Getting Started If you would like to review an example in code please review the Github project.Publisher API's Reconcillations reports API RapidoReach Publisher API Guide Reconcialation Report API Method: GET URL: http://www.rapidoreach.com/api/v1/reconciliations/{{publisher_id}}/{{app_id}}?key={{app_api_key}}&limit=3&skip=2 Params publisher_id: Publisher User id app_id: App id Query app_api_key: API Key generated for an app. It can be found on publisher portal limit: it is a number of records to fetch in one query request. It is limited to maximum 500 records for performance reasons skip: Number of records to be skipped. For example there are total 350 records are available. You can then fetch it as follows set skip = 0 and limit = 100 -> it will show first 100 records set skip = 100 and limit 100 -> to get another set of 100 records set skip = 200 and limit 100 -> to get another set of 100 records set skip = 300 and limit 100 -> to get another set of 50 records At this point records retrieved (50) are less than requested (limit = 100) hence there are no more records are available to fetch Records the total number of records retrived it skip (300) + final call records (50) = 350 in total Store this number in your system Next time start from this number and retrieve from 350 ie skip = 350 set skip = 350 and limit 100 and so on