Would you like to get access to the SDK? Submit your request here: SDK Request Form



The Poynt Enabled solution enables messaging providers to enhance their applications with search functionality and benefit from the associated revenue stream. There are three ways to implement the Sprylogics functionality:

1. Client-side SDK

2. Objective C and Java API Wrappers


Here is a brief summary of each,and explanations detailing when a given method would be used, and what dependencies are required for each.

Note: Please consult the attached class diagram at the end of this document for additional details.

Client-side SDK (iOS)

This method is chat-protocol agnostic: it does not rely on any external frameworks. It handles all requests, responses and UI elements used to search and share search results.

The SDK consists of statically linked library called FjordUIKit that contains all the visual elements as well as underlying search API wrapped into Objective-C interfaces. There are no external dependencies for the project.

Client-side SDK (Android)

This Android Client-side SDK is also chat-protocol agnostic. It handles all requests, responses and UI elements used to search and share search results within a messaging stream. It is broken into two projects: the non-UI (“backend”) project and the UI elements project which is responsible for all UI elements that are rendered as part of search and sharing of search results experience. The projects are Android libraries and can be easily integrated into your application workspace. There are no external dependencies for the projects.

Objective C and Java API wrappers

This method assumes that the chat client does not want the Sprylogics framework to handle any of the UI associated with searching. It’s essentially a wrapper and response handler (processes all XML responses) for the Sprylogics search API. Sharing functionality, rendering of chat messages/shared results, and search UI is all up to the client to implement.

Required dependencies for iOS:

FjordUIKit static library.

Required dependencies for Android:

The LiquidMessaging project/jar.


For messaging applications that do not wish to use our wrappers, we provide access to our REST APIs. All APIs are documented at http://dev.sprylogics.com/developers-support/

Note: You will need to be provisioned with valid application ID in order to use the APIs

This method assumes that the chat client does not want the Sprylogics framework to handle any of the UI associated with searching. Sharing functionality, rendering of chat messages/shared results, and search UI is all up to the client to implement.

Sprylogics provides access to select partners to the following APIs:

Search Suggestions API

Search suggestions API is the API used for obtaining search suggestions. Currently the search suggestions provides suggestions for the movie vertical based on users location. The search suggestions returns names of the movies that match the typed input.

Movie Search API

Movie search API provides search for movies, theatres, genres and showtimes. Note that the staging server has an implementation of the theatre search API that is broken into two processes: obtain theatres nearby and second call for getting movies playing at the theatres.

Local Search API

Local search allows search for businesses nearby. Note that the user name is optional and is really only required for purposes of voting (if you are implementing voting API). The local search has been broken out into separate category based search for restaurants, bars and cafes, if so desired.

Weather API

Weather API provides weather information based on provided location.

Classifier API

Classifier API provides means of classifying messages into verticals as well as getting answers to questions about people and locations.

Analytics API

Analytics API describes how the application should implement tracking of events.

Product Search API

Searches for location-based products by keyword, barcode, etc.

Share API

In order to share search results with other parties, the share API must be invoked. It creates a unique share id for each shared result. The shared results GET call is RESTful and it will either render the HTML5 version or return JSON for rendering within the application (depending on the request headers).

General Web Search API

This is a general web search API that returns results from internet

YouTube Search API

YouTube search API provides access to YouTube video search

Answer Engine API

Currently the answer engine is not available to outside parties. If you are interested in beta trial, let us know.

Usage Examples

iOS Client-side SDK

FjordUIKit SDK

FjordUIKit includes complete UI interfaces for search verticals that can be integrated into various kinds of iOS applications.

NOTE: For Xcode 5 please make sure that you have the Arm 7 architecture as the target since the released SDK does not contain 64-bit architecture binaries.


Kit initialization

It is recommended to initialize FjordUIKit when app starts:

#import <FjordUIKit/FjordUIKit.h>


[FjordUIKit initializeDefaultKitWithAppId:@”your_app_id”];

Default instance of the kit can be obtained anywhere in the project by:

FjordUIKit *kit = [FjordUIKit defaultKit];

Share delegate

You need to provide a share delegate object to fjordUIKit, which will be called whenever app users shares movie(s), restaurant(s), product(s), video(s), location, etc. from FjordUIKit.

FjordUIKit *kit = [FjordUIKit defaultKit];

kit.shareDelegate = myViewController;

MyViewController needs to implement FjordShareDelegate protocol which includes this method:

-(void) didShareItems:(FjordShareItems*)items;

And this method

-(void) didPickMediaImageForSharing:(UIImage*)image

