---
title: "Referência rápida do Signer"
description: "Lacuna Signer em uma página: chave de API, URLs base, pacotes cliente, criação de documentos, URL de assinatura, status, download, webhooks e erros."
canonical: "https://docs.lacunasoftware.com/articles/signer/quick-reference"
locale: "pt-BR"
product: "Signer"
last_updated: "2026-10-12"
---

# Referência rápida do Signer

O essencial do Lacuna Signer em uma página, com links para as páginas completas.

## Para que serve

O Lacuna Signer é um gerenciador de documentos e assinaturas: sua aplicação faz upload de um arquivo e define um fluxo de participantes (signatários e aprovadores, em sequência ou em paralelo), e o Signer os notifica, coleta as assinaturas digitais ou eletrônicas deles e devolve o arquivo assinado.   Ele funciona como SaaS em [dropsigner.com](https://www.dropsigner.com/) ou como uma instância [on-premises](https://docs.lacunasoftware.com/articles/signer/on-premises) própria, e você integra pela API REST, pelas bibliotecas cliente usadas nos exemplos e por um widget de assinatura que pode ser embutido na sua página.   

| Prefira | Quando |
|---|---|
| [Rest PKI Core](https://docs.lacunasoftware.com/articles/rest-pki/core/quick-reference) | Você quer assinaturas dentro da sua própria aplicação, sem um fluxo de documentos: sua aplicação cria uma sessão, envia o usuário para uma página hospedada pelo Rest PKI Core e recebe o resultado de volta. Ele também valida assinaturas, aplica carimbos de tempo e verifica identidade biométrica. |
| [PKI SDK](https://docs.lacunasoftware.com/articles/pki-sdk/quick-reference) | Sua aplicação é .NET e precisa criar ou validar assinaturas CMS/CAdES, PDF/PAdES ou XmlDSig/XAdES, ou validar certificados X.509, no próprio código. |
| [PKI Express](https://docs.lacunasoftware.com/articles/pki-express/quick-reference) | Você precisa desses mesmos formatos de assinatura em praticamente qualquer linguagem, no seu próprio servidor Windows ou Linux, com um arquivo de licença. |
| [Web PKI](https://docs.lacunasoftware.com/articles/web-pki/quick-reference) | Sua página web precisa acessar os certificados do usuário por JavaScript (listá-los, lê-los, assinar dados) enquanto um SDK no servidor monta a assinatura. O próprio widget do Signer já depende de uma licença do Web PKI para o seu domínio. |
| [Bulk Signer](https://docs.lacunasoftware.com/articles/bulk-signer) | Os arquivos precisam ser assinados em lote na sua própria infraestrutura, com um certificado mantido pelo servidor, sem uma pessoa no processo. O Bulk Signer também pode encaminhar ao Signer os arquivos de um perfil de assinatura quando uma pessoa precisa assinar. |

## Instalação

| Linguagem | Pacote | Versão major atual | Registro |
|---|---|---|---|
| .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 (navegador), assinatura embutida | `lacuna-signer-widget` | 0 (0.8.0) | [Script na CDN](https://cdn.lacunasoftware.com/libs/signer/lacuna-signer-widget-0.8.0.min.js), [npm](https://www.npmjs.com/package/lacuna-signer-widget) |

Instale com `dotnet add package Lacuna.Signer.Client`, Gradle `implementation 'com.lacunasoftware.signer:signer-client:2.14.0'`, `npm install signer-node-client` ou `composer require lacuna/signer-client`. Veja [Bibliotecas cliente](https://docs.lacunasoftware.com/articles/signer/integration-guide#bibliotecas-cliente). 

Os exemplos fixam 1.17.0 (.NET), 2.13.0 (Java), `^1.1.0` (Node.js) e 1.4.10 (PHP), todas na versão major atual. Sem uma biblioteca cliente, chame a API REST diretamente, como fazem os [Primeiros passos](https://docs.lacunasoftware.com/articles/signer/get-started) com curl.  

## Configuração e autenticação

* **Chave de API.** Toda requisição leva a chave no header `X-Api-Key`, no formato `nome-da-aplicacao|<chave>`. Se você tem permissão para criar aplicações na sua organização, crie uma em **Aplicações** e gere a chave com o botão **Chaves** dela; caso contrário, peça uma chave ao administrador da sua instância. A chave é exibida uma única vez e só enxerga e cria documentos daquela organização. Veja [Primeiros passos](https://docs.lacunasoftware.com/articles/signer/get-started) e o [Guia de Integração](https://docs.lacunasoftware.com/articles/signer/integration-guide).  
* **Chaves de administração e de monitoramento.** As APIs de administração (usuários e organizações) exigem uma chave de uma aplicação da organização `Sys Admin`; as APIs de monitoramento de consumo exigem uma com o papel `Monitor`. Veja [APIs de Administração](https://docs.lacunasoftware.com/articles/signer/on-premises/administration) e [Monitoramento de consumo](https://docs.lacunasoftware.com/articles/signer/on-premises/consumption-monitoring).  
* **Referência da API.** [Swagger](https://www.dropsigner.com/swagger) e a cópia do OpenAPI em https://docs.lacunasoftware.com/openapi/signer.json, com o título "Dropsigner", versão 2.16.1.  

| Ambiente | URL base |
|---|---|
| Produção, em nuvem (Dropsigner SaaS) | `https://www.dropsigner.com` |
| Produção, on-premises | A URL da sua instância, como `https://signer.suaempresa.com.br` |
| Sandbox, para desenvolvimento e testes | `https://signer-lac.azurewebsites.net` |

O cliente recebe a URL da instância e a chave de API; troque as duas juntas ao passar para produção.  

```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): as páginas da documentação do Signer não mencionam o sandbox (só os exemplos o mencionam), nem como obter uma organização e uma chave de API nele.

## Operações principais

Os blocos abaixo são em PHP, a linguagem com mais exemplos no catálogo; [Experimente](https://docs.lacunasoftware.com/articles/signer/quick-reference#experimente) traz as mesmas tarefas em C#, Java e Node.js, quando existem. 

### Fazer upload de um arquivo

Envie o arquivo primeiro; o `id` de upload da resposta é o que o documento referencia. `POST /api/uploads/bytes` recebe os bytes em Base64, em JSON (o mais simples), e `POST /api/uploads` recebe multipart/form-data (melhor para arquivos grandes); em PHP, `uploadFile`. Veja [Criar documentos](https://docs.lacunasoftware.com/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);
```

### Criar um documento com um fluxo

Crie o documento a partir do upload e defina quem age e em que ordem: cada item de `flowActions` tem um `type` (`Signer`, `Approver`, `SignRule` ou `ApproverRule`), um `step` (ações no mesmo step acontecem em paralelo, e um step maior acontece depois) e um `user` (`name`, `identifier`, `email`). `POST /api/documents`; em PHP, `createDocument`. A resposta traz um par `uploadId` e `documentId` por arquivo. O Signer envia e-mail aos participantes do primeiro passo imediatamente, a menos que você envie `disablePendingActionNotifications: true`. Veja [Criar documentos](https://docs.lacunasoftware.com/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];
```

### Obter a URL de assinatura (assinatura embutida)

Para que o participante assine dentro da sua aplicação em vez de pelo e-mail, peça a URL de ação dele, identificando o participante por `identifier` (a documentação também envia `emailAddress`): `POST /api/documents/{id}/action-url`; em PHP, `getActionUrl`. A resposta traz `url`, para redirecionar o usuário à página de assinatura do Signer, e `embedUrl`, que você passa ao método `render` do `LacunaSignerWidget` na sua página. Combine com `disablePendingActionNotifications: true` na criação. O widget exige que o Signer esteja configurado com uma licença do Web PKI para o domínio da sua página. Veja [Assinatura Embutida](https://docs.lacunasoftware.com/articles/signer/embedded-signature).    

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

### Verificar o status do documento

`GET /api/documents/{id}`; em PHP, `getDocumentDetails`. O documento está finalizado quando `status` é `Concluded` (os demais são `Pending`, `FlowConcluded`, `Refused`, `Canceled` e `Expired`), e um participante concluiu a ação dele quando o item correspondente em `flowActions` tem `status` `Completed`. Em produção, use webhooks em vez de polling. Veja [Acompanhar documentos](https://docs.lacunasoftware.com/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";
    }
}
```

### Baixar o arquivo assinado

`GET /api/documents/{id}/content?type=...`; em PHP, `getDocumentContent`. `Signatures` é o arquivo assinado (o PDF com as assinaturas embutidas, ou um `.p7s` para CAdES), `PrinterFriendlyVersion` é um PDF com o manifesto de assinaturas e `Original` é o arquivo enviado. Documentos cancelados, expirados ou recusados só podem ser baixados como `Original` e `PrinterFriendlyVersion`, e um documento que ninguém assinou ainda não tem `Signatures` nem `PrinterFriendlyVersion`: verifique `hasSignature` e `status` antes. `GET /api/documents/{id}/content-b64` devolve os bytes em Base64, em JSON. Veja [Baixar e listar](https://docs.lacunasoftware.com/articles/signer/integration/download-and-list#quando-uma-versão-não-pode-ser-baixada).   

```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);
```

### Receber webhooks

Cadastre a sua URL na tela da **Organização**, seção **Integração**, ou com `POST /api/organizations/{orgId}/webhooks` (`url`, `authType`, `token`). O Signer passa então a enviar um `POST` com `{ "type": "...", "data": { ... } }` para `DocumentsCreated`, `DocumentSigned`, `DocumentApproved`, `DocumentRefused`, `DocumentConcluded`, `DocumentCanceled`, `DocumentExpired` e `DocumentDeleted`. Ele não assina o corpo: verifique o header que você escolheu, como `Authorization: Bearer <token>`, responda 2xx imediatamente (qualquer outra resposta gera novas tentativas, por padrão até 10), torne o processamento idempotente e consulte o documento de novo, porque os eventos podem chegar fora de ordem. Veja [Webhooks](https://docs.lacunasoftware.com/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;
    }
}
```

### Cancelar, recusar ou excluir um documento

`POST /api/documents/{id}/cancellation` e `POST /api/documents/{id}/refusal`, cada um com um `reason`, e `DELETE /api/documents/{id}`; em PHP, `cancelDocument`, `refuseDocument` e `deleteDocument`. Chame a operação de que você precisa. Veja [Ciclo de vida do documento](https://docs.lacunasoftware.com/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);
```

## Erros

A API responde com um código de status HTTP: `400` para um erro de sintaxe, como um campo obrigatório que não foi enviado; `401` quando a chave de API não foi enviada ou é inválida; `403` quando a chave é válida, mas a aplicação não tem permissão para a operação; e `422` para um erro da API, cujo corpo JSON (`ErrorModel`) tem `code`, `message` e `details`. Um id de entidade que não é encontrado também gera `422`. Teste o `code`, e não a mensagem. Veja [Respostas de erro](https://docs.lacunasoftware.com/articles/signer/integration-guide#respostas-de-erro).  

Os primeiros que um integrador encontra:
* `401` ou `403` na primeira chamada: a chave é inválida, foi revogada ou pertence a outra organização. 
* `DocumentNotFound` e `InvalidFlowAction`, entre os principais códigos que a referência da API lista (a lista não é completa, e novos códigos podem surgir).  
* `DocumentHasNoSignatures` (`422`): baixar `Signatures` ou `PrinterFriendlyVersion` de um documento que ninguém assinou ainda. 
* `MaxWebhooksLimitReached` (mais webhooks que o limite `MaxWebhooksPerOrganization`, 5 por padrão) e `OperationNotSupportedInPersonalOrganizations` ao cadastrar um webhook. 

Em PHP, as chamadas do cliente lançam uma exceção cuja mensagem traz a exceção interna inteira, mas `getDocumentContent` não lança exceção em erros HTTP: ele devolve o corpo JSON do erro, então verifique os detalhes do documento antes de salvar o conteúdo como arquivo.  

## Certificados e credenciais de teste

* [Certificados de teste](https://docs.lacunasoftware.com/articles/pki-guide/test-certs#signer): a ICP de testes da Lacuna Software. O cenário de assinatura pública dos exemplos assina no sandbox com um deles, o certificado do CPF 56072386105.  
* Sandbox `https://signer-lac.azurewebsites.net`: os exemplos rodam nele com uma chave de exemplo compartilhada; para usar a sua própria organização, troque-a por uma chave sua. Cada execução cria documentos reais e o Signer envia e-mail aos participantes, por isso os exemplos usam endereços `@mailinator.com` fictícios. 
* Assinatura em nuvem no widget: o exemplo online usa o certificado de teste do BirdID (CPF 026.102.470-10), pareado por um QR code no aplicativo BirdID. Veja [Assinatura Embutida](https://docs.lacunasoftware.com/articles/signer/embedded-signature). 
* Por padrão, uma instância do Signer aceita só certificados ICP-Brasil; a página [TrustArbitrator](https://docs.lacunasoftware.com/articles/signer/on-premises/trust-arbitrator) mostra como aceitar outras ACs raiz. 
* TODO(docs): quais certificados de teste o Dropsigner e o sandbox aceitam.

## Experimente

Demonstrações online e os exemplos de cada linguagem:

**Demonstrações e exemplos**

- Demonstração: [Sign a document](https://try.lacunasoftware.com/pt/signer/sign-a-document)
- Demonstração: [Sign without leaving your page](https://try.lacunasoftware.com/pt/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)
