Kaizen #130 - Zoho CRM Scala SDK (V6) - Configuration and Initialization

Kaizen #130 - Zoho CRM Scala SDK (V6) - Configuration and Initialization

Hello and welcome to another Kaizen week!

In this week's post, we'll show you how to get started with Zoho CRM's Scala SDK, and walk you through the configuration and initialization process. Specifically, we will  discuss how to use the Scala SDK to make API calls authenticated via self-client. Please note that this article holds true for Scala SDK supporting version 6 of Zoho CRM APIs.

Software Development Kits (SDKs) are sets of tools and libraries designed to simplify the development process, and the integration between applications and specific platforms or services. They provide pre-built functionalities and abstract complex tasks, facilitating easier and faster development process. Zoho CRM's Scala SDKs act as a wrapper  for the REST APIs, thus making it easier to use the services of Zoho CRM.

Simplified Authentication using Scala SDK

Authentication with Zoho CRM APIs is facilitated by the OAuth 2.0 protocol, ensuring secure access to its resources. The process begins with the generation of a grant token for your organization in the Zoho Developer Console, where you specify the required scopes. Subsequently, using this grant token, you can generate both the access token, used for API call authentication, and the refresh token, employed for refreshing the access tokens after their one-hour expiry period. You must persist these tokens, along with their expiry times, in your server's data store for seamless API access. 

However, with the Scala SDK, this authentication process is significantly simplified. After generating the grant token and initialization, the SDK takes care of the rest. The SDK handles token generation, persistence, and refreshing the access token automatically, ensuring access to the resources without manual intervention.

Using the Zoho CRM Scala SDK

Before diving into the usage of Scala SDKs, ensure that the following prerequisites are met:
  • Ensure that the client app has Java version 11 or above.
  • Ensure that the client app has Scala version 2.13.5 or above.
  • Have an IDE such as IntelliJ installed.
  • An active Zoho CRM account.

1. Register your application with Zoho CRM

When you register a client with Zoho CRM, you establish a connection between your application and Zoho CRM, enabling your application to securely access and interact with Zoho CRM APIs and resources after authentication. The registration process involves providing essential details such as the client type, homepage URL, and authorized redirect URIs, depending on the type of client you choose.

To register your client:
  1. Go to the Zoho Developer Console
  2. Click on Get Started or +ADD CLIENT
  3. Choose the Client Type as Self-Client or Server based Applications depending on your application. Read our Kaizen post on the different client types to understand better. For this article, we will proceed with Self-client as we aim to develop a Scala application for our own use.
  4. Fill in the necessary details and click CREATE to register your client successfully. This will provide you with a Client ID and Client Secret.

2. Create a Scala project in your preferred IDE

If you already have your project set up, you may skip this step. However, if you are starting out, the next crucial step is to create a Scala Project in your preferred IDE. For the purpose of this guide, we will be using IntelliJ IDEA as the IDE of choice. 

3. Include the Zoho CRM Scala SDK in your project

To include the Zoho CRM Scala SDK in your project, you can follow different methods as outlined here.  However, for the purpose of this guide, we will demonstrate how to include the SDK using the build.sbt file.

Follow these steps to include the Zoho CRM Scala SDK in your project using the build.sbt file:
  1. Open your project in IntelliJ IDEA or your preferred IDE.
  2. Locate the build.sbt file in your project directory.
  3. Add the Zoho CRM Scala SDK dependency to your build.sbt file. To add the latest version (supporting version 6 of Zoho CRM APIs), include this line in the file  and Save: libraryDependencies ++= Seq( "com.zoho.crm" % "zohocrmsdk-6-0" % "2.0.0")
  4. Sync the changes and reload the files to ensure that the SDK has been added to the project.
Please note that when you install the Zoho CRM SDK, there are many dependencies which will also be installed. These dependencies are necessary for the proper functioning of the SDK and will be automatically managed by your build tool (such as sbt) during the installation process.


4. Obtain the grant token to authenticate your client

To make API calls, you need to authenticate your client by generating a grant token with the required scopes. For this guide, we will be using the self-client created in the first step. 
Log in to the Zoho Developer Console, and generate the grant token with the required scopes. Please note that this grant token has a short life span, and that it is used to generate the access and refresh tokens. Refer to our Kaizen on OAuth2.0 for more details.


5. Configuration and Initialization of the SDK