withCompletionHandler:(void(^)(UIImage *editedImage))completionBlock {



And this method

-(BOOL) shouldPerformTelephoneCallToNumber:(NSString*)telNumber {

// return NO to prevent SDK from using standard telephone number handling

return YES;


Additional information about sharing is in Sharing Items section.

User authentication

When app user authenticates to a chat or similar server it is recommended that you provide name and image of the user to the FjordUIKit:

FjordUIKit *kit = [FjordUIKit defaultKit];


FjordShareUser *user = [[FjordShareUser alloc] init];

user.name = firstNameAndLastName;

user.image = userImage;


kit.currentShareUser = user;

Share partner

When app user enters in communication with chat partner or any other type of partner you need to provide the following info of the partner to FjordUIKit:

FjordUIKit *kit = [FjordUIKit defaultKit]


FjordSharePartner *partner = [[FjordSharePartner alloc] init];

partner.partnerId = partnerId;

partner.name = firstNameAndLastName;

partner.image = partnerImage;


kit.currentSharePartner = partner;

Share partner location

If your app receives information about partner’s location it needs to supply the information to FjordUIKit:

FjordUIKit *kit = [FjordUIKit defaultKit]

[kit updateLocation:location forSharePartnerWithId:sharePartnerId];

Hooking up the search button

Display main UIViewController of FjordUIKit in existing navigation controller

FjordUIKit *kit = [FjordUIKit defaultKit]

UIViewController *fjordRoot = [kit rootSearchViewController];

[self.navigationController pushViewController:fjordRoot];

or display the view controller modally:

FjordUIKit *kit = [FjordUIKit defaultKit]

UIViewController *fjordRoot = [kit rootSearchViewController];

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:fjordRoot];

[self presentModalViewController:nav animated:YES];

Sharing items

Whenever user shares an item or several items from FjordUIKit didShareItems delegate method is called which needs to be implemented for example in one of your view controllers.

-(void) didShareItems:(FjordShareItems*)items {

if ([items.type isEqualToString:@”Movies”) {

//items.type can be @”Movies”, @”Restaurants”, @”People”,

// @”Products”, @”Weather”, @”YouTube” …


for (FjordMovie *movie in items.items) {

// do something with shared movie(s)



// if items.type equals to @”Movies” items.items array contains

// FjordMovie objects, if items.type equals to @”Restaurants”

// items.items array contains FjordRestaurant objects, etc.


// if user shared a single item (most cases) items.items array

// contains only one object, if it is a bulk share it

//contains more than one item.


// items.displayLink contains a link which can be shared trough

// a chat stream. At the other end of the stream link can be used

// to retrieve information about all the shared items.


//items.itemsAsString contains encoded string representation of

// shared items. This string can also be used to send via chat or

// other communication stream in certain cases and can be decoded

// on the other side of the stream.



Decoding shared items

This method retrieves single or an array of shared items that were sent as displayLink trough chat stream. Items are returned asynchronously with completion block.

[kit retrieveShareItemsFromDisplayLink:displayLink withCompletionHandler:^(FjordShareItems *items, NSError *error)) {

// code to handle items


This method retrieves single or an array of shared items that were sent as encoded string trough chat stream.

FjordShareItems *items = [kit decodeShareItemsFromString:shareString];

Displaying shared items

FjordUIKit provides visual elements for shared items. For example it can provide UITableViewCells or detail UIViewControllers for individual items. Usually you can use UITableViewCells to be displayed in chat stream table view and detail UIViewControllers can be pushed when you press a cell in a table.

This method returns UITableViewCell for displaying in UITableView for specified item. Item can be FjordMovie, FjordRestaurant, FjordProduct, etc. object:

-(UITableViewCell*) cellForItem:(id)item





This method returns UIViewController with visual details about shared item. Item can be FjordMovie, FjordRestaurant, FjordProduct, etc. object:

-(UIViewController*) detailViewControllerForFjordItem:(id)item;

restaurantId and restaurantName are the only ones guaranteed to be there by the framework.

Objective C API Search Wrapper

In this case there is one class that exposes with the Sprylogics API: FjordKit.m

This class is meant to be implemented as a singleton, and is instantiated through

backendManager = [FjordKit getInstance];

The functions exposed through this class are:

+(void) initializeDefaultInstanceWithAppId:(NSString*)appId;

+(FjordKit*) getInstance;

-(id) initWithAppId:(NSString*)aId;

+(void) setDefaultInstance:(id)fk;


-(void)getPredictiveSearchForMoviesStartingWith:(NSString *)startingString completionHandler:(void(^)(NSArray *, NSError *))completionBlock;


-(void)getPredictiveSearchForRestaurantsStartingWith:(NSString *)startingString completionHandler:(void(^)(NSArray *, NSError *))completionBlock;


//search centre

-(void) setSearchCentreLatitude:(NSString *)triangulatedLatitude andLongitude:(NSString*)triangulatedLongitude aroundUserId:(NSString*)userId betweenTheTwoOfUs:(BOOL)YesOrNO;

-(void) setAsSearchingFromSecondaryCoordinates:(BOOL)onOrOff;




-(void)getMoviesByRank:(void(^)(NSArray *, NSError *))completionBlock;

-(void)getMoviesByQuery:(NSString *)query completionHandler:(void(^)(NSArray *, NSError *))completionBlock;

-(void)getMovieById:(NSString*)movieID completionHandler:(void(^)(FjordMovie *, NSError *))completionBlock;



-(void)getTheatresByMovieId:(NSString *)movieId completionHandler:(void(^)(NSArray *,NSError *))completionBlock;

-(void)getTheatresNearbyWithCompletionHandler:(void(^)(NSArray *, NSError *))completionBlock;

-(void)getTheatresNearbyWithDetailsWithCompletionHandler:(void(^)(NSArray *, NSError *))completionBlock;

-(void)getTheatreDetailsByTheatreId:(NSString*)theatreId completionHandler:(void(^)(NSArray *, NSError *))completionBlock;




-(void)getMovieGenresWithCompletionHandler:(void(^)(NSArray *, NSError *)) completionBlock;

-(void)getMoviesByGenre:(NSString *)genre completionHanlder:(void(^)(NSArray *, NSError *)) completionBlock;


//local search

-(void)getBusinessesWithCompletionHandler:(void(^)(NSArray *, NSError *)) completionBlock;



-(void)getRestaurantsNearbyWithCompletionHandler:(void(^)(NSArray *, NSError *))completionBlock;

-(void)getRestaurantsByCuisine:(NSString *)cuisine completionHanlder:(void(^)(NSArray *, NSError *))completionBlock;

-(void)getRestaurantReviews:(NSString *)reviewURL completionHandler:(void(^)(NSArray *, NSError *))completionBlock;

-(void)getRestaurantByQuery:(NSString *)query completionHandler:(void(^)(NSArray *, NSError *))completionBlock;

-(void)getRestaurantById:(NSString *)productId WithCompletionHandler:(void(^)(FjordRestaurant *, NSError *))completionBlock;


-(void)getBarsNearbyWithCompletionHandler:(void(^)(NSArray *, NSError *))completionBlock;


-(void)getCafesNearbyWithCompletionHandler:(void(^)(NSArray *, NSError *))completionBlock;



-(void)getProductById:(NSString*)productId withCompletionHandler:(void(^)(FjordProduct *, NSError*))completionBlock;

-(void)getProductsNearbyWithCompletionHandler:(void(^)(NSArray *, NSError *))completionBlock;

-(void)getProductsByQuery:(NSString*) query WithCompletionHandler:(void(^)(NSArray*, NSError*)) completionBlock;



-(void)getWeatherStatusForCurrentLocationWithCompletionHandler:(void(^)(FjordWeather*, NSError*))completionBlock;



//YouTube Movies


//feed_id can be: top_rated, most_shared, most_popular, most_recent, most_discussed, most_responded, recently_featured

-(void)getYoutubeMoviesByFeedId:(NSString*)feedId andCompletionHandler:(void(^)(NSArray *, NSError *))completionBlock;

//timeIntervalFilter can be today, this_week, this_month, all_time

-(void)getYoutubeMoviesByFeedId:(NSString*)feedId timeIntervalFilter:(NSString*)tiFilter andCompletionHandler:(void(^)(NSArray *, NSError *))completionBlock;

-(void)getYoutubeMoviesByQuery:(NSString*)query andCompletionHandler:(void(^)(NSArray *, NSError *))completionBlock;

-(void)getYoutubeMovieById:(NSString*)movieId andCompletionHandler:(void(^)(FjordYouTubeVideo*, NSError *))completionBlock;



-(void) saveItemInfoForSharing:(NSString*)info withCompletionHandler:(void(^)(NSString *shareLink, NSError *error))completionBlock;

-(void) retrieveSharedLinkInfo:(NSString*)link withCompletionHandler:(void(^)(NSString *sharedItemInfo, NSError *error))completionBlock;

Note the location and 3rd party APIs which are implemented by the current framework.

The 3rd party API is a geocoding Google API and can be replaced.

Note on the result type

The FjordKit uses blocks as completion handlers for all its calls. The NSArrays returned into the block are either of type FjordMovie, FjordRestaurant, or FjordTheatre, depending on the call.

The one exception is

-(void)getMovieGenresWithCompletionHandler:(void(^)(NSArray *, NSError *)) completionBlock;

which returns an array of NSString.

Android Client-side SDK

1. Setting up the Environment

Android SDK is provided as a set of Android library projects. LiquidMessagingUI project is the main SDK interface project and must be added/referenced by your project under the Android section of your project properties. Below is the list of project that you should expect in the package:






SprySdkSample (This is reference implementation of how to use the SDK)


You can simply start a new workspace in Eclipse and import the above listed projects from the location where you have unzipped the package, by using the File->Import->General->Existing Projects into Workspace.

IMPORTANT: Please add the provided font directory from the LiquidMessagingUI/assets to your project’s assets directory.

2. Invoking the SDK from Your App

You can add an actionable button to invoke the LiquidMessaging Search service, in your conversation window, when a person is talking to a particular friend. Below is the code to launch the SDK using an intent.

Intent liqMsgIntent = new Intent(this,



liqMsgIntent.putExtra(“imgUrl”, userImageLocationUri);

liqMsgIntent.putExtra(“name”, userName);



imgUrl: the url to the image of the friend

name: is the name of the friend

3. Handling the Shared Messages

Liquid Messaging SDK allows users to share the search results with their friends via your messaging client, and it provides all the necessary tools to easily process these shared messages for both sending/receiving parties. The SDK provides predefined views which can be rendered in the chat window on the sending and receiving side. In case the receiving side does not have a version with the SDK installed then the messages are simple links which can be clicked and launched in a browser where they are rendered through HTML5.

In order to process these shared messages, your chat window Activity must extend com.sprylogics.liqmsg.ui.LiqMsgSharedItemActivity. This activity requires you to implement two abstract methods. These are call back methods that are called by the SDK when certain events take place. Details for each callback are provided in the following sections.

public abstract void processSharedItem(String sharedMessage, String url);

public abstract void processSharedItemData(String messageId, String data);

There is also a utility method in the Activity which needs to be used for identifying shared messages and rendering them in the chat window, the details follow in the following section.

public boolean renderSharedViewIfApplicable(LinearLayout viewToRenderSharedMessage, String messageId, String message, String userID, String userName, String userImage, boolean isSentMessage)

3.1. Processing an outgoing Shared Item

The first method processSharedItem is called by the SDK when the sending user shares an item from the SDK. When this method is called, your app must store the sharedMessage field in the local database as a sent message and must send out the url to the user of the current chat window. Sample code provided below:

public class ChatConversationActivity extends LiqMsgSharedItemActivity {

private ChatConnectionInterface service;

private static String jid = null;




public void processSharedItem(String message, String url) {

try {

service.sendMessage(userId ,url);

} catch (RemoteException e) {



saveOutgoingMessage(userId ,message);

// refresh the view as you would for any outgoing message so

// it shows up in the chat window



3.2. Processing an incoming Shared Item

For every messages that is rendered in the chat window with a friend, you must call renderSharedViewIfApplicable method (ideally inside the getView(…) method of your android.widget.ArrayAdapteror equivalent ). Calling this method can have 3 different outcomes:

Note: this method will never block and will return immediately, and will notify via a callback method if necessary, details on the callback below (section iii).

i) If the message is not a shared message it will return immediately returning afalsevalue and you can proceed to render the message as you normally would.

ii) If the message is a shared message but the content of the message has already been downloaded, then the method will return immediately returning a truevalue and content of the message will be rendered inside the viewToRenderSharedMessage object which was passed as an input parameter.

iii) The message is a shared message but the content of it has not been downloaded, then the method returntrue. Upon download of the content, the processSharedItemDatacall back method will be called, in which scenario you must do the following two actions:

a) Update the content of the local message store with the data field provided in the call back. You can use the message id field to identify the message content to update. This will eliminate any future download of the content since they will be locally stored.

b) Refresh your android.widget.ArrayAdapterby calling the notifyDataSetChanged()method (or equivalent), which should in turn call the method renderSharedViewIfApplicable and it will render the content immediately since they have already been downloaded.

public void processSharedItemData(String messageId, String data) {

if (data != null && data.trim().length() > 0 && messageId != null) {



try {

service.saveUpdateMessage(jid, data, messageId);

} catch (RemoteException e) {





3.3. Google Map Key

In order to have the Google maps displayed properly you need to register for a Google Maps key or user one that you might already have provisioned. You can set the Google Maps Key by editing the corresponding value in the LiquidMessagingSDK/res/values/strings.xml file.

Please replace with your own google_map_api key.


3.4. AndroidManifest.xml


Below is the list of all the Activities, Services and permissions required by the SDK. Please add following entries to your AndroidManifest.xml:


























































<!– filters to allow this app to receive image intents from the system –>


























































































<actionandroid:name=“android.intent.action.MAIN” />

<categoryandroid:name=“android.intent.category.LAUNCHER” />




<!– receiver. gets the newly installed plugins –>












<!– Used for install referrer tracking–>







<!– Required for the hi-res image processing –>

<!– authorities can have the value you prefer –>