DoConure

Qualified seal and qualified timestamp

Two things a finished document can carry that let it prove itself without us. They work on all three APIs — composition, signature and the one-call flow — and they are bought separately from the products themselves.

What it provesWho says so
qeSeal these bytes left this organisation in this form and nobody has touched them since (eIDAS Art. 35) us, with a qualified certificate a QTSP issued
qualifiedTimestamp these exact bytes existed at this hour (eIDAS Art. 41) an independent timestamping authority

Neither one changes the signature level. A seal is the act of a legal person and says nothing about who signed; the signature stays SES either way. See Signature levels — the distinction matters, and a document you are comparing us against probably blurs it.

Available now, to every organisation that is not a test organisation. A seal is 2 credits, a seal with its qualified timestamp 6 (the timestamp is 4 and is never sold alone). Gift credit pays for them like any other credit. An organisation that registers itself holds both by default; one opened by an operator holds them when the operator turns them on. They are asked for per call (qeSeal, qualifiedTimestamp) or by your organisation's own setting.

What they say, and what they do not. The seal is applied with DoConure's organisational certificate, not one in your organisation's name. It says the file came from DoConure and has not been altered since; it does not say who signed (that is the signature, which stays SES). With the timestamp the file is PAdES B-LT: it keeps validating after the certificate expires.

What comes back. Paid first, and what a problem leaves unused returns to the credit it came from. An envelope pays its seal and timestamp with the signature at the send; if it is cancelled, expires or is declined, they are returned (the signature is not); if they cannot be applied when the last signer finishes, they are returned at once, and so are they when the provider received the request and its answer was lost (we never repeat it). Each return is a line in your audit trail with its code (ATTESTATION_REFUNDED_*, 2130 to 2132).

It needs an external provider that has been configured for the platform, the feature enabled for your organisation, and a valid production configuration. Until all three are in place, a request that asks for one is refused with TRUST_PROVIDER_NOT_CONFIGURED or FEATURE_NOT_ENABLED, never answered with an unsealed document. A simulated provider is reported as not qualified.

Asking for one

Both are optional in settings and tri-state: true asks for it, false refuses it, and leaving the key out hands the decision to your organisation's own setting (see the table below). Sending false applies nothing and charges nothing.

POST /api/v1/compose/documents/generate
Authorization: Bearer lpdc_…

{
  "data": { "cliente": "Acme S.r.l." },
  "settings": {
    "templateId": "contract",
    "qeSeal": true,
    "qualifiedTimestamp": true
  }
}

On the signature API the same two capabilities have been called seal and timestamp since 2026-09-18, and they still are — a published field is permanent here. qeSeal and qualifiedTimestamp are accepted there too, as aliases, so one vocabulary works across all three surfaces and nothing already written breaks.

POST /api/v1/sign/envelopes

{
  "signers": { … },
  "settings": {
    "documentId": "…",
    "subject": "Service agreement",
    "qeSeal": true
  }
}

On an envelope the two are recorded as an intent and acted on when the last signer finishes, which may be days later. On a composition they are applied inside the call.

The four combinations, and what each produces

The timestamp is an option of the seal, not a product of its own: you can have the seal without it, never the other way round. A seal is a fixed annual certificate and a timestamp costs money every time, so buying origin without buying time is a position a customer is entitled to take — and the PAdES profile that results is reported back in output.compose.trust.padesProfile so nobody discovers in 2031 that they bought a seal and not ten years.

qeSealqualifiedTimestampProfileWhat it is worth
falsefalsenullan ordinary PDF
falsetrue—refused with TIMESTAMP_REQUIRES_SEAL (1012): the timestamp is an option of the seal and is never applied on its own — see below
truefalseB-Borigin, until the certificate expires — after which it cannot be validated
truetrueB-T or B-LTorigin and time. B-LT keeps validating after the certificate expires

What they cost. A seal applied by a qualified provider is 2 credits and its qualified timestamp 4 (6 together), paid at the send for an envelope and with the document for a composition. A seal or timestamp from a provider that is not qualified (a test or simulated one, reported with TRUST_NOT_QUALIFIED and "qualified": false) costs nothing: it attests nothing, so it is not sold. The dry run's estimatedCredits follows the same rule. What is returned when one is not applied is described at the top of this page.

Your organisation has to hold the capability

These are sold separately from the three products. An organisation that registered itself holds both from the start; for one an operator opened, we turn them on. Your administrator can see which ones are active under Settings → Trust and compliance in the console; only we can change them.

A request that asks for one you do not hold is refused:

403 Forbidden

{
  "code": "FEATURE_NOT_ENABLED",
  "number": 1007,
  "message": "Qualified electronic seal is not enabled for this organisation…",
  "details": {
    "feature": "qeSeal",
    "enabled": { "qeSeal": false, "qualifiedTimestamp": true },
    "note": "the request was refused, not downgraded"
  },
  "retryable": false
}