The configuration step in initializing the SDK involves setting up various objects to define how the SDK operates. This includes specifying the domain for API calls, token persistence, error logging, resource information storage, and more.

Before going into the specifics of various configurations, let us first discuss Token Persistence. Token Persistence refers to the mechanism through which access tokens and refresh tokens obtained during authentication are stored and managed by the SDK.  By storing tokens securely, the SDK can automatically manage token expiration and renewal, eliminating the need for manual token handling by the developer.For details on the different persistence methods supported by our SDKs, please refer to the last section of this post. In this guide, we will be using File Persistence as the method for Token Persistence. However, please note that users must choose the method that best suits their requirements and preferences.

Here is a sample code to initialize the SDK. Make sure to replace the client ID, client secret, grantToken, file paths, and other configurations with your specific values. 
  1. import com.zoho.api.authenticator.OAuthToken
  2. import com.zoho.crm.api.dc.USDataCenter
  3. import com.zoho.crm.api.exception.SDKException
  4. import com.zoho.crm.api.{HeaderMap, Initializer, SDKConfig}
  5. import com.zoho.api.logger.Logger
  6. import com.zoho.api.authenticator.store.FileStore

  7. object BulkWrite {
  8.   @throws[SDKException]
  9.   def main(args: Array[String]): Unit = {
  10.     val environment = USDataCenter.PRODUCTION
  11.     val token = new OAuthToken.Builder().clientID("1000.xxx").clientSecret("xxx").grantToken( "1000.xxx").findUser(false).build()
  12.     //Object containing the absolute file path to store tokens
  13.     var tokenstore = new FileStore("/Documents/SDK-Projects/Scala-SDK/ScalaSample/sdk_tokens_new.txt")
  14.     var logger = new Logger.Builder()
  15.       .level(Logger.Levels.ALL)
  16.       .filePath("/Documents/SDK-Projects/Scala-SDK/ScalaSample/scala_sdk_log.log")
  17.       .build
  18.     var sdkConfig = new SDKConfig.Builder().pickListValidation(false).autoRefreshFields(false).connectionTimeout(1000).requestTimeout(1000).socketTimeout(1000).build
  19.     new Initializer.Builder().environment(environment).token(token).store(tokenstore).logger(logger).SDKConfig(sdkConfig).initialize()
  20.   }
  21. }
  22. class BulkWrite {}

During the initialization step, the following configuration details have to be defined to configure the  behavior and functionality of the SDK. While two of them are mandatory, the others are optional.
  1. environment (mandatory): It determines the API environment, which dictates the domain and URL for making API calls. The format follows the Domain.Environment pattern.
    eg : val env = USDataCenter.PRODUCTION
  2. token (mandatory) : Contains the user token details. Create an instance of OAuthToken with the details that you get after registering your Zoho client. Depending on the available tokens, you can select one of the following flows:
    1. Grant Token Flow: Involves storing and persisting the grant token. This flow is used when you have a grant token available. The SDK will generate and persist the access and refresh tokens, and also refresh the access token upon expiry.
    2. Refresh Token Flow: Involves storing and persisting the refresh token. This flow is used when you have a refresh token available. The SDK will generate and persist the access and refresh tokens, and also refresh the access token upon expiry.
    3. Access Token Flow: In this flow, the access token is directly utilized for API calls without token persistence. The SDK will persist the access token, but upon expiry it won't be refreshed, and an INVALID_TOKEN error will be thrown once the access token has expired.
    4. Id FLow : You can use the id from the persisted token file/DB to make API calls. The id is a unique system generated value for each token details entry in the file/DB. Please note that you can use this method only after the SDK has already been initialized.
  3. logger (optional) : You can customize the logging behavior by setting the desired log level, which can be one of the following: FATAL, ERROR, WARNING, INFO, DEBUG, TRACE, ALL, or OFF. Additionally, you can configure the file path and file name for the log file.
  4. store (optional) : Allows you to configure token persistence for your application. If this is skipped, the SDK will create the "sdk_tokens.txt" file in the current working directory by default to persist the tokens. 

    Database Persistence
    File Persistence
    Custom Persistence
    var tokenstore = new DBStore.Builder()
      .host("hostName")
      .databaseName("databaseName")
      .tableName("tableName")
      .userName("userName")
      .password("password")
      .portNumber("portNumber")
      .build
    var tokenstore = new FileStore("/Users/user_name/Documents/scala_sdk_token.txt")
    var tokenStore = new CustomStore()

  5. SDKConfig (optional) : This method takes care of additional SDK configurations.

    Configuration Key
    Description
    autoRefreshFields
    Default Value : False
    A boolean configuration field to enable or disable automatic refreshing of module fields in the background. If set to true, fields are refreshed every hour, and if set to false, fields must be manually refreshed or deleted.
    pickListValidation
    Default Value : True
    This field enables or disables pick list validation. If enabled, user input for pick list fields is validated, and if the value does not exist in the pick list, the SDK throws an error. If disabled, the input is not validated and the API call is made.
    enableSSLVerification
    Default Value : True
    A boolean field to enable or disable curl certificate verification. If set to true, the SDK verifies the authenticity of certificate. If set to false, the SDK skips the verification.
    connectionTimeout
    Default Value : 0
    The maximum time (in seconds) to wait while trying to connect. Use 0 to wait indefinitely.
    timeout
    Default Value : 0
    The maximum time (in seconds) to allow cURL functions to execute. Use 0 to wait indefinitely.

  6. requestProxy (optional) : Configure this only if you're using a proxy server to make the API calls. To configure, create an instance of RequestProxy containing the proxy properties of the user.

    var requestProxy = new RequestProxy.Builder()
      .host("proxyHost")
      .port(80)
      .user("proxyUser")
      .password("password")
      .userDomain("userDomain")
      .build()

  7. resourcePath (optional) : To configure the absolute directory path to store user-specific files containing module fields information. If this object is skipped, the files will be stored in the project directory itself.
