---
title: "Signer quick reference"
description: "Lacuna Signer on one page: API key, base URLs, client packages, document creation, signing URL, status, download, webhooks and errors."
canonical: "https://docs.lacunasoftware.com/en-us/articles/signer/quick-reference"
locale: "en"
product: "Signer"
last_updated: "2026-10-12"
---

# Signer quick reference

The essentials of Lacuna Signer on one page, with links to the full pages.

## What it is for

Lacuna Signer is a document and signature manager: your application uploads a file and defines a flow of participants (signers and approvers, in sequence or in parallel), and Signer notifies them, collects their digital or electronic signatures and returns the signed file.   It runs as SaaS at [dropsigner.com](https://www.dropsigner.com/) or as your own [on-premises](https://docs.lacunasoftware.com/en-us/articles/signer/on-premises) instance, and you integrate through its REST API, the client libraries used by the samples and an embeddable signing widget.   

| Choose instead | When |
|---|---|
| [Rest PKI Core](https://docs.lacunasoftware.com/en-us/articles/rest-pki/core/quick-reference) | You want signatures inside your own application, without a document workflow: your application creates a session, sends the user to a page Rest PKI Core hosts and gets the result back. It also validates signatures, adds timestamps and checks biometric identity. |
| [PKI SDK](https://docs.lacunasoftware.com/en-us/articles/pki-sdk/quick-reference) | Your application is in .NET and must create or validate CMS/CAdES, PDF/PAdES or XmlDSig/XAdES signatures, or validate X.509 certificates, in its own code. |
| [PKI Express](https://docs.lacunasoftware.com/en-us/articles/pki-express/quick-reference) | You need those same signature formats from virtually any language, on your own Windows or Linux server, with a license file. |
| [Web PKI](https://docs.lacunasoftware.com/en-us/articles/web-pki/quick-reference) | Your web page must reach the user's certificates from JavaScript (list them, read them, sign data) while a server-side SDK assembles the signature. Signer's own widget already relies on a Web PKI license for your domain. |
| [Bulk Signer](https://docs.lacunasoftware.com/en-us/articles/bulk-signer) | Files must be signed in bulk on your own infrastructure with a certificate the server holds, with no person in the loop. Bulk Signer can also hand a profile's files to Signer when a person must sign. |

## Install

| Language | Package | Current major | Registry |
|---|---|---|---|
| .NET | `Lacuna.Signer.Client` | 1 (1.24.0) | [NuGet](https://www.nuget.org/packages/Lacuna.Signer.Client) |
| Java | `com.lacunasoftware.signer:signer-client` | 2 (2.14.0) | [Maven Central](https://central.sonatype.com/artifact/com.lacunasoftware.signer/signer-client) |
| Node.js | `signer-node-client` | 1 (1.1.0) | [npm](https://www.npmjs.com/package/signer-node-client) |
| PHP | `lacuna/signer-client` | 1 (1.4.10) | [Packagist](https://packagist.org/packages/lacuna/signer-client) |
| JavaScript (browser), embedded signature | `lacuna-signer-widget` | 0 (0.8.0) | [CDN script](https://cdn.lacunasoftware.com/libs/signer/lacuna-signer-widget-0.8.0.min.js), [npm](https://www.npmjs.com/package/lacuna-signer-widget) |

Install with `dotnet add package Lacuna.Signer.Client`, Gradle `implementation 'com.lacunasoftware.signer:signer-client:2.14.0'`, `npm install signer-node-client` or `composer require lacuna/signer-client`. See [Client libraries](https://docs.lacunasoftware.com/en-us/articles/signer/integration-guide#client-libraries). 

The samples pin 1.17.0 (.NET), 2.13.0 (Java), `^1.1.0` (Node.js) and 1.4.10 (PHP), all on the current major. Without a client library, call the REST API directly, as [Getting started](https://docs.lacunasoftware.com/en-us/articles/signer/get-started) does with curl.  

## Configuration and authentication

* **API key.** Every request carries the key in the `X-Api-Key` header, in the format `application-name|<key>`. If you have permission to create applications in your organization, create one under **Applications** and generate the key with its **Keys** button; otherwise, ask your instance administrator for a key. The key is shown only once, and it only sees and creates documents of that organization. See [Getting started](https://docs.lacunasoftware.com/en-us/articles/signer/get-started) and the [Integration Guide](https://docs.lacunasoftware.com/en-us/articles/signer/integration-guide).  
* **Administration and monitoring keys.** The administration APIs (users and organizations) need a key from an application of the `Sys Admin` organization; the consumption monitoring APIs need one with the `Monitor` role. See [Administration APIs](https://docs.lacunasoftware.com/en-us/articles/signer/on-premises/administration) and [Consumption Monitoring](https://docs.lacunasoftware.com/en-us/articles/signer/on-premises/consumption-monitoring).  
* **API reference.** [Swagger](https://www.dropsigner.com/swagger), and the OpenAPI copy at https://docs.lacunasoftware.com/openapi/signer.json, titled "Dropsigner", version 2.16.1.  

| Environment | Base URL |
|---|---|
| Production, cloud (Dropsigner SaaS) | `https://www.dropsigner.com` |
| Production, on-premises | Your instance URL, such as `https://signer.yourcompany.com` |
| Sandbox, for development and tests | `https://signer-lac.azurewebsites.net` |

The client takes the instance URL and the API key; change both together when you move to production.  

```php
use Lacuna\Signer\PhpClient\SignerClient;
$this->endPoint = "https://signer-lac.azurewebsites.net/";
$this->apiKey = "your-application|0000000000000000000000000000000000000000000000000000000000000000";
$this->signerClient = new SignerClient($this->endPoint, $this->apiKey);
```

TODO(docs): the Signer docs pages do not mention the sandbox (only the samples do), nor how to get an organization and an API key on it.

## Core operations

The blocks below are PHP, the language with the most samples in the catalog; [Try it](https://docs.lacunasoftware.com/en-us/articles/signer/quick-reference#try-it) links the same tasks in C#, Java and Node.js where they exist. 

### Upload a file

Send the file first; the upload `id` in the response is what the document refers to. `POST /api/uploads/bytes` takes the bytes in Base64, in JSON (the simplest), and `POST /api/uploads` takes multipart/form-data (better for large files); PHP `uploadFile`. See [Create documents](https://docs.lacunasoftware.com/en-us/articles/signer/integration/documents).   

```php
$filePath = "resources/sample.pdf";
$fileName = basename($filePath);
$file = fopen($filePath, "r");
$uploadModel = new UploadModel($this->signerClient->uploadFile($fileName, $file, "application/pdf"));
fclose($file);
```

### Create a document with a flow

Create the document from the upload and say who acts and in which order: each `flowActions` item has a `type` (`Signer`, `Approver`, `SignRule` or `ApproverRule`), a `step` (the same step runs in parallel, a higher step runs later) and a `user` (`name`, `identifier`, `email`). `POST /api/documents`; PHP `createDocument`. The response has one `uploadId` and `documentId` pair per file. Signer e-mails the participants of the first step at once, unless you send `disablePendingActionNotifications: true`. See [Create documents](https://docs.lacunasoftware.com/en-us/articles/signer/integration/documents).   

```php
$fileUploadModelBuilder = new FileUploadBuilder($uploadModel);
$fileUploadModelBuilder->setDisplayName("One Signer Sample");
$user = new UsersParticipantUserModel();
$user->setName("Jack Bauer");
$user->setEmail("jack.bauer@mailinator.com");
$user->setIdentifier("75502846369");
$flowActionCreateModel = new FlowActionsFlowActionCreateModel();
$flowActionCreateModel->setType(FlowActionType::SIGNER);
$flowActionCreateModel->setUser($user);
$documentRequest = new DocumentsCreateDocumentRequest();
$documentRequest->setFiles(array($fileUploadModelBuilder->toModel()));
$documentRequest->setFlowActions(array($flowActionCreateModel));
$docResult = $this->signerClient->createDocument($documentRequest)[0];
```

### Get the signing URL (embedded signature)

To have the participant sign inside your application instead of through the e-mail, ask for their action URL, identifying the participant by `identifier` (the docs also send `emailAddress`): `POST /api/documents/{id}/action-url`; PHP `getActionUrl`. The response has `url`, to redirect the user to Signer's signing page, and `embedUrl`, which you pass to the `render` method of `LacunaSignerWidget` on your page. Combine it with `disablePendingActionNotifications: true` on creation. The widget needs Signer to be configured with a Web PKI license for your page's domain. See [Embedded signature](https://docs.lacunasoftware.com/en-us/articles/signer/embedded-signature).    

```php
$actionUrlRequest = new DocumentsActionUrlRequest();
$actionUrlRequest->setIdentifier($user->getIdentifier());
$actionUrlResponse = new DocumentsActionUrlResponse($this->signerClient->getActionUrl($docResult->getDocumentId(), $actionUrlRequest));
echo ($actionUrlResponse->getEmbedUrl());
```

### Check the document status

`GET /api/documents/{id}`; PHP `getDocumentDetails`. The document is finished when `status` is `Concluded` (the others are `Pending`, `FlowConcluded`, `Refused`, `Canceled` and `Expired`), and a participant is done when their `flowActions` item has `status` `Completed`. In production, use webhooks instead of polling. See [Track documents](https://docs.lacunasoftware.com/en-us/articles/signer/integration/tracking#check-document).   

```php
$documentDetails = new DocumentsDocumentModel($this->signerClient->getDocumentDetails($document->getDocumentId()));
if ($documentDetails->getIsConcluded()) {
    echo "Document concluded";
}
foreach ($documentDetails->getFlowActions() as $item) {
    if ($item["status"] == ActionStatus::PENDING) {
        $user = new UsersParticipantUserModel($item["user"]);
        echo "The status of User " . $user->getName() . " is Pending\n";
    }
}
```

### Download the signed file

`GET /api/documents/{id}/content?type=...`; PHP `getDocumentContent`. `Signatures` is the signed file (the PDF with the signatures embedded, or a `.p7s` for CAdES), `PrinterFriendlyVersion` a PDF with the signatures manifest and `Original` the uploaded file. Canceled, expired or refused documents download only as `Original` and `PrinterFriendlyVersion`, and a document nobody has signed yet has no `Signatures` or `PrinterFriendlyVersion`: check `hasSignature` and `status` first. `GET /api/documents/{id}/content-b64` returns the bytes in Base64, in JSON. See [Download and list](https://docs.lacunasoftware.com/en-us/articles/signer/integration/download-and-list#when-a-version-cannot-be-downloaded).   

```php
$signed = $this->signerClient->getDocumentContent($documentId, DocumentDownloadTypes::SIGNATURES);
file_put_contents("./resources/downloaded-signed.pdf", $signed);
$printerFriendly = $this->signerClient->getDocumentContent($documentId, DocumentDownloadTypes::PRINTER_FRIENDLY_VERSION);
file_put_contents("./resources/downloaded-printer-friendly.pdf", $printerFriendly);
```

### Receive webhooks

Register your URL under **Organization**, **Integration**, or with `POST /api/organizations/{orgId}/webhooks` (`url`, `authType`, `token`). Signer then posts `{ "type": "...", "data": { ... } }` for `DocumentsCreated`, `DocumentSigned`, `DocumentApproved`, `DocumentRefused`, `DocumentConcluded`, `DocumentCanceled`, `DocumentExpired` and `DocumentDeleted`. It does not sign the body: check the header you chose, such as `Authorization: Bearer <token>`, answer 2xx at once (any other answer is retried, by default up to 10 attempts), make processing idempotent and read the document back, because events can arrive out of order. See [Webhooks](https://docs.lacunasoftware.com/en-us/articles/signer/webhooks).  

```php
if (!hash_equals(self::EXPECTED_AUTHORIZATION, $_SERVER['HTTP_AUTHORIZATION'] ?? '')) {
    http_response_code(401);
    return;
}
$body = file_get_contents('php://input');
$webhook = json_decode($body, true);
if (($webhook['type'] ?? null) === WebhookTypes::DOCUMENT_CONCLUDED) {
    $document = new DocumentsDocumentModel($this->signerClient->getDocumentDetails($webhook['data']['id']));
    if ($document->getStatus() !== DocumentStatus::CONCLUDED) {
        return;
    }
}
```

### Cancel, refuse or delete a document

`POST /api/documents/{id}/cancellation` and `POST /api/documents/{id}/refusal`, each with a `reason`, and `DELETE /api/documents/{id}`; PHP `cancelDocument`, `refuseDocument` and `deleteDocument`. Call the one you need. See [Document lifecycle](https://docs.lacunasoftware.com/en-us/articles/signer/integration/lifecycle).  

```php
$cancelDocument = new DocumentsCancelDocumentRequest();
$cancelDocument->setReason("This is a document cancellation");
$this->signerClient->cancelDocument($documentId, $cancelDocument);
$refuseDocument = new RefusalRefusalRequest();
$refuseDocument->setReason("This is a document refusal");
$this->signerClient->refuseDocument($documentId, $refuseDocument);
$this->signerClient->deleteDocument($documentId);
```

## Errors

The API answers with an HTTP status code: `400` for a syntax error, such as a required field that was not sent; `401` when the API key was not sent or is invalid; `403` when the key is valid but the application lacks permission for the operation; and `422` for an API error, whose JSON body (`ErrorModel`) has `code`, `message` and `details`. An entity id that is not found is also a `422`. Test `code`, not the message. See [Error responses](https://docs.lacunasoftware.com/en-us/articles/signer/integration-guide#error-responses).  

The ones an integrator hits first:
* `401` or `403` on the first call: the key is invalid, revoked or belongs to another organization. 
* `DocumentNotFound` and `InvalidFlowAction`, among the main codes the API reference lists (the list is not comprehensive, and new codes may appear).  
* `DocumentHasNoSignatures` (`422`): downloading `Signatures` or `PrinterFriendlyVersion` of a document nobody has signed yet. 
* `MaxWebhooksLimitReached` (more webhooks than `MaxWebhooksPerOrganization`, 5 by default) and `OperationNotSupportedInPersonalOrganizations` when registering a webhook. 

In PHP, client calls throw an exception whose message carries the whole inner exception, but `getDocumentContent` does not throw on HTTP errors: it returns the JSON error body, so check the document's details before saving the content as a file.  

## Test certificates and credentials

* [Test certificates](https://docs.lacunasoftware.com/en-us/articles/pki-guide/test-certs#signer): the Lacuna Test PKI. The samples' public signature scenario signs on the sandbox with one of them, the certificate for CPF 56072386105.  
* Sandbox `https://signer-lac.azurewebsites.net`: the samples run there with a shared sample key; to use your own organization, replace it with a key of yours. Every run creates real documents and Signer e-mails the participants, so the samples use made-up `@mailinator.com` addresses. 
* Cloud signing in the widget: the online example uses the BirdID test certificate (CPF 026.102.470-10), paired by a QR code in the BirdID app. See [Embedded signature](https://docs.lacunasoftware.com/en-us/articles/signer/embedded-signature). 
* By default, a Signer instance accepts only ICP-Brasil certificates; [TrustArbitrator](https://docs.lacunasoftware.com/en-us/articles/signer/on-premises/trust-arbitrator) shows how to accept other roots. 
* TODO(docs): which test certificates Dropsigner and the sandbox accept.

## Try it

Live demos and the samples for each language:

**Demos and samples**

- Live demo: [Sign a document](https://try.lacunasoftware.com/en/signer/sign-a-document)
- Live demo: [Sign without leaving your page](https://try.lacunasoftware.com/en/signer/embedded-signature)
- Sign multiple Signer documents with Web PKI: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/BatchSignerSignatureController.java)
- Sign a document: create it with one signer: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDocumentWithOneSignerScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDocumentWithOneSignerScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createDocumentWithOneSignerScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDocumentWithOneSignerScenario.php)
- Create a document with an attachment: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDocumentWithAttachmentScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDocumentWithAttachmentScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createDocumentWithAttachmentScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDocumentWithAttachmentScenario.php)
- Create a document with a description: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDocumentWithDescriptionScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDocumentWithDescriptionScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createDocumentWithDescriptionScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDocumentWithDescriptionScenario.php)
- Merge several PDFs into one document (envelope): [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDocumentWithEnvelopeScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDocumentWithEnvelopeScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createDocumentWithEnvelopeScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDocumentWithEnvelopeScenario.php)
- Upload a file as Base64: [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateBase64DocumentScenario.php)
- Upload a file as multipart/form-data: [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/uploadUsingMultipartFormDataScenario.ts)
- Create a document from a large file: [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateLargeDocumentScenario.php)
- Generate a document from a PDF form template and CSV data: [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/GenerateDocumentWithTwoOrMoreSignersScenario.java) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/GenerateDocumentWithTwoOrMoreSignersScenario.php)
- Create a document with two or more signers, in any order: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDocumentWithTwoOrMoreSignersWithoutOrderScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDocumentWithTwoOrMoreSignersWithoutOrderScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createDocumentWithTwoOrMoreSignersWithoutOrderScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDocumentWithTwoOrMoreSignersWithoutOrderScenario.php)
- Create a document with signers in a fixed order: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDocumentWithTwoOrMoreSignersWithOrderScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDocumentWithTwoOrMoreSignersWithOrderScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createDocumentWithTwoOrMoreSignersWithOrderScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDocumentWithTwoOrMoreSignersWithOrderScenario.php)
- Create a document with an approver: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDocumentWithApproversScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDocumentWithApproversScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createDocumentWithApproversScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDocumentWithApproversScenario.php)
- Create a document with a signing rule (any N of a group): [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDocumentWithSigningRuleScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDocumentWithSigningRuleScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createDocumentWithSigningRuleScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDocumentWithSigningRuleScenario.php)
- Pre-position a signature on the document: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDocumentWithPositionedSignaturesScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDocumentWithPositionedSignaturesScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createDocumentWithPositionedSignaturesScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDocumentWithPositionedSignaturesScenario.php)
- Add a signer to an existing document: [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/AddSignerToExistingDocumentScenario.php)
- Change a participant in an ongoing flow: [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/DocumentFlowEditRequestScenario.php)
- Require a CAdES signature on a PDF: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreatePDFDocumentWithCadesSignatureScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreatePDFDocumentWithCadesSignatureScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createPDFDocumentWithCadesSignatureScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreatePDFDocumentWithCadesSignatureScenario.php)
- Sign a whole XML file (XAdES): [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateXMLWithFullDocumentSignatureScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateXmlWithFullDocumentSignatureScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createXmlWithFullDocumentSignatureScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateXmlWithFullDocumentSignatureScenario.php)
- Sign one element of an XML file (XAdES): [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateXMLWithElementSignatureScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateXMLWithElementSignatureScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createXMLWithElementSignatureScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateXMLWithElementSignatureScenario.php)
- Sign a Brazilian digital diploma (XAdES, Portaria MEC 554/2019): [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDigitalDegreeScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDigitalDegreeScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createDigitalDegreeScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDigitalDegreeScenario.php)
- Sign with a digital certificate through the API (public signature): [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/PublicSignatureScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/PublicSignatureScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/publicSignatureScenario.ts)
- Sign electronically with an uploaded signature image: [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/ElectronicSignatureWithSignatureImageScenario.java)
- Sign without leaving your page (embedded signature): [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/EmbeddedSignatureScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/EmbeddedSignatureScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/embeddedSignatureScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/EmbeddedSignatureScenario.php)
- Check a document's status and its participants' actions: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CheckDocumentStatusScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CheckDocumentStatusScenario.java) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CheckDocumentStatusScenario.php)
- Send reminders to participants with pending actions: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/NotifyFlowParticipantsScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/NotifyFlowParticipantsScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/notifyFlowParticipantsScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/NotifyFlowParticipantsScenario.php)
- List documents: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/ListDocumentsScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/ListDocumentsScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/listDocumentsScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/ListDocumentsScenario.php)
- List saved document flows: [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/listDocumentScenario.ts)
- Receive webhooks with a minimal HTTP endpoint: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/WebhookEndpointScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/WebhookEndpointScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/webhookEndpointScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/WebhookEndpointScenario.php)
- Handle document webhooks (signed, approved, refused, concluded): [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CheckDocumentStatusScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CheckDocumentStatusScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/checkDocumentStatusScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CheckDocumentStatusScenario.php)
- Handle the invoice-closed billing webhook: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/InvoiceWebhookHandlingScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/InvoiceWebhookHandlingScenario.java) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/InvoiceWebhookHandlingScenario.php)
- Mark an invoice as paid: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/InvoiceWebhookHandlingScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/InvoiceWebhookHandlingScenario.java) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/InvoiceWebhookHandlingScenario.php)
- Download a document's versions: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/DownloadDocumentVersionScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/DownloadDocumentVersionScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/downloadDocumentVersionScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/DownloadDocumentVersionScenario.php)
- Cancel a document: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CancelDocumentScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CancelDocumentScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/cancelDocumentScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CancelDocumentScenario.php)
- Refuse a document as the organization: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/RefuseDocumentScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/RefuseDocumentScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/refuseDocumentScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/RefuseDocumentScenario.php)
- Delete a document: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/DeleteDocumentScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/DeleteDocumentScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/deleteDocumentScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/DeleteDocumentScenario.php)
- Upload a new version of a document: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/AddNewDocumentVersionScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/AddNewDocumentVersionScenario.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/addNewDocumentVersionScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/AddNewDocumentVersionScenario.php)
- Create a document in a new folder: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDocumentInNewFolderScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDocumentInNewFolderScenario.java) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDocumentInNewFolderScenario.php)
- Create a document in an existing folder: [.NET](https://github.com/LacunaSoftware/SignerSamples/blob/master/dotnet/console/Console/Scenarios/CreateDocumentInExistingFolderScenario.cs) · [Java](https://github.com/LacunaSoftware/SignerSamples/blob/master/java/console/src/main/java/com/lacunasoftware/signer/sample/scenarios/CreateDocumentInExistingFolder.java) · [Node.js](https://github.com/LacunaSoftware/SignerSamples/blob/master/nodejs/scenarios/createDocumentInExistingFolderScenario.ts) · [PHP](https://github.com/LacunaSoftware/SignerSamples/blob/master/php/Scenarios/CreateDocumentInExistingFolder.php)
