Outcome
Get the immutable audit certificate issued when an envelope completed: signer identities, capacities, consent and evidence hashes, the source and completed document SHA-256 and a hash chain over the audit trail, plus the certificate's own hash.
Before you start
- Verify the environment, authenticated identity and specifically approved organization context.
- The published application permission is workspace:read. Resolve and bind the exact canonical Sign workspace. A supplied id or organization membership alone grants no workspace access.
- Session callers require read workspace access. API-key resource binding is verified by Auth; never treat a caller-supplied header as an independent grant.
Discover the target
topolo whoami --json
topolo actions get app_topolo_sign.envelopes.audit_certificate.get --detail --json
topolo resources topolo-sign --json
topolo workspaces list topolo-sign --json
- Set SIGN_WORKSPACE_ID to the exact granted workspace returned by discovery.
- Resolve envelopeId through envelopes.list/get or retain the exact creation response.
Request
GET /api/envelopes/{envelopeId}/audit-certificate
Inspect and test this action. Save the reviewed input as payload.json. Supply resource context separately.
Input fields
| Field | Required | Meaning | Constraints |
|---|---|---|---|
envelopeId | Required | Exact envelope.id returned by creation or envelopes.list/get in this workspace. | {"minLength":1} |
Read the complete input schema.
Effects
- Get the immutable audit certificate issued when an envelope completed: signer identities, capacities, consent and evidence hashes, the source and completed document SHA-256 and a hash chain over the audit trail, plus the certificate's own hash.
Interpret the response
The certificate binds existing envelope and signer identifiers. Its certificateSha256 is an artifact hash, not a new envelope id.
A completed immutable envelope returns certificate, certificateSha256 and retained artifacts. Compare source and completed hashes with the retained envelope. A pre-immutable completed envelope can return certificate.legacy:true with envelope detail and no stored certificateSha256. This historical projection is not a cryptographically bound immutable certificate.
Inspect the success schema. CLI/MCP add their transport envelope; --detail requests the full CLI result. HTTP 204 contains no JSON payload.
Worked examples
Captured from the exported Sign Worker with the existing SQLite-backed D1 harness applying all core, envelope and audit migrations to one local database, in-memory R2 and synthetic Auth/workspace/archive/Notify transports. These examples prove local validation, persistence and artifact production. They do not prove separate deployed D1 topology, real recipient consent, provider delivery or a live signed agreement. All identities, signing links and documents are synthetic; replace identifiers through authorized discovery and never execute a fixture against a live organization. Binary download examples use the released SDK binary projection; tests Base64-decode and compare original bytes, lengths and server SHA-256 headers.
Supported request · Read the stored certificate and artifact hashes
Input · payload.json:
{
"envelopeId": "b0db0353-6d5a-4a9b-b3f4-85f439ec4953"
}
CLI:
topolo actions validate app_topolo_sign.envelopes.audit_certificate.get --data @payload.json --json
topolo actions plan app_topolo_sign.envelopes.audit_certificate.get --resource-type workspace --resource-id "$SIGN_WORKSPACE_ID" --data @payload.json --json
topolo actions call app_topolo_sign.envelopes.audit_certificate.get --resource-type workspace --resource-id "$SIGN_WORKSPACE_ID" --data @payload.json --detail --json
MCP tool and arguments:
{
"tool": "topolo_read_action",
"arguments": {
"actionId": "app_topolo_sign.envelopes.audit_certificate.get",
"input": {
"envelopeId": "b0db0353-6d5a-4a9b-b3f4-85f439ec4953"
},
"resourceType": "workspace",
"resourceId": "<exact granted id from discovery>",
"detail": true
}
}
Captured exported Worker response · HTTP 200:
{
"certificate": {
"auditTrail": {
"digest": "1214d04e787dfbe1b26b683e813d56a4c1ab524e72e665da290e26809f485382",
"digestAlgorithm": "sha256-chain",
"eventCount": 7,
"events": [
{
"actorEmail": "operator@example.test",
"actorType": "user",
"createdAt": "2026-10-05T18:07:40.462Z",
"eventType": "envelope.created",
"id": "bb368dd7-b119-44df-90cc-51647043472f",
"metadata": {
"fieldCount": 1,
"recipientCount": 1,
"sourceApp": null,
"sourceRef": null
},
"recipientId": null
},
{
"actorEmail": "operator@example.test",
"actorType": "user",
"createdAt": "2026-10-05T18:07:40.476Z",
"eventType": "envelope.updated",
"id": "3693a899-7ef0-4e60-944b-c07d527bc692",
"metadata": {
"fieldCount": 1,
"recipientCount": 0,
"sourceApp": null,
"sourceRef": null
},
"recipientId": null
},
{
"actorEmail": "operator@example.test",
"actorType": "user",
"createdAt": "2026-10-05T18:07:40.490Z",
"eventType": "envelope.updated",
"id": "57e62e82-a761-446c-980e-12689f481434",
"metadata": {
"fieldCount": 1,
"recipientCount": 1,
"sourceApp": null,
"sourceRef": null
},
"recipientId": null
},
{
"actorEmail": "operator@example.test",
"actorType": "user",
"createdAt": "2026-10-05T18:07:40.497Z",
"eventType": "envelope.sent",
"id": "fcd1c63e-81a4-4fd9-89fc-ba9b33f944de",
"metadata": {
"fieldCount": 1,
"fieldSchemaSha256": "3a5a88731600386e198b8fe5915ebb0e6fba73e4326f1e0a3012de81293194c3",
"recipientCount": 1,
"sourceDocumentId": "92c3741e-171c-439c-9419-597ffe485224",
"sourceDocumentVersion": 1,
"sourceSha256": "bc75a1b1ad4d41a275e3a4dadd9a6031e0c56029e486e47a181ba84891acc97f"
},
"recipientId": null
},
{
"actorEmail": "operator@example.test",
"actorType": "user",
"createdAt": "2026-10-05T18:07:40.516Z",
"eventType": "recipient.link_reissued",
"id": "84bd0dd7-7a61-4c90-8a90-1b06736c2445",
"metadata": {
"previousLinkRevoked": true
},
"recipientId": "843e8126-a83e-471e-bc54-e57c07c0067d"
},
{
"actorEmail": "recipient@example.test",
"actorType": "recipient",
"createdAt": "2026-10-05T18:07:40.523Z",
"eventType": "recipient.signed",
"id": "c843a148-ccb5-4da2-ad56-d5b9520e3698",
"metadata": {
"capacities": [
"personal"
],
"consentVersion": "sign-consent-2026-09",
"evidenceSha256": "44c58fa5968721ed6e9d758daca399ea2ea1e279cf60d16417d9a2fc3dde99fd",
"fieldCount": 1,
"sourceSha256": "bc75a1b1ad4d41a275e3a4dadd9a6031e0c56029e486e47a181ba84891acc97f",
"typedName": "Fixture Recipient"
},
"recipientId": "843e8126-a83e-471e-bc54-e57c07c0067d"
},
{
"actorEmail": null,
"actorType": "system",
"createdAt": "2026-10-05T18:07:40.525Z",
"eventType": "envelope.completed",
"id": "97bda971-672d-4694-892c-b58c51496384",
"metadata": {
"sourceSha256": "bc75a1b1ad4d41a275e3a4dadd9a6031e0c56029e486e47a181ba84891acc97f"
},
"recipientId": null
}
]
},
"certificateId": "a81e8228-092c-49f6-ab71-b5f8b482cb12",
"certificateVersion": 1,
"completedDocument": {
"sha256": "adb1ade0d475aa2cec7ff848d72e4af3c575f795ef9e4fe2575c2a3f9822e363",
"sizeBytes": 4285
},
"envelope": {
"completedAt": "2026-10-05T18:07:40.522Z",
"documentTitle": "Fixture agreement",
"fieldSchemaSha256": "3a5a88731600386e198b8fe5915ebb0e6fba73e4326f1e0a3012de81293194c3",
"id": "b0db0353-6d5a-4a9b-b3f4-85f439ec4953",
"organizationId": "org_acme",
"title": "Fixture agreement",
"workspaceId": "ws_default"
},
"issuedAt": "2026-10-05T18:07:40.543Z",
"issuer": {
"appId": "app_topolo_sign",
"service": "topolo-sign"
},
"signers": [
{
"capacities": [
{
"key": "personal",
"kind": "personal"
}
],
"consent": {
"text": "I agree to sign this document electronically using Topolo Sign.",
"version": "sign-consent-2026-09"
},
"email": "recipient@example.test",
"evidenceSha256": "44c58fa5968721ed6e9d758daca399ea2ea1e279cf60d16417d9a2fc3dde99fd",
"ipHash": "a1ceb3dc7b127ea22d04f67b50908245930cfa9a3f91e1d38c0b266c44669ee7",
"name": "Fixture Recipient",
"recipientId": "843e8126-a83e-471e-bc54-e57c07c0067d",
"role": "Signer",
"routingOrder": 1,
"signedAt": "2026-10-05T18:07:40.522Z",
"userAgent": "vitest-signer",
"values": [
{
"capacity": "personal",
"display": "Fixture Recipient",
"fieldId": "fixture_signature",
"label": "Signature",
"type": "signature"
}
],
"viewedAt": null
}
],
"source": {
"documentId": "92c3741e-171c-439c-9419-597ffe485224",
"pageCount": 1,
"sha256": "bc75a1b1ad4d41a275e3a4dadd9a6031e0c56029e486e47a181ba84891acc97f",
"version": 1
},
"verification": {
"algorithm": "sha256",
"verifyPath": "/api/verify/{sha256}"
}
},
"certificateSha256": "e29d63dd80fb18c5d411302046233fec15cfdd5383ac62179dcdfdbc631ecc6c",
"artifacts": [
{
"kind": "completed_pdf",
"sha256": "adb1ade0d475aa2cec7ff848d72e4af3c575f795ef9e4fe2575c2a3f9822e363",
"sizeBytes": 4285,
"sourceSha256": "bc75a1b1ad4d41a275e3a4dadd9a6031e0c56029e486e47a181ba84891acc97f",
"createdAt": "2026-10-05T18:07:40.541Z"
},
{
"kind": "certificate_json",
"sha256": "e29d63dd80fb18c5d411302046233fec15cfdd5383ac62179dcdfdbc631ecc6c",
"sizeBytes": 4062,
"sourceSha256": "bc75a1b1ad4d41a275e3a4dadd9a6031e0c56029e486e47a181ba84891acc97f",
"createdAt": "2026-10-05T18:07:40.545Z"
},
{
"kind": "certificate_pdf",
"sha256": "900716257f1a964b685028dcf70f0d71d9040bba809b77e9a4a6026958a61ead",
"sizeBytes": 4503,
"sourceSha256": "bc75a1b1ad4d41a275e3a4dadd9a6031e0c56029e486e47a181ba84891acc97f",
"createdAt": "2026-10-05T18:07:40.550Z"
}
]
}
HTTP 200. A completed immutable envelope returns certificate, certificateSha256 and retained artifacts. Compare source and completed hashes with the retained envelope. A pre-immutable completed envelope can return certificate.legacy:true with envelope detail and no stored certificateSha256. This historical projection is not a cryptographically bound immutable certificate.
Refused request · HTTP 401
Input · payload.json:
{
"envelopeId": "ed22fca5-d5f0-4392-8e71-96e247bf3875"
}
CLI:
topolo actions validate app_topolo_sign.envelopes.audit_certificate.get --data @payload.json --json
topolo actions plan app_topolo_sign.envelopes.audit_certificate.get --resource-type workspace --resource-id "$SIGN_WORKSPACE_ID" --data @payload.json --json
Captured exported Worker response · HTTP 401:
{
"error": "Token validation failed"
}
HTTP 401. Resolve the exact refusal before retrying. This request is not a successful workflow.
Verify the result
- A completed immutable envelope returns certificate, certificateSha256 and retained artifacts. Compare source and completed hashes with the retained envelope.
- A pre-immutable completed envelope can return certificate.legacy:true with envelope detail and no stored certificateSha256. This historical projection is not a cryptographically bound immutable certificate.
Errors and recovery
artifact_integrity_failed(HTTP 500): Stored artifact bytes do not match the retained SHA-256. Preserve the envelope, expected hash and request id and report the integrity incident; do not substitute a new hash.auth_error(HTTP 401): Reauthenticate in the same approved context before retrying.
Some existing refusals return a human message as error rather than a stable code; preserve the actual response, status and request id. Platform validation, authentication and resource checks can refuse before the handler.
Recovery boundary
This read changes no organizer data. Resolve identity, permission, resource binding or target state and repeat the same reviewed read. Do not turn a refused read into a mutation.
Related actions
Evidence
Captured from the exported Sign Worker with the existing SQLite-backed D1 harness applying all core, envelope and audit migrations to one local database, in-memory R2 and synthetic Auth/workspace/archive/Notify transports. These examples prove local validation, persistence and artifact production. They do not prove separate deployed D1 topology, real recipient consent, provider delivery or a live signed agreement. All identities, signing links and documents are synthetic; replace identifiers through authorized discovery and never execute a fixture against a live organization. Binary download examples use the released SDK binary projection; tests Base64-decode and compare original bytes, lengths and server SHA-256 headers.