Once the initialization is successful, you can verify that the access and refresh tokens are generated and persisted. You can do this by checking the tokens file or the database, depending on the token persistence method you configured during initialization.


Token Persistence

There are three token persistence methods supported by our SDKs. 
  1. Token Persistence using a Database : In Database persistence, tokens are stored and retrieved from a database (e.g., MySQL). In this case, you should create a table in your database with the required columns. The custom database name and table name can be set in DBStore instance, when you initialise the SDK.
    For instance, to persist your tokens in a table named token in database named zoho in your mySQL DB, use this:

    CREATE DATABASE zoho; // use this to create database named zoho
    // use this to create a table named token, with the following necessary columns
    CREATE TABLE token ( 
      id varchar(10) NOT NULL,
      user_name varchar(255) NOT NULL,
      client_id varchar(255),
      client_secret varchar(255),
      refresh_token varchar(255),
      access_token varchar(255),
      grant_token varchar(255),
      expiry_time varchar(20),
      redirect_url varchar(255),
      api_domain varchar(255),
      primary key (id)
    );

  2. File Persistence : This method allows storing and retrieving the authentication tokens from the file in the file path that you configure. The file will contain the id, user_name, client_id, client_secret, refresh_token, access_token, grant_token, expiry_time, redirect_url, and api_domain.
  3. Custom Persistence : This is a method where users can create their own method of storing and retrieving authentication tokens. To use this method, users need to implement the TokenStore interface and override its methods according to their own logic. For more details, please refer here.
We hope that you found this useful. In next week's Kaizen post, we will discuss about Bulk Write operations using the Scala SDK for Zoho CRM, and on how to import both parent and child records in a single operation.

If you have any queries, let us know the comments below, or send an email to support@zohocrm.com. We would love to hear from you. 


Cheers!
Anu Abraham



