---
title: "PKI Express quick reference"
description: "PKI Express on one page: install the server binaries and client package, activate the license, configure, sign, validate, timestamp and handle errors."
canonical: "https://docs.lacunasoftware.com/en-us/articles/pki-express/quick-reference"
locale: "en"
product: "PKI Express"
last_updated: "2026-10-12"
---

# PKI Express quick reference

The essentials of PKI Express on one page, with links to the full pages.

## What it is for

PKI Express creates CMS/CAdES, PDF/PAdES and XmlDSig/XAdES digital signatures from virtually any programming language, on your own Windows or Linux servers. 
You install it on the server and drive it through a client library for Java, Node.js, PHP, Python or Ruby; to sign with the user's certificate on a web page, it works together with Web PKI. 

| Choose instead | When it fits better |
|---|---|
| [PKI SDK](https://docs.lacunasoftware.com/en-us/articles/pki-sdk/quick-reference) | Your application is .NET: PKI SDK is a library for .NET applications, and the PKI guide recommends it for server signatures in .NET  |
| [Rest PKI Core](https://docs.lacunasoftware.com/en-us/articles/rest-pki/core/quick-reference) | You would rather call a REST API than install software on your servers: use it as a service at core.pki.rest or as your own instance; it also hosts the page where the user signs  |
| [Web PKI](https://docs.lacunasoftware.com/en-us/articles/web-pki/quick-reference) | You need the browser side: listing the user's certificates and signing with them on a web page. It complements PKI Express rather than replacing it  |
| [Signer](https://docs.lacunasoftware.com/en-us/articles/signer/quick-reference) | You want to send documents to people and collect their signatures with a ready-made workflow, as SaaS or on-premises, instead of building the flow  |

## Install

Two parts: PKI Express itself, on each server that runs your application, and the client package for your language. 

| Language | Package | Current major | Registry |
|---|---|---|---|
| PKI Express, Windows Server 2008 R2+ / Windows 7+ (needs .NET Framework 4.6.1) | `pkie-1.38.0-x64.msi` installer; x86 and zip packages on [the setup page](https://docs.lacunasoftware.com/en-us/articles/pki-express/setup/windows) | 1 (1.38.0) | [cdn.lacunasoftware.com](https://cdn.lacunasoftware.com/pki-express/windows/pkie-1.38.0-x64.msi)  |
| PKI Express, Linux (Ubuntu/Mint, RHEL, CentOS/Oracle Linux/Fedora) | `pkie-1.38.0.tar.gz` ([setup](https://docs.lacunasoftware.com/en-us/articles/pki-express/setup)) | 1 (1.38.0) | [cdn.lacunasoftware.com](https://cdn.lacunasoftware.com/pki-express/linux/pkie-1.38.0.tar.gz)  |
| Java | `com.lacunasoftware.pkiexpress:pki-express` | 1 (1.23.1) | [Maven Central](https://search.maven.org/artifact/com.lacunasoftware.pkiexpress/pki-express)  |
| Node.js | `pki-express` | 1 (1.16.2) | [npm](https://www.npmjs.com/package/pki-express)  |
| PHP 5.5+ | `lacuna/pki-express` | 1 (1.17.0) | [Packagist](https://packagist.org/packages/lacuna/pki-express)  |
| Python | `pkiexpress` | 1 (1.10.4) | [PyPI](https://pypi.org/project/pkiexpress)  |
| Ruby | `pki_express` | 1 (1.3.2) | [RubyGems](https://rubygems.org/gems/pki_express)  |

On Linux, extract the package to `/usr/share/pkie`, link `/usr/share/pkie/pkie` into `/usr/local/bin`, set the log folder and run `sudo pkie activate LacunaPkiLicense.config`; the [Ubuntu](https://docs.lacunasoftware.com/en-us/articles/pki-express/setup/linux-ubuntu), [RHEL](https://docs.lacunasoftware.com/en-us/articles/pki-express/setup/linux-rhel) and [CentOS](https://docs.lacunasoftware.com/en-us/articles/pki-express/setup/linux-centos) pages give the commands. To update, run the new installer (Windows) or replace the contents of `/usr/share/pkie` with the new package (Linux). 

## Configuration and authentication

**License, no API key.** PKI Express needs a license file, `LacunaPkiLicense.config`; ask Lacuna for a free trial license. Activate it once per machine: `pkie activate` on Linux ([manual activation](https://docs.lacunasoftware.com/en-us/articles/pki-express/setup/manual-activation) if the network activation fails), the *PKI Express Configuration Manager* (`pkiemgr.exe`, in the installation folder) on Windows. Your application does not read the license, and there is no service URL: the client library runs the PKI Express installed on the same machine. 

**Server settings** are set with `pkie config --set name=value` (administrator privileges); `pkie config --effective` shows the values in use. 

| Setting | Keys | Page |
|---|---|---|
| Log folder and minimum level | `logDir`, `logLevel` | [Logging](https://docs.lacunasoftware.com/en-us/articles/pki-express/config/log) |
| Temporary folder (cache of CRLs and CA certificates) | `tempDir` | [Temporary directory](https://docs.lacunasoftware.com/en-us/articles/pki-express/config/temp-dir) |
| Proxy | `proxyHost`, `proxyPort`, `proxyUsername`, `proxyPassword` | [Proxy](https://docs.lacunasoftware.com/en-us/articles/pki-express/config/proxy) |
| LAPP, to fetch CRLs and CA certificates through `*.lacunasoftware.com` (support must also authorize it) | `lappEnabled` | [LAPP](https://docs.lacunasoftware.com/en-us/articles/pki-express/config/lapp) |
| Keys in Azure Key Vault | `azureAppId`, `azureAppSecret`, `azureKeyVaultEndpoint` | [Azure](https://docs.lacunasoftware.com/en-us/articles/pki-express/config/azure) |
| Cloud certificates (BirdID, NeoID, RemoteID, SafeID, VIDaaS, others) | `trustServices:<service>:clientId`, `trustServices:<service>:clientSecret`, `trustServices:<service>:endpoint` | [Cloud certificates](https://docs.lacunasoftware.com/en-us/articles/pki-express/config/trust-services)  |
| Keys on PKCS#11 tokens and HSMs | `pkcs11LibraryPath` | [Changelog 1.38.0](https://docs.lacunasoftware.com/en-us/articles/pki-express/changelog#v1-38-0) |

TODO(docs): `pkcs11LibraryPath` (PKI Express 1.38.0) has no configuration page; only the changelog names it, and neither the client libraries nor any published help text describe it.

**In your code**, every operation class inherits `PkiExpressOperator`, whose settings the samples apply in one helper, `Util.setPkiDefaults()`, called by every block below: 

- what to trust: only ICP-Brasil certificates by default; add roots with `addTrustedRootSync()`, or the Lacuna test root with `trustLacunaTestRoot` ([trusting custom certificates](https://docs.lacunasoftware.com/en-us/articles/pki-express/nodejs/trusting-in-custom-certificates)); 
- `timestampAuthority`, a `TimestampAuthority` for policies that need a timestamp: the samples use REST PKI's, `https://pki.rest/tsp/a402df41-8559-47b2-a05c-be555bf66310`, with a REST PKI access token (`setOAuthTokenAuthentication()`); user and password, and mutual SSL, also work ([timestamp authority](https://docs.lacunasoftware.com/en-us/articles/pki-express/php/configuring-timestamp-authority)); 
- `offline`, to run without network access. 

Each class also takes an optional `PkiExpressConfig` (PKI Express folder, temporary folder, transfer data folder): without it, the libraries look for PKI Express in the default Windows installation folders, and run `pkie` from the `PATH` on Linux. On Linux, only the Java library can run PKI Express 1.31.0 or later from a custom folder; see [client library settings](https://docs.lacunasoftware.com/en-us/articles/pki-express/config#client-library). 

## Core operations

The blocks are trimmed from the Node.js samples (`nodejs/expressmvc/routes/` in PkiSuiteSamples), the language with the most PKI Express samples. Policy names come from `StandardSignaturePolicies` and differ from Rest PKI's: see the [equivalence table](https://docs.lacunasoftware.com/en-us/articles/pki-express/nodejs/convert-from-restpki). 

TODO(docs): apart from the Java PAdES walkthrough ([how it works](https://docs.lacunasoftware.com/en-us/articles/pki-express/java/how-it-works)) and the PHP project map ([PHP samples](https://docs.lacunasoftware.com/en-us/articles/pki-express/php/plain)), no page documents these operations; the code below comes from the samples.

### Sign a PDF with the user's certificate
PAdES with the key on the user's computer, in two server steps: `PadesSignatureStarter.start()` returns the hash that Web PKI signs in the browser (`signHash()`), and `SignatureFinisher.complete()` writes the signed PDF. Step by step in Java: [how it works](https://docs.lacunasoftware.com/en-us/articles/pki-express/java/how-it-works); signature stamp: [visual representation](https://docs.lacunasoftware.com/en-us/articles/pki-express/nodejs/visual-rep). 

```js
// POST /start: certContent is the user's certificate, read by Web PKI
const signatureStarter = new PadesSignatureStarter();
Util.setPkiDefaults(signatureStarter);
signatureStarter.signaturePolicy = StandardSignaturePolicies.PADES_BASIC_WITH_LTV;
signatureStarter.setPdfToSignFromPathSync(StorageMock.getDataPath(fileId));
signatureStarter.setCertificateFromBase64Sync(certContent);
signatureStarter.start().then((response) => { /* toSignHash, digestAlgorithm, transferFile */ });

// POST /complete: signature is the result of Web PKI's signHash()
const signatureFinisher = new SignatureFinisher();
Util.setPkiDefaults(signatureFinisher);
signatureFinisher.setFileToSignFromPathSync(StorageMock.getDataPath(fileId));
signatureFinisher.setTransferFileFromPathSync(transferFile);
signatureFinisher.signature = signature;
signatureFinisher.outputFile = path.join(APP_ROOT, 'app-data', outputFile);
signatureFinisher.complete(true).then((result) => { /* signed PDF at outputFile */ });
```

### Sign a PDF with a server key
One step, no browser: `PadesSigner.sign()` signs with a PKCS #12 file on the server. 

```js
const signer = new PadesSigner();
Util.setPkiDefaults(signer);
signer.signaturePolicy = StandardSignaturePolicies.PADES_BASIC_WITH_LTV;
await signer.setPdfToSignFromPath(StorageMock.getDataPath(fileId));
await signer.setPkcs12FromPath(StorageMock.getSamplePkcs12Path());
signer.certPassword = '1234';
signer.outputFile = path.join(APP_ROOT, 'app-data', outputFile);
let signerCert = await signer.sign(true);
```

### Sign a file with CAdES
`CadesSignatureStarter` follows the same start/complete flow, finished by `SignatureFinisher` (output `.p7s`); if the file is already a CMS, PKI Express co-signs it. 

```js
const signatureStarter = new CadesSignatureStarter();
Util.setPkiDefaults(signatureStarter);
signatureStarter.signaturePolicy = StandardSignaturePolicies.PKI_BRAZIL_CADES_ADR_BASICA;
signatureStarter.setFileToSignFromPathSync(StorageMock.getDataPath(fileId));
signatureStarter.setCertificateFromBase64Sync(certContent);
signatureStarter.start().then((response) => { /* same as the PDF flow */ });
```

### Sign an XML document
`XmlSigner.sign()` signs with a server key; with the user's certificate, use `XmlSignatureStarter` and `SignatureFinisher` as in the PDF flow. 

```js
const signer = new XmlSigner();
Util.setPkiDefaults(signer);
signer.signaturePolicy = StandardSignaturePolicies.XADES_BES;
await signer.setXmlToSignFromPath(StorageMock.getSampleDocPath(SampleDocs.SAMPLE_XML));
await signer.setPkcs12FromPath(StorageMock.getSamplePkcs12Path());
signer.certPassword = '1234';
signer.outputFile = path.join(APP_ROOT, 'app-data', outputFile);
let signerCert = await signer.sign(true);
```

### Validate a signed PDF
`PadesSignatureExplorer.open()` returns the file's signatures and, with `validate = true`, validates them; `CadesSignatureExplorer` does the same for CMS/CAdES. 

```js
const sigExplorer = new PadesSignatureExplorer();
Util.setPkiDefaults(sigExplorer);
sigExplorer.validate = true;
sigExplorer.setSignatureFileFromPathSync(filePath);
sigExplorer.signaturePolicy = StandardSignaturePolicies.PADES_BASIC;
sigExplorer.open().then((r) => res.render('open-pades-express', { signature: r }));
```

### Timestamp a PDF
`PadesTimestamper.stamp()` adds a timestamp to a PDF, using the operator's timestamp authority. 

```js
const stamper = new PadesTimestamper();
Util.setPkiDefaults(stamper);
stamper.setPdfFromPath(pdfPath).then(() => {
	stamper.setOutputFilePath(outputFilePath);
	stamper.stamp().then(() => { /* timestamped PDF at outputFilePath */ });
});
```

### Make a printer-friendly version
After opening the signatures with `PadesSignatureExplorer`, `PdfMarker.apply()` stamps texts and images built with `PdfHelper` on the PDF, such as the signers' names and a verification code. 

```js
const pdfMarker = new PdfMarker();
Util.setPkiDefaults(pdfMarker);
pdfMarker.setFileFromPathSync(pdfPath);
const pdf = new PdfHelper();
pdfMarker.marks.push(pdf.mark().onAllPages()
	.onContainer(pdf.container().width(1).anchorRight(1).height(1).anchorBottom(1))
	.addElement(pdf.imageElement().withOpacity(75).withImageContent(Util.getIcpBrasilLogoContent(), 'image/png')));
pdfMarker.outputFile = path.join(APP_ROOT, 'app-data', outputFile);
pdfMarker.apply();
```

### Authenticate with a certificate
`Authentication.start()` returns a nonce and digest algorithm for Web PKI to sign; `complete()` checks the signature and validates the certificate. 

```js
const auth = new Authentication();
Util.setPkiDefaults(auth);
auth.setNonce(nonce); // from auth.start(), signed in the browser by Web PKI
await auth.setCertificateFromBase64(certContent);
auth.setSignature(signature);
const result = await auth.complete();
if (result.validationResults.isValid()) { const userCert = result.certificate; }
```

## Errors

Each PKI Express operation ends with a return code, `00 - Ok` or an error from `01` to `43`; signatures, authentications and inspections with validation also report validation errors such as `CertificateChainRootNotTrusted`. Full list: [return codes](https://docs.lacunasoftware.com/en-us/articles/pki-express/return-codes). 
In Node.js, a failed operation rejects its promise with a `CommandError` whose `code` is the return code (`ValidationError` for code 14, `InstallationNotFoundError` when PKI Express is not found); the samples pass it to `next(err)`. PHP throws `CommandException` (`$e->returnCode`), Ruby `PkiExpress::CommandError` (`e.code.exitstatus`); Java and Python throw a plain exception with the output in the message: see [return codes in the client libraries](https://docs.lacunasoftware.com/en-us/articles/pki-express/return-codes#client-libraries). 

| Error | Meaning | What to do |
|---|---|---|
| `17 - NotActivated` | PKI Express is not activated on this machine | Activate it with the license ([setup](https://docs.lacunasoftware.com/en-us/articles/pki-express/setup))  |
| `14 - ValidationFailed` with `CertificateChainRootNotTrusted` | The certificate's root is not trusted; by default, only ICP-Brasil is | Trust the root: `trustLacunaTestRoot` or `addTrustedRootSync()` ([trusting custom certificates](https://docs.lacunasoftware.com/en-us/articles/pki-express/nodejs/trusting-in-custom-certificates))  |
| `CertificateRevocationStatusUnknown` | PKI Express could not access the certificate's CRLs | Configure the [proxy](https://docs.lacunasoftware.com/en-us/articles/pki-express/config/proxy) or [LAPP](https://docs.lacunasoftware.com/en-us/articles/pki-express/config/lapp)  |
| `32 - TimestampOptionsRequired` | No timestamp authority given, and the policy requires a timestamp | Set the operator's `timestampAuthority` ([timestamp authority](https://docs.lacunasoftware.com/en-us/articles/pki-express/php/configuring-timestamp-authority))  |

## Test certificates and credentials

- [Test certificates](https://docs.lacunasoftware.com/en-us/articles/pki-guide/test-certs): PKCS #12 files from the Lacuna Test PKI, password `1234`; never trust this PKI in production. 
- PKI Express accepts them only after you trust the Lacuna test root: `trustLacunaTestRoot` ([Node.js](https://docs.lacunasoftware.com/en-us/articles/pki-express/nodejs/trusting-in-custom-certificates), [Java](https://docs.lacunasoftware.com/en-us/articles/pki-express/java/trusting-in-custom-certificates), [PHP](https://docs.lacunasoftware.com/en-us/articles/pki-express/php/trusting-in-custom-certificates)) or `trust_lacuna_test_root` ([Python](https://docs.lacunasoftware.com/en-us/articles/pki-express/python/trusting-in-custom-certificates), [Ruby](https://docs.lacunasoftware.com/en-us/articles/pki-express/ruby/trusting-in-custom-certificates)). 
- License: request a [free trial license](https://www.lacunasoftware.com/en/home/purchase) and activate it as in [Configuration and authentication](https://docs.lacunasoftware.com/en-us/articles/pki-express/quick-reference#configuration). 

## Try it

Run the demos, or start from a sample in your language:

**Demos and samples**

- Live demo: [Sign a file with your certificate](https://try.lacunasoftware.com/en/pki-suite/sign-a-file)
- Live demo: [Sign a PDF with your cloud certificate](https://try.lacunasoftware.com/en/pki-suite/sign-with-cloud-certificate)
- Live demo: [Timestamp a PDF](https://try.lacunasoftware.com/en/pki-suite/timestamp-a-pdf)
- Live demo: [Validate a signed file](https://try.lacunasoftware.com/en/pki-suite/validate-a-signed-file)
- Live demo: [Make a printer-friendly version](https://try.lacunasoftware.com/en/pki-suite/printer-friendly-version)
- Live demo: [Your certificates in the browser](https://try.lacunasoftware.com/en/web-pki/certificates-in-the-browser)
- Sign a PDF with PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/PadesSignatureExpressController.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/pades-signature-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/pades-signature-express/index.php) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/pades_signature_express.py) · [Ruby](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/ruby/rails/app/controllers/pades_signature_express_controller.rb)
- Sign multiple PDFs with PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/BatchPadesSignatureExpressController.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/batch-pades-signature-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/batch-pades-signature-express/index.php) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/batch_pades_express.py) · [Ruby](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/ruby/rails/app/controllers/batch_pades_express_controller.rb)
- Sign a PDF with a server key using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/PadesServerKeyExpressController.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/pades-server-key-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/pades-server-key-express/index.php) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/pades_server_key_express.py) · [Ruby](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/ruby/rails/app/controllers/pades_server_key_express_controller.rb)
- Sign a PDF with a cloud certificate (OAuth flow) using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/PadesCloudOauthExpressController.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/pades-cloud-oauth-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/pades-cloud-oauth-express/index.php) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/pades_cloud_oauth_express.py) · [Ruby](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/ruby/rails/app/controllers/pades_cloud_oauth_express_controller.rb)
- Sign a PDF with a cloud certificate (password flow) using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/PadesCloudPwdExpressController.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/pades-cloud-pwd-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/pades-cloud-pwd-express/index.php) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/pades_cloud_pwd_express.py) · [Ruby](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/ruby/rails/app/controllers/pades_cloud_pwd_express_controller.rb)
- Timestamp a PDF with PKI Express: [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/timestamp-pdf-express.js) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/timestamp_pdf_express.py)
- Sign a file with CAdES using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/CadesSignatureExpressController.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/cades-signature-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/cades-signature-express/index.php) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/cades_signature_express.py) · [Ruby](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/ruby/rails/app/controllers/cades_signature_express_controller.rb)
- Sign multiple files with CAdES using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/BatchCadesSignatureExpressControler.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/batch-cades-signature-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/batch-cades-signature-express/index.php) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/batch_cades_express.py) · [Ruby](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/ruby/rails/app/controllers/batch_cades_express_controller.rb)
- Sign a file with CAdES and a server key using PKI Express: [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/cades-server-key-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/cades-server-key-express/index.php) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/cades_server_key_express.py)
- Sign a file with CAdES and a cloud certificate (OAuth flow) using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/CadesCloudOauthExpressController.java)
- Merge CMS/CAdES signatures using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/MergeCadesExpressController.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/merge-cades-express.js) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/merge_cades_express.py)
- Sign an XML document using PKI Express: [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/xml-signature-express.js)
- Sign an XML document with a server key using PKI Express: [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/xml-server-key-express.js)
- Sign an XML document with a cloud certificate (OAuth flow) using PKI Express: [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/xml-cloud-oauth-express.js)
- Sign a Brazilian NF-e using PKI Express: [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/xml-nfe-signature-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/xml-nfe-signature-express/index.php)
- Sign a COD XML using PKI Express: [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/xml-cod-signature-express/index.php)
- Validate a signed PDF using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/OpenPadesExpressController.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/open-pades-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/open-pades-express/index.php) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/open_pades_express.py) · [Ruby](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/ruby/rails/app/controllers/open_pades_express_controller.rb)
- Validate a CMS/CAdES signature using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/OpenCadesExpressController.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/open-cades-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/open-cades-express/index.php) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/open_cades_express.py)
- Validate a signed XML using PKI Express: [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/open-xml-express/index.php)
- Make a printer-friendly version of a signed PDF using PKI Express: [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/printer-version-pades-express.js) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/printer_version_pades_express.py)
- Make a printer-friendly version of a CMS/CAdES signature using PKI Express: [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/printer-version-cades-express.js)
- Authenticate with a digital certificate using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/AuthenticationExpressController.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/authentication-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/authentication-express/index.php) · [Python](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/python/flask/sample/views/authentication_express.py)
- Authenticate with a cloud certificate (OAuth flow) using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/AuthenticationCloudExpressController.java)
- Sign a medical prescription (Receita Simples) using PKI Express: [Java](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/java/springmvc/src/main/java/com/lacunasoftware/pkisuite/controller/ReceitaSimplesExpressController.java) · [Node.js](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/nodejs/expressmvc/routes/receita-simples-express.js) · [PHP](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/php/plain/public/receita-simples-express/index.php) · [Ruby](https://github.com/LacunaSoftware/PkiSuiteSamples/blob/master/ruby/rails/app/controllers/receita_simples_express_controller.rb)
