Privacy

Local invoice checks stay in your browser. Hosted checks send invoice data to Attestwire for processing in memory. This page explains the data used for accounts, payments, optional validation records, registration lookups and website analytics.

Invoice data sent to the API

This is the part that matters most if you are integrating, so it goes first.

An invoice you send to api.attestwire.com is processed in memory and never stored. It is parsed, validated or generated, and answered; when the response is written the payload is gone. There is no database of invoices, no cache, no queue and no backup holding one. Responses carry Cache-Control: no-store. Payloads are never used to train anything: the engine is deterministic TypeScript, and we send payloads to no third party.

Validation records, only if you ask for one

If you add ?record=true to a POST /v1/validate call, we store a validation record of that check: the verdict, each finding (its rule, severity and message), the engine and rule-set versions, the time, and a SHA-256 fingerprint of the document. The document itself is not stored. A finding’s message can quote a value from the invoice, such as a VAT identifier, a name or an email address, so a record can contain those values.

Anyone who has the record’s link can read it; the link contains a 128-bit random identifier, and that is the only access control, so share it only with the people it is for. Records are deleted automatically 365 days after they are made. To delete one sooner, email hello@attestwire.com with its link.

Alongside each record, and never shown with it, we keep a salted hash that ties it to the key that made it, so abuse can be traced.

Live registration lookups are separate. VAT checks send the VAT number to VIES, the EU service for checking VAT numbers, and Peppol checks send the participant identifier to the public lookup service run by OpenPeppol, the association that operates the Peppol e-invoicing network. They do not send the invoice itself to those services.

We do not log invoice payloads in normal operation. Errors are logged as the error class name and the route, with no stack trace. The one exception is our Paddle webhook handler, which logs a stack trace on failure and never carries an invoice payload. What we keep for an API account is on the security page, listed in full: nothing about the documents themselves.

The full detail, including where processing physically happens and who our subprocessors are, is on the security page. If you need a GDPR Article 28 processor agreement, one is written: the data processing addendum.

AI agents using the MCP server

The MCP server at api.attestwire.com/mcp is how AI assistants such as Claude, Cursor and similar tools reach the API. So we can see what those assistants are trying to do and where the service falls short, the server records a short usage entry for each connection and each tool call. An entry never contains invoice content, and never the name, VAT number, company search or other text an assistant sends with a call.

Each entry holds only these:

No IP address is recorded in an entry. To stop one connection flooding the feedback tool described below, the server counts that tool’s calls per API key, or per IP address when there is no key. The count lives in the server’s memory, is never written down, and is gone within the hour.

The feedback tool

The server also offers assistants a send_feedback tool. An assistant may call it to tell us, in its own words, what you were trying to do when the service could not help, or when a result looked wrong or confusing. We ask assistants not to include invoice contents, names or identifiers.

Before anything is stored we also remove email addresses, API keys, IBANs, VAT numbers and long numbers from the text. The text is capped at 1,000 characters. Feedback is anonymous, so we cannot reply to it; if you want an answer, email hello@attestwire.com.

Usage entries and feedback are stored in Cloudflare Workers Analytics Engine, in the same Cloudflare account that runs the API, and are deleted automatically after three months. They reach no other company. We read them ourselves, as daily totals and by reading the feedback text directly, to decide what to fix and build next.

The lawful basis is our legitimate interest in understanding how the service is used and improving it (GDPR Art. 6(1)(f)). If you want an entry removed, tell us roughly when and from which assistant, and we will find and delete what we can.

What we collect, and where

Three places on our properties take an email address:

This site used to carry a fourth: a "need more than 100 documents a month" box posting to /api/waitlist. The hosted API is self-serve now, so the box is gone. That endpoint still answers (it is the same store the alert form writes to, under the name it was published under), and the paragraph below on getting removed applies to those records as it always did.

The rule-change alerts and the update list store the same three things, and only these:

Email address
Lowercased, and used as the storage key, so a second submission updates nothing rather than creating a duplicate.
Timestamp
ISO 8601, of your first submission. Later submissions do not overwrite it.
Source
A short label such as home, so we know which form you used.

The VIES alert form stores the same email address and timestamp, plus one extra field: the member state you asked to be told about, or nothing if you asked about all of them. That is the only difference between the lists.

One more form is not a list at all. The "create my key" box on the homepage sends your address straight to api.attestwire.com to issue an API key, the same thing POST /v1/keys does from your terminal, and the address is not stored on attestwire.com at all.

What the API keeps is an account record: the address, the tier, and the SHA-256 hash of the key. We do not email you because you created a key. That record is described on the security page.

The email forms do not record your IP address, user agent, referrer, name, company, or anything you did not type into the box. There is no account, password or profile.

One place IP addresses are used: the hosted API applies abuse-prevention rate limiting keyed on the calling IP address, today on the key-issuing endpoint, so that one caller cannot mint unlimited free keys, and, in memory only, on the MCP feedback tool (described above). Those counters reset daily or sooner, are not a record of you, and are not joined to an account or to anything else.

Why

To reply to you about the thing you asked about, and nothing else. That is the entire purpose; we run no newsletter, drip sequence or marketing automation. Under the GDPR the lawful basis is your consent (Art. 6(1)(a)), given by submitting the form. You can withdraw it at any time and we delete the record.

Cookies and analytics

