glitchr / omnisign
Omnisign: one contract for having documents signed - create an envelope (documents, signers, fields, a level: simple, advanced, qualified), send it, follow it, remind, cancel, sign in the application's page, download the signed documents and their evidence, hear the provider's webhooks - whoever sig
Requires
- php: >=8.2
- symfony/http-client-contracts: ^3.0
Requires (Dev)
- phpunit/phpunit: ^11.0
- symfony/config: ^6.4|^7.0|^8.0
- symfony/dependency-injection: ^6.4|^7.0|^8.0
- symfony/http-client: ^6.4|^7.0|^8.0
- symfony/http-kernel: ^6.4|^7.0|^8.0
Suggests
- omnisign/docuseal: DocuSeal: an instance of one's own (open source) or DocuSeal's cloud - nothing leaves for a third party when self-hosted
- omnisign/docusign: DocuSign eSignature: envelopes, embedded signing, Connect webhooks
- omnisign/yousign: Yousign (Youtrust): simple, advanced and qualified signatures, by e-mail or in the page
- symfony/config: In a Symfony application: the configuration of Omnisign\Bridge\Symfony\OmnisignBundle
- symfony/dependency-injection: In a Symfony application: the services of Omnisign\Bridge\Symfony\OmnisignBundle
- symfony/http-kernel: In a Symfony application: Omnisign\Bridge\Symfony\OmnisignBundle itself
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-10-15 13:23:24 UTC
README
One contract for having documents signed - whoever signs: Yousign, DocuSign, or a DocuSeal instance of one's own.
$gateway = $registry->get('contracts'); // or 'qualified': the same calls $envelope = $gateway->create(new Envelope('Bail', $documents, $signers, $fields, Level::SIMPLE, embedded: true)); $envelope->reference; // keep it $gateway->send($envelope); $gateway->signingUrl($envelope, 'tenant')->url; // the tenant signs in your page $gateway->fetch($envelope)->status; // Status::COMPLETED $signed = $gateway->download($envelope); // the signed documents and their evidence
This package holds the contract (GatewayInterface, the requests Create, Send, Fetch,
Remind, Cancel, Download, SigningUrl, Notify, GatewayFactory, Registry), the models
(Envelope, Document, File, Signer, Field, Level, Status, SignerState, Download,
SigningUrl, Notification, Capabilities) and a bridge for Symfony. It needs no framework: PHP
and symfony/http-client-contracts. Each gateway is a package of its own:
| Package | Levels | In the page | Third party |
|---|---|---|---|
omnisign/yousign |
simple, advanced, qualified | yes | Yousign (Youtrust) |
omnisign/docusign |
simple | yes | DocuSign |
omnisign/docuseal |
simple | yes | none when self-hosted |
What a gateway is, and is not
A gateway has documents signed: it creates the envelope, sends it, says where it stands, gives
back the signed documents and the evidence of their signing. It keeps nothing for the
application: store what download() gives in your own vault, with the envelope's reference.
The levels are eIDAS's (simple, advanced, qualified): a gateway that cannot reach a level refuses
the envelope (InvalidConfigException), it never signs lower. A notary's authentic deed and a
lawyer's deed go through their professions' own tools, not this family. It is not a vault, nor a
template editor.
Documentation
- Installation and a first envelope
- Models
- Gateways: the contract, what each does, writing one
- Symfony
- The Docker harness: bare PHP, the console
Plain PHP
composer require glitchr/omnisign omnisign/docuseal
$registry = new Registry([new DocusealGatewayFactory()], [ 'contracts' => ['factory' => 'docuseal', 'options' => ['url' => 'https://sign.example.org/api', 'api_key' => getenv('DOCUSEAL_API_KEY')]], ]);
No bundle, no container: a factory per gateway package, the registry built by hand.
Symfony
Omnisign\Bridge\Symfony\OmnisignBundle does that wiring (docs/symfony.md);
its components are not required by this package.
omnisign: gateways: contracts: { factory: docuseal, options: { url: 'https://sign.example.org/api', api_key: '%env(DOCUSEAL_API_KEY)%' } }
Docker
cd docker && cp .env.dist .env docker compose run --rm omnisign gateways docker compose run --rm omnisign bare # plain PHP: no bundle, no container, and what PHP loaded docker compose run --rm omnisign test
Responsibility
glitchr/omnisign and its omnisign/* providers are independent, unofficial clients: none is
affiliated with, endorsed by or sponsored by the services it reaches. Each service keeps its own
terms (accounts and contracts, keys, rate limits), named with a link in the "Responsibility" section
of the README of each provider that reaches one. The MIT licence covers this code only and grants no
right to any service or to its data.
Whoever installs and runs these packages is responsible for complying with those terms, for obtaining whatever they require, and for any use made of what they return. The authors publish them free of charge, make no commercial use of them, and accept no liability for how they are used (see LICENSE).
License: MIT since 2026-10-09; earlier versions remain published under LGPL-3.0-or-later.