PHPackages                             podio-labs/podio-client - 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. [HTTP &amp; Networking](/categories/http)
4. /
5. podio-labs/podio-client

ActiveLibrary[HTTP &amp; Networking](/categories/http)

podio-labs/podio-client
=======================

Modern, framework-agnostic PHP client for the Podio API. PSR-18, OAuth handled, fully typed.

0.3.0(1mo ago)335↑150%1MITPHPPHP ^8.3CI passing

Since Jun 19Pushed 2w agoCompare

[ Source](https://github.com/podio-labs/podio-client)[ Packagist](https://packagist.org/packages/podio-labs/podio-client)[ Docs](https://github.com/podio-labs/podio-client)[ RSS](/packages/podio-labs-podio-client/feed)WikiDiscussions main Synced 2w ago

READMEChangelog (4)Dependencies (28)Versions (5)Used By (1)

Podio Client
============

[](#podio-client)

[![Tests](https://github.com/podio-labs/podio-client/actions/workflows/tests.yml/badge.svg)](https://github.com/podio-labs/podio-client/actions/workflows/tests.yml)[![Latest Stable Version](https://camo.githubusercontent.com/f4de178e755fad44a88b684703a3b5c10033500e8453b1f60e85081a49b2407f/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f706f64696f2d6c6162732f706f64696f2d636c69656e74)](https://packagist.org/packages/podio-labs/podio-client)[![License](https://camo.githubusercontent.com/fd4ccae3147ad7c9ab7be7ed5fa069afa01c9f59263c7beb1a114d5a977abcc6/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f706f64696f2d6c6162732f706f64696f2d636c69656e74)](https://packagist.org/packages/podio-labs/podio-client)

A framework-agnostic PHP client for the Podio API, built on PSR-18, bring your own HTTP client, everything else is wired for you.

In this example, we build a client and create an item, authentication is handled for you:

```
use Podio\Client\PodioClient;

$podio = PodioClient::factory()
    ->withClientCredentials($clientId, $clientSecret)
    ->withPasswordAuth($username, $password)
    ->make();

$item = $podio->items()->create($appId, [
    'fields' => ['title' => 'New lead'],
]);
```

> Using Laravel? See [`podio-labs/podio-laravel`](https://github.com/podio-labs/podio-laravel).

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

[](#installation)

> Requires PHP 8.3+.

You can install the package via composer:

```
composer require podio-labs/podio-client
```

Ensure the [`php-http/discovery`](https://github.com/php-http/discovery) composer plugin is allowed to run, or install a [PSR-18](https://www.php-fig.org/psr/psr-18/) client manually if your project does not already have one:

```
composer require guzzlehttp/guzzle
```

Usage
-----

[](#usage)

### Creating a client

[](#creating-a-client)

```
use Podio\Client\PodioClient;

$podio = PodioClient::factory()
    ->withClientCredentials($clientId, $clientSecret) // required
    ->withPasswordAuth($username, $password)          // required (see Authentication for more details)
    ->withBaseUrl('https://api.podio.com')            // optional
    ->withTokenCache($cache)                          // optional (PSR-16)
    ->withHttpClient($client)                         // optional (PSR-18)
    ->make();
```

### Authentication

[](#authentication)

A client always needs your Podio API credentials plus one authentication method, slotted into the builder above. The token manager fetches, caches and refreshes the access token for you.

MethodBuilder callUse whenPassword`->withPasswordAuth($username, $password)`service account, server-to-serverAuthorization code`->withAuthorizationCodeAuth($code, $redirectUri)`per-user OAuth2, after the user authorises your appApp`->withAppAuth($appId, $appToken)`a single Podio app via its app tokenAccess token`->withAccessToken($token, $expiresAt, $refreshToken)`reuse a token you storedRead (and persist) the current token:

```
$token = $podio->authenticate(); // ensure a valid token and return it
$token = $podio->token();        // current token

$token->value();
$token->expiresAt();
$token->refreshToken();
```

### Endpoints

[](#endpoints)

```
// Items
$item = $podio->items()->get($itemId);
$item = $podio->items()->create($appId, ['fields' => ['title' => 'Hello']]);
$item = $podio->items()->update($itemId, ['fields' => ['title' => 'Updated']]);
$total = $podio->items()->getCount($appId);

// Files
$file = $podio->files()->upload($absolutePath, 'photo.jpg');
$podio->files()->attach($file->file_id, ['ref_type' => 'item', 'ref_id' => $itemId]);
$bytes = $podio->files()->getRaw($fileId);

// Comments
$podio->comments()->create('item', $itemId, ['value' => 'Imported from Dropbox']);

// Embeds
$embed = $podio->embed()->create(['url' => 'https://youtu.be/...']);

// Webhooks
$hooks = $podio->hooks()->getForApp($appId);
$hook = $podio->hooks()->createForApp($appId, ['url' => 'https://example.com/hook', 'type' => 'item.create']);
$podio->hooks()->verify($hook->hook_id);

// Organizations
$organizations = $podio->organizations()->getAll();
$organization = $podio->organizations()->get($orgId);

// Spaces
$space = $podio->spaces()->get($spaceId);

// Apps
$app = $podio->apps()->get($appId);
$apps = $podio->apps()->getForSpace($spaceId);
```

### Raw requests

[](#raw-requests)

For anything not covered by an endpoint, send a request directly:

```
$response = $podio->send('GET', '/item/123', ['raw' => true]);

$response->statusCode();
$response->body();
$response->rateLimit();
```

### Rate limit

[](#rate-limit)

```
$podio->rateLimit()->limit();
$podio->rateLimit()->remaining();
```

How it works
------------

[](#how-it-works)

`PodioClient` wraps a transporter over your PSR-18 client (or one discovered via `php-http/discovery`) and a token manager that:

- authenticates with the configured grant (password, authorization code, app, or a seeded access token) and caches the access token when you pass a PSR-16 cache;
- refreshes the token automatically: `send()` retries once on an expired-token response, using the refresh token when there is one, otherwise re-authenticating.

Every endpoint (`items()`, `files()`, …) is a small typed wrapper over `send()`.

Testing
-------

[](#testing)

```
composer test
```

To test code that uses the client without hitting Podio, inject a stub PSR-18 client:

```
$podio = PodioClient::factory()
    ->withClientCredentials('id', 'secret')
    ->withPasswordAuth('user', 'pass')
    ->withHttpClient($stubPsr18Client)
    ->make();
```

License
-------

[](#license)

Podio Client is open-sourced software licensed under the [MIT license](LICENSE.md).

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance95

Actively maintained with recent releases

Popularity14

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% 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 ~3 days

Total

4

Last Release

34d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/30530408?v=4)[Karim](/maintainers/karim-tao)[@karim-tao](https://github.com/karim-tao)

---

Top Contributors

[![karim-tao](https://avatars.githubusercontent.com/u/30530408?v=4)](https://github.com/karim-tao "karim-tao (10 commits)")

---

Tags

api-clientphpphp-clientpodiopodio-apipsr-18sdkpsr-18podiopodio-apipodio-clientpodio-sdk

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/podio-labs-podio-client/health.svg)

```
[![Health](https://phpackages.com/badges/podio-labs-podio-client/health.svg)](https://phpackages.com/packages/podio-labs-podio-client)
```

###  Alternatives

[telnyx/telnyx-php

Official Telnyx PHP SDK — APIs for Voice, SMS, MMS, WhatsApp, Fax, SIP Trunking, Wireless IoT, Call Control, and more. Build global communications on Telnyx's private carrier-grade network.

36826.2k2](/packages/telnyx-telnyx-php)[flow-php/flow

PHP ETL - Extract Transform Load - Data processing framework

86337.5k](/packages/flow-php-flow)[n1ebieski/ksef-php-client

PHP API client that allows you to interact with the API Krajowego Systemu e-Faktur

9082.3k](/packages/n1ebieski-ksef-php-client)[shopware/app-php-sdk

Shopware App SDK for PHP

15120.5k3](/packages/shopware-app-php-sdk)[openai-php/client

OpenAI PHP is a supercharged PHP API client that allows you to interact with the Open AI API

5.8k29.9M338](/packages/openai-php-client)[getbrevo/brevo-php

Official PHP SDK for the Brevo API.

1004.1M56](/packages/getbrevo-brevo-php)

PHPackages © 2026

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