No cookies. No local storage. Two things measure anything on this site, both named here: Cloudflare Web Analytics for page views, described in this section, and our own event counters, described in the section below it. There is one further exception on the checkout page, which is described below.

We run Cloudflare Web Analytics on this site, and on the free tools, so we can see which pages get read and which rule pages people land on.

What that means in practice, stated so you can check it against Cloudflare's own documentation rather than taking our word for it:

It is a third-party script, and you should know that. Every page here loads one file from outside this domain, https://static.cloudflareinsights.com/beacon.min.js, which is the beacon that reports those page views. Apart from the two payment pages described below, it is the only cross-origin request the site makes; there are no external fonts, images, stylesheets, pixels, tag managers, or advertising or social scripts.

Loading it means Cloudflare receives the technical details of that request, including your IP address, in the same way it already does as the host serving this page. Block it in your browser and every page here works as before.

Cloudflare processes that data as our infrastructure provider, under its own terms and privacy policy. We describe what the product does; we do not warrant Cloudflare's conduct, and we cannot audit it for you. If you need the vendor's own commitments, read them at cloudflare.com/privacypolicy.

We may change or drop the analytics provider. If we do, this page says so and carries a new date. That notice is here, on this page, and it is the notice you get.

Our own event counters

Cloudflare Web Analytics reports page views. It cannot tell us whether anyone pressed a button, so three pages here also count a small number of named events: the homepage, /playground and /pricing. This is first-party. Nothing is sent to a third party and no vendor is involved.

An event is a name, and the name is the whole record. The name comes from a fixed list written into our Worker, it is sent when you press one of a few specific buttons or when a check on /playground finishes, and it is stored as a count. What is recorded is that somebody, once, did a thing with that name.

The counters are Cloudflare Workers Analytics Engine, a store inside the same account that already serves this page, so the events reach no company that was not already handling the request. The full list of names and the code that writes them are in the site's Worker; to see what a button sends, open the network panel and press it. The request is one short line of JSON.

The two pages that are different: /pay and /fix

Two pages on this site load a second third-party script, and both of them are pages you only use to pay us. /pay is where a hosted-API upgrade is paid for, and /fix is where the one-time Invoice Fix Report is bought. Each loads https://cdn.paddle.com/paddle/v2/paddle.js so that Paddle, our payment provider and merchant of record, can open its own payment window on our domain.

No other page here loads it, and it is not analytics.

What that means for you, stated the same way as the beacon above. /pay is noindex and does nothing without a checkout link, so you cannot arrive there by browsing. /fix is an ordinary readable page and you can arrive there by browsing, so the script loads with it, before you have decided anything.

That is the cost of putting the payment window on the page that describes what it buys. We collect nothing on either: /pay reads the transaction id out of the URL and hands it to Paddle, /fix hands Paddle a price id when you press the button, and neither stores anything anywhere. Paddle's own script may set cookies or browser storage on those pages to run its checkout and its fraud checks.

That is Paddle's, under Paddle's privacy policy, and it is why the sentence at the top of the analytics section says "no cookies" about this site rather than about every script that can run on it. Your card details go to Paddle and never to us.

/fix/claim, the page that shows the key after a Fix Report is paid for, loads no payment script at all. It sends the transaction id to api.attestwire.com, shows you the key that comes back, and writes nothing to your browser: no storage or cookie, and no copy of the key anywhere but the screen.

Who else touches the data

We do not sell, rent, share or trade email addresses, and we send them to no marketing, CRM or advertising service.

Two processors, both named here. Cloudflare is our infrastructure provider: these sites run on Cloudflare Workers, the email records live in Cloudflare Workers KV, and the analytics described above are Cloudflare's product. Like any web host, Cloudflare processes the technical details of your request, including your IP address, in order to serve and protect the site.

We do not retain those logs as a record of you, and we do not join them to anything. Paddle handles payment for the hosted API as our merchant of record, and never receives an invoice payload; card details are entered on Paddle's checkout, not ours, and the billing email, address and any tax ID you give at checkout are held by Paddle so it can charge the right tax and issue your invoice.

Both act as our infrastructure and payment providers under their own terms. We describe what they do for us and we choose them carefully, but we do not warrant their conduct and we cannot audit them on your behalf. The full list, with what each one touches, is the subprocessor table on the security page.

How long we keep it

Until you ask us to remove it, or until the list has served its purpose and we delete the whole store, whichever comes first.

Getting removed, or getting a copy

Email hello@attestwire.com from the address you signed up with, or just tell us which address to look for. We delete it and confirm. There is no form or login to go through.

The GDPR also gives you the right to access the data we hold, correct it, object to the processing, receive it in a portable form, and lodge a complaint with your national supervisory authority. Ask at the same address; we answer within 30 days, usually the same week.

Contact

Attestwire: hello@attestwire.com. That address reaches a person, and it is the right one for privacy requests, security reports and everything else.

Changes, and what this page is

This page describes how the site and the service work today. It is a description of current practice, not a contract: the binding commitments are in the terms and, where you have one in place, the data processing addendum, and where the DPA says something different from this page, the DPA governs.

Practices change: we may add, replace or drop a provider, including the analytics one. When that happens this page is updated and re-dated, and that is the notice. DPA customers additionally get 30 days' notice before a new subprocessor starts processing their data.

If this page changes materially we will say so here rather than silently swapping it. Last updated .