Tell people they’re talking to an AI.
A clear notice, at the latest at the first interaction.
Art. 50(2) marking: 2 Dec 2026 for existing systems.
Three AI Act duties in pictures, the cost of a breach, and a one-click CTO handoff.
A clear notice, at the latest at the first interaction.
Art. 50(2) marking: 2 Dec 2026 for existing systems.
Automatic event records, kept at least six months.
Oversight that lets a person step in or stop.
As amended by Reg. (EU) 2026/1744, the Digital Omnibus.
1Raw documentYour app holds the text, as it does today.
2Cryptographic sealThe SDK seals it with your key, then discards the raw text.
3Fingerprint in FrankfurtOnly the fingerprint is kept: in your EU store today, in Spurvik fra1 once hosting launches.
Zero-PII means no raw personal data is persisted. Fingerprints remain pseudonymised data under GDPR Art. 4(5) while your key exists.
SME: under 250 staff and turnover up to €50M.
A ceiling, not an expected fine; Art. 99(7) weighs the measures you had in place. Log scale.
Our hosts (Vercel, Neon on AWS) have US parents; we claim no CLOUD Act immunity, only that the record holds nothing readable. Public documentation, October 2026.
Add your company name. The message is written in this tab and goes nowhere until you send it.
Wrap the model call you already make: Art. 50 notice text, an Art. 14 hold on side effects, an Art. 12 record sealed with your key.
npm i @spurvik/sdk
npx @spurvik/sdk check
npm i https://spurvik.com/sdk/latest.tgz
import { wrapOpenAIDecision } from "@spurvik/sdk"; const result = await wrapOpenAIDecision( { goal: "Answer a billing question", taskType: "draft_reply", promptOrInput: userMessage, executeDecision: (prompt) => openai.responses.create({ model, input: prompt }), }, { appId: "support-assistant", principal: "Acme Nordic ApS", hmacKey: process.env.SPURVIK_HMAC_KEY!, mode: "active", } ); result.status; // "EXECUTED" | "HELD_FOR_ART14_HUMAN_OVERSIGHT" | "HALTED_BY_SYSTEM_ONE" result.art12EvidenceEnvelope; // digests only: keep it in your EU store result.art50Provenance; // the Art. 50(1) notice text to show the user
import { generateText } from "ai"; import { wrapOpenAIDecision } from "@spurvik/sdk"; // Any AI SDK provider: OpenAI, Anthropic or a local model. const result = await wrapOpenAIDecision( { goal: "Summarise the support ticket", taskType: "summarise_ticket", promptOrInput: ticketText, executeDecision: async (prompt) => (await generateText({ model, prompt })).text, }, spurvikConfig // the same config object as in the OpenAI tab );
const input = { goal: "Pay supplier invoice 4471", taskType: "send_payment", // side-effect verb: locked to ask_human executeDecision: () => bank.pay(invoice), }; const held = await wrapOpenAIDecision(input, spurvikConfig); held.status; // "HELD_FOR_ART14_HUMAN_OVERSIGHT": bank.pay() did not run // After a named person approves in your review flow: const done = await wrapOpenAIDecision(input, { ...spurvikConfig, humanApproved: true, humanApproverId: "approver_0193", }); done.status; // "EXECUTED"
The SDK’s redaction, router and digest, running in this tab. Nothing is sent.
zeroPiiInputHmacDemo key spurvik-public-demo-key-2026. Model call stubbed: the output digest covers an empty string.
sk- and whsec_ secrets, before transport.ask_human.EXECUTED, HELD_FOR_ART14_HUMAN_OVERSIGHT, HALTED_BY_SYSTEM_ONE| Provision | Spurvik control | Status |
|---|---|---|
| Art. 50(1) | Notice text naming your company, per call | SDK v1.0 |
| Art. 50(2) | Content digest, marked-output flag | SDK v1.0C2PA planned |
| Art. 12, 19(1), 26(6) | One keyed-HMAC envelope per event | SDK v1.0Hosted fra1 planned |
| Art. 14 | ask_human lock, named approver | SDK v1.0Two-account pre-release |
| Annex IV | Structured evidence exports | Scale tier |
| GDPR Art. 5(1)(c), 25, 32 | Redaction, digests only, your key | By design |
List prices, excl. VAT, B2B only.
€249/mo
€2,490/yr, up to 50,000 events/mo
90-day pilot €522.90
€1,490/mo
€14,900/yr, up to 1,000,000 events/mo
90-day pilot €3,129
from €30,000/yr
Custom volume and a dedicated EU region
Pilots are credited on conversion. The Founding 10 design partner offer closes 2 December 2026.
Book a 45-minute walkthroughTreat it as pseudonymised data. Without your key nobody can link it to a person; with it and the original, you can prove a match.
You do, in your environment or KMS. It never travels with events.
No. Prompts go only to your model provider, with emails, IBANs and CPR numbers redacted first.
No tool can. Spurvik supplies measures and evidence that support Art. 50, 12 and 14; classification, your DPIA and any conformity assessment stay with you.