Recommended Reads:





    • Recent Topics

    • A way to create kits (groups of items) that do not require bundling and are added to an order as the individual items

      We are evaluating moving off of Sage BusinessWorks (which handles accounting, order entry, inventory control, accounts receivable, etc) to Zoho Books/Inventory. One of the things we heavily use is a feature called Kits, which allows creating a group of
    • Allocating Salesman To Customer

      Hello, please add a feature to allocate a salesman to a particular business customer/account. Regards
    • Shipment

      I have 70 shipments Out of which 40 delivery date are updated( since it is live tracked) 30 numbers i need to update manually. How to do it in bulk?
    • arabic not printing

      Qatar has a legal requirement to have invoices in English and Arabic. When writing invoice fields in Arabic, they don't print. Why?
    • How to show Order Number/SO Ref on Invoice emails

      When creating a sales order or invoice we have an option to input an order number or ref# (see attached images). For the Sales Order email template we can add a placeholder for the SO_REF. However, for the Invoice email template there's no option to reference
    • Specify in-line image size in question

      I have an image inserted into a file upload type question. I can click and drag the corner of the image to make it larger or smaller, but I would like to manually input the dimensions I need. No matter what size I make the image in photoshop before uploading
    • Can you limit who creates tags?

      Hi there, I'd like to find out if it's possible to limit which Agents create tags on Zoho desk. Thank you. 
    • Auto CC - Moving Departments

      We have Auto CC e-mail replies to your support mailbox enabled. We have two departments: Helpdesk (helpdesk@domain.com) Delivery (delivery@domain.com) If we create a Helpdesk ticket, and reply, replies are CC'd to helpdesk@domain.com (OK) We then move
    • Sudden Layout Issue After Last CSS Update for ZML (Temporary Fix Inside)

      Hi, Our clients have noticed today that every section laid out with ZML suddenly shows an unwanted top padding/blank space that interrupts the user screens. It appears that Zoho has changed the default CSS for the .zcp-col.zcp-panel-rowtype-auto element.
    • Customer paid excess. How do I record payment?

      A customer has paid me Rs. 7150 which is in excess. The amount due is Rs. 5388 I owe them Rs. 1762 back which I will be transferring to their account tomorrow. How do I get this entered into Zoho Books? I'm a little lost. :) Rishi
    • Tabular View Report | Scale To Fit Screen

      Please add the option to scale Tabular View reports to fit the screen. I constantly have to adjust the column size of Tabular View reports to fit various screen sizes and it just looks messy. You can see in the screenshot below there is a blank gap after
    • Why Server error in creatiing Landing Pages

      Hi Zoho Team, pls see my screenshot and tell me, what's wrong. Thx
    • Tip 31: How to make a field in a Zoho Creator form mandatory based on criteria

      Hi folks,   I'm sure most of you are familiar with the Mandatory property available in our form builder. It enables you to ensure that your users enter an input in a required field. If they don't enter an input in that field, they'll be unable to submit
    • Bulk update account type when adding a bill

      Hi I've only been using Zoho Books for a short while but I'm impressed so far, keep up the great work. One minor issue I'm coming up against is when creating a new bill from a scanned document (supplier invoice). In some cases, the supplier invoice could
    • How to start fresh after many years of using Zoho Books without deleting everything and creating a new organisation?

      Hi, I have used Books since 2016, but never reconciled with my bank account. I was thinking of trying to go back and fix that, but I don't just don't have the time it would take. Instead, I'd like back up my old records and start anew. What is the best
    • How do I modify the the incoming/current call popup? I can modify other call pages but not that one.

      I want to modify the incoming and active call popup on the crm to include customer relevant information, such as purchase history or length of relationship. Under modules and fields, I don't seem to see active call as a choice to modify, only the main
    • Canvas: Add Sections to Detail View

      Currently it is only possible to add fields to a canvas detail view. This makes Canvas hard to maintain, because everytime we add a field to our system, someone needs to go into the canvas view and add it there as well. This leads to additional work and
    • Automation#32:Auto Add New Portal Users to the Help Center User Groups

      Hello Everyone, Introducing a custom function that automates the process of adding new portal users to Help Center user groups, making user management effortless! By default, Zoho Desk allows you to assign new portal users to groups manually. But with
    • Cannot delete old accounts

      Hello, I try to delete old accounts from CRM, but it won't permit, saying documents are still linked to them. I searched in CRM and BOOKS, found some documents and deleted them, but still CRM won't delete them. Any idea how to do that ? I have a lot of
    • Offline mode on Android TV app?

      Hello! Is there a way to use Zoho Show offline in the Android TV app? I have an Android TV based projector, and I travel with it, and don't want to have to rely on a steady internet connection when giving a presentation.
    • Choice-based Field Rules on Global Lists

      Hi, The new Choice-based Field Rules should also be able to work with Global Lists not just local lists. Thanks Dan
    • Tip #36- How to use Survey in Zoho Assist to capture valuable feedback from remote sessions- 'Insider Insights'

      How to use Survey in Zoho Assist to capture valuable feedback from remote sessions The survey feature allows technicians and customers to share their valuable feedback, contributing to the improvement of remote service quality. After the completion of
    • Narrative 3 - Comprehending User Management

      Behind the scenes of a successful ticketing system - BTS Series Narrative 3 - Comprehending User Management User management in a ticketing system includes important aspects of how administrators oversee user access, roles, and permissions. This process
    • Product Details's Description is lost

      Hi CRM lost its description in Product details subform. Can you make some test before deploy any update?
    • Sent items with shared folders

      Hello, this is in some way in between a problem and an idea.  When sharing folders (which is actually not any close to a shared mailbox...) the person which the folder has been shared with can access that folder and can send emails when delegation is
    • Zoho Bookings Issues We are facing

      Hi team, Here are list of issues we are facing with Zoho Bookings when migrating from other platforms. Sorry there is a lot but the bookings app need to be functional and practical for people to actually use it and not-cause MORE problems by being so basic and not customisable to each business.  1: SMS reminders for staff  There should be time limits on these reminders to make them useful. EG. if a new booking comes in more than 4 hours from now we don't really need to get a reminder, however if
    • Booking outside of scheduled availability

      Is there a way for staff (such as the secretary) to book appointments outside of the scheduled availability? Right now to do this special hours must be set each time. There should be a quicker way. Am I missing something?
    • Run workflow on data import in Creator 6

      How to run a workflow on data import in Creator 6?
    • Multi Day booking for resources

      I have following business-case: Rental for Tablets. Customer should be able to select how many device for how many days he'd like to rent. Same as a car rental for multiple days. Is this possible with Bookings on the current version?
    • Add Usage & Voting Analytics for Knowledge Base Articles in Zoho SalesIQ

      Dear Zoho SalesIQ Team, We appreciate the current integration between Zoho Desk and Zoho SalesIQ that allows knowledge base articles to be synced and displayed to users directly within the SalesIQ chat interface. One valuable feature already available
    • Real-Time Alert or Status Indicator for WhatsApp Connection Issues in SalesIQ

      Hi Zoho Team, We’d like to request a feature enhancement in Zoho SalesIQ related to WhatsApp integration stability and visibility. Recently, we encountered a critical issue where our WhatsApp bot stopped responding to messages without any warning or alert
    • Customization of Chat Transcript Emails in Zoho SalesIQ

      Hi Zoho SalesIQ Team, I hope you're doing well. We would like to request the ability to customize the email template that is sent to clients when they request a chat transcript from SalesIQ. Currently, when a client clicks the button to receive their
    • Import from Linkedin

      Please provide a way to enable importing contact information for Contacts and Companies from Linkedin? Thanks
    • The ability to format text fields, ie when data is number or currency

      Hello, I have spent some time trying to determine how to accomplish this but it appears to be impossible. I want to merge a currency field from CRM into a PDF document. The CRM data shows $1,234, but when zSign gets the data it shows 1234 in the text
    • Tip of the Week #64– Customize your sidebar for a more focused workflow.

      When your shared spaces start filling up with too many views, it gets a little harder to zoom in on what really matters. You find yourself scrolling more than working, and the things that need your attention? They’re often buried down below. Custom sidebar
    • Zoho Social - Queries about GST invoices and subscription

      Hi, I am going to purchase the Zoho Social tool with a yearly subscription. So, can you please help me with my below queries: 1. How I get the monthly GST Invoices? 2. What is the process of subscription? 2. How to cancel a subscription?
    • Add a Way to Duplicate Cards in the Same Canvas (Retain All Settings)

      Dear Zoho SalesIQ Team, We would like to request a new feature in Zoho SalesIQ: the ability to duplicate an existing card within the same canvas while retaining all of its information and settings, including conditions, configurations, and display preferences.
    • Sales IQ needs to capture both first and last names

      Sales IQ chat only has one field for name. When this then syncs with Campaigns, the field populates the "last name" field in Campaigns. However most people fill in the "name" field of Sales IQ with either their full name or their Christian name. This
    • Multi-Card Selection and Cross-Zobot Copy-Paste Functionality

      Dear Zoho SalesIQ Team, We’d like to suggest a productivity-enhancing feature for the Zobot builder in Zoho SalesIQ: the ability to select multiple cards (modules) at once using a selection area, and then copy-paste them either within the same canvas
    • Personal Link / Meeting ID

      with zoho meetings do I have my own personal link to my 'meeting space' ? I have an email template in Zoho CRM which confirms people's appointment with me, I would like to include the link to my Zoho Meetings so that they have it in advance. How do I
    • Next Page