{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Certification — Overview","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"certification--overview","__idx":0},"children":["Certification — Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Certification"]}," is the process by which one or more digital files are cryptographically certified to attest:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["their ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["existence"]}," at a given time (timestamp),"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["their ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["integrity"]}," (files have not been altered after certification),"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["their ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["provenance"]}," (the user who performed the certification)."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The result is a set of digitally signed artifacts that constitute proof of certification."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"the-three-modes","__idx":1},"children":["The three modes"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Public API offers ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["three modes"]}," to create a certification, depending on how content is provided:"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"data-certification","__idx":2},"children":["Data certification"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The client sends ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["key-value string data"]}," in the required ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]}," field. TrueScreen certifies only those pairs (no file upload, no hash list)."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoint:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/data-certifications"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Calls required:"]}," 1"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Security level:"]}," lower — data is declared by the caller (similar to hash certification)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Cost:"]}," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["1 credit per certification"]}," (regardless of how many key-value pairs are in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]},")."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]}," for the certified content"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"hash-certification","__idx":3},"children":["Hash certification"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The client sends a list of ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["file names and hashes"]}," (SHA-256) already computed. TrueScreen certifies the hashes without receiving the original files."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoint:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/hash-certifications"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Calls required:"]}," 1"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Security level:"]}," lower — the system cannot verify that the hashes correspond to real files."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Cost:"]}," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["1 credit per hash"]}," sent."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"file-certification","__idx":4},"children":["File certification"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The client ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["uploads the files"]}," via temporary upload URLs. TrueScreen receives the original files, computes their hashes, and performs the certification."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoint:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/file-certifications-attachments"]}," + upload + ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/file-certifications"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Calls required:"]}," 3 (file registration → upload → certification creation)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Security level:"]}," higher — original files are processed by the system."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Cost:"]}," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["1 credit per file"]}," uploaded."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On each ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["files"]}," item in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/file-certifications-attachments"]}]},", ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["creation_datetime"]}]}," is optional (ISO 8601 ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["date-time"]},", same object as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["file_name"]},"). When present and valid, it is used as creation date in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["jsonData"]}," for that attachment. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/certification-workflow#2-file-certification"},"children":["Certification call flow"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"quick-comparison","__idx":5},"children":["Quick comparison"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Aspect"},"children":["Aspect"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Hash certification"},"children":["Hash certification"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Data certification"},"children":["Data certification"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"File certification"},"children":["File certification"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Input"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["File names + hash (SHA-256)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]}," key-value strings"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Files to upload"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["File upload"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Yes (presigned URL)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["API calls"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["3"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Security"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Lower"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Lower"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Higher"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Credit cost"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1 per hash"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1 per certification"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1 per file"]}]}]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"certification-through-mcp","__idx":6},"children":["Certification through MCP"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["TrueScreen also exposes certification workflows through MCP."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["truescreen_create_hash_certification"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["truescreen_create_data_certification"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["truescreen_get_certification"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["truescreen_wait_for_certification"]}," are available on both the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["remote"]}," and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["local"]}," MCP server."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["File certification is available only on the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["local"]}," MCP server through ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["truescreen_create_file_certification_attachments"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["truescreen_upload_file"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["truescreen_create_file_certification"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/mcp-integration"},"children":["MCP integration"]}," to choose the right server and install it."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"produced-artifacts","__idx":7},"children":["Produced artifacts"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When certification completes, the system produces three types of files:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Artifact"},"children":["Artifact"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Format"},"children":["Format"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Readability"},"children":["Readability"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["jsonData"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["JSON"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Machine-readable"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Hashes of certified files, file metadata, and user metadata. Contains all information needed to verify integrity."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PDF report"]}," (optional)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["PDF"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Human-readable"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Readable report with key data from jsonData. Useful for direct consultation (lawyers, auditors, etc.). Generated only if enabled in configuration."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Signed XML"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["XML + XAdES"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Both"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Contains hashes of jsonData and, when present, of the PDF report. Digitally signed and timestamped. This is what gives probative value to the certification."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["signed XML"]}," guarantees:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Integrity"]}," — any change to jsonData or the PDF report (when present) invalidates the signature."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Authenticity"]}," — the digital signature attests that the certification was issued by the TrueScreen system."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Certain date"]}," — the timestamp proves that the data existed at the time of certification."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"asynchronous-process","__idx":8},"children":["Asynchronous process"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Certification generation is ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["asynchronous"]},": the creation response returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status: \"pending\""]}," and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["report_id"]},". Completion happens later."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You have ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["two options"]}," to know when the certification is ready:"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"webhook","__idx":9},"children":["Webhook"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Pass a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["webhook_url"]}]}," in the creation request body. When processing ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["finishes"]}," (success or failure), TrueScreen sends an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HTTP POST"]}," callback to that URL."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The callback payload follows the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://www.standardwebhooks.com"},"children":["Standard Webhooks"]}]}," envelope format — a JSON object with three top-level fields:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Event type: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["certification.completed"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["certification.error"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["timestamp"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["ISO 8601 timestamp of when the event occurred"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Event payload (see below)"]}]}]}]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["certification.completed"]}]}," — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]}," matches the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["200"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/certifications/{reportId}"]}," response (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status: \"completed\""]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["files"]}," array with signed URLs)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["certification.error"]}]}," — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data"]}," contains an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["application/problem+json"]}]}," (RFC 9457) document with the same shape as the error from that ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Content-Type"]}," is always ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["application/json"]},"; distinguish success from failure via the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," field."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"signature-verification","__idx":10},"children":["Signature verification"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Every callback includes three ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Standard Webhooks"]}," headers for signature verification:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Header"},"children":["Header"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["webhook-id"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Unique event identifier (idempotency key)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["webhook-timestamp"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Unix timestamp (seconds since epoch) of the delivery attempt"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["webhook-signature"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["HMAC-SHA256 signature(s) in format ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["v1,<base64>"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The signature is computed over ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{webhook-id}.{webhook-timestamp}.{raw_body}"]}," using a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["webhook signing secret"]}," — a dedicated key (prefixed ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["whsec_"]},") separate from your API key, obtained from the TrueScreen portal. To verify:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Reconstruct the signed content: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"{webhook-id}.{webhook-timestamp}.{body}\""]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Compute ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["HMAC-SHA256"]}," with your decoded signing secret"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Compare (constant-time) against each ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["v1,..."]}," signature in the header"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Reject if ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["|now - webhook-timestamp| > 300s"]}," (replay protection)"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"polling","__idx":11},"children":["Polling"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Poll ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/certifications/{reportId}"]}]}," periodically using the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["report_id"]}," from the creation response. When the certification is complete, the response is ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["200"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status: \"completed\""]}," and the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["files"]}," array with signed URLs. If async processing fails, the API returns an ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["error status code"]}," and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["application/problem+json"]}]},"—see OpenAPI and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/certification-workflow"},"children":["Certification call flow"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"additional-metadata","__idx":12},"children":["Additional metadata"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In both creation endpoints you can pass an optional ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["metadata"]}]}," field: a free-form key-value object with custom data (e.g. case number, client name, contract reference)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Metadata keys and values are included in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["jsonData"]}," and, when generated, in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["PDF report"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Example:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"metadata\": {\n    \"case_number\": \"2024/001\",\n    \"client_name\": \"John Doe\",\n    \"contract_ref\": \"CTR-20240315\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"credits","__idx":13},"children":["Credits"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each certification has a cost in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["credits"]}," (units purchasable from the TrueScreen portal)."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Mode"},"children":["Mode"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Cost"},"children":["Cost"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Hash certification"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1 credit per hash sent"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["File certification"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1 credit per file uploaded"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Credits are ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["deducted at creation time"]},", before asynchronous processing starts. If the credit balance is insufficient, the request is rejected with an error and no credits are deducted."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can check the balance at any time with ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /v1/credits"]}]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"purchased\": 100,\n  \"used\": 35,\n  \"available\": 65,\n  \"expires_at\": \"2026-12-31\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"references","__idx":14},"children":["References"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/certification-workflow"},"children":["Certification call flow"]}," — Operational guide with API call sequences"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/errors"},"children":["API errors"]}," — RFC 9457 format, code list, and detail pages for each error type"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/openapi"},"children":["OpenAPI spec"]}," — Technical reference for endpoints"]}]}]},"headings":[{"value":"Certification — Overview","id":"certification--overview","depth":1},{"value":"The three modes","id":"the-three-modes","depth":2},{"value":"Data certification","id":"data-certification","depth":3},{"value":"Hash certification","id":"hash-certification","depth":3},{"value":"File certification","id":"file-certification","depth":3},{"value":"Quick comparison","id":"quick-comparison","depth":3},{"value":"Certification through MCP","id":"certification-through-mcp","depth":2},{"value":"Produced artifacts","id":"produced-artifacts","depth":2},{"value":"Asynchronous process","id":"asynchronous-process","depth":2},{"value":"Webhook","id":"webhook","depth":3},{"value":"Signature verification","id":"signature-verification","depth":4},{"value":"Polling","id":"polling","depth":3},{"value":"Additional metadata","id":"additional-metadata","depth":2},{"value":"Credits","id":"credits","depth":2},{"value":"References","id":"references","depth":2}],"frontmatter":{"title":"Certification — Overview","description":"What certification is, available modes, produced artifacts, and the asynchronous process","seo":{"title":"Certification — Overview"}},"lastModified":"2026-06-25T15:58:45.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/certification-overview","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}