Issue tamper-evident verifiable certificates from any workflow — new community node (Attestify)

TL;DR: I built a community node, n8n-nodes-attestify, that issues a verifiable digital certificate for any completion event in your workflow and gives you back a permanent public verify page. No account, no API key. It’s free and early — feedback very welcome.

The problem it solves
Plenty of n8n workflows already generate certificates — PDF Generator API, Google Slides, PDF.co, an HTML-to-PDF step. They all produce a file that looks official… and that anyone can edit in two minutes. A recipient can bump their score, change the date, or swap the name. The issuer has no way to prove which one is real, and the employer / licensing board on the other end has no way to check.

What the node does
Certificate → Issue Certificate takes one input item (issuer, course/credential, recipient name, optional email) and returns verify_url, cert_image_url, signed_record_url, and cert_id.

Every certificate gets a permanent, Ed25519-signed public verify page. Change one character in the record and verification fails — so the page is the source of truth, not the PDF. Recipient name maps straight from an incoming row ({{ $json.name }}), so it drops into a batch unchanged.

A nice detail for the compliance-minded: the recipient email is never stored in the signed record and never shown on the public page — it’s only echoed back so you can mail-merge the verify URL. Recipient PII stays on your side.

A workflow that uses it
Schedule / Webhook / Sheet → (your "course completed" rows) → Attestify (Issue) → Gmail (send verify_url)
Point it at an LMS export, a Typeform/Tally submission, an Airtable view, a CRM query — anything that emits “this person finished this thing” — and each recipient gets their own certificate + a link an employer can actually check. (I’ve been testing it against the real-estate continuing-education case, where “prove you completed your CE hours” is a real recurring need, but it’s domain-agnostic.)

No account, no key
The free Attestify service needs no signup and no API key, so the node ships with no credentials — install it and run. A modest per-IP daily issuance cap applies (anti-abuse). If you self-host, there’s an API Base URL option, but the default just works.

Try it

It’s genuinely early — built by Novadyne. If you try it, I’d love to hear what breaks or what’s missing. If there’s a credential type or an output field that would make it fit your flow better, say so and I’ll add it.

Welcome @novadyne!

The problem you identified is real - editable PDFs as “certificates” have no audit trail, and most workflow-generated docs don’t solve for that at all. The public verify URL backed by Ed25519 signatures is the right foundation; the fact that verification requires no account makes it usable for the recipient side too.

A natural fit for this in n8n: LMS-style training completion workflows where a Typeform or Airtable triggers certificate issuance, the node returns the verify_url, and that URL gets embedded directly in the completion email or added to a learner record in Notion or Sheets. The employer-side verification step makes this much more useful than a static PDF.

Thanks @nguyenthieutoan — that’s exactly the use case we built it for. Continuing-education / training completion is our beachhead, and the LMS flow you describe is spot on: a Typeform or Airtable completion triggers the node, it returns verify_url, and that URL drops straight into the completion email or a Notion/Sheets learner record.

There’s an optional Completion Date field on the node too, so the certificate reflects when the training was actually finished rather than when the workflow happened to run.

The recipient-side point is the one we care most about: because the verify page needs no account and the Ed25519 signature is checked server-side, an employer (or a state CE board) can confirm a certificate is genuine straight from the URL — no “email us a PDF and we’ll eyeball it.” Happy to compare notes if you wire one of these up.