Refused on every API, and never quietly produced without it. That is the same reasoning as SIGNATURE_LEVEL_UNAVAILABLE: being handed a document you believe is sealed and is not is worse than being told no. Nothing is charged, and details.enabled tells you what you do hold, so an integration can adapt without a support call.

Your own settings are a separate, lower ceiling

Once a capability is active, your organisation still chooses when it applies, under Settings → Document authenticity. Three positions, and they behave the way every other gate in this API does:

you ask trueyou ask falseyou say nothing
offno, with a warningnono
optionalyesnono
alwaysyesyes, with a warningyes

Unlike the entitlement above, this one warns rather than refusing — you receive the ordinary document plus a SEAL_NOT_ENABLED or TIMESTAMP_NOT_ENABLED warning. The difference is that your own administrator chose this ceiling and can see it on their own settings page, so handing back less is something you can find out about and act on.

Always read the settled value, never your own request. The response echoes what actually happened:

{
  "settings": { "qeSeal": true, "qualifiedTimestamp": false, … },
  "output": {
    "compose": {
      "trust": {
        "qeSeal":             { "requested": true, "applied": true,
                                "provider": "local",
                                "appliedAt": "2026-09-23T14:02:11+00:00" },
        "qualifiedTimestamp": { "requested": true, "applied": false },
        "padesProfile": "B-B"
      }
    },
    "warnings": [ { "code": "TIMESTAMP_NOT_ENABLED", "number": 2002, … } ]
  }
}

A failure withholds the document

If you asked for a seal and it could not be applied, the composition fails — 502 with SEAL_FAILED or TIMESTAMP_FAILED — and no document comes back. Nothing is charged for the attestation.

That is deliberate. A composition can be run again, so withholding costs you a retry; handing back an unsealed PDF where a qualified seal was asked for would be claiming a property the file does not have, which is the one thing this service will not do.

Neither is marked retryable, and that is also deliberate: the provider may have performed the operation before the connection failed, and a blind retry of a paid operation is how one document costs two. Where the failure is clearly transient — the provider could not be reached at all, a rate limit, a timestamp authority that did not answer — you get TRUST_PROVIDER_UNAVAILABLE instead, which is retryable, with details.category saying why.

The line between the two is whether the provider received the request. A seal request that timed out after it was sent comes back as SEAL_FAILED with details.category: "OUTCOME_UNKNOWN" — we do not know whether it was performed, so we never repeat it on your behalf, and we record the provider's reference whenever we learned one so the operation can be reconciled afterwards.

A signature that has been given is never lost to this. An envelope behaves the opposite way on purpose: if the seal fails at completion, the envelope still completes, with SEAL_NOT_APPLIED in its warnings and padesProfile: null recorded. A person went through the whole signing flow; stranding their document because somebody else's endpoint was restarting would punish them for an outage that is not theirs, for an attestation that can be obtained again by other means.

Test organisations never buy either one

An organisation marked as scaffolding gets neither, whatever its settings say, and the response carries PAID_EXTRA_SKIPPED_ON_TEST so you can see why the profile came back null. Use the live organisation to see a sealed document.

The same goes for a single call: isTest: true together with qeSeal: true or qualifiedTimestamp: true is refused with FEATURE_NOT_AVAILABLE_IN_TEST_MODE before anything is reserved or sent to a provider.

A timestamp on its own is refused

The qualified timestamp exists only as an option of the seal. Asking for qualifiedTimestamp: true without qeSeal: true is refused with TIMESTAMP_REQUIRES_SEAL (1012, HTTP 422, not retryable), on every door — compose, flow, a batch, an envelope — before anything is rendered, reserved, sent or charged. A timestamp by itself would come from an authority that is not necessarily qualified and would read as something it is not; a sealed document without a timestamp is fine.

422 Unprocessable Entity

{
  "code": "TIMESTAMP_REQUIRES_SEAL",
  "number": 1012,
  "message": "a qualified timestamp is an option of the qualified seal and is never applied on its own: …",
  "details": { "feature": "qualifiedTimestamp", "requires": "qeSeal",
               "source": "request" },
  "retryable": false
}

details.source is request when you asked for the timestamp, and organisation setting when your organisation's own timestamp_mode is always and the document is not sealed: set Seal to always as well, or the timestamp to optional. An envelope that loses its seal before it completes finishes without either, and says so in two warnings (SEAL_NOT_APPLIED, TIMESTAMP_NOT_APPLIED).

Who performs them

A qualified seal and a qualified timestamp are DoConure capabilities. Which QTSP and which timestamping authority are behind them is ours to change — the request you write, the errors you branch on and the metadata you read back do not change when one is replaced. output.compose.trust.*.provider carries our own internal name for whoever performed it, so a support conversation has something to quote.

Where a deployment is running against a simulated authority — the whole path runs, and the token attests nothing to anybody — it says so, on every screen and in capabilities, and qualified is reported as false whatever the configuration claims.