The error window hands an error over as one JSON document, to paste into an AI on another screen or to send to a colleague or to support. Personal data in the document is masked on a best-effort basis, and secrets are always masked. Available from release 28.0. ## Copy as JSON and Save as JSON Below the message, next to "OK", the error window offers two buttons: - "Copy as JSON" puts the document on the clipboard. - "Save as JSON" writes the document to a file. The proposed name holds the message code and the moment in UTC, such as `invantive-error-itgenttn082-20261007T195024Z.json`. The file is written as UTF-8 without a byte order mark. The error window of the example below shows them as follows: ![[20261007-qt-error-window-json.png]] The same two buttons are in the error window of every product which shows its errors in a window: Invantive Query Tool, [[Invantive Query Tool Multi-Platform/Invantive Query Tool Multi-Platform|Invantive Query Tool Multi-Platform]], [[Invantive Studio/Invantive Studio|Invantive Studio]], [[Invantive Runtime/Invantive Runtime|Invantive Runtime]], [[Invantive Data Loader/Invantive Data Loader|Invantive Data Loader]], [[Invantive Control for Excel/Invantive Control for Excel|Invantive Control for Excel]], [[Invantive Composition for Word/Invantive Composition for Word|Invantive Composition for Word]], [[Invantive Authenticator/Invantive Authenticator|Invantive Authenticator]] and [[Invantive Support Assistant/Invantive Support Assistant|Invantive Support Assistant]]. A message window which reports an error with a message code carries them as well. ## What the Document Holds The document is laid out as the other JSON files of Invantive: one member per line, with the separating commas at the start of the line. Each member is left out when the error carries nothing for it: - `kind` is always `invantive-error`, and `version` is the version of the shape of the document, currently 1. - `takenUtc` and `occurredUtc` are the moments the document was made and the error occurred, in UTC. - `product`, `productVersion`, `operatingSystem` and `runtime` say where the error occurred. - `messageCode`, `message`, `hint` and `object` are what the window shows, and `severity` is the level of the message. - `messageId` is the identification under which the product registers the error at Invantive. - `exceptions` lists the error and the errors it was caused by, outermost first, each with its type, message code, text and hint. - `psqlCallStack` lists, for an error in a PSQL block, the statements it passed through, innermost first: the unit, the line within the unit and the beginning of the statement. - `statement` is the statement which caused the error or ran last; `statementCausedError` says which of the two, and `statementFragment` holds the part of the statement the error is about. - `table`, `column` and `partition` name what the error is about. - `dataContainers` lists the alias, the driver and the identification of each data container involved. - `request` holds the method, the address, the status code and the status of a request to a platform. - `requestId` and `inboundCorrelationIds` relate the error to the logging of a server. - `personalData` is always `masked on a best-effort basis`. A PSQL block which divides by zero, run on the [[Invantive Query Tool/Sample Database|sample database]], gives: ```json { "kind": "invantive-error" , "version": 1 , "takenUtc": "2026-10-07T19:50:24.401Z" , "occurredUtc": "2026-10-07T19:50:21.136Z" , "product": "Invantive Query Tool" , "productVersion": "27.1.3-BETA+6294" , "operatingSystem": "Microsoft Windows 10.0.26300 (X64)" , "runtime": ".NET 10.0.9 (X64)" , "messageCode": "itgenttn082" , "message": "Division of 1 by zero is impossible." , "severity": "Error" , "messageId": "fe095fa6-b7e8-4adc-a753-d2501c40f0e4" , "exceptions": [ { "type": "Invantive.Basics.ValidationException" , "messageCode": "itgenttn082" , "message": "Division of 1 by zero is impossible." } ] , "psqlCallStack": [ { "unit": "anonymous block" , "line": 5 , "statement": "l_ratio := 1 / 0;" } ] , "statement": "declare\r\n l_ratio pls_integer;\r\nbegin\r\n dbms_output.put_line('Mail to [masked e-mail address: 16 characters]');\r\n l_ratio := 1 / 0;\r\nend;" , "statementCausedError": true , "dataContainers": [ { "provider": "dummy" , "id": "Dummy" } ] , "personalData": "masked on a best-effort basis" } ``` ## Personal Data and Secrets The masking recognises personal data in two ways: - By the name a value is held under, such as `email`, `first_name`, `phone`, `iban`, `city` or `password`, in a statement as well as in a message. - By the shape of a value: e-mail addresses, telephone numbers written with an international or a trunk prefix, IBANs with valid check digits, Dutch postal codes, streets with a house number, public IP addresses and citizen service numbers which pass the eleven test. A masked value keeps its kind and its length, such as `[masked e-mail address: 16 characters]`, which is usually what an analysis needs. An address keeps the names of the parameters of its query string and loses their values. Passwords, tokens, keys and connection strings never reach the document. The masking is best effort. A personal name in running text, or a personal value under a neutral name, is not recognised. The document is therefore worth reading before it is sent. ## Related Topics The following topics cover the rest of what an error says: - [[Invantive Query Tool/Message Codes|Message Codes]] - [[Invantive Query Tool/Troubleshooting|Troubleshooting]] - [[Invantive Query Tool/PSQL Blocks|PSQL Blocks]]