PHPackages                             qurbanali/zendesk-php - 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. qurbanali/zendesk-php

ActiveLibrary

qurbanali/zendesk-php
=====================

Effortlessly work with Zendesk REST API using this PHP API wrapper. Simplify integration and enhance functionality.

1.23(1y ago)9953MITPHPPHP 7.4.0|^8.0|^8.1

Since Jan 15Pushed 1y ago1 watchersCompare

[ Source](https://github.com/qurban-ali/zendesk-php)[ Packagist](https://packagist.org/packages/qurbanali/zendesk-php)[ RSS](/packages/qurbanali-zendesk-php/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (4)Versions (14)Used By (0)

API version support
-------------------

[](#api-version-support)

This client **only** supports Zendesk's API v2. Please see our [API documentation](http://developer.zendesk.com) for more information.

Requirements
------------

[](#requirements)

- PHP 7.4+

Installation
------------

[](#installation)

The Zendesk PHP API client can be installed using [Composer](https://packagist.org/packages/qurbanali/zendesk-php).

### Composer

[](#composer)

To install run `composer require qurbanali/zendesk-php`

Configuration
-------------

[](#configuration)

Configuration is done through an instance of `Qurban\ZendeskAPI\HttpClient`. The block is mandatory and if not passed, an error will be thrown.

```
// load Composer
require 'vendor/autoload.php';

use Qurban\ZendeskAPI\HttpClient as ZendeskAPI;

$subdomain = "subdomain";
$username  = "email@example.com"; // replace this with your registered email
$token     = "6wiIBWbGkBMo1mRDMuVwkw1EPsNkeUj95PIz2akv"; // replace this with your token

$client = new ZendeskAPI($subdomain);
$client->setAuth('basic', ['username' => $username, 'token' => $token]);
```

Usage
-----

[](#usage)

### Basic Operations

[](#basic-operations)

```
// Get all tickets
$tickets = $client->tickets()->findAll();
echo $tickets;

// Get all tickets regarding a specific user.
$tickets = $client->users($requesterId)->tickets()->requested();
echo $tickets;

// Create a new ticket
$newTicket = $client->tickets()->create([
    'subject'  => 'The quick brown fox jumps over the lazy dog',
    'comment'  => [
        'body' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, ' .
                  'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'
    ],
    'priority' => 'normal'
]);
echo $newTicket;

// Update a ticket
$client->tickets()->update(123,[
    'priority' => 'high'
]);

// Delete a ticket
$client->tickets()->delete(123);

// Get all users
$users = $client->users()->findAll();
echo $users;
```

### Attachments

[](#attachments)

```
$attachment = $client->attachments()->upload([
    'file' => getcwd().'/tests/assets/UK.png',
    'type' => 'image/png',
    'name' => 'UK.png' // Optional parameter, will default to filename.ext
]);
```

Attaching files to comments

```
$ticket = $client->tickets()->create([
    'subject' => 'The quick brown fox jumps over the lazy dog',
    'comment' => [
        'body' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, ' .
                  'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
        'uploads'   => [$attachment->upload->token]
    ]
]);
```

### Side-loading

[](#side-loading)

Side-loading allows you to retrieve related records as part of a single request. See \[the documentation\] for more information. ([https://developer.zendesk.com/rest\_api/docs/core/side\_loading](https://developer.zendesk.com/rest_api/docs/core/side_loading)).

An example of sideloading with the client is shown below.

```
$tickets = $client->tickets()->sideload(['users', 'groups'])->findAll();
```

### Pagination

[](#pagination)

Methods like `findAll()` call the API without any pagination parameter. If an endpoint supports pagination, only the first page will be returned. To fetch all resources, you need to make multiple API calls.

#### Iterator (recommended)

[](#iterator-recommended)

The use of the correct type of pagination is encapsulated using an iterator, which allows you to retrieve all resources in all pages, making multiple API calls, without having to worry about pagination at all:

```
$iterator = $client->tickets()->iterator();

foreach ($iterator as $ticket) {
    echo($ticket->id . " ");
}
```

If you want a specific sort order, please refer to the sorting section in the documentation ([Tickets, for example](https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/#sorting)).

##### Iterator with params example

[](#iterator-with-params-example)

```
$params = ['my' => 'param1', 'extra' => 'param2'];
$iterator = $client->tickets()->iterator($params);

foreach ($iterator as $ticket) {
    echo($ticket->id . " ");
}
```

- Change page size with: `$params = ['page[size]' => 5];`
- Change sorting with: `$params = ['sort' => '-updated_at'];`
    - Refer to the docs for details, including allowed sort fields
- Combine everything: `$params = ['page[size]' => 2, 'sort' => 'updated_at', 'extra' => 'param'];`

**Note**:

- Refer to the documentation for the correct params for sorting with the pagination type you're using
- The helper method `iterator_to_array` doesn't work with this implementation

##### Iterator API call response

[](#iterator-api-call-response)

The latest response is exposed in the iterator at `$iterator->latestResponse()`. This could come handy for debugging.

##### Custom iterators

[](#custom-iterators)

If you want to use the iterator for custom methods, as opposed to the default `findAll()`, you can create an iterator for your collection:

```
$strategy = new CbpStrategy( // Or ObpStrategy or SinglePageStrategy
    "resources_key", // The root key with resources in the response, usually plural and in underscore
    [], // Extra params for your call
);
$iterator = PaginationIterator($client->tickets(), $strategy);
foreach ($ticketsIterator as $ticket) {
    // Use as normal
}
```

This can be useful for filter endpoints like [active automations](https://developer.zendesk.com/api-reference/ticketing/business-rules/automations/#list-active-automations). However, in this common case where you only need to change the method from `findAll()` to `findActive()` there's a better shortcut:

```
$iterator = $client->automations()->iterator($params, 'findActive');
```

Which is analogous to:

```
use Qurban\ZendeskAPI\Traits\Utility\Pagination\PaginationIterator;
use Qurban\ZendeskAPI\Traits\Utility\Pagination\CbpStrategy;
$strategy = new CbpStrategy('automations', $params);
$iterator = new PaginationIterator(
    $client->automations(),
    $strategy,
    'findActive'
);
```

See how the [Pagination Trait](src/Zendesk/API/Traits/Resource/Pagination.php) is used if you need more custom implementations.

##### Catching API errors

[](#catching-api-errors)

This doesn't change too much:

```
try {
    foreach ($iterator as $ticket) {
        // your code
    }
} catch (ApiResponseException $e) {
    $errorMessage = $e->getMessage();
    $errorDetails = $e=>getErrorDetails();
}
```

If you need to know at what point you got the error, you can store the required information inside the loop in your code.

#### FindAll using CBP (fine)

[](#findall-using-cbp-fine)

If you still want use `findAll()`, until CBP becomes the default API response, you must explicitly request CBP responses by using the param `page[size]`.

```
// CBP: /path?page[size]=100
$response = $client->tickets()->findAll(['page[size]' => 100]);
process($response->tickets); // Your implementation
do {
    if ($response->meta->has_more) {
        // CBP: /path?page[after]=cursor
        $response = $client->tickets()->findAll(['page[after]' => $response->meta->after_cursor]);
        process($response->tickets);
    }
} while ($response->meta->has_more);
```

**Process data *immediately* upon fetching**. This optimizes memory usage, enables real-time processing, and helps adhere to API rate limits, enhancing efficiency and user experience.

#### Find All using OBP (only recommended if the endpoint doesn't support CBP)

[](#find-all-using-obp-only-recommended-if-the-endpoint-doesnt-support-cbp)

If CBP is not available, this is how you can fetch one page at a time:

```
$pageSize = 100;
$pageNumber = 1;
do {
    // OBP: /path?per_page=100&page=2
    $response = $client->tickets()->findAll(['per_page' => $pageSize, 'page' => $pageNumber]);
    process($response->tickets); // Your implementation
    $pageNumber++;
} while (count($response->tickets) == $pageSize);
```

**Process data *immediately* upon fetching**. This optimizes memory usage, enables real-time processing, and helps adhere to API rate limits, enhancing efficiency and user experience.

### Retrying Requests

[](#retrying-requests)

Add the `RetryHandler` middleware on the `HandlerStack` of your `GuzzleHttp\Client` instance. By default `Qurban\ZendeskAPI\HttpClient`retries:

- timeout requests
- those that throw `Psr\Http\Message\RequestInterface\ConnectException:class`
- and those that throw `Psr\Http\Message\RequestInterface\RequestException:class` that are identified as ssl issue.

#### Available options

[](#available-options)

Options are passed on `RetryHandler` as an array of values.

- max = 2 *limit of retries*
- interval = 300 *base delay between retries in milliseconds*
- max\_interval = 20000 *maximum delay value*
- backoff\_factor = 1 *backoff factor*
- exceptions = \[ConnectException::class\] *Exceptions to retry without checking retry\_if*
- retry\_if = null *callable function that can decide whether to retry the request or not*

Contributing
------------

[](#contributing)

Pull Requests are always welcome but before you send one please read our [contribution guidelines](#CONTRIBUTING.md). It would speed up the process and would make sure that everybody follows the community's standard.

#### HTTP client print API calls

[](#http-client-print-api-calls)

You can print a line with details about every API call with:

```
$client = new ZendeskAPI($subdomain);
$client->log_api_calls = true;
```

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance32

Infrequent updates — may be unmaintained

Popularity17

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 57.1% 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 ~13 days

Recently: every ~27 days

Total

12

Last Release

695d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/113d810572e6554daa238eb05080e2d46dc82d11c495be759fa977f28e813e3d?d=identicon)[qurbanali](/maintainers/qurbanali)

---

Top Contributors

[![qurban-fridaymediagroup](https://avatars.githubusercontent.com/u/105273449?v=4)](https://github.com/qurban-fridaymediagroup "qurban-fridaymediagroup (12 commits)")[![rizwan0544](https://avatars.githubusercontent.com/u/100270738?v=4)](https://github.com/rizwan0544 "rizwan0544 (6 commits)")[![qurban-ali](https://avatars.githubusercontent.com/u/82603994?v=4)](https://github.com/qurban-ali "qurban-ali (2 commits)")[![taimoor57](https://avatars.githubusercontent.com/u/84604714?v=4)](https://github.com/taimoor57 "taimoor57 (1 commits)")

###  Code Quality

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/qurbanali-zendesk-php/health.svg)

```
[![Health](https://phpackages.com/badges/qurbanali-zendesk-php/health.svg)](https://phpackages.com/packages/qurbanali-zendesk-php)
```

###  Alternatives

[spatie/crawler

Crawl all internal links found on a website

2.8k16.3M52](/packages/spatie-crawler)[google/cloud

Google Cloud Client Library

1.2k16.2M54](/packages/google-cloud)[google/cloud-core

Google Cloud PHP shared dependency, providing functionality useful to all components.

343121.4M79](/packages/google-cloud-core)[googleads/googleads-php-lib

Google Ad Manager SOAP API Client Library for PHP

67410.3M25](/packages/googleads-googleads-php-lib)[drupal/core

Drupal is an open source content management platform powering millions of websites and applications.

19462.3M1.3k](/packages/drupal-core)[stechstudio/laravel-zipstream

A fast and simple streaming zip file downloader for Laravel.

4633.7M3](/packages/stechstudio-laravel-zipstream)

PHPackages © 2026

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