esauti/esauti-php

Official PHP SDK for eSauti – REST API and Event Injection

Maintainers

Package info

github.com/esauti/esauti-php

pkg:composer/esauti/esauti-php

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.1.0 2026-04-28 20:42 UTC

This package is auto-updated.

Last update: 2026-04-28 20:43:08 UTC


README

Official PHP 7.4+ SDK for eSauti – covering both the REST API (OpenAPI-backed) and the Event Injection API.

Requirements

  • PHP 7.4 or later
  • Composer
  • ext-json

Installation

composer require esauti/esauti-php

Quick Start

REST API

use Esauti\EsautiClient;

$client = new EsautiClient(
    'https://your-mautic-host.com/api',
    ['bearer_token' => 'your-api-token'],
    ['timeout' => 30, 'max_retries' => 3]
);

// List contacts
$result = $client->api->contacts()->list(['limit' => 10]);
echo $result['total'];

// Create a contact
$contact = $client->api->contacts()->create([
    'firstname' => 'Jane',
    'lastname'  => 'Doe',
    'email'     => 'jane@example.com',
]);

// Update a contact
$client->api->contacts()->update($contact['contact']['id'], ['city' => 'Montreal']);

Event Injection

use Esauti\EsautiClient;
use Esauti\Events\EventType;

$client = new EsautiClient(
    'https://your-mautic-host.com/api',
    ['bearer_token' => 'your-api-token'],
    ['source' => 'my-app']
);

$client->events->send(EventType::CUSTOMER_CREATED, [
    'occurred_at' => date('c'),
    'source'      => 'my-shop',
    'customer'    => [
        'id'    => 'cus_001',
        'email' => 'user@example.com',
    ],
]);

HMAC Signing

$client = new EsautiClient(
    'https://your-mautic-host.com/api',
    [
        'bearer_token' => 'your-api-token',
        'hmac_secret'  => 'your-hmac-secret',  // enables HMAC on all event requests
    ]
);

Constructor Options

new EsautiClient(
    string $baseUrl,
    array $auth = [
        'bearer_token' => '...',   // Bearer token
        'hmac_secret'  => '...',   // HMAC signing secret (optional)
    ],
    array $options = [
        'timeout'          => 30,          // Request timeout (seconds)
        'connect_timeout'  => 10,          // Connection timeout (seconds)
        'max_retries'      => 3,           // Retry attempts (408, 429, 5xx, network)
        'debug'            => false,       // Write debug logs to STDERR
        'redact_pii'       => false,       // Redact email/phone in logs
        'events_endpoint'  => '/v1/inbound/event',
        'source'           => 'sdk',       // X-eSauti-Source header
        'logger'           => $myLogger,   // Custom LoggerInterface
        'transport'        => $myTransport, // Custom HttpTransportInterface
    ]
);

API Resources

Resource Methods
contacts() list, get, create, update, replace, delete, segments, campaigns, addUtm, removeUtm, addDnc, removeDnc
campaigns() list, get, create, update, replace, delete, addContact, removeContact
assets() list, get, create, update, replace, delete
categories() list, get, create, update, replace, delete
forms() list, get, create, update, replace, delete, submissions
notifications() list, get, create, update, replace, delete
fields() listContact, getContact, createContact, updateContact, deleteContact, listCompany, getCompany, createCompany, updateCompany, deleteCompany
pointGroups() list, get, create, update, delete
reports() list, get
sms() list, get, create, update, replace, delete, sendToContact

Event Types

All 225 canonical event types are available as constants in EventType:

use Esauti\Events\EventType;

EventType::CUSTOMER_CREATED     // 'customer.created'
EventType::ORDER_PAID           // 'order.paid'
EventType::SUBSCRIPTION_CREATED // 'subscription.created'
// ... 225 total

Dead-Letter Sink

Failed event deliveries (after all retries) are written to ./deadletter/events.jsonl. Override:

use Esauti\Events\DeadLetterSink;
use Esauti\Events\EventRegistry;
use Esauti\Events\EventsClient;

$sink = new DeadLetterSink(function (array $envelope, \Throwable $reason) {
    // Send to your own queue, log, alert, etc.
    myErrorTracker()->capture($reason, ['envelope' => $envelope]);
});

Custom HTTP Transport

use Esauti\Http\HttpTransportInterface;
use Esauti\Http\Response;

class MyTransport implements HttpTransportInterface {
    public function request(string $method, string $path, array $headers = [], array $query = [], ?array $body = null): Response {
        // your implementation
    }
}

$client = new EsautiClient('https://…', [], ['transport' => new MyTransport()]);

Running Tests

composer install
composer test

Project Structure

esauti-php/
├── composer.json
├── phpunit.xml
├── LICENSE
├── README.md
├── CHANGELOG.md
├── src/
│   ├── EsautiClient.php
│   ├── Config.php
│   ├── Auth/
│   │   ├── AuthInterface.php
│   │   ├── BearerAuth.php
│   │   ├── HmacAuth.php
│   │   ├── CompositeAuth.php
│   │   └── NoAuth.php
│   ├── Http/
│   │   ├── HttpTransportInterface.php
│   │   ├── GuzzleTransport.php
│   │   └── Response.php
│   ├── Api/
│   │   ├── ApiClient.php
│   │   ├── AbstractResource.php
│   │   ├── Contacts.php
│   │   ├── Campaigns.php
│   │   ├── Assets.php
│   │   ├── Categories.php
│   │   ├── Forms.php
│   │   ├── Notifications.php
│   │   ├── Fields.php
│   │   ├── PointGroups.php
│   │   ├── Reports.php
│   │   └── Sms.php
│   ├── Events/
│   │   ├── EventsClient.php
│   │   ├── EventType.php
│   │   ├── EventRegistry.php
│   │   ├── EventValidator.php
│   │   ├── EventEnvelope.php
│   │   └── DeadLetterSink.php
│   ├── Exception/
│   │   ├── ApiException.php
│   │   ├── NetworkException.php
│   │   └── ValidationException.php
│   ├── Logger/
│   │   ├── LoggerInterface.php
│   │   ├── NullLogger.php
│   │   └── DebugLogger.php
│   └── Retry/
│       └── RetryPolicy.php
├── tests/
│   ├── ApiClientTest.php
│   ├── EventValidationTest.php
│   ├── HmacAuthTest.php
│   ├── IdempotencyTest.php
│   └── RetryTest.php
└── examples/
    ├── api_contacts.php
    ├── send_event.php
    └── hmac_event.php