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

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

highfive/inngest-php
====================

Framework-agnostic PHP client for the Inngest event ingestion and v1 REST APIs, with optional Laravel auto-discovery.

v1.0.0(1mo ago)1100↑20%MITPHPPHP ^8.3CI passing

Since May 4Pushed 1mo agoCompare

[ Source](https://github.com/highfive-vet/inngest-php-client)[ Packagist](https://packagist.org/packages/highfive/inngest-php)[ RSS](/packages/highfive-inngest-php/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (10)Versions (2)Used By (0)

Inngest PHP Client
==================

[](#inngest-php-client)

A framework-agnostic PHP **API client** for [Inngest](https://www.inngest.com).

It is **not** an SDK: PHP is never an Inngest runtime. The package only sends events and manages runs from outside Inngest, by talking to two HTTP surfaces:

- the event ingestion endpoint (`https://inn.gs`)
- the v1 REST API (`https://api.inngest.com/v1`) for runs, events, and bulk cancellations

If you want PHP to author and serve Inngest functions, you want a different library — Inngest's own SDKs (TypeScript, Python, Go) embed a function runtime and signature-verifying serve handler that this package intentionally does not.

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

[](#requirements)

- PHP 8.3+
- A PSR-18 HTTP client and PSR-17 factories — auto-discovered via `php-http/discovery`. In a Laravel app this picks up Guzzle automatically; otherwise install any combination such as `nyholm/psr7` + `symfony/http-client` or `guzzlehttp/guzzle` + `guzzlehttp/psr7`.

Install
-------

[](#install)

```
composer require highfive/inngest-php
```

Quick start
-----------

[](#quick-start)

```
use DateTimeImmutable;
use Highfive\Inngest\Client;
use Highfive\Inngest\Event\Event;
use Highfive\Inngest\Cancellation\CancellationRequest;

$client = Client::create(
    eventKey: getenv('INNGEST_EVENT_KEY'),
    signingKey: getenv('INNGEST_SIGNING_KEY'),
);

// 1. Send an event (triggers any function listening for "user.signup")
$result = $client->events()->send(new Event(
    name: 'user.signup',
    data: ['userId' => 'u_123'],
));
$eventId = $result->ids[0];

// 2. Inspect the resulting run(s)
$runs = $client->runs()->forEvent($eventId);

// 3. Or block until the run finishes
$runs = $client->runs()->waitForEvent($eventId, timeoutSeconds: 60);

// 4. Cancel runs in bulk
$client->cancellations()->bulk(new CancellationRequest(
    appId: 'acme-app',
    functionId: 'schedule-reminder',
    startedAfter: new DateTimeImmutable('-1 hour'),
    startedBefore: new DateTimeImmutable('now'),
    if: "event.data.userId == 'u_123'",
));
```

Typed consumer events
---------------------

[](#typed-consumer-events)

If you want typed events in your app code, implement `DispatchableEvent` and convert your DTO into the low-level `Event` payload the client sends:

```
use Highfive\Inngest\Event\DispatchableEvent;
use Highfive\Inngest\Event\Event;

final readonly class UserSignedUp implements DispatchableEvent
{
    public function __construct(
        public string $userId,
        public string $email,
    ) {}

    public function toInngestEvent(): Event
    {
        return new Event(
            name: 'user.signup',
            data: [
                'userId' => $this->userId,
                'email' => $this->email,
            ],
        );
    }
}

$client->events()->send(new UserSignedUp('u_123', 'jane@example.com'));
```

`sendMany()` also accepts a mix of raw `Event` instances and typed `DispatchableEvent` objects.

Branch environments
-------------------

[](#branch-environments)

```
$client = Client::create(eventKey: '...', signingKey: '...', env: 'feature/checkout');
```

The `env` is forwarded as `x-inngest-env` on every request.

Local dev server
----------------

[](#local-dev-server)

Point both base URLs at Inngest's local dev server:

```
$client = Client::create(eventKey: 'fake', devServerUrl: 'http://localhost:8288');
```

Laravel
-------

[](#laravel)

If you install this package in a Laravel app (11.x or 12.x), the bundled `InngestServiceProvider` is auto-discovered. There is nothing else to install — the `Highfive\Inngest\Laravel` namespace is dormant outside Laravel because its classes extend framework types that only exist when Laravel is present.

Configure with environment variables:

```
INNGEST_EVENT_KEY=...
INNGEST_SIGNING_KEY=signkey-prod-...
INNGEST_ENV=feature/checkout       # optional, branch envs
INNGEST_DEV_SERVER_URL=             # optional, e.g. http://localhost:8288 in dev
```

Laravel defaults to the production Inngest base URLs when you do not override them:

- `event_base_url`: `https://inn.gs`
- `api_base_url`: `https://api.inngest.com`

Optionally publish the config:

```
php artisan vendor:publish --tag=inngest-config
```

Resolve via DI, the container alias, or the `Inngest` facade:

```
use Highfive\Inngest\Client;
use Highfive\Inngest\Event\Event;
use Inngest; // Facade

class CheckoutController
{
    public function __invoke(Client $inngest)
    {
        $inngest->events()->send(new Event('order.placed', ['orderId' => 42]));
        // or:
        Inngest::events()->send(new Event('order.placed', ['orderId' => 42]));
    }
}
```

Sub-API services (`EventApi`, `RunsApi`, `CancellationApi`) are also bound and can be injected directly.

Errors
------

[](#errors)

All errors extend `Highfive\Inngest\Exception\InngestException`:

- `AuthenticationException` — 401/403
- `BadRequestException` — 400
- `NotFoundException` — 404
- `RateLimitException` — 429
- `ServerException` — 5xx
- `TransportException` — network / PSR-18 client failures

###  Health Score

43

—

FairBetter than 89% of packages

Maintenance93

Actively maintained with recent releases

Popularity16

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity48

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

Unknown

Total

1

Last Release

36d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/3ea19dd5df13cad1d168136ff9dbd38eb97a1e95a2ad1b2c4ccd993216b9251f?d=identicon)[ianrodrigues](/maintainers/ianrodrigues)

---

Top Contributors

[![ianrodrigues](https://avatars.githubusercontent.com/u/5269377?v=4)](https://github.com/ianrodrigues "ianrodrigues (2 commits)")

---

Tags

laravelpsr-18eventsqueueworkflowinngest

###  Code Quality

TestsPest

### Embed Badge

![Health badge](/badges/highfive-inngest-php/health.svg)

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

###  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.

35729.6k2](/packages/telnyx-telnyx-php)[guzzlehttp/psr7

PSR-7 message implementation that also provides common utility methods

7.9k1.1B3.7k](/packages/guzzlehttp-psr7)[tempest/framework

The PHP framework that gets out of your way.

2.2k31.1k11](/packages/tempest-framework)[cakephp/cakephp

The CakePHP framework

8.8k19.1M1.7k](/packages/cakephp-cakephp)[flow-php/flow

PHP ETL - Extract Transform Load - Data processing framework

84735.1k](/packages/flow-php-flow)[laudis/neo4j-php-client

Neo4j-PHP-Client is the most advanced PHP Client for Neo4j

185671.3k41](/packages/laudis-neo4j-php-client)

PHPackages © 2026

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