PHPackages                             christiaan/zohocrmclient - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. christiaan/zohocrmclient

Abandoned → [zohocrm/php-sdk-archive](/?search=zohocrm%2Fphp-sdk-archive)ArchivedLibrary[API Development](/categories/api)

christiaan/zohocrmclient
========================

Provides a clean readable PHP API to the Zoho Rest API

0.9.4(9y ago)2137.7k14MITPHPPHP &gt;=5.3.3

Since Aug 20Pushed 5y ago2 watchersCompare

[ Source](https://github.com/christiaan/zohocrmclient)[ Packagist](https://packagist.org/packages/christiaan/zohocrmclient)[ Docs](http://christiaan.github.io/zohocrmclient)[ RSS](/packages/christiaan-zohocrmclient/feed)WikiDiscussions master Synced 4w ago

READMEChangelog (2)Dependencies (3)Versions (6)Used By (0)

This project is archived
========================

[](#this-project-is-archived)

Since Zoho now has an official package this project is archived/deprecated. See

ZohoCRMClient
=============

[](#zohocrmclient)

Provides a clean readable PHP API to the [Zoho Rest API](https://www.zoho.com/crm/help/api/).

Usage
-----

[](#usage)

```
use Christiaan\ZohoCRMClient\ZohoCRMClient;

$client = new ZohoCRMClient('Leads', 'yourAuthKey');

$records = $client->getRecords()
    ->selectColumns('First Name', 'Last Name', 'Email')
    ->sortBy('Last Name')->sortAsc()
    ->since(date_create('last week'))
    ->request();

echo 'Content: ' . print_r($records, true) . PHP_EOL;
```

### Enabling logging

[](#enabling-logging)

You can enable logging by adding the following line after instantiating the client:

```
$client->setLogger($myPsrLogger);
```

The logger should implement the PSR `LoggerInterface`. If the transport being used implements `LoggerAwareInterface`, this call will chaing to set the logger for the transport as well. The build in transport supports this.

### Choosing a different Zoho realm

[](#choosing-a-different-zoho-realm)

ZohoCRMClient will by default connect to the API at `crm.zoho.com`. If you wish to connect to a different one, you can supply the TLD as the third parameter to the constructor. For example, customer on the EU realm should instantiate the client like this:

```
$client = new ZohoCRMClient('Leads', 'yourAuthKey', 'eu');
```

### Using custom transport

[](#using-custom-transport)

If we wish, you can supply a custom transport class to ZohoCRMClient, as shown here:

```
$buzzTransport = new BuzzTransport(
    new \Buzz\Browser(new \Buzz\Client\Curl()),
    'https://crm.zoho.com/crm/private/xml/'
);
$buzzTransport->setLogger($logger);

$transport = new XmlDataTransportDecorator(
    new AuthenticationTokenTransportDecorator(
        'yourAuthKey',
        $buzzTransport
    )
);

$client = new ZohoCRMClient('Leads', $transport);
```

Implemented Calls
-----------------

[](#implemented-calls)

At the moment only the following calls are supported

- [getRecords](https://www.zoho.eu/crm/help/api/getrecords.html)
- [getRecordById](https://www.zoho.eu/crm/help/api/getrecordbyid.html)
- [insertRecords](https://www.zoho.eu/crm/help/api/insertrecords.html)
- [updateRecords](https://www.zoho.eu/crm/help/api/updaterecords.html)
- [getFields](https://www.zoho.eu/crm/help/api/getfields.html)
- [searchResults](https://www.zoho.eu/crm/help/api/searchrecords.html)

It is rather easy to add new calls, look at one of the classes in the Request dir for examples. After the Request class is made it might be necessary to alter the parsing of the response XML in the XmlDataTransportDecorator class.

More examples
-------------

[](#more-examples)

### insertRecords()

[](#insertrecords)

```
use Christiaan\ZohoCRMClient\ZohoCRMClient;

$client = new ZohoCRMClient('Contacts', 'yourAuthKey');

$records = $client
            ->insertRecords()
            ->addRecord([
                'Email' => 'john@example.com',
                'First Name' => 'John'
            ])
            ->request();
```

Optionally, you can add `onDuplicateUpdate()` or `onDuplicateError()` to the chain, before `request()`, to instruct Zoho to either update or fail on duplicated records. Duplicate checking depends on the module being targeted, see the list in the [Zoho documentation](https://www.zoho.eu/crm/help/api/insertrecords.html#Duplicate_Check_Fields).

The `$records` array will contain an entry for each record you have tried to create, which on success will contain the ID of the new (or updated) record.

### updateRecords()

[](#updaterecords)

```
use Christiaan\ZohoCRMClient\ZohoCRMClient;

$client = new ZohoCRMClient('Contacts', 'yourAuthKey');

$records = $client
            ->updateRecords()
            ->addRecord([
                'Id' => '(ID returned from insert, search, ...)'
                'Last Name' => 'Smith'
            ])
            ->request();
```

Specifying the ID per record is necessary when updating multiple records. Alternatively, you may call `id()` to set the ID if you are only updating a single record. Setting the ID per record works in either case.

### searchResults()

[](#searchresults)

```
use Christiaan\ZohoCRMClient\ZohoCRMClient;

$client = new ZohoCRMClient('Contacts', 'yourAuthKey');

$records = $client
            ->searchRecords()
            ->criteria('Email:john@example.com')
            ->request();
```

See the [Zoho documentation](https://www.zoho.eu/crm/help/api/searchrecords.html) for the full explanation of how to write the criteria.

###  Health Score

33

—

LowBetter than 72% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity33

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 63.6% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~350 days

Total

5

Last Release

3295d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/118490?v=4)[Christiaan Baartse](/maintainers/christiaan)[@christiaan](https://github.com/christiaan)

---

Top Contributors

[![christiaan](https://avatars.githubusercontent.com/u/118490?v=4)](https://github.com/christiaan "christiaan (14 commits)")[![runemoennike](https://avatars.githubusercontent.com/u/1521283?v=4)](https://github.com/runemoennike "runemoennike (4 commits)")[![gwagner](https://avatars.githubusercontent.com/u/648065?v=4)](https://github.com/gwagner "gwagner (3 commits)")[![Deathnerd](https://avatars.githubusercontent.com/u/1685953?v=4)](https://github.com/Deathnerd "Deathnerd (1 commits)")

---

Tags

crmapi clientZoho

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/christiaan-zohocrmclient/health.svg)

```
[![Health](https://phpackages.com/badges/christiaan-zohocrmclient/health.svg)](https://phpackages.com/packages/christiaan-zohocrmclient)
```

###  Alternatives

[smsapi/php-client

SMSAPI API PHP Client

652.2M19](/packages/smsapi-php-client)[webit/w-firma-api

wFirma.pl API

1821.5k](/packages/webit-w-firma-api)[smsapi.pl/php-client

SMSAPI API PHP Client

6582.0k1](/packages/smsapipl-php-client)[asciisd/zoho

Laravel wrapper for Zoho CRM API v8

3853.8k](/packages/asciisd-zoho)[asciisd/zoho-v3

Laravel Zoho API V3 Package

2122.1k](/packages/asciisd-zoho-v3)[tristanjahier/zoho-crm

A PHP client for the API of Zoho CRM.

2415.6k](/packages/tristanjahier-zoho-crm)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
