Zoho CRM Scala SDK - Configuration and Initialization

Zoho CRM Scala SDK - 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:





    Access your files securely from anywhere

          Zoho Developer Community




                                    Zoho Desk Resources

                                    • Desk Community Learning Series


                                    • Digest


                                    • Functions


                                    • Meetups


                                    • Kbase


                                    • Resources


                                    • Glossary


                                    • Desk Marketplace


                                    • MVP Corner


                                    • Word of the Day



                                        Zoho Marketing Automation


                                                Manage your brands on social media



                                                      Zoho TeamInbox Resources

                                                        Zoho DataPrep Resources



                                                          Zoho CRM Plus Resources

                                                            Zoho Books Resources


                                                              Zoho Subscriptions Resources

                                                                Zoho Projects Resources


                                                                  Zoho Sprints Resources


                                                                    Qntrl Resources


                                                                      Zoho Creator Resources



                                                                          Zoho Campaigns Resources


                                                                            Zoho CRM Resources

                                                                            • CRM Community Learning Series

                                                                              CRM Community Learning Series


                                                                            • Kaizen

                                                                              Kaizen

                                                                            • Functions

                                                                              Functions

                                                                            • Meetups

                                                                              Meetups

                                                                            • Kbase

                                                                              Kbase

                                                                            • Resources

                                                                              Resources

                                                                            • Digest

                                                                              Digest

                                                                            • CRM Marketplace

                                                                              CRM Marketplace

                                                                            • MVP Corner

                                                                              MVP Corner





                                                                                Design. Discuss. Deliver.

                                                                                Create visually engaging stories with Zoho Show.

                                                                                Get Started Now


                                                                                  Zoho Show Resources


                                                                                    Zoho Writer Writer

                                                                                    Get Started. Write Away!

                                                                                    Writer is a powerful online word processor, designed for collaborative work.

                                                                                      Zoho CRM コンテンツ






                                                                                        Nederlandse Hulpbronnen


                                                                                            ご検討中の方





                                                                                                  • Recent Topics

                                                                                                  • Can't delete/hide related lists

                                                                                                    Hi, Maybe I'm missing something, but I can't seem to find where I delete or hide related lists in a module. When I go to a record and click the little arrow on the right next to the related list, I only get the option to select what fields in that list
                                                                                                  • Make Widgets Clickable or Copiable

                                                                                                    Hi, I created a KPI Widget in Zoho Analytics whose content I would like the users that see my dashboard could copy or click and be redirected elsewhere. Yes, I'm aware I can create a Text Box for that instead of a Widget, but the problem is that the link
                                                                                                  • Address Autofill

                                                                                                    Hi I'm having issues with the address autofill tutorial (https://zurl.co/rGXQ). I have followed each step in the tutorial, but when i paste the code into a workflow/function, i'm getting the following error code: Improper code format Correct format :
                                                                                                  • Sync custom module ID to Lead module

                                                                                                    Hello, I am trying to sync Contract ID (custom module) from Deal module. I have an existing function that whenever a contract is created, it will automatically creating deals based on the frequency of the contract. Now i am having problem to show the
                                                                                                  • In Kiosk, please support "File upload field" in the "Field Update" action

                                                                                                    Hello. Supporting "File upload field" in the "Field Update" actions would be a great addition to Kiosk Studio. I would appreciate it if you could evaluate it. Saludos,
                                                                                                  • can I link a contacts to multiple accounts

                                                                                                    can I link a contacts to multiple accounts
                                                                                                  • Change Last Name to not required in Leads

                                                                                                    I would like to upload 500 target companies as leads but I don't yet have contact people for them. Can you enable the option for me to turn this requirement off to need a Second Name? Moderation update (10-Jun-23): As we explore potential solutions for
                                                                                                  • For security reasons your account has been blocked as you have exceeded the maximum number of requests per minute that can originate from one account.

                                                                                                    Hello Zoho Even if we open 10-15 windows in still we are getting our accounts locked with error " For security reasons your account has been blocked as you have exceeded the maximum number of requests per minute that can originate from one account. "
                                                                                                  • Launching CPQ for Zoho CRM! An in-built solution for bespoke quote management

                                                                                                    Hello everyone, We are thrilled to announce the public release of CPQ (Configure, Price, Quote) for Zoho CRM, which is a fundamental block in sales management. NOTE: CPQ was a public early access feature from March 2023 — January 2024. Since February
                                                                                                  • Power of Automation :: Automatically set the dependency between Parent task and the respective sub tasks

                                                                                                    A custom function is a software code that can be used to automate a process and this allows you to automate a notification, call a webhook, or perform logic immediately after a workflow rule is triggered. This feature helps to automate complex tasks and
                                                                                                  • Spell Check default language

                                                                                                    Hello All, Is it possible to set the Spell Check default language? I can't find it in the settings. Thanks a lot! Levente
                                                                                                  • Function #4: Schedule Customer Statements

                                                                                                    Regularly sending statements to customers is an imperative part of many business processes as it helps foster strong customer relationships and provides timely guidance on payments. While you can generate the statement of accounts and have it sent over
                                                                                                  • Music files on Zoho Docs

                                                                                                    1) Uploaded a ma3 music file from Itunes.  When I click on the link, i go to the page and see a music player but it doesn't play.  Clicking on the play arrow does nothing.  How to fix???? 2) Also, when i put up a .zip file  and goto the page, anyone download it.  That's fine. But with a music file, all I get is that non functional player with no way to simply download the song. Do I have to zip every song so it can be downloaded?
                                                                                                  • Restrict Employees Access to Zoho Support

                                                                                                    Dear Zoho Support Team, Greetings! I am the focal point for all Zoho-related matters in our organization, and I would like to request the following features to help us streamline and centralize our support interactions. We request that zoho one support
                                                                                                  • How to import timesheets or entries into a projecgt

                                                                                                    How can one import timesheets into a project via a csv file?
                                                                                                  • Issues with Agent Forwarding Card in Zobot

                                                                                                    I implemented an Agent Forwarding Card in a Zobot that I created. There are a few issues with the way the card functions in an actual chat. The way it is designed right now is not easy to use and is not intuitive. Here are a few of the issues I have with
                                                                                                  • Automatic License Management Upon User Deactivation in Zoho One

                                                                                                    Dear Zoho Team, We would like to propose a feature enhancement for Zoho One regarding license management. Currently, when a user is deactivated, their license is not automatically downgraded or removed from our account. Zoho explains this behavior by
                                                                                                  • Shared Snippets Everyone

                                                                                                    Hi, Now that the Shared Snippets have been released and I think will be the most used feature implemented in 2023 :) Creating and Using Snippets in Ticket Responses - Online Help | Zoho Desk Maintain consistency in ticket responses with shared snippets
                                                                                                  • Introducing parent-child ticketing in Zoho Desk [Early access]

                                                                                                    Hello Zoho Desk users! We have introduced the parent-child ticketing system to help customer service teams ensure efficient resolution of issues involving multiple, related tickets. You can now combine repetitive and interconnected tickets into parent-child
                                                                                                  • How to suppress display of "USD" of currency field?

                                                                                                  • When is Zoho Vault getting fuzzy search?

                                                                                                    Seeing posts on here dating back as far as 3 years complaining about Vaults search functionality. It’s terrible. Please include fuzzy search, and sorting of results according to “most applicable”; not just alphabetically.
                                                                                                  • Automation#22 Track Ticket Duration at Specific Status

                                                                                                    Hello Everyone! Welcome back to the Community Learning Series! Today, we explore how Zylker Techfix, a gadget servicing firm, boosted productivity by tracking the time spent at a particular ticket status in Zoho Desk. Zylker Techfix customized Zoho Desk’s
                                                                                                  • Self-Support Portal invites

                                                                                                    I'm a one man operation and I'm using the free version of the Zoho Desk for now, but I am in need of help. When I do test tickets, I get a reply from the system inviting me to join the Self Service portal. I don't plan on using that, so I wonder if there
                                                                                                  • Tip #10: Automatically add tags to Zoho CRM records using form responses

                                                                                                    You may be using tags to filter records, create reports based on specific tags, or let your sales team to know which clients to give priority to. Don't skip tagging for the crm records added via forms. The tags can be set to be automatically captured during the form submission. How it works When you set up a configuration to push form entries into CRM, you can add a tag to them automatically. The tag value can vary based on the respondent's input (captured using form fields), or you can include a
                                                                                                  • Understanding response time

                                                                                                    We have the following set up for our SLA. When a contact first writes in, the response due and resolution due dates are set. When one of our agents responses, the response due goes away. When a ticket gets a response from the contact, it appears to reset
                                                                                                  • Publish multiple languages at once in Knowledge Base

                                                                                                    Does anyone know if it is possible to publish multiple translated articles at the same time? My knowledge base has about 35 languages, and while I have them set up to automatically translate, I still have to go in and select each language and manually
                                                                                                  • Canvas and Related lists

                                                                                                    Hi, As much as I like canvas, when adding in a asection with related lists,it doesnt mimic the same functionality as the standard view within the CRM e.g left hand panel will show the module and total number of records. Is there a way of indicating this
                                                                                                  • Email address ZOHO suggestions in replying - how to delete unwanted suggestions?

                                                                                                    Hi, I have some "unwanted" email addresses suggestions by ZOHO, and made some mistakes by replying for some tickets already. How can I clear this in ZOHO directly, I deleted all web browser history and cookies . Did not help :/ Below example, where one
                                                                                                  • Subform edits don't appear in parent record timeline?

                                                                                                    Is it possible to have subform edits (like add row/delete row) appear in the Timeline for parent records? A user can edit a record, only edit the subform, and it doesn't appear in the timeline. Is there a workaround or way that we can show when a user
                                                                                                  • Zoho Learn vs. Trainer Central

                                                                                                    Hi, I'm currently using Zoho One with a WordPress-based website and WooCommerce to manage my online courses. I would like to know what is the difference between Zoho Learn and Trainer Central and if it's possible for these two platforms to replace WP
                                                                                                  • How to Display a Logo Image on a Public Form?

                                                                                                    I would like to display a logo image in the header of a form. To achieve this, I added an Add Notes field to the form. The code below works perfectly for Zoho users accessing the form. However, when the form is made public, the image does not load properly:
                                                                                                  • Creating a Zoho Online Meeting in a Blueprint

                                                                                                    We are looking for an easy solution to schedule online meetings in a blueprint and ran into the same problem discussed in this topic: https://help.zoho.com/portal/en/community/topic/custom-function-to-set-meeting-to-online-meeting (After connecting Zoho
                                                                                                  • Enabling 'From Number' and 'To Number' fields in the Calls module

                                                                                                    Hello everyone, We've added "To Number" and "From Number" fields in the Calls module as part of our latest update to provide users with the option to enable or disable them through the Calls Preferences tab. When enabled, these fields will be displayed
                                                                                                  • Workaround for Zoho Inventory changing previous Fiscal Year Trial Balance in QBO

                                                                                                    We've run into an issue where Zoho Inventory syncs to QBO and makes adjustments to journal entries from previous fiscal years. Fiscal Year End reporting has been long completed, but the Trial Balance keeps changing. Zoho does not have a fix for this,
                                                                                                  • Route Optimizer

                                                                                                    Does Zoho Inventory offer route optimization for our in-house deliveries? It will save us time to manually route our daily orders. Thank you
                                                                                                  • Can documents attached to different ZohoForms automatically go to different OneDrive folders?

                                                                                                    Hi there, I set a workflow to track and store applications coming in from our website. I created two different Zoho forms, one for unsolicited applications, one for applications to job postings. After any of the forms has been filled in, a new record
                                                                                                  • TeamInbox down?

                                                                                                    Hi everyone, we are getting message "Sorry, this action cannot be performed due to an internal error. Please try again later. We are on the Canadian data centers. Can someone please confirm if the service is down? Thank you! F
                                                                                                  • Purchase Requisition in Zoho Books

                                                                                                    I want to understand if Zoho Books is having the following workflow: PR ( Purchase Requisition ) >> PO ( Purchase order) >>  GRN/SRN ( Goods/Services receipt note) >> Bill
                                                                                                  • Confirmation prompt before a custom button action is triggered

                                                                                                    Have you ever created a custom button and just hoped that you/your users are prompted first to confirm the action? Well, Zoho knows this concept. For example, in blueprint, whenever we want to advance to the next state by clicking the transition, it is
                                                                                                  • Marketer's Space: Streamline marketing and sales by integrating ZMA's Planner with Zoho CRM

                                                                                                    In a competitive market, clear goal-setting and seamless campaign execution are crucial for marketing and sales alignment. When integrated with Zoho CRM, Zoho Marketing Automation's Planner enables marketers to create, manage, and measure campaigns effectively
                                                                                                  • Next Page