PHPackages                             retech/sign-me - 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. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. retech/sign-me

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

retech/sign-me
==============

Celest Sign me SDK

v0.2.2(2y ago)020↓100%[1 issues](https://github.com/sroehrl/SignMe-SDK/issues)MITPHPPHP ^8.1

Since Apr 9Pushed 2y ago1 watchersCompare

[ Source](https://github.com/sroehrl/SignMe-SDK)[ Packagist](https://packagist.org/packages/retech/sign-me)[ Docs](https://sign.celest.services)[ RSS](/packages/retech-sign-me/feed)WikiDiscussions master Synced 1mo ago

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

SignMe (sign.celest.services) PHP-SDK
=====================================

[](#signme-signcelestservices-php-sdk)

Handle your SignMe-requests in a human-digestible way. The goal is to make it feel like working with local models.

[SignMe](https://sign.celest.services) is a signature service targeted at integrators, rather than a pure UI-solution like most competitors.

***Status: Private BETA. Please do not use in production yet***

Example
-------

[](#example)

```
use Retech\Celest\SignMe\SignMeClient;

$sdk = (new SignMeClient())->authenticate();

// create a new document to sign
$newDocument = $sdk->uploadDocument('SDK upload','path/contracts/max-hunter-lease-agreement.pdf');

// add Signatory
$signatoryMax = $newDocument->addSignatory('my-reference-c9d9b8b8', 'Max Hunter', 'm.hunter@example.com');

// create field on page 4
$signatureField = $signatoryMax->addField('Please sign here', 4);

// move field in position using percentages
$signatureField->setX(53.3);
$signatureField->setY(40);

// you can set width/height as well
$signatureField->setHeight(7);

// send changes to API
$signatureField->update();

// and then some pseudo-code to get the picture
$email = new MyEmailClientWrapper();
$email->to('Max Hunter', 'm.hunter@example.com');
$email->body('Hi Max. Please sign this: ' . $signatoryMax->getSignatureLink());
$email->send();
```

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

[](#installation)

`composer require retech/sign-me`

Usage
-----

[](#usage)

This package is a one-stop solution for all your remote signMe needs. It's functionality can be divided into three categories:

- [api](#pure-api)
- [easy objects](#easy-objects-oo)
- [webhook reader](#webhook-reader)

### pure API

[](#pure-api)

In order to use the public REST-API, method-wrappers simplify your calls. All of these methods return the result as assoc-array on success and throw the Exception *Retech\\Celest\\SignMe\\Exceptions\\ConnectionException* when things go wrong.

***authenticate***

argumenttyperequired$clientIdstringno (reads from env)$apiKeystringno (reads from env)The method establishes authentication using the environment variables *SIGN\_ME\_CLIENT\_ID* and *SIGN\_ME\_API\_KEY*. Alternatively, you can pass in your clientId &amp; ApiKey directly.

```
$client = new SignMeClient();
$client->authenticate();
```

***get***

argumenttyperequired$urlstringyesExecute GET-calls against the base-uri `https://sign.celest.services/api/`

```
$myDocument = $client->get('documents/123-123-123-1231-123123123');
```

***post***

argumenttyperequired$urlstringyes$payloadarraynoExecute POST-calls against the base-uri `https://sign.celest.services/api/`

```
$myReference = 'user-123-345-523-93645'
$newSignatory = $client->post('signature/123-123-123-1231-123123123', [
    'signerHash' => $myReference,
    'signerEmail' => 'john.doe@email.com'
]);
```

***put***

argumenttyperequired$urlstringyes$payloadarrayyesExecute PUT-calls against the base-uri `https://sign.celest.services/api/`

```
$webHookUrl = 'https://webhook.your-domain.com?mydocId=1023'
$updatedDoc = $client->put('documents/123-123-123-1231-123123123', [
    'webhookUrl' => $webHookUrl
]);
```

***delete***

argumenttyperequired$urlstringyesExecute DELETE-calls against the base-uri `https://sign.celest.services/api/`

```
$success = $client->delete('documents/123-123-123-1231-123123123');
```

### Easy Objects (OO)

[](#easy-objects-oo)

Other than managing your transactions and company-settings, the use-case of the signMe API is predictable enough to make your day-to-day life easier with our object oriented interaction possibilities.

***getDocuments***

argumenttyperequired$pageintno (defaults to 1)```
$documents = $client->getDocuments();
$totalPages = $documents['pages']; // e.g. 3
$allDocumentCount = $documents['total'] // e.g. 127
$newestDocument = $documents[documents][0] // Document (see Entities)
```

***getDocument***

argumenttyperequired$documentSlugstringyes```
$myDocument = $client->getDocument('d3373e45-f7bd-43dc-b48e-db5bca1a5493'); // Document (see Entities)
```

***uploadDocument***

argumenttyperequired$namestringyes$filePathstringyesCurrently accepts PDF &amp; DOCX only

```
$myDocument = $client->uploadDocument('Mike\'s car sale', __DIR__ . '/file.php'); // Document (see Entities)
```

### Entities

[](#entities)

#### Document

[](#document)

- getDownloadUrl(): null|string
- getDownloadUrl(): null|string
- getFinalInstructions(): null|string
- setFinalInstructions(finalInstructions: null|string): void
- getWebhookUrl(): null|string
- setWebhookUrl(webhookUrl: null|string): void
- getSlug(): string
- getName(): string
- getRequesterHash(): string
- getFields(): array
- getSignatures(): array
- getSignature(signerHash: string): null|Signature
- addSignatory(signerHash: string, \[signerName: null|string = null\], \[signerEmail: null|string = null\]): Signature
- update(): Document

#### Signature

[](#signature)

- fields: array = \[...\]
- documentSlug: string
- getSignerHash(): string
- getSignerName(): null|string
- getSignerEmail(): null|string
- getIp(): null|string
- getSignedAt(): DateTimeImmutable|null
- isSigned(): bool
- setSignerName(signerName: null|string): void
- setSignerEmail(signerEmail: null|string): void
- addField(label: string, \[page: int = 1\], \[type: string = 'signature'\]): Field
- getSignatureLink(): string

#### Field

[](#field)

- setType(type: string): void
- setSignerHash(signerHash: string): void
- setPage(page: int): void
- setX(x: float): void
- setY(y: float): void
- setWidth(width: float): void
- setHeight(height: float): void
- setLabel(label: null|string): void
- getLabel(): null|string
- getHeight(): float
- getWidth(): float
- getY(): float
- getX(): float
- getPage(): int
- getSignerHash(): string
- getType(): string
- update(): Field
- delete(): void

### Webhook Reader

[](#webhook-reader)

Lastly, let's have a quick look at the webhook validation tool included in this package

```
$webHook = new Retech\Celest\SignMe\WebHookValidator($mySignatureSecret);
try{
    $webHook->validate();
} catch (WebhookValidationException $e){
    // malicious!!
}

// readonly properties (available after validate() or parse())

$event = $webHook->event; // Retech\Celest\SignMe\Enums\Event e.g Event::UPDATE
$entity = $webHook->entity; // Retech\Celest\SignMe\Enums\Entity e.g. Entity::DOCUMENT
$slug = $webHook->slug;

// payload
$payload = $webHook->parse();

if($webHook->entity === Entity::DOCUMENT && $payload->isCompleted()){
    // all signatures are valid
} elseif ($webHook->entity === Entity::DOCUMENT) {
    // apparently some signatures are outstanding
    $signatures = $payload->getSignatures(); // e.g. [['ip' => null, 'time' => null, 'signerHash' => '123-123-123-k']]
    ...
    // or let's get the doc
    $sdk = (new SignMeClient())->authenticate();
    $document = $sdk->getDocument($webHook->slug);
    ...

}
```

Support
-------

[](#support)

Before the official release, no public support is provided.

License
-------

[](#license)

MIT

###  Health Score

21

—

LowBetter than 18% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity7

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity43

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 ~4 days

Total

4

Last Release

755d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/92d2361b646651e3452a62d07274076346c4096480098a6c43d6c27ee28d460d?d=identicon)[neoan](/maintainers/neoan)

---

Top Contributors

[![sroehrl](https://avatars.githubusercontent.com/u/28542911?v=4)](https://github.com/sroehrl "sroehrl (6 commits)")

### Embed Badge

![Health badge](/badges/retech-sign-me/health.svg)

```
[![Health](https://phpackages.com/badges/retech-sign-me/health.svg)](https://phpackages.com/packages/retech-sign-me)
```

###  Alternatives

[hwi/oauth-bundle

Support for authenticating users using both OAuth1.0a and OAuth2 in Symfony.

2.4k21.5M69](/packages/hwi-oauth-bundle)[web-auth/webauthn-framework

FIDO2/Webauthn library for PHP and Symfony Bundle.

50570.7k1](/packages/web-auth-webauthn-framework)[web-auth/webauthn-symfony-bundle

FIDO2/Webauthn Security Bundle For Symfony

63397.4k6](/packages/web-auth-webauthn-symfony-bundle)[symfonycorp/connect

SymfonyConnect SDK

9245.2k2](/packages/symfonycorp-connect)

PHPackages © 